dpif_netdev_execute: Extract flow key from the packet.
authorJarno Rajahalme <jrajahalme@nicira.com>
Thu, 14 Nov 2013 22:35:58 +0000 (14:35 -0800)
committerJarno Rajahalme <jrajahalme@nicira.com>
Thu, 14 Nov 2013 22:35:58 +0000 (14:35 -0800)
Extract the flow key from the packet instead of the execute->key.
This reflects how the kernel datapath behaves.

Also use ofpbuf_clone_with_headroom() instead of open coding the same.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/dpif-netdev.c

index 3007d9f..daa7883 100644 (file)
@@ -1107,8 +1107,7 @@ static int
 dpif_netdev_execute(struct dpif *dpif, const struct dpif_execute *execute)
 {
     struct dp_netdev *dp = get_dp_netdev(dpif);
-    struct ofpbuf copy;
-    struct flow key;
+    struct flow md;
     int error;
 
     if (execute->packet->size < ETH_HEADER_LEN ||
@@ -1116,22 +1115,24 @@ dpif_netdev_execute(struct dpif *dpif, const struct dpif_execute *execute)
         return EINVAL;
     }
 
-    /* Make a deep copy of 'packet', because we might modify its data. */
-    ofpbuf_init(&copy, DP_NETDEV_HEADROOM + execute->packet->size);
-    ofpbuf_reserve(&copy, DP_NETDEV_HEADROOM);
-    ofpbuf_put(&copy, execute->packet->data, execute->packet->size);
-
-    flow_extract(&copy, 0, 0, NULL, NULL, &key);
-    error = dpif_netdev_flow_from_nlattrs(execute->key, execute->key_len,
-                                          &key);
+    /* Get packet metadata. */
+    error = dpif_netdev_flow_from_nlattrs(execute->key, execute->key_len, &md);
     if (!error) {
+        struct ofpbuf *copy;
+        struct flow key;
+
+        /* Make a deep copy of 'packet', because we might modify its data. */
+        copy = ofpbuf_clone_with_headroom(execute->packet, DP_NETDEV_HEADROOM);
+
+        /* Extract flow key. */
+        flow_extract(copy, md.skb_priority, md.pkt_mark, &md.tunnel,
+                     &md.in_port, &key);
         ovs_mutex_lock(&dp_netdev_mutex);
-        dp_netdev_execute_actions(dp, &copy, &key,
+        dp_netdev_execute_actions(dp, copy, &key,
                                   execute->actions, execute->actions_len);
         ovs_mutex_unlock(&dp_netdev_mutex);
+        ofpbuf_delete(copy);
     }
-
-    ofpbuf_uninit(&copy);
     return error;
 }