nx-match: Make more fields writable with NXAST_REG_MOVE and other actions.
authorBen Pfaff <blp@nicira.com>
Mon, 18 Jul 2011 22:26:43 +0000 (15:26 -0700)
committerBen Pfaff <blp@nicira.com>
Tue, 26 Jul 2011 17:44:48 +0000 (10:44 -0700)
Until now, fields writable by actions defined in terms of NXM field
numbers were special cases, but commit b3e9b2eda9a "ofproto: Optimize
datapath actions" had the side effect of making it easy to modify
additional fields.  This commit takes advantage of that to make
modifiable all the fields that the kernel datapath supports modifying.
We could make other fields modifiable by adding more support to the kernel
datapath.

include/openflow/nicira-ext.h
lib/nx-match.c
lib/nx-match.def

index b97cd4fcbf077c2ad1c7e0ec4f56c01bd441e006..5cf02e7c58a1b4fe6dac19b18c14104f503cbeee 100644 (file)
@@ -427,6 +427,18 @@ OFP_ASSERT(sizeof(struct nx_action_pop_queue) == 16);
  *
  * The following nxm_header values are potentially acceptable as 'dst':
  *
+ *   - NXM_OF_ETH_DST
+ *   - NXM_OF_ETH_SRC
+ *   - NXM_OF_IP_TOS
+ *   - NXM_OF_IP_SRC
+ *   - NXM_OF_IP_DST
+ *   - NXM_OF_TCP_SRC
+ *   - NXM_OF_TCP_DST
+ *   - NXM_OF_UDP_SRC
+ *   - NXM_OF_UDP_DST
+ *     Modifying any of the above fields changes the corresponding packet
+ *     header.
+ *
  *   - NXM_NX_REG(idx) for idx in the switch's accepted range.
  *
  *   - NXM_OF_VLAN_TCI.  Modifying this field's value has side effects on the
index 6c48d024706909c73fb232b23b79eac9b792a08c..e698cc628504d4ebf2f15728ac0109d6f9a6275c 100644 (file)
@@ -1366,6 +1366,14 @@ nxm_write_field(const struct nxm_field *dst, struct flow *flow,
                 uint64_t new_value)
 {
     switch (dst->index) {
+    case NFI_NXM_OF_ETH_DST:
+        eth_addr_from_uint64(new_value, flow->dl_dst);
+        break;
+
+    case NFI_NXM_OF_ETH_SRC:
+        eth_addr_from_uint64(new_value, flow->dl_src);
+        break;
+
     case NFI_NXM_OF_VLAN_TCI:
         flow->vlan_tci = htons(new_value);
         break;
@@ -1395,21 +1403,34 @@ nxm_write_field(const struct nxm_field *dst, struct flow *flow,
 #error
 #endif
 
-    case NFI_NXM_OF_IN_PORT:
-    case NFI_NXM_OF_ETH_DST:
-    case NFI_NXM_OF_ETH_SRC:
-    case NFI_NXM_OF_ETH_TYPE:
     case NFI_NXM_OF_IP_TOS:
-    case NFI_NXM_OF_IP_PROTO:
-    case NFI_NXM_OF_ARP_OP:
+        flow->nw_tos = new_value & IP_DSCP_MASK;
+        break;
+
     case NFI_NXM_OF_IP_SRC:
-    case NFI_NXM_OF_ARP_SPA:
+        flow->nw_src = htonl(new_value);
+        break;
+
     case NFI_NXM_OF_IP_DST:
-    case NFI_NXM_OF_ARP_TPA:
+        flow->nw_dst = htonl(new_value);
+        break;
+
     case NFI_NXM_OF_TCP_SRC:
     case NFI_NXM_OF_UDP_SRC:
+        flow->tp_src = htons(new_value);
+        break;
+
     case NFI_NXM_OF_TCP_DST:
     case NFI_NXM_OF_UDP_DST:
+        flow->tp_dst = htons(new_value);
+        break;
+
+    case NFI_NXM_OF_IN_PORT:
+    case NFI_NXM_OF_ETH_TYPE:
+    case NFI_NXM_OF_IP_PROTO:
+    case NFI_NXM_OF_ARP_OP:
+    case NFI_NXM_OF_ARP_SPA:
+    case NFI_NXM_OF_ARP_TPA:
     case NFI_NXM_OF_ICMP_TYPE:
     case NFI_NXM_OF_ICMP_CODE:
     case NFI_NXM_NX_TUN_ID_W:
index 4a42aaa47bfe999d015a9ea79600f3a337fe6b74..215e71aae79e804178070058bd0bcb6ef19fee86 100644 (file)
 /*             ------------    ------------  -----------    ------------- --- */
 DEFINE_FIELD_M(NX_TUN_ID,      0,            NXM_DL_NONE,   0,            true)
 DEFINE_FIELD  (OF_IN_PORT,     FWW_IN_PORT,  NXM_DL_NONE,   0,            false)
-DEFINE_FIELD_M(OF_ETH_DST,     0,            NXM_DL_NONE,   0,            false)
-DEFINE_FIELD  (OF_ETH_SRC,     FWW_DL_SRC,   NXM_DL_NONE,   0,            false)
+DEFINE_FIELD_M(OF_ETH_DST,     0,            NXM_DL_NONE,   0,            true)
+DEFINE_FIELD  (OF_ETH_SRC,     FWW_DL_SRC,   NXM_DL_NONE,   0,            true)
 DEFINE_FIELD  (OF_ETH_TYPE,    FWW_DL_TYPE,  NXM_DL_NONE,   0,            false)
 DEFINE_FIELD_M(OF_VLAN_TCI,    0,            NXM_DL_NONE,   0,            true)
-DEFINE_FIELD  (OF_IP_TOS,      FWW_NW_TOS,   NXM_DL_IP_ANY, 0,            false)
+DEFINE_FIELD  (OF_IP_TOS,      FWW_NW_TOS,   NXM_DL_IP_ANY, 0,            true)
 DEFINE_FIELD  (OF_IP_PROTO,    FWW_NW_PROTO, NXM_DL_IP_ANY, 0,            false)
-DEFINE_FIELD_M(OF_IP_SRC,      0,            NXM_DL_IP,     0,            false)
-DEFINE_FIELD_M(OF_IP_DST,      0,            NXM_DL_IP,     0,            false)
-DEFINE_FIELD  (OF_TCP_SRC,     FWW_TP_SRC,   NXM_DL_IP_ANY, IPPROTO_TCP,  false)
-DEFINE_FIELD  (OF_TCP_DST,     FWW_TP_DST,   NXM_DL_IP_ANY, IPPROTO_TCP,  false)
-DEFINE_FIELD  (OF_UDP_SRC,     FWW_TP_SRC,   NXM_DL_IP_ANY, IPPROTO_UDP,  false)
-DEFINE_FIELD  (OF_UDP_DST,     FWW_TP_DST,   NXM_DL_IP_ANY, IPPROTO_UDP,  false)
+DEFINE_FIELD_M(OF_IP_SRC,      0,            NXM_DL_IP,     0,            true)
+DEFINE_FIELD_M(OF_IP_DST,      0,            NXM_DL_IP,     0,            true)
+DEFINE_FIELD  (OF_TCP_SRC,     FWW_TP_SRC,   NXM_DL_IP_ANY, IPPROTO_TCP,  true)
+DEFINE_FIELD  (OF_TCP_DST,     FWW_TP_DST,   NXM_DL_IP_ANY, IPPROTO_TCP,  true)
+DEFINE_FIELD  (OF_UDP_SRC,     FWW_TP_SRC,   NXM_DL_IP_ANY, IPPROTO_UDP,  true)
+DEFINE_FIELD  (OF_UDP_DST,     FWW_TP_DST,   NXM_DL_IP_ANY, IPPROTO_UDP,  true)
 DEFINE_FIELD  (OF_ICMP_TYPE,   FWW_TP_SRC,   NXM_DL_IP,     IPPROTO_ICMP, false)
 DEFINE_FIELD  (OF_ICMP_CODE,   FWW_TP_DST,   NXM_DL_IP,     IPPROTO_ICMP, false)
 DEFINE_FIELD  (OF_ARP_OP,      FWW_NW_PROTO, NXM_DL_ARP,    0,            false)