24 #ifndef OPENFLOW_SWITCH_NET_DEVICE_H 25 #define OPENFLOW_SWITCH_NET_DEVICE_H 27 #include "ns3/simulator.h" 29 #include "ns3/mac48-address.h" 31 #include "ns3/ethernet-header.h" 32 #include "ns3/arp-header.h" 33 #include "ns3/tcp-header.h" 34 #include "ns3/udp-header.h" 36 #include "ns3/ipv4-l3-protocol.h" 37 #include "ns3/arp-l3-protocol.h" 39 #include "ns3/bridge-channel.h" 42 #include "ns3/string.h" 43 #include "ns3/integer.h" 44 #include "ns3/uinteger.h" 156 int AddVPort (
const ofp_vport_mod *ovpm);
186 void DoOutput (uint32_t packet_uid,
int in_port,
size_t max_len,
int out_port,
bool ignore_no_fwd);
225 virtual void SetIfIndex (
const uint32_t index);
230 virtual bool SetMtu (
const uint16_t mtu);
231 virtual uint16_t
GetMtu (
void)
const;
286 int AddFlow (
const ofp_flow_mod *ofm);
294 int ModFlow (
const ofp_flow_mod *ofm);
304 int OutputAll (uint32_t packet_uid,
int in_port,
bool flood);
324 void OutputPort (uint32_t packet_uid,
int in_port,
int out_port,
bool ignore_no_fwd);
336 void OutputControl (uint32_t packet_uid,
int in_port,
size_t max_len,
int reason);
346 void SendErrorMsg (uint16_t type, uint16_t code,
const void *
data,
size_t len);
377 void SendFlowExpired (sw_flow *flow,
enum ofp_flow_expired_reason reason);
434 void FlowTableLookup (sw_flow_key key, ofpbuf* buffer, uint32_t packet_uid,
int port,
bool send_to_controller);
virtual Ptr< Node > GetNode(void) const
int ReceiveEchoRequest(const void *oh)
virtual bool NeedsArp(void) const
Simulation virtual time values and global simulation resolution.
uint32_t m_ifIndex
Interface Index.
Smart pointer class similar to boost::intrusive_ptr.
vport_table_t GetVPortTable()
void ReceiveFromDevice(Ptr< NetDevice > netdev, Ptr< const Packet > packet, uint16_t protocol, const Address &src, const Address &dst, PacketType packetType)
Called when a packet is received on one of the switch's ports.
void FlowTableLookup(sw_flow_key key, ofpbuf *buffer, uint32_t packet_uid, int port, bool send_to_controller)
Called by RunThroughFlowTable on a scheduled delay to account for the flow table lookup overhead...
int AddVPort(const ofp_vport_mod *ovpm)
Add a virtual port to a switch device.
virtual Address GetBroadcast(void) const
static const char * GetSerialNumber()
int ReceiveGetConfigRequest(const void *msg)
uint16_t m_flags
Flags; configurable by the controller.
vport_table_t m_vportTable
Virtual Port Table.
void SendFeaturesReply()
Send a reply about this OpenFlow switch's features to the controller.
virtual void SetNode(Ptr< Node > node)
int ReceivePortMod(const void *msg)
virtual void SetIfIndex(const uint32_t index)
int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport)
Run the packet through the vport table.
void OutputControl(uint32_t packet_uid, int in_port, size_t max_len, int reason)
Sends a copy of the Packet to the controller.
static const char * GetHardwareDescription()
Mac48Address m_address
Address of this device.
int OutputAll(uint32_t packet_uid, int in_port, bool flood)
Send packets out all the ports except the originating one.
int ReceiveFeaturesRequest(const void *msg)
virtual bool SupportsSendFrom() const
int ReceivePacketOut(const void *msg)
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
void SendPortStatus(ofi::Port p, uint8_t status)
Send a reply about a Port's status to the controller.
int ReceiveStatsRequest(const void *oh)
int AddFlow(const ofp_flow_mod *ofm)
Add a flow.
a polymophic address class
virtual bool SetMtu(const uint16_t mtu)
NetDevice::ReceiveCallback m_rxCallback
Callbacks.
void SendErrorMsg(uint16_t type, uint16_t code, const void *data, size_t len)
If an error message happened during the controller's request, send it to the controller.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
int ModFlow(const ofp_flow_mod *ofm)
Modify a flow.
uint16_t m_mtu
Maximum Transmission Unit.
virtual void DoDispose(void)
Destructor implementation.
int UpdatePortStatus(ofi::Port &p)
Update the port status field of the switch port.
int GetSwitchPortIndex(ofi::Port p)
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Ptr< Node > m_node
Node this device is installed on.
virtual Ptr< Channel > GetChannel(void) const
virtual bool IsMulticast(void) const
uint32_t GetNSwitchPorts(void) const
void StatsDone(ofi::StatsDumpCallback *cb_)
Stats callback is done.
void DoOutput(uint32_t packet_uid, int in_port, size_t max_len, int out_port, bool ignore_no_fwd)
Called from the OpenFlow Interface to output the Packet on either a Port or the Controller.
static TypeId GetTypeId(void)
Register this type.
void OutputPacket(uint32_t packet_uid, int out_port)
Sends a copy of the Packet over the provided output port.
ofi::Port GetSwitchPort(uint32_t n) const
void RunThroughFlowTable(uint32_t packet_uid, int port, bool send_to_controller=true)
Run the packet through the flow table.
int ReceiveVPortTableFeaturesRequest(const void *msg)
void SendFlowExpired(sw_flow *flow, enum ofp_flow_expired_reason reason)
Send a reply to the controller that a specific flow has expired.
static const char * GetManufacturerDescription()
Time m_lastExecute
Last time the periodic execution occurred.
uint64_t m_id
Unique identifier for this switch, needed for OpenFlow.
void * MakeOpenflowReply(size_t openflow_len, uint8_t type, ofpbuf **bufferp)
Generates an OpenFlow reply message based on the type.
int ForwardControlInput(const void *msg, size_t length)
The registered controller calls this method when sending a message to the switch. ...
PacketData_t m_packetData
Packet data.
int ReceiveFlow(const void *msg)
Callback for a stats dump request.
Ptr< BridgeChannel > m_channel
Collection of port channels into the Switch Channel.
static const char * GetSoftwareDescription()
sw_chain * m_chain
Flow Table; forwarding rules.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual void AddLinkChangeCallback(Callback< void > callback)
Ptr< ofi::Controller > m_controller
Connection to controller.
int ReceiveSetConfig(const void *msg)
virtual bool IsLinkUp(void) const
OpenFlowSwitchNetDevice()
int StatsDump(ofi::StatsDumpCallback *cb_)
Stats callback is ready for a dump.
void OutputPort(uint32_t packet_uid, int in_port, int out_port, bool ignore_no_fwd)
Seeks to send out a Packet over the provided output port.
void SetController(Ptr< ofi::Controller > c)
Set up the Switch's controller connection.
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
virtual void SetAddress(Address address)
Set the address of this interface.
virtual uint32_t GetIfIndex(void) const
Network layer to device interface.
void FillPortDesc(ofi::Port p, ofp_phy_port *desc)
Fill out a description of the switch port.
int AddSwitchPort(Ptr< NetDevice > switchPort)
Add a 'port' to a switch device.
int ReceiveVPortMod(const void *msg)
ofpbuf * BufferFromPacket(Ptr< const Packet > packet, Address src, Address dst, int mtu, uint16_t protocol)
Takes a packet and generates an OpenFlow buffer from it, loading the packet data as well as its heade...
virtual Address GetAddress(void) const
NetDevice::PromiscReceiveCallback m_promiscRxCallback
PacketType
Packet types are used as they are in Linux.
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
std::map< uint32_t, ofi::SwitchPacketMetadata > PacketData_t
void SendVPortTableFeatures()
Send a reply about this OpenFlow switch's virtual port table features to the controller.
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
a unique identifier for an interface.
uint16_t m_missSendLen
Flow Table Miss Send Length; configurable by the controller.
virtual uint16_t GetMtu(void) const
virtual bool IsBroadcast(void) const
int ReceiveEchoReply(const void *oh)
A net device that switches multiple LAN segments via an OpenFlow-compatible flow table.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
Ports_t m_ports
Switch's ports.
std::vector< ofi::Port > Ports_t
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
int SendOpenflowBuffer(ofpbuf *buffer)
Send a message to the controller.
Time m_lookupDelay
Flow Table Lookup Delay [overhead].
virtual ~OpenFlowSwitchNetDevice()