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;
}
}
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;
}
- packet->l2 = ofpbuf_data(&b);
- ofpbuf_set_l2_5(packet, NULL);
- ofpbuf_set_l3(packet, NULL);
- ofpbuf_set_l4(packet, NULL);
+ ofpbuf_set_frame(packet, ofpbuf_data(packet));
if (ofpbuf_size(&b) < sizeof *eth) {
return;
/* eth_compose() sets l3 pointer and makes sure it is 32-bit aligned. */
eth_compose(b, flow->dl_dst, flow->dl_src, ntohs(flow->dl_type), 0);
if (flow->dl_type == htons(FLOW_DL_TYPE_NONE)) {
- struct eth_header *eth = b->l2;
+ struct eth_header *eth = ofpbuf_l2(b);
eth->eth_type = htons(ofpbuf_size(b));
return;
}