packets: New function eth_pop_vlan(), formerly dp_netdev_pop_vlan().
authorBen Pfaff <blp@nicira.com>
Mon, 14 Nov 2011 22:02:43 +0000 (14:02 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 23 Nov 2011 23:32:37 +0000 (15:32 -0800)
An upcoming commit will add a new user.

lib/dpif-netdev.c
lib/packets.c
lib/packets.h

index 6de4bfc15898df291053de2b285d7a4f1c2b1c7b..eb101349f01a1416bde2da1520587b5f47813703 100644 (file)
@@ -1041,24 +1041,6 @@ dpif_netdev_wait(struct dpif *dpif)
     }
 }
 
-static void
-dp_netdev_pop_vlan(struct ofpbuf *packet)
-{
-    struct vlan_eth_header *veh = packet->l2;
-    if (packet->size >= sizeof *veh
-        && veh->veth_type == htons(ETH_TYPE_VLAN)) {
-        struct eth_header tmp;
-
-        memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
-        memcpy(tmp.eth_src, veh->veth_src, ETH_ADDR_LEN);
-        tmp.eth_type = veh->veth_next_type;
-
-        ofpbuf_pull(packet, VLAN_HEADER_LEN);
-        packet->l2 = (char*)packet->l2 + VLAN_HEADER_LEN;
-        memcpy(packet->data, &tmp, sizeof tmp);
-    }
-}
-
 static void
 dp_netdev_set_dl(struct ofpbuf *packet, const struct ovs_key_ethernet *eth_key)
 {
@@ -1325,7 +1307,7 @@ dp_netdev_execute_actions(struct dp_netdev *dp,
             break;
 
         case OVS_ACTION_ATTR_POP_VLAN:
-            dp_netdev_pop_vlan(packet);
+            eth_pop_vlan(packet);
             break;
 
         case OVS_ACTION_ATTR_SET:
index 03f92e365acd8840054dd1d4c5a2935d3eb11790..46a44bdb38a410f7457bba8cc95dad68176274ae 100644 (file)
@@ -100,6 +100,27 @@ eth_push_vlan(struct ofpbuf *packet, ovs_be16 tci)
     packet->l2 = packet->data;
 }
 
+/* Removes outermost VLAN header (if any is present) from 'packet'.
+ *
+ * 'packet->l2' must initially point to 'packet''s Ethernet header. */
+void
+eth_pop_vlan(struct ofpbuf *packet)
+{
+    struct vlan_eth_header *veh = packet->l2;
+    if (packet->size >= sizeof *veh
+        && veh->veth_type == htons(ETH_TYPE_VLAN)) {
+        struct eth_header tmp;
+
+        memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
+        memcpy(tmp.eth_src, veh->veth_src, ETH_ADDR_LEN);
+        tmp.eth_type = veh->veth_next_type;
+
+        ofpbuf_pull(packet, VLAN_HEADER_LEN);
+        packet->l2 = (char*)packet->l2 + VLAN_HEADER_LEN;
+        memcpy(packet->data, &tmp, sizeof tmp);
+    }
+}
+
 /* Given the IP netmask 'netmask', returns the number of bits of the IP address
  * that it specifies, that is, the number of 1-bits in 'netmask'.  'netmask'
  * must be a CIDR netmask (see ip_is_cidr()). */
index d924492849f3c1a8897ce1a849a3b94199adb920..439a7dd07ffae4a93d832acaf37f42b0c4c5c976 100644 (file)
@@ -132,6 +132,7 @@ void compose_benign_packet(struct ofpbuf *, const char *tag,
                            const uint8_t eth_src[ETH_ADDR_LEN]);
 
 void eth_push_vlan(struct ofpbuf *, ovs_be16 tci);
+void eth_pop_vlan(struct ofpbuf *);
 
 /* Example:
  *