A Discrete-Event Network Simulator
API
openflow-switch-net-device.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation;
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15  *
16  * Author: Blake Hurd <naimorai@gmail.com>
17  */
18 
24 #ifndef OPENFLOW_SWITCH_NET_DEVICE_H
25 #define OPENFLOW_SWITCH_NET_DEVICE_H
26 
27 #include "ns3/simulator.h"
28 #include "ns3/log.h"
29 #include "ns3/mac48-address.h"
30 
31 #include "ns3/ethernet-header.h"
32 #include "ns3/arp-header.h"
33 #include "ns3/tcp-header.h"
34 #include "ns3/udp-header.h"
35 
36 #include "ns3/ipv4-l3-protocol.h"
37 #include "ns3/arp-l3-protocol.h"
38 
39 #include "ns3/bridge-channel.h"
40 #include "ns3/node.h"
41 #include "ns3/enum.h"
42 #include "ns3/string.h"
43 #include "ns3/integer.h"
44 #include "ns3/uinteger.h"
45 
46 #include <map>
47 #include <set>
48 
49 #include "openflow-interface.h"
50 
51 namespace ns3 {
52 
87 {
88 public:
93  static TypeId GetTypeId (void);
94 
109  static const char * GetManufacturerDescription ();
110  static const char * GetHardwareDescription ();
111  static const char * GetSoftwareDescription ();
112  static const char * GetSerialNumber ();
116  virtual ~OpenFlowSwitchNetDevice ();
117 
124 
141  int AddSwitchPort (Ptr<NetDevice> switchPort);
142 
156  int AddVPort (const ofp_vport_mod *ovpm);
157 
167 
175  void StatsDone (ofi::StatsDumpCallback *cb_);
176 
186  void DoOutput (uint32_t packet_uid, int in_port, size_t max_len, int out_port, bool ignore_no_fwd);
187 
195  int ForwardControlInput (const void *msg, size_t length);
196 
200  sw_chain* GetChain ();
201 
205  uint32_t GetNSwitchPorts (void) const;
206 
212 
217  ofi::Port GetSwitchPort (uint32_t n) const;
218 
222  vport_table_t GetVPortTable ();
223 
224  // From NetDevice
225  virtual void SetIfIndex (const uint32_t index);
226  virtual uint32_t GetIfIndex (void) const;
227  virtual Ptr<Channel> GetChannel (void) const;
228  virtual void SetAddress (Address address);
229  virtual Address GetAddress (void) const;
230  virtual bool SetMtu (const uint16_t mtu);
231  virtual uint16_t GetMtu (void) const;
232  virtual bool IsLinkUp (void) const;
233  virtual void AddLinkChangeCallback (Callback<void> callback);
234  virtual bool IsBroadcast (void) const;
235  virtual Address GetBroadcast (void) const;
236  virtual bool IsMulticast (void) const;
237  virtual Address GetMulticast (Ipv4Address multicastGroup) const;
238  virtual bool IsPointToPoint (void) const;
239  virtual bool IsBridge (void) const;
240  virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
241  virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
242  virtual Ptr<Node> GetNode (void) const;
243  virtual void SetNode (Ptr<Node> node);
244  virtual bool NeedsArp (void) const;
247  virtual bool SupportsSendFrom () const;
248  virtual Address GetMulticast (Ipv6Address addr) const;
249 
250 protected:
251  virtual void DoDispose (void);
252 
263  void ReceiveFromDevice (Ptr<NetDevice> netdev, Ptr<const Packet> packet, uint16_t protocol, const Address& src, const Address& dst, PacketType packetType);
264 
275  ofpbuf * BufferFromPacket (Ptr<const Packet> packet, Address src, Address dst, int mtu, uint16_t protocol);
276 
277 private:
286  int AddFlow (const ofp_flow_mod *ofm);
287 
294  int ModFlow (const ofp_flow_mod *ofm);
295 
304  int OutputAll (uint32_t packet_uid, int in_port, bool flood);
305 
311  void OutputPacket (uint32_t packet_uid, int out_port);
312 
324  void OutputPort (uint32_t packet_uid, int in_port, int out_port, bool ignore_no_fwd);
325 
336  void OutputControl (uint32_t packet_uid, int in_port, size_t max_len, int reason);
337 
346  void SendErrorMsg (uint16_t type, uint16_t code, const void *data, size_t len);
347 
369  void SendFeaturesReply ();
370 
377  void SendFlowExpired (sw_flow *flow, enum ofp_flow_expired_reason reason);
378 
385  void SendPortStatus (ofi::Port p, uint8_t status);
386 
390  void SendVPortTableFeatures ();
391 
401  int SendOpenflowBuffer (ofpbuf *buffer);
402 
411  void RunThroughFlowTable (uint32_t packet_uid, int port, bool send_to_controller = true);
412 
422  int RunThroughVPortTable (uint32_t packet_uid, int port, uint32_t vport);
423 
434  void FlowTableLookup (sw_flow_key key, ofpbuf* buffer, uint32_t packet_uid, int port, bool send_to_controller);
435 
443  int UpdatePortStatus (ofi::Port& p);
444 
451  void FillPortDesc (ofi::Port p, ofp_phy_port *desc);
452 
461  void* MakeOpenflowReply (size_t openflow_len, uint8_t type, ofpbuf **bufferp);
462 
474  int ReceiveFeaturesRequest (const void *msg);
475  int ReceiveGetConfigRequest (const void *msg);
476  int ReceiveSetConfig (const void *msg);
477  int ReceivePacketOut (const void *msg);
478  int ReceiveFlow (const void *msg);
479  int ReceivePortMod (const void *msg);
480  int ReceiveStatsRequest (const void *oh);
481  int ReceiveEchoRequest (const void *oh);
482  int ReceiveEchoReply (const void *oh);
483  int ReceiveVPortMod (const void *msg);
484  int ReceiveVPortTableFeaturesRequest (const void *msg);
490 
494  uint32_t m_ifIndex;
495  uint16_t m_mtu;
496 
497  typedef std::map<uint32_t,ofi::SwitchPacketMetadata> PacketData_t;
498  PacketData_t m_packetData;
499 
500  typedef std::vector<ofi::Port> Ports_t;
501  Ports_t m_ports;
502 
504 
505  uint64_t m_id;
507 
509  uint16_t m_flags;
510  uint16_t m_missSendLen;
511 
512  sw_chain *m_chain;
513  vport_table_t m_vportTable;
514 };
515 
516 } // namespace ns3
517 
518 #endif /* OPENFLOW_SWITCH_NET_DEVICE_H */
int ReceiveEchoRequest(const void *oh)
uint32_t GetNSwitchPorts(void) const
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
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...
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.
Definition: net-device.h:296
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.
uint16_t port
Definition: dsdv-manet.cc:44
a polymophic address class
Definition: address.h:90
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)
Register this type.
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.
uint8_t data[writeSize]
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
an EUI-48 address
Definition: mac48-address.h:43
int ReceiveSetConfig(const void *msg)
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.
Definition: ipv6-address.h:48
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
virtual void SetAddress(Address address)
Set the address of this interface.
Network layer to device interface.
Definition: net-device.h:95
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.
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 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.
tuple address
Definition: first.py:37
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.
Definition: type-id.h:58
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.
Port and its metadata.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
int SendOpenflowBuffer(ofpbuf *buffer)
Send a message to the controller.
Time m_lookupDelay
Flow Table Lookup Delay [overhead].