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"
49 #include "openflow-interface.h"
89 static TypeId GetTypeId (
void);
101 static const char * GetManufacturerDescription ();
102 static const char * GetHardwareDescription ();
103 static const char * GetSoftwareDescription ();
104 static const char * GetSerialNumber ();
148 int AddVPort (
const ofp_vport_mod *ovpm);
178 void DoOutput (uint32_t packet_uid,
int in_port,
size_t max_len,
int out_port,
bool ignore_no_fwd);
218 virtual void SetIfIndex (
const uint32_t index);
223 virtual bool SetMtu (
const uint16_t mtu);
224 virtual uint16_t
GetMtu (
void)
const;
286 int AddFlow (
const ofp_flow_mod *ofm);
296 int ModFlow (
const ofp_flow_mod *ofm);
308 int OutputAll (uint32_t packet_uid,
int in_port,
bool flood);
332 void OutputPort (uint32_t packet_uid,
int in_port,
int out_port,
bool ignore_no_fwd);
346 void OutputControl (uint32_t packet_uid,
int in_port,
size_t max_len,
int reason);
358 void SendErrorMsg (uint16_t type, uint16_t code,
const void *data,
size_t len);
393 void SendFlowExpired (sw_flow *flow,
enum ofp_flow_expired_reason reason);
462 void FlowTableLookup (sw_flow_key key, ofpbuf* buffer, uint32_t packet_uid,
int port,
bool send_to_controller);
507 int ReceiveFeaturesRequest (
const void *msg);
508 int ReceiveGetConfigRequest (
const void *msg);
509 int ReceiveSetConfig (
const void *msg);
510 int ReceivePacketOut (
const void *msg);
511 int ReceiveFlow (
const void *msg);
512 int ReceivePortMod (
const void *msg);
513 int ReceiveStatsRequest (
const void *oh);
514 int ReceiveEchoRequest (
const void *oh);
515 int ReceiveEchoReply (
const void *oh);
516 int ReceiveVPortMod (
const void *msg);
517 int ReceiveVPortTableFeaturesRequest (
const void *msg);
530 typedef std::map<uint32_t,ofi::SwitchPacketMetadata> PacketData_t;
533 typedef std::vector<ofi::Port> Ports_t;
uint32_t GetNSwitchPorts(void) const
uint32_t m_ifIndex
Interface Index.
vport_table_t GetVPortTable()
void ReceiveFromDevice(Ptr< NetDevice > netdev, Ptr< const Packet > packet, uint16_t protocol, const Address &src, const Address &dst, PacketType packetType)
void FlowTableLookup(sw_flow_key key, ofpbuf *buffer, uint32_t packet_uid, int port, bool send_to_controller)
ofpbuf * BufferFromPacket(Ptr< Packet > packet, Address src, Address dst, int mtu, uint16_t protocol)
virtual bool NeedsArp(void) const
int AddVPort(const ofp_vport_mod *ovpm)
Add a virtual port to a switch device.
uint16_t m_flags
Flags; configurable by the controller.
vport_table_t m_vportTable
Virtual Port Table.
virtual bool IsLinkUp(void) const
virtual void SetNode(Ptr< Node > node)
virtual void SetIfIndex(const uint32_t index)
int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport)
ofi::Port GetSwitchPort(uint32_t n) const
void OutputControl(uint32_t packet_uid, int in_port, size_t max_len, int reason)
Mac48Address m_address
Address of this device.
int OutputAll(uint32_t packet_uid, int in_port, bool flood)
virtual bool SupportsSendFrom() const
void SendPortStatus(ofi::Port p, uint8_t status)
int AddFlow(const ofp_flow_mod *ofm)
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)
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
int ModFlow(const ofp_flow_mod *ofm)
uint16_t m_mtu
Maximum Transmission Unit.
virtual void DoDispose(void)
int UpdatePortStatus(ofi::Port &p)
int GetSwitchPortIndex(ofi::Port p)
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Ptr< Node > m_node
Node this device is installed on.
virtual uint16_t GetMtu(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.
void OutputPacket(uint32_t packet_uid, int out_port)
void RunThroughFlowTable(uint32_t packet_uid, int port, bool send_to_controller=true)
void SendFlowExpired(sw_flow *flow, enum ofp_flow_expired_reason reason)
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)
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.
Callback for a stats dump request.
Ptr< BridgeChannel > m_channel
Collection of port channels into the Switch Channel.
sw_chain * m_chain
Flow Table; forwarding rules.
virtual void AddLinkChangeCallback(Callback< void > callback)
Ptr< ofi::Controller > m_controller
Connection to controller.
virtual Ptr< Channel > GetChannel(void) const
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)
virtual Address GetAddress(void) const
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
void SetController(Ptr< ofi::Controller > c)
Set up the Switch's controller connection.
virtual uint32_t GetIfIndex(void) const
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
virtual void SetAddress(Address address)
Network layer to device interface.
void FillPortDesc(ofi::Port p, ofp_phy_port *desc)
virtual bool IsBroadcast(void) const
int AddSwitchPort(Ptr< NetDevice > switchPort)
Add a 'port' to a switch device.
virtual Ptr< Node > GetNode(void) const
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
virtual Address GetBroadcast(void) const
virtual bool IsMulticast(void) const
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
void SendVPortTableFeatures()
a unique identifier for an interface.
uint16_t m_missSendLen
Flow Table Miss Send Length; configurable by the controller.
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.
int SendOpenflowBuffer(ofpbuf *buffer)
Time m_lookupDelay
Flow Table Lookup Delay [overhead].