From: wenxu <[email protected]> Add this feature to help only nw_src or nw_dst hash senario.
Signed-off-by: wenxu <[email protected]> --- include/openflow/nicira-ext.h | 7 ++++++- lib/bundle.c | 4 ++++ lib/flow.c | 38 +++++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h index 9d53623..71a1de0 100644 --- a/include/openflow/nicira-ext.h +++ b/include/openflow/nicira-ext.h @@ -103,8 +103,13 @@ enum nx_hash_fields { * - NXM_OF_TCP_SRC / NXM_OF_TCP_DST * - NXM_OF_UDP_SRC / NXM_OF_UDP_DST */ - NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP + NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP, + /* Network source address (NXM_OF_IP_SRC) only. */ + NX_HASH_FIELDS_NW_SRC, + + /* Network destination address (NXM_OF_IP_DST) only. */ + NX_HASH_FIELDS_NW_DST }; diff --git a/lib/bundle.c b/lib/bundle.c index 70a743b..6c00b86 100644 --- a/lib/bundle.c +++ b/lib/bundle.c @@ -191,6 +191,10 @@ bundle_parse__(const char *s, char **save_ptr, bundle->fields = NX_HASH_FIELDS_SYMMETRIC_L3L4; } else if (!strcasecmp(fields, "symmetric_l3l4+udp")) { bundle->fields = NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP; + } else if (!strcasecmp(fields, "nw_src")) { + bundle->fields = NX_HASH_FIELDS_NW_SRC; + } else if (!strcasecmp(fields, "nw_dst")) { + bundle->fields = NX_HASH_FIELDS_NW_DST; } else { return xasprintf("%s: unknown fields `%s'", s, fields); } diff --git a/lib/flow.c b/lib/flow.c index fb7bfeb..ff01366 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -1879,6 +1879,22 @@ flow_mask_hash_fields(const struct flow *flow, struct flow_wildcards *wc, } break; + case NX_HASH_FIELDS_NW_SRC: + if (flow->dl_type == htons(ETH_TYPE_IP)) { + memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); + } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) { + memset(&wc->masks.ipv6_src, 0xff, sizeof wc->masks.ipv6_src); + } + break; + + case NX_HASH_FIELDS_NW_DST: + if (flow->dl_type == htons(ETH_TYPE_IP)) { + memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); + } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) { + memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); + } + break; + default: OVS_NOT_REACHED(); } @@ -1903,6 +1919,22 @@ flow_hash_fields(const struct flow *flow, enum nx_hash_fields fields, case NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP: return flow_hash_symmetric_l3l4(flow, basis, true); + case NX_HASH_FIELDS_NW_SRC: + if (flow->dl_type == htons(ETH_TYPE_IP)) + return jhash_bytes(&flow->nw_src, sizeof flow->nw_src, basis); + else if (flow->dl_type == htons(ETH_TYPE_IPV6)) + return jhash_bytes(&flow->ipv6_src, sizeof flow->ipv6_src, basis); + else + return 0; + + case NX_HASH_FIELDS_NW_DST: + if (flow->dl_type == htons(ETH_TYPE_IP)) + return jhash_bytes(&flow->nw_dst, sizeof flow->nw_dst, basis); + else if (flow->dl_type == htons(ETH_TYPE_IPV6)) + return jhash_bytes(&flow->ipv6_dst, sizeof flow->ipv6_dst, basis); + else + return 0; + } OVS_NOT_REACHED(); @@ -1917,6 +1949,8 @@ flow_hash_fields_to_str(enum nx_hash_fields fields) case NX_HASH_FIELDS_SYMMETRIC_L4: return "symmetric_l4"; case NX_HASH_FIELDS_SYMMETRIC_L3L4: return "symmetric_l3l4"; case NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP: return "symmetric_l3l4+udp"; + case NX_HASH_FIELDS_NW_SRC: return "nw_src"; + case NX_HASH_FIELDS_NW_DST: return "nw_dst"; default: return "<unknown>"; } } @@ -1928,7 +1962,9 @@ flow_hash_fields_valid(enum nx_hash_fields fields) return fields == NX_HASH_FIELDS_ETH_SRC || fields == NX_HASH_FIELDS_SYMMETRIC_L4 || fields == NX_HASH_FIELDS_SYMMETRIC_L3L4 - || fields == NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP; + || fields == NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP + || fields == NX_HASH_FIELDS_NW_SRC + || fields == NX_HASH_FIELDS_NW_DST; } /* Returns a hash value for the bits of 'flow' that are active based on -- 1.8.3.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
