dpif-netdev: preserve packet metadata fields across recirculation
[sliver-openvswitch.git] / lib / flow.c
index e1ea75e..6c6978d 100644 (file)
@@ -88,10 +88,11 @@ parse_mpls(struct ofpbuf *b, struct flow *flow)
     int idx = 0;
 
     while ((mh = ofpbuf_try_pull(b, sizeof *mh))) {
+        ovs_be32 mpls_lse = get_16aligned_be32(&mh->mpls_lse);
         if (idx < FLOW_MAX_MPLS_LABELS) {
-            flow->mpls_lse[idx++] = mh->mpls_lse;
+            flow->mpls_lse[idx++] = mpls_lse;
         }
-        if (mh->mpls_lse & htonl(MPLS_BOS_MASK)) {
+        if (mpls_lse & htonl(MPLS_BOS_MASK)) {
             break;
         }
     }
@@ -369,6 +370,8 @@ flow_extract(struct ofpbuf *packet, const struct pkt_metadata *md,
         flow->in_port = md->in_port;
         flow->skb_priority = md->skb_priority;
         flow->pkt_mark = md->pkt_mark;
+        flow->recirc_id = md->recirc_id;
+        flow->dp_hash = md->dp_hash;
     }
 
     ofpbuf_set_frame(packet, ofpbuf_data(packet));