A Discrete-Event Network Simulator
API
openflow-switch-net-device.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License version 2 as
4  * published by the Free Software Foundation;
5  *
6  * This program is distributed in the hope that it will be useful,
7  * but WITHOUT ANY WARRANTY; without even the implied warranty of
8  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9  * GNU General Public License for more details.
10  *
11  * You should have received a copy of the GNU General Public License
12  * along with this program; if not, write to the Free Software
13  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14  *
15  * Author: Blake Hurd <naimorai@gmail.com>
16  */
17 
24 #ifndef OPENFLOW_SWITCH_NET_DEVICE_H
25 #define OPENFLOW_SWITCH_NET_DEVICE_H
26 
27 #include "openflow-interface.h"
28 
29 #include "ns3/arp-header.h"
30 #include "ns3/arp-l3-protocol.h"
31 #include "ns3/bridge-channel.h"
32 #include "ns3/enum.h"
33 #include "ns3/ethernet-header.h"
34 #include "ns3/integer.h"
35 #include "ns3/ipv4-l3-protocol.h"
36 #include "ns3/log.h"
37 #include "ns3/mac48-address.h"
38 #include "ns3/node.h"
39 #include "ns3/simulator.h"
40 #include "ns3/string.h"
41 #include "ns3/tcp-header.h"
42 #include "ns3/udp-header.h"
43 #include "ns3/uinteger.h"
44 
45 #include <map>
46 #include <set>
47 
48 namespace ns3
49 {
50 
91 {
92  public:
97  static TypeId GetTypeId();
98 
113  static const char* GetManufacturerDescription();
114  static const char* GetHardwareDescription();
115  static const char* GetSoftwareDescription();
116  static const char* GetSerialNumber();
120  ~OpenFlowSwitchNetDevice() override;
121 
128 
145  int AddSwitchPort(Ptr<NetDevice> switchPort);
146 
160  int AddVPort(const ofp_vport_mod* ovpm);
161 
171 
180 
192  void DoOutput(uint32_t packet_uid,
193  int in_port,
194  size_t max_len,
195  int out_port,
196  bool ignore_no_fwd);
197 
205  int ForwardControlInput(const void* msg, size_t length);
206 
210  sw_chain* GetChain();
211 
215  uint32_t GetNSwitchPorts() const;
216 
222 
227  ofi::Port GetSwitchPort(uint32_t n) const;
228 
232  vport_table_t GetVPortTable();
233 
234  // From NetDevice
235  void SetIfIndex(const uint32_t index) override;
236  uint32_t GetIfIndex() const override;
237  Ptr<Channel> GetChannel() const override;
238  void SetAddress(Address address) override;
239  Address GetAddress() const override;
240  bool SetMtu(const uint16_t mtu) override;
241  uint16_t GetMtu() const override;
242  bool IsLinkUp() const override;
243  void AddLinkChangeCallback(Callback<void> callback) override;
244  bool IsBroadcast() const override;
245  Address GetBroadcast() const override;
246  bool IsMulticast() const override;
247  Address GetMulticast(Ipv4Address multicastGroup) const override;
248  bool IsPointToPoint() const override;
249  bool IsBridge() const override;
250  bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
251  bool SendFrom(Ptr<Packet> packet,
252  const Address& source,
253  const Address& dest,
254  uint16_t protocolNumber) override;
255  Ptr<Node> GetNode() const override;
256  void SetNode(Ptr<Node> node) override;
257  bool NeedsArp() const override;
260  bool SupportsSendFrom() const override;
261  Address GetMulticast(Ipv6Address addr) const override;
262 
263  protected:
264  void DoDispose() override;
265 
276  void ReceiveFromDevice(Ptr<NetDevice> netdev,
277  Ptr<const Packet> packet,
278  uint16_t protocol,
279  const Address& src,
280  const Address& dst,
281  PacketType packetType);
282 
294  ofpbuf* BufferFromPacket(Ptr<const Packet> packet,
295  Address src,
296  Address dst,
297  int mtu,
298  uint16_t protocol);
299 
300  private:
309  int AddFlow(const ofp_flow_mod* ofm);
310 
317  int ModFlow(const ofp_flow_mod* ofm);
318 
328  int OutputAll(uint32_t packet_uid, int in_port, bool flood);
329 
336  void OutputPacket(uint32_t packet_uid, int out_port);
337 
349  void OutputPort(uint32_t packet_uid, int in_port, int out_port, bool ignore_no_fwd);
350 
362  void OutputControl(uint32_t packet_uid, int in_port, size_t max_len, int reason);
363 
372  void SendErrorMsg(uint16_t type, uint16_t code, const void* data, size_t len);
373 
395  void SendFeaturesReply();
396 
403  void SendFlowExpired(sw_flow* flow, ofp_flow_expired_reason reason);
404 
411  void SendPortStatus(ofi::Port p, uint8_t status);
412 
416  void SendVPortTableFeatures();
417 
427  int SendOpenflowBuffer(ofpbuf* buffer);
428 
437  void RunThroughFlowTable(uint32_t packet_uid, int port, bool send_to_controller = true);
438 
448  int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport);
449 
460  void FlowTableLookup(sw_flow_key key,
461  ofpbuf* buffer,
462  uint32_t packet_uid,
463  int port,
464  bool send_to_controller);
465 
474  int UpdatePortStatus(ofi::Port& p);
475 
483  void FillPortDesc(ofi::Port p, ofp_phy_port* desc);
484 
493  void* MakeOpenflowReply(size_t openflow_len, uint8_t type, ofpbuf** bufferp);
494 
506  int ReceivePortMod(const void* msg);
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 ReceiveStatsRequest(const void* msg);
513  int ReceiveEchoRequest(const void* msg);
514  int ReceiveEchoReply(const void* msg);
515  int ReceiveVPortMod(const void* msg);
516  int ReceiveVPortTableFeaturesRequest(const void* msg);
523 
527  uint32_t m_ifIndex;
528  uint16_t m_mtu;
529 
531  typedef std::map<uint32_t, ofi::SwitchPacketMetadata> PacketData_t;
533 
535  typedef std::vector<ofi::Port> Ports_t;
537 
539 
540  uint64_t m_id;
542 
544  uint16_t m_flags;
545  uint16_t m_missSendLen;
546 
547  sw_chain* m_chain;
548  vport_table_t m_vportTable;
549 };
550 
551 } // namespace ns3
552 
553 #endif /* OPENFLOW_SWITCH_NET_DEVICE_H */
a polymophic address class
Definition: address.h:101
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Describes an IPv6 address.
Definition: ipv6-address.h:49
an EUI-48 address
Definition: mac48-address.h:46
Network layer to device interface.
Definition: net-device.h:98
PacketType
Packet types are used as they are in Linux.
Definition: net-device.h:300
A net device that switches multiple LAN segments via an OpenFlow-compatible flow 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.
Mac48Address m_address
Address of this device.
ofi::Port GetSwitchPort(uint32_t n) const
Ptr< Node > m_node
Node this device is installed on.
uint64_t m_id
Unique identifier for this switch, needed for OpenFlow.
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber) override
void * MakeOpenflowReply(size_t openflow_len, uint8_t type, ofpbuf **bufferp)
Generates an OpenFlow reply message based on the type.
Ptr< Channel > GetChannel() const override
void SendFlowExpired(sw_flow *flow, ofp_flow_expired_reason reason)
Send a reply to the controller that a specific flow has expired.
Ptr< BridgeChannel > m_channel
Collection of port channels into the Switch Channel.
void SetNode(Ptr< Node > node) override
void SendPortStatus(ofi::Port p, uint8_t status)
Send a reply about a Port's status to the controller.
Ptr< Node > GetNode() const override
uint16_t m_mtu
Maximum Transmission Unit.
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 RunThroughFlowTable(uint32_t packet_uid, int port, bool send_to_controller=true)
Run the packet through the flow table.
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.
int ModFlow(const ofp_flow_mod *ofm)
Modify a flow.
static const char * GetManufacturerDescription()
vport_table_t m_vportTable
Virtual Port Table.
bool IsBridge() const override
Return true if the net device is acting as a bridge.
void SendFeaturesReply()
Send a reply about this OpenFlow switch's features to the controller.
void SendVPortTableFeatures()
Send a reply about this OpenFlow switch's virtual port table features to the controller.
Time m_lastExecute
Last time the periodic execution occurred.
int ForwardControlInput(const void *msg, size_t length)
The registered controller calls this method when sending a message to the switch.
bool SetMtu(const uint16_t mtu) override
int UpdatePortStatus(ofi::Port &p)
Update the port status field of the switch port.
uint16_t m_flags
Flags; configurable by the controller.
void SetAddress(Address address) override
Set the address of this interface.
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.
void AddLinkChangeCallback(Callback< void > callback) override
uint16_t m_missSendLen
Flow Table Miss Send Length; configurable by the controller.
void SetReceiveCallback(NetDevice::ReceiveCallback cb) override
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 StatsDone(ofi::StatsDumpCallback *cb_)
Stats callback is done.
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.
void OutputPacket(uint32_t packet_uid, int out_port)
Sends a copy of the Packet over the provided output port.
std::map< uint32_t, ofi::SwitchPacketMetadata > PacketData_t
PacketData type.
int AddSwitchPort(Ptr< NetDevice > switchPort)
Add a 'port' to a switch device.
int SendOpenflowBuffer(ofpbuf *buffer)
Send a message to the controller.
void SetController(Ptr< ofi::Controller > c)
Set up the Switch's controller connection.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
Promiscuous Rx Callback.
void DoDispose() override
Destructor implementation.
int StatsDump(ofi::StatsDumpCallback *cb_)
Stats callback is ready for a dump.
Time m_lookupDelay
Flow Table Lookup Delay [overhead].
int AddFlow(const ofp_flow_mod *ofm)
Add a flow.
int RunThroughVPortTable(uint32_t packet_uid, int port, uint32_t vport)
Run the packet through the vport table.
static TypeId GetTypeId()
Register this type.
NetDevice::ReceiveCallback m_rxCallback
Rx Callback.
void SetIfIndex(const uint32_t index) override
void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb) override
static const char * GetSoftwareDescription()
int OutputAll(uint32_t packet_uid, int in_port, bool flood)
Send packets out all the ports except the originating one.
int AddVPort(const ofp_vport_mod *ovpm)
Add a virtual port to a switch device.
static const char * GetHardwareDescription()
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...
Address GetMulticast(Ipv4Address multicastGroup) const override
Make and return a MAC multicast address using the provided multicast group.
Ptr< ofi::Controller > m_controller
Connection to controller.
std::vector< ofi::Port > Ports_t
Switch's port type.
void FillPortDesc(ofi::Port p, ofp_phy_port *desc)
Fill out a description of the switch port.
int ReceiveVPortTableFeaturesRequest(const void *msg)
sw_chain * m_chain
Flow Table; forwarding rules.
bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber) override
bool IsPointToPoint() const override
Return true if the net device is on a point-to-point link.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
a unique identifier for an interface.
Definition: type-id.h:59
uint16_t port
Definition: dsdv-manet.cc:44
address
Definition: first.py:47
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint8_t data[writeSize]
Port and its metadata.
Callback for a stats dump request.