X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fflow.c;h=b1b9f989a7710961e1bcf1a145a698ce31e150f5;hb=fe29af4c888d48cc1f16b1a247c2ffb6f0864522;hp=8f80f88c14129288110ebf40633fc54aa6bcb710;hpb=d8d9c698b853d67fcf55cb0e8c57cc8fbcdfe0d9;p=sliver-openvswitch.git diff --git a/lib/flow.c b/lib/flow.c index 8f80f88c1..b1b9f989a 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -725,24 +725,22 @@ flow_wildcards_fold_minimask(struct flow_wildcards *wc, flow_union_with_miniflow(&wc->masks, &mask->masks); } -inline uint64_t +uint64_t miniflow_get_map_in_range(const struct miniflow *miniflow, - uint8_t start, uint8_t end, const uint32_t **data) + uint8_t start, uint8_t end, unsigned int *offset) { uint64_t map = miniflow->map; - uint32_t *p = miniflow->values; + *offset = 0; if (start > 0) { uint64_t msk = (UINT64_C(1) << start) - 1; /* 'start' LSBs set */ - p += count_1bits(map & msk); /* Skip to start. */ + *offset = count_1bits(map & msk); map &= ~msk; } if (end < FLOW_U32S) { uint64_t msk = (UINT64_C(1) << end) - 1; /* 'end' LSBs set */ map &= msk; } - - *data = p; return map; } @@ -754,8 +752,10 @@ flow_wildcards_fold_minimask_range(struct flow_wildcards *wc, uint8_t start, uint8_t end) { uint32_t *dst_u32 = (uint32_t *)&wc->masks; - const uint32_t *p; - uint64_t map = miniflow_get_map_in_range(&mask->masks, start, end, &p); + unsigned int offset; + uint64_t map = miniflow_get_map_in_range(&mask->masks, start, end, + &offset); + const uint32_t *p = mask->masks.values + offset; for (; map; map = zero_rightmost_1bit(map)) { dst_u32[raw_ctz(map)] |= *p++; @@ -940,7 +940,7 @@ flow_mask_hash_fields(const struct flow *flow, struct flow_wildcards *wc, break; default: - NOT_REACHED(); + OVS_NOT_REACHED(); } } @@ -958,7 +958,7 @@ flow_hash_fields(const struct flow *flow, enum nx_hash_fields fields, return flow_hash_symmetric_l4(flow, basis); } - NOT_REACHED(); + OVS_NOT_REACHED(); } /* Returns a string representation of 'fields'. */ @@ -1168,7 +1168,7 @@ flow_compose(struct ofpbuf *b, const struct flow *flow) } if (flow->vlan_tci & htons(VLAN_CFI)) { - eth_push_vlan(b, flow->vlan_tci); + eth_push_vlan(b, htons(ETH_TYPE_VLAN), flow->vlan_tci); } if (flow->dl_type == htons(ETH_TYPE_IP)) { @@ -1516,11 +1516,7 @@ miniflow_hash_in_minimask(const struct miniflow *flow, hash = basis; for (map = mask->masks.map; map; map = zero_rightmost_1bit(map)) { - if (*p) { - int ofs = raw_ctz(map); - hash = mhash_add(hash, miniflow_get(flow, ofs) & *p); - } - p++; + hash = mhash_add(hash, miniflow_get(flow, raw_ctz(map)) & *p++); } return mhash_finish(hash, (p - mask->masks.values) * 4); @@ -1542,10 +1538,7 @@ flow_hash_in_minimask(const struct flow *flow, const struct minimask *mask, hash = basis; for (map = mask->masks.map; map; map = zero_rightmost_1bit(map)) { - if (*p) { - hash = mhash_add(hash, flow_u32[raw_ctz(map)] & *p); - } - p++; + hash = mhash_add(hash, flow_u32[raw_ctz(map)] & *p++); } return mhash_finish(hash, (p - mask->masks.values) * 4); @@ -1562,15 +1555,14 @@ flow_hash_in_minimask_range(const struct flow *flow, uint8_t start, uint8_t end, uint32_t *basis) { const uint32_t *flow_u32 = (const uint32_t *)flow; - const uint32_t *p; - uint64_t map = miniflow_get_map_in_range(&mask->masks, start, end, &p); + unsigned int offset; + uint64_t map = miniflow_get_map_in_range(&mask->masks, start, end, + &offset); + const uint32_t *p = mask->masks.values + offset; uint32_t hash = *basis; for (; map; map = zero_rightmost_1bit(map)) { - if (*p) { - hash = mhash_add(hash, flow_u32[raw_ctz(map)] & *p); - } - p++; + hash = mhash_add(hash, flow_u32[raw_ctz(map)] & *p++); } *basis = hash; /* Allow continuation from the unfinished value. */