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"
152 int AddVPort (
const ofp_vport_mod *ovpm);
182 void DoOutput (uint32_t packet_uid,
int in_port,
size_t max_len,
int out_port,
bool ignore_no_fwd);
221 virtual void SetIfIndex (
const uint32_t index);
226 virtual bool SetMtu (
const uint16_t mtu);
227 virtual uint16_t
GetMtu (
void)
const;
282 int AddFlow (
const ofp_flow_mod *ofm);
290 int ModFlow (
const ofp_flow_mod *ofm);
300 int OutputAll (uint32_t packet_uid,
int in_port,
bool flood);
320 void OutputPort (uint32_t packet_uid,
int in_port,
int out_port,
bool ignore_no_fwd);
332 void OutputControl (uint32_t packet_uid,
int in_port,
size_t max_len,
int reason);
342 void SendErrorMsg (uint16_t type, uint16_t code,
const void *
data,
size_t len);
373 void SendFlowExpired (sw_flow *flow,
enum ofp_flow_expired_reason reason);
430 void FlowTableLookup (sw_flow_key key, ofpbuf* buffer, uint32_t packet_uid,
int port,
bool send_to_controller);
int ReceiveEchoRequest(const void *oh)
uint32_t GetNSwitchPorts(void) const
Simulation virtual time values and global simulation resolution.
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)
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...
ofpbuf * BufferFromPacket(Ptr< 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 bool NeedsArp(void) const
int AddVPort(const ofp_vport_mod *ovpm)
Add a virtual port to a switch device.
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.
virtual bool IsLinkUp(void) const
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)
PacketType
Packet types are used as they are in Linux.
int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport)
Run the packet through the vport table.
ofi::Port GetSwitchPort(uint32_t n) const
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)
int ReceivePacketOut(const void *msg)
virtual bool SupportsSendFrom() const
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 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.
static TypeId GetTypeId(void)
void OutputPacket(uint32_t packet_uid, int out_port)
Sends a copy of the Packet over the provided output port.
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.
virtual Ptr< Channel > GetChannel(void) const
int ReceiveSetConfig(const void *msg)
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.
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)
Set the address of this interface.
Network layer to device interface.
void FillPortDesc(ofi::Port p, ofp_phy_port *desc)
Fill out a description of the switch port.
virtual bool IsBroadcast(void) const
int AddSwitchPort(Ptr< NetDevice > switchPort)
Add a 'port' to a switch device.
int ReceiveVPortMod(const void *msg)
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.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
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.
a unique identifier for an interface.
uint16_t m_missSendLen
Flow Table Miss Send Length; configurable by the controller.
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
int SendOpenflowBuffer(ofpbuf *buffer)
Send a message to the controller.
Time m_lookupDelay
Flow Table Lookup Delay [overhead].
virtual ~OpenFlowSwitchNetDevice()