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"
74 void update_checksums (ofpbuf *buffer,
const sw_flow_key *key, uint32_t old_word, uint32_t new_word);
82 #define OFP_SUPPORTED_CAPABILITIES ( OFPC_FLOW_STATS \
89 #define OFP_SUPPORTED_ACTIONS ( (1 << OFPAT_OUTPUT) \
90 | (1 << OFPAT_SET_VLAN_VID) \
91 | (1 << OFPAT_SET_VLAN_PCP) \
92 | (1 << OFPAT_STRIP_VLAN) \
93 | (1 << OFPAT_SET_DL_SRC) \
94 | (1 << OFPAT_SET_DL_DST) \
95 | (1 << OFPAT_SET_NW_SRC) \
96 | (1 << OFPAT_SET_NW_DST) \
97 | (1 << OFPAT_SET_TP_SRC) \
98 | (1 << OFPAT_SET_TP_DST) \
99 | (1 << OFPAT_SET_MPLS_LABEL) \
100 | (1 << OFPAT_SET_MPLS_EXP) )
102 #define OFP_SUPPORTED_VPORT_TABLE_ACTIONS ( (1 << OFPPAT_OUTPUT) \
103 | (1 << OFPPAT_POP_MPLS) \
104 | (1 << OFPPAT_PUSH_MPLS) \
105 | (1 << OFPPAT_SET_MPLS_LABEL) \
106 | (1 << OFPPAT_SET_MPLS_EXP) ) \
110 class OpenFlowSwitchNetDevice;
148 Stats (ofp_stats_types _type,
size_t body_len);
158 int DoInit (
const void *body,
int body_len,
void **state);
186 ofp_flow_stats_request
rq;
205 int FlowStatsInit (
const void *body,
int body_len,
void **state);
215 int PortStatsInit (
const void *body,
int body_len,
void **state);
241 static uint16_t
Validate (ofp_action_type type,
size_t len,
const sw_flow_key *key,
const ofp_action_header *ah);
251 static void Execute (ofp_action_type type, ofpbuf *buffer, sw_flow_key *key,
const ofp_action_header *ah);
263 static bool IsValidType (ofp_vport_action_type type);
273 static uint16_t
Validate (ofp_vport_action_type type,
size_t len,
const ofp_action_header *ah);
283 static void Execute (ofp_vport_action_type type, ofpbuf *buffer,
const sw_flow_key *key,
const ofp_action_header *ah);
304 static uint16_t
Validate (er_action_type type,
size_t len);
314 static void Execute (er_action_type type, ofpbuf *buffer,
const sw_flow_key *key,
const er_action_header *ah);
323 ofp_stats_request *
rq;
353 .AddConstructor<Controller> ()
427 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);
505 uint16_t
ValidateActions (
const sw_flow_key *key,
const ofp_action_header *actions,
size_t actions_len);
535 void ExecuteVendor (ofpbuf *buffer,
const sw_flow_key *key,
const ofp_action_header *ah);
545 uint16_t
ValidateVendor (
const sw_flow_key *key,
const ofp_action_header *ah, uint16_t len);
555 #define PKT_BUFFER_BITS 8
556 #define N_PKT_BUFFERS (1 << PKT_BUFFER_BITS)
557 #define PKT_BUFFER_MASK (N_PKT_BUFFERS - 1)
558 #define PKT_COOKIE_BITS (32 - PKT_BUFFER_BITS)