Split flow_extract() to flow_extract() and flow_extract_l2_onwards().
This allows extracting while keeping existing packet metadata in the flow.

Signed-off-by: Jarno Rajahalme <jarno.rajaha...@nsn.com>
---
 lib/flow.c |   33 +++++++++++++++++++++++++++++----
 lib/flow.h |    1 +
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/lib/flow.c b/lib/flow.c
index 5e7d1d4..525fb71 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -356,10 +356,6 @@ flow_extract(struct ofpbuf *packet, uint32_t skb_priority, 
uint32_t skb_mark,
              const struct flow_tnl *tnl, uint16_t ofp_in_port,
              struct flow *flow)
 {
-    struct ofpbuf b = *packet;
-    struct eth_header *eth;
-
-    COVERAGE_INC(flow_extract);
 
     memset(flow, 0, sizeof *flow);
 
@@ -371,6 +367,35 @@ flow_extract(struct ofpbuf *packet, uint32_t skb_priority, 
uint32_t skb_mark,
     flow->skb_priority = skb_priority;
     flow->skb_mark = skb_mark;
 
+    flow_extract_l2_onwards(packet, flow);
+}
+
+/* Initializes l2 and higher 'flow' members from 'packet'
+ *
+ * Initializes 'packet' header pointers as follows:
+ *
+ *    - packet->l2 to the start of the Ethernet header.
+ *
+ *    - packet->l2_5 to the start of the MPLS shim header.
+ *
+ *    - packet->l3 to just past the Ethernet header, or just past the
+ *      vlan_header if one is present, to the first byte of the payload of the
+ *      Ethernet frame.
+ *
+ *    - packet->l4 to just past the IPv4 header, if one is present and has a
+ *      correct length, and otherwise NULL.
+ *
+ *    - packet->l7 to just past the TCP or UDP or ICMP header, if one is
+ *      present and has a correct length, and otherwise NULL.
+ */
+void
+flow_extract_l2_onwards(struct ofpbuf *packet, struct flow *flow)
+{
+    struct ofpbuf b = *packet;
+    struct eth_header *eth;
+
+    COVERAGE_INC(flow_extract);
+
     packet->l2   = b.data;
     packet->l2_5 = NULL;
     packet->l3   = NULL;
diff --git a/lib/flow.h b/lib/flow.h
index e6da480..55940ec 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -126,6 +126,7 @@ struct flow_metadata {
 
 void flow_extract(struct ofpbuf *, uint32_t priority, uint32_t mark,
                   const struct flow_tnl *, uint16_t in_port, struct flow *);
+void flow_extract_l2_onwards(struct ofpbuf *, struct flow *);
 void flow_extract_l3_onwards(struct ofpbuf *, struct flow *,
                              ovs_be16 dl_type);
 
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to