18 #ifndef OPENFLOW_INTERFACE_H    19 #define OPENFLOW_INTERFACE_H    25 #include "ns3/simulator.h"    27 #include "ns3/net-device.h"    28 #include "ns3/packet.h"    29 #include "ns3/address.h"    30 #include "ns3/nstime.h"    31 #include "ns3/mac48-address.h"    38 #include "openflow/openflow.h"    39 #include "openflow/nicira-ext.h"    40 #include "openflow/ericsson-ext.h"    45 #define private _private    46 #define delete _delete    50 #include "openflow/private/csum.h"    51 #include "openflow/private/poll-loop.h"    52 #include "openflow/private/rconn.h"    53 #include "openflow/private/stp.h"    54 #include "openflow/private/vconn.h"    55 #include "openflow/private/xtoxll.h"    58 #include "openflow/private/chain.h"    59 #include "openflow/private/table.h"    60 #include "openflow/private/datapath.h"     64 #include "openflow/private/dp_act.h"     65 void set_vlan_vid (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    66 void set_vlan_pcp (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    67 void strip_vlan (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    68 void set_dl_addr (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    69 void set_nw_addr (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    70 void set_tp_port (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    71 void set_mpls_label (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    72 void set_mpls_exp (ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
    73 #include "openflow/private/pt_act.h"    81 #define OFP_SUPPORTED_CAPABILITIES ( OFPC_FLOW_STATS            \    88 #define OFP_SUPPORTED_ACTIONS ( (1 << OFPAT_OUTPUT)             \    89                                 | (1 << OFPAT_SET_VLAN_VID)     \    90                                 | (1 << OFPAT_SET_VLAN_PCP)     \    91                                 | (1 << OFPAT_STRIP_VLAN)       \    92                                 | (1 << OFPAT_SET_DL_SRC)       \    93                                 | (1 << OFPAT_SET_DL_DST)       \    94                                 | (1 << OFPAT_SET_NW_SRC)       \    95                                 | (1 << OFPAT_SET_NW_DST)       \    96                                 | (1 << OFPAT_SET_TP_SRC)       \    97                                 | (1 << OFPAT_SET_TP_DST)       \    98                                 | (1 << OFPAT_SET_MPLS_LABEL)   \    99                                 | (1 << OFPAT_SET_MPLS_EXP) )   101 #define OFP_SUPPORTED_VPORT_TABLE_ACTIONS ( (1 << OFPPAT_OUTPUT)                \   102                                             | (1 << OFPPAT_POP_MPLS)            \   103                                             | (1 << OFPPAT_PUSH_MPLS)           \   104                                             | (1 << OFPPAT_SET_MPLS_LABEL)      \   105                                             | (1 << OFPPAT_SET_MPLS_EXP) )      \   109 class OpenFlowSwitchNetDevice;
   147   Stats (ofp_stats_types _type, 
size_t body_len);
   157   int DoInit (
const void *body, 
int body_len, 
void **state);
   185     ofp_flow_stats_request 
rq;
   204   int FlowStatsInit (
const void *body, 
int body_len, 
void **state);
   214   int PortStatsInit (
const void *body, 
int body_len, 
void **state);
   240   static uint16_t 
Validate (ofp_action_type type, 
size_t len, 
const sw_flow_key *key, 
const ofp_action_header *ah);
   250   static void Execute (ofp_action_type type, ofpbuf *buffer, sw_flow_key *key, 
const ofp_action_header *ah);
   262   static bool IsValidType (ofp_vport_action_type type);
   272   static uint16_t 
Validate (ofp_vport_action_type type, 
size_t len, 
const ofp_action_header *ah);
   282   static void Execute (ofp_vport_action_type type, ofpbuf *buffer, 
const sw_flow_key *key, 
const ofp_action_header *ah);
   303   static uint16_t 
Validate (er_action_type type, 
size_t len);
   313   static void Execute (er_action_type type, ofpbuf *buffer, 
const sw_flow_key *key, 
const er_action_header *ah);
   322   ofp_stats_request *
rq;                
   416   ofp_flow_mod* 
BuildFlow (sw_flow_key key, uint32_t buffer_id, uint16_t command, 
void* acts, 
size_t actions_len, 
int idle_timeout, 
int hard_timeout);
   502 uint16_t 
ValidateActions (
const sw_flow_key *key, 
const ofp_action_header *actions, 
size_t actions_len);
   532 void ExecuteVendor (ofpbuf *buffer, 
const sw_flow_key *key, 
const ofp_action_header *ah);
   542 uint16_t 
ValidateVendor (
const sw_flow_key *key, 
const ofp_action_header *ah, uint16_t len);
   552 #define PKT_BUFFER_BITS 8   553 #define N_PKT_BUFFERS (1 << PKT_BUFFER_BITS)   554 #define PKT_BUFFER_MASK (N_PKT_BUFFERS - 1)   555 #define PKT_COOKIE_BITS (32 - PKT_BUFFER_BITS) void StartDump(StatsDumpCallback *cb)
Starts a callback-based, reliable, possibly multi-message reply to a request made by the controller...
void strip_vlan(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
void discard_buffer(uint32_t id)
static bool IsValidType(ofp_action_type type)
Simulation virtual time values and global simulation resolution. 
Smart pointer class similar to boost::intrusive_ptr. 
void ExecuteActions(Ptr< OpenFlowSwitchNetDevice > swtch, uint64_t packet_uid, ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *actions, size_t actions_len, int ignore_no_fwd)
Executes a list of flow table actions. 
static TypeId GetTypeId(void)
Register this type. 
sw_table_position position
Ptr< OpenFlowSwitchNetDevice > swtch
The switch that we're requesting data from. 
int(* AggregateDumpCallback)(sw_flow *flow, void *state)
static TypeId GetTypeId(void)
Register this type. 
int DoInit(const void *body, int body_len, void **state)
Prepares to dump some kind of statistics on the connected OpenFlowSwitchNetDevice. 
int(* FlowDumpCallback)(sw_flow *flow, void *state)
uint32_t config
Some subset of OFPPC_* flags. 
int AggregateStatsInit(const void *body, int body_len, void **state)
void ReceiveFromSwitch(Ptr< OpenFlowSwitchNetDevice > swtch, ofpbuf *buffer)
A switch calls this method to pass a message on to the Controller. 
int AggregateStatsDump(Ptr< OpenFlowSwitchNetDevice > dp, ofp_aggregate_stats_request *s, ofpbuf *buffer)
ofpbuf * retrieve_buffer(uint32_t id)
void ReceiveFromSwitch(Ptr< OpenFlowSwitchNetDevice > swtch, ofpbuf *buffer)
A switch calls this method to pass a message on to the Controller. 
Demonstration of a Drop controller. 
Stats(ofp_stats_types _type, size_t body_len)
unsigned long long int rx_packets
int PortTableStatsDump(Ptr< OpenFlowSwitchNetDevice > dp, void *state, ofpbuf *buffer)
void set_dl_addr(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
virtual void ReceiveFromSwitch(Ptr< OpenFlowSwitchNetDevice > swtch, ofpbuf *buffer)
A switch calls this method to pass a message on to the Controller. 
a polymophic address class 
bool done
Whether we are done requesting stats. 
int TableStatsDump(Ptr< OpenFlowSwitchNetDevice > dp, void *state, ofpbuf *buffer)
Stats * s
Handler of the stats request. 
static uint16_t Validate(ofp_vport_action_type type, size_t len, const ofp_action_header *ah)
Validates the action on whether its data is valid or not. 
NS_ASSERT() and NS_ASSERT_MSG() macro definitions. 
void ExecuteVPortActions(Ptr< OpenFlowSwitchNetDevice > swtch, uint64_t packet_uid, ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *actions, size_t actions_len)
Executes a list of virtual port table entry actions. 
static void Execute(er_action_type type, ofpbuf *buffer, const sw_flow_key *key, const er_action_header *ah)
Executes the action. 
LearnState_t m_learnState
Learned state data. 
static bool IsValidType(er_action_type type)
void * state
Stats request state data. 
static void Execute(ofp_vport_action_type type, ofpbuf *buffer, const sw_flow_key *key, const ofp_action_header *ah)
Executes the action. 
static TypeId GetTypeId(void)
Register this type. 
std::map< Mac48Address, LearnedState > LearnState_t
Switches_t m_switches
The collection of switches registered to this controller. 
ofp_flow_stats_request rq
Callback for a stats dump request. 
static uint16_t Validate(er_action_type type, size_t len)
Validates the action on whether its data is valid or not. 
uint32_t save_buffer(ofpbuf *)
unsigned long long int tx_bytes
int DoDump(Ptr< OpenFlowSwitchNetDevice > swtch, void *state, ofpbuf *buffer)
Appends statistics for OpenFlowSwitchNetDevice to 'buffer'. 
uint32_t port
Learned port. 
An interface for a Controller of OpenFlowSwitchNetDevices. 
uint32_t num_ports
Number of ports in host byte order. 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
void set_tp_port(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
int PortStatsDump(Ptr< OpenFlowSwitchNetDevice > dp, PortStatsState *s, ofpbuf *buffer)
unsigned long long int tx_dropped
Demonstration of a Learning controller. 
virtual void SendToSwitch(Ptr< OpenFlowSwitchNetDevice > swtch, void *msg, size_t length)
However the controller is implemented, this method is to be used to pass a message on to a switch...
ofp_stats_request * rq
Current stats request. 
Class for handling virtual port table actions. 
void set_mpls_exp(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
int FlowStatsInit(const void *body, int body_len, void **state)
uint16_t ValidateActions(const sw_flow_key *key, const ofp_action_header *actions, size_t actions_len)
Validates a list of flow table actions. 
Class for handling Ericsson Vendor-defined actions. 
unsigned long long int rx_bytes
uint32_t * ports
Array of ports in network byte order. 
virtual void AddSwitch(Ptr< OpenFlowSwitchNetDevice > swtch)
Adds a switch to the controller. 
ofp_flow_mod * BuildFlow(sw_flow_key key, uint32_t buffer_id, uint16_t command, void *acts, size_t actions_len, int idle_timeout, int hard_timeout)
Construct flow data from a matching key to build a flow entry for adding, modifying, or deleting a flow. 
virtual ~LearningController()
static uint16_t Validate(ofp_action_type type, size_t len, const sw_flow_key *key, const ofp_action_header *ah)
Validates the action on whether its data is valid or not. 
unsigned long long int mpls_ttl0_dropped
void set_vlan_pcp(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
void set_nw_addr(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
Time m_expirationTime
Time it takes for learned MAC state entry/created flow to expire. 
uint8_t GetPacketType(ofpbuf *buffer)
Get the packet type on the buffer, which can then be used to determine how to handle the buffer...
int DescStatsDump(void *state, ofpbuf *buffer)
State of the FlowStats request/reply. 
int PortStatsInit(const void *body, int body_len, void **state)
std::set< Ptr< OpenFlowSwitchNetDevice > > Switches_t
A base class which provides memory management and object aggregation. 
void set_mpls_label(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
static bool IsValidType(ofp_vport_action_type type)
uint16_t ValidateVPortActions(const ofp_action_header *actions, size_t actions_len)
Validates a list of virtual port table entry actions. 
void ExecuteVendor(ofpbuf *buffer, const sw_flow_key *key, const ofp_action_header *ah)
Executes a vendor-defined action. 
int FlowStatsDump(Ptr< OpenFlowSwitchNetDevice > dp, FlowStatsState *s, ofpbuf *buffer)
a unique identifier for an interface. 
uint32_t state
Some subset of OFPPS_* flags. 
static void Execute(ofp_action_type type, ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
Executes the action. 
void DoCleanup(void *state)
Cleans any state created by the init or dump functions. 
unsigned long long int tx_packets
uint16_t ValidateVendor(const sw_flow_key *key, const ofp_action_header *ah, uint16_t len)
Validates a vendor-defined action. 
void set_vlan_vid(ofpbuf *buffer, sw_flow_key *key, const ofp_action_header *ah)
State of the PortStats request/reply. 
virtual ~Controller()
Destructor. 
Class for handling flow table actions.