25 #include "ns3/openflow-switch-net-device.h" 
   26 #include "ns3/openflow-interface.h" 
   38     m_chain = chain_create ();
 
   43     chain_destroy (m_chain);
 
   47   virtual void DoRun (
void);
 
   61   size_t actions_len = 0; 
 
   64   Mac48Address dl_src (
"00:00:00:00:00:00"), dl_dst (
"00:00:00:00:00:01");
 
   65   Ipv4Address nw_src (
"192.168.1.1"), nw_dst (
"192.168.1.2");
 
   66   int tp_src = 5000, tp_dst = 80;
 
   72   key.flow.in_port = htons (0);
 
   74   key.flow.dl_vlan = htons (OFP_VLAN_NONE);
 
   75   key.flow.dl_type = htons (ETH_TYPE_IP);
 
   76   key.flow.nw_proto = htons (IP_TYPE_UDP);
 
   78   key.flow.reserved = 0;
 
   79   key.flow.mpls_label1 = htonl (MPLS_INVALID_LABEL);
 
   80   key.flow.mpls_label2 = htonl (MPLS_INVALID_LABEL);
 
   83   dl_src.CopyTo (key.flow.dl_src);
 
   84   dl_dst.
CopyTo (key.flow.dl_dst);
 
   87   key.flow.nw_src = htonl (nw_src.Get ());
 
   88   key.flow.nw_dst = htonl (nw_dst.
Get ());
 
   91   key.flow.tp_src = htonl (tp_src);
 
   92   key.flow.tp_dst = htonl (tp_dst);
 
   96   ofm.header.version = OFP_VERSION;
 
   97   ofm.header.type = OFPT_FLOW_MOD;
 
   98   ofm.header.length = htons (
sizeof (ofp_flow_mod) + actions_len);
 
   99   ofm.command = htons (OFPFC_ADD);
 
  100   ofm.idle_timeout = htons (OFP_FLOW_PERMANENT);
 
  101   ofm.hard_timeout = htons (OFP_FLOW_PERMANENT);
 
  102   ofm.buffer_id = htonl (-1);
 
  103   ofm.priority = OFP_DEFAULT_PRIORITY;
 
  105   ofm.match.wildcards = key.wildcards;                                 
 
  106   ofm.match.in_port = key.flow.in_port;                                
 
  107   memcpy (ofm.match.dl_src, key.flow.dl_src, 
sizeof ofm.match.dl_src); 
 
  108   memcpy (ofm.match.dl_dst, key.flow.dl_dst, 
sizeof ofm.match.dl_dst); 
 
  109   ofm.match.dl_vlan = key.flow.dl_vlan;                                
 
  110   ofm.match.dl_type = key.flow.dl_type;                                
 
  111   ofm.match.nw_proto = key.flow.nw_proto;                              
 
  112   ofm.match.nw_src = key.flow.nw_src;                                  
 
  113   ofm.match.nw_dst = key.flow.nw_dst;                                  
 
  114   ofm.match.tp_src = key.flow.tp_src;                                  
 
  115   ofm.match.tp_dst = key.flow.tp_dst;                                  
 
  116   ofm.match.mpls_label1 = key.flow.mpls_label1;                        
 
  117   ofm.match.mpls_label2 = key.flow.mpls_label1;                        
 
  120   sw_flow *flow = flow_alloc (actions_len);
 
  123   flow_extract_match (&flow->key, &ofm.match);
 
  126   flow->priority = flow->key.wildcards ? ntohs (ofm.priority) : -1;
 
  127   flow->idle_timeout = ntohs (ofm.idle_timeout);
 
  128   flow->hard_timeout = ntohs (ofm.hard_timeout);
 
  129   flow->used = flow->created = time_now ();
 
  130   flow->sf_acts->actions_len = actions_len;
 
  131   flow->byte_count = 0;
 
  132   flow->packet_count = 0;
 
  133   memcpy (flow->sf_acts->actions, ofm.actions, actions_len);
 
  139   NS_TEST_ASSERT_MSG_NE (chain_lookup (m_chain, &key), 0, 
"Key provided doesn't match to the flow that was created from it.");
 
  142   dl_dst.
CopyTo (key.flow.dl_src);
 
  143   dl_src.CopyTo (key.flow.dl_dst);
 
  144   key.flow.nw_src = htonl (nw_dst.
Get ());
 
  145   key.flow.nw_dst = htonl (nw_src.Get ());
 
  146   key.flow.tp_src = htonl (tp_dst);
 
  147   key.flow.tp_dst = htonl (tp_src);
 
  149   NS_TEST_ASSERT_MSG_EQ (chain_lookup (m_chain, &key), 0, 
"Key provided shouldn't match the flow but it does.");
 
  152   dl_dst.
CopyTo (key.flow.dl_dst);
 
  153   dl_src.CopyTo (key.flow.dl_src);
 
  154   key.flow.nw_src = htonl (nw_src.Get ());
 
  155   key.flow.nw_dst = htonl (nw_dst.
Get ());
 
  156   key.flow.tp_src = htonl (tp_src);
 
  157   key.flow.tp_dst = htonl (tp_dst);
 
  161   ofp_action_output acts[1];
 
  162   acts[0].type = htons (OFPAT_OUTPUT);
 
  163   acts[0].len = htons (
sizeof (ofp_action_output));
 
  164   acts[0].port = output_port;
 
  166   uint16_t priority = key.wildcards ? ntohs (ofm.priority) : -1;
 
  167   NS_TEST_ASSERT_MSG_EQ (chain_modify (m_chain, &key, priority, 
false, (
const ofp_action_header*)acts, 
sizeof (acts)), 1, 
"Flow table failed to modify Flow.");
 
  172   NS_TEST_ASSERT_MSG_EQ (chain_delete (m_chain, &key, output_port, 0, 0), 1, 
"Flow table failed to delete Flow.");
 
  173   NS_TEST_ASSERT_MSG_EQ (chain_lookup (m_chain, &key), 0, 
"Key provided shouldn't match the flow but it does.");
 
virtual ~SwitchFlowTableTestCase()
 
void CopyTo(uint8_t buffer[6]) const 
 
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite. 
 
uint32_t Get(void) const 
Get the host-order 32-bit IP address. 
 
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not. 
 
static SwitchTestSuite switchTestSuite
 
SwitchFlowTableTestCase()
 
virtual void DoRun(void)
Implementation to actually run this TestCase. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
Ipv4 addresses are stored in host order in this class. 
 
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not...