--- lib/flow.c | 21 +++++++++++++++++++++ lib/flow.h | 3 +++ 2 files changed, 24 insertions(+), 0 deletions(-)
diff --git a/lib/flow.c b/lib/flow.c index 1263734..bf7ba6d 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -985,6 +985,27 @@ flow_hash_fields_valid(enum nx_hash_fields fields) || fields == NX_HASH_FIELDS_SYMMETRIC_L4; } +void +flow_set_vlan_vid(struct flow *flow, ovs_be16 vid) +{ + if (vid == htons(OFP_VLAN_NONE)) { + flow->vlan_tci = htons(0); + } else { + vid &= htons(VLAN_VID_MASK); + flow->vlan_tci &= ~htons(VLAN_VID_MASK); + flow->vlan_tci |= htons(VLAN_CFI) | vid; + } +} + +void +flow_set_vlan_pcp(struct flow *flow, uint8_t pcp) +{ + pcp &= 0x07; + flow->vlan_tci &= ~htons(VLAN_PCP_MASK); + flow->vlan_tci |= htons((pcp << VLAN_PCP_SHIFT) | VLAN_CFI); +} + + /* Puts into 'b' a packet that flow_extract() would parse as having the given * 'flow'. * diff --git a/lib/flow.h b/lib/flow.h index 0abfe5a..b26949c 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -97,6 +97,9 @@ static inline int flow_compare(const struct flow *, const struct flow *); static inline bool flow_equal(const struct flow *, const struct flow *); static inline size_t flow_hash(const struct flow *, uint32_t basis); +void flow_set_vlan_vid(struct flow *, ovs_be16 vid); +void flow_set_vlan_pcp(struct flow *, uint8_t pcp); + void flow_compose(struct ofpbuf *, const struct flow *); static inline int -- 1.7.2.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev