2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

bundle: add symmetric_l3 hash method for multipath

Add a symmetric_l3 hash method that uses both network destination
address and network source address.

VMware-BZ: #2112940
Signed-off-by: Martin Xu <martinxu9.ovs@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
This commit is contained in:
Martin Xu 2018-10-02 09:40:09 -07:00 committed by Ben Pfaff
parent b5967cb747
commit 84ddf96ce0
11 changed files with 520 additions and 2 deletions

1
NEWS
View File

@ -11,6 +11,7 @@ Post-v2.10.0
- DPDK:
* Add option for simple round-robin based Rxq to PMD assignment.
It can be set with pmd-rxq-assign.
- Add 'symmetric_l3' hash function.
v2.10.0 - 18 Aug 2018
---------------------

View File

@ -109,8 +109,10 @@ enum nx_hash_fields {
NX_HASH_FIELDS_NW_SRC,
/* Network destination address (NXM_OF_IP_DST) only. */
NX_HASH_FIELDS_NW_DST
NX_HASH_FIELDS_NW_DST,
/* Both network destination and source destination addresses. */
NX_HASH_FIELDS_SYMMETRIC_L3
};
/* NXT_PACKET_IN (analogous to OFPT_PACKET_IN).

View File

@ -198,6 +198,8 @@ bundle_parse__(const char *s, const struct ofputil_port_map *port_map,
bundle->fields = NX_HASH_FIELDS_NW_SRC;
} else if (!strcasecmp(fields, "nw_dst")) {
bundle->fields = NX_HASH_FIELDS_NW_DST;
} else if (!strcasecmp(fields, "symmetric_l3")) {
bundle->fields = NX_HASH_FIELDS_SYMMETRIC_L3;
} else {
return xasprintf("%s: unknown fields `%s'", s, fields);
}

View File

@ -2307,6 +2307,37 @@ flow_hash_symmetric_l3l4(const struct flow *flow, uint32_t basis,
return hash_finish(hash, basis);
}
/* Hashes 'flow' based on its nw_dst and nw_src for multipath. */
uint32_t
flow_hash_symmetric_l3(const struct flow *flow, uint32_t basis)
{
struct {
union {
ovs_be32 ipv4_addr;
struct in6_addr ipv6_addr;
};
ovs_be16 eth_type;
} fields;
int i;
memset(&fields, 0, sizeof fields);
fields.eth_type = flow->dl_type;
if (fields.eth_type == htons(ETH_TYPE_IP)) {
fields.ipv4_addr = flow->nw_src ^ flow->nw_dst;
} else if (fields.eth_type == htons(ETH_TYPE_IPV6)) {
const uint8_t *a = &flow->ipv6_src.s6_addr[0];
const uint8_t *b = &flow->ipv6_dst.s6_addr[0];
uint8_t *ipv6_addr = &fields.ipv6_addr.s6_addr[0];
for (i = 0; i < 16; i++) {
ipv6_addr[i] = a[i] ^ b[i];
}
}
return jhash_bytes(&fields, sizeof fields, basis);
}
/* Initialize a flow with random fields that matter for nx_hash_fields. */
void
flow_random_hash_fields(struct flow *flow)
@ -2422,6 +2453,16 @@ flow_mask_hash_fields(const struct flow *flow, struct flow_wildcards *wc,
}
break;
case NX_HASH_FIELDS_SYMMETRIC_L3:
if (flow->dl_type == htons(ETH_TYPE_IP)) {
memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
} else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
memset(&wc->masks.ipv6_src, 0xff, sizeof wc->masks.ipv6_src);
memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst);
}
break;
default:
OVS_NOT_REACHED();
}
@ -2464,6 +2505,8 @@ flow_hash_fields(const struct flow *flow, enum nx_hash_fields fields,
return basis;
}
case NX_HASH_FIELDS_SYMMETRIC_L3:
return flow_hash_symmetric_l3(flow, basis);
}
OVS_NOT_REACHED();
@ -2480,6 +2523,7 @@ flow_hash_fields_to_str(enum nx_hash_fields fields)
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";
case NX_HASH_FIELDS_SYMMETRIC_L3: return "symmetric_l3";
default: return "<unknown>";
}
}
@ -2493,7 +2537,8 @@ flow_hash_fields_valid(enum nx_hash_fields fields)
|| fields == NX_HASH_FIELDS_SYMMETRIC_L3L4
|| fields == NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP
|| fields == NX_HASH_FIELDS_NW_SRC
|| fields == NX_HASH_FIELDS_NW_DST;
|| fields == NX_HASH_FIELDS_NW_DST
|| fields == NX_HASH_FIELDS_SYMMETRIC_L3;
}
/* Returns a hash value for the bits of 'flow' that are active based on

View File

@ -241,6 +241,7 @@ uint32_t flow_hash_symmetric_l4(const struct flow *flow, uint32_t basis);
uint32_t flow_hash_symmetric_l2(const struct flow *flow, uint32_t basis);
uint32_t flow_hash_symmetric_l3l4(const struct flow *flow, uint32_t basis,
bool inc_udp_ports );
uint32_t flow_hash_symmetric_l3(const struct flow *flow, uint32_t basis);
/* Initialize a flow with random fields that matter for nx_hash_fields. */
void flow_random_hash_fields(struct flow *);

View File

@ -171,6 +171,8 @@ multipath_parse__(struct ofpact_multipath *mp, const char *s_, char *s)
mp->fields = NX_HASH_FIELDS_NW_SRC;
} else if (!strcasecmp(fields, "nw_dst")) {
mp->fields = NX_HASH_FIELDS_NW_DST;
} else if (!strcasecmp(fields, "symmetric_l3")) {
mp->fields = NX_HASH_FIELDS_SYMMETRIC_L3;
} else {
return xasprintf("%s: unknown fields `%s'", s_, fields);
}

View File

@ -273,3 +273,182 @@ AT_CHECK([grep Final stdout], [0],
])
OVS_VSWITCHD_STOP
AT_CLEANUP
AT_SETUP([hrw bundle symmetric_l3 link selection])
AT_KEYWORDS([bundle_action])
AT_CHECK([[ovstest test-bundle 'symmetric_l3,60,hrw,ofport,NXM_NX_REG0[],slaves:1,2,3,4,5']],
[0], [ignore])
# 100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
# 110000: disruption=0.50 (perfect=0.50) 0.50 0.50 0.00 0.00 0.00 0.00
# 010000: disruption=0.50 (perfect=0.50) 0.00 1.00 0.00 0.00 0.00 0.00
# 011000: disruption=0.50 (perfect=0.50) 0.00 0.50 0.50 0.00 0.00 0.00
# 111000: disruption=0.33 (perfect=0.33) 0.33 0.33 0.34 0.00 0.00 0.00
# 101000: disruption=0.33 (perfect=0.33) 0.50 0.00 0.50 0.00 0.00 0.00
# 001000: disruption=0.50 (perfect=0.50) 0.00 0.00 1.00 0.00 0.00 0.00
# 001100: disruption=0.50 (perfect=0.50) 0.00 0.00 0.50 0.50 0.00 0.00
# 101100: disruption=0.33 (perfect=0.33) 0.33 0.00 0.34 0.33 0.00 0.00
# 111100: disruption=0.25 (perfect=0.25) 0.25 0.25 0.25 0.25 0.00 0.00
# 011100: disruption=0.25 (perfect=0.25) 0.00 0.33 0.33 0.33 0.00 0.00
# 010100: disruption=0.33 (perfect=0.33) 0.00 0.50 0.00 0.50 0.00 0.00
# 110100: disruption=0.33 (perfect=0.33) 0.33 0.33 0.00 0.34 0.00 0.00
# 100100: disruption=0.33 (perfect=0.33) 0.50 0.00 0.00 0.50 0.00 0.00
# 000100: disruption=0.50 (perfect=0.50) 0.00 0.00 0.00 1.00 0.00 0.00
# 000110: disruption=0.50 (perfect=0.50) 0.00 0.00 0.00 0.50 0.50 0.00
# 100110: disruption=0.33 (perfect=0.33) 0.33 0.00 0.00 0.33 0.33 0.00
# 110110: disruption=0.25 (perfect=0.25) 0.25 0.25 0.00 0.25 0.25 0.00
# 010110: disruption=0.25 (perfect=0.25) 0.00 0.34 0.00 0.33 0.33 0.00
# 011110: disruption=0.25 (perfect=0.25) 0.00 0.25 0.25 0.25 0.25 0.00
# 111110: disruption=0.20 (perfect=0.20) 0.20 0.20 0.20 0.20 0.20 0.00
# 101110: disruption=0.20 (perfect=0.20) 0.25 0.00 0.25 0.25 0.25 0.00
# 001110: disruption=0.25 (perfect=0.25) 0.00 0.00 0.34 0.33 0.33 0.00
# 001010: disruption=0.33 (perfect=0.33) 0.00 0.00 0.50 0.00 0.50 0.00
# 101010: disruption=0.33 (perfect=0.33) 0.33 0.00 0.34 0.00 0.33 0.00
# 111010: disruption=0.25 (perfect=0.25) 0.25 0.25 0.25 0.00 0.25 0.00
# 011010: disruption=0.25 (perfect=0.25) 0.00 0.33 0.34 0.00 0.33 0.00
# 010010: disruption=0.34 (perfect=0.33) 0.00 0.50 0.00 0.00 0.50 0.00
# 110010: disruption=0.33 (perfect=0.33) 0.33 0.33 0.00 0.00 0.33 0.00
# 100010: disruption=0.33 (perfect=0.33) 0.50 0.00 0.00 0.00 0.50 0.00
# 000010: disruption=0.50 (perfect=0.50) 0.00 0.00 0.00 0.00 1.00 0.00
# 000011: disruption=0.50 (perfect=0.50) 0.00 0.00 0.00 0.00 0.50 0.50
# 100011: disruption=0.33 (perfect=0.33) 0.33 0.00 0.00 0.00 0.33 0.33
# 110011: disruption=0.25 (perfect=0.25) 0.25 0.25 0.00 0.00 0.25 0.25
# 010011: disruption=0.25 (perfect=0.25) 0.00 0.33 0.00 0.00 0.33 0.33
# 011011: disruption=0.25 (perfect=0.25) 0.00 0.25 0.25 0.00 0.25 0.25
# 111011: disruption=0.20 (perfect=0.20) 0.20 0.20 0.20 0.00 0.20 0.20
# 101011: disruption=0.20 (perfect=0.20) 0.25 0.00 0.25 0.00 0.25 0.25
# 001011: disruption=0.25 (perfect=0.25) 0.00 0.00 0.34 0.00 0.33 0.33
# 001111: disruption=0.25 (perfect=0.25) 0.00 0.00 0.25 0.25 0.25 0.25
# 101111: disruption=0.20 (perfect=0.20) 0.20 0.00 0.20 0.20 0.20 0.20
# 111111: disruption=0.17 (perfect=0.17) 0.17 0.17 0.17 0.17 0.17 0.17
# 011111: disruption=0.17 (perfect=0.17) 0.00 0.20 0.20 0.20 0.20 0.20
# 010111: disruption=0.20 (perfect=0.20) 0.00 0.25 0.00 0.25 0.25 0.25
# 110111: disruption=0.20 (perfect=0.20) 0.20 0.20 0.00 0.20 0.20 0.20
# 100111: disruption=0.20 (perfect=0.20) 0.25 0.00 0.00 0.25 0.25 0.25
# 000111: disruption=0.25 (perfect=0.25) 0.00 0.00 0.00 0.33 0.33 0.33
# 000101: disruption=0.33 (perfect=0.33) 0.00 0.00 0.00 0.50 0.00 0.50
# 100101: disruption=0.33 (perfect=0.33) 0.33 0.00 0.00 0.33 0.00 0.33
# 110101: disruption=0.25 (perfect=0.25) 0.25 0.25 0.00 0.25 0.00 0.25
# 010101: disruption=0.25 (perfect=0.25) 0.00 0.33 0.00 0.33 0.00 0.33
# 011101: disruption=0.25 (perfect=0.25) 0.00 0.25 0.25 0.25 0.00 0.25
# 111101: disruption=0.20 (perfect=0.20) 0.20 0.20 0.20 0.20 0.00 0.20
# 101101: disruption=0.20 (perfect=0.20) 0.25 0.00 0.25 0.25 0.00 0.25
# 001101: disruption=0.25 (perfect=0.25) 0.00 0.00 0.33 0.33 0.00 0.33
# 001001: disruption=0.33 (perfect=0.33) 0.00 0.00 0.50 0.00 0.00 0.50
# 101001: disruption=0.33 (perfect=0.33) 0.33 0.00 0.33 0.00 0.00 0.33
# 111001: disruption=0.25 (perfect=0.25) 0.25 0.25 0.25 0.00 0.00 0.25
# 011001: disruption=0.25 (perfect=0.25) 0.00 0.33 0.34 0.00 0.00 0.33
# 010001: disruption=0.34 (perfect=0.33) 0.00 0.50 0.00 0.00 0.00 0.50
# 110001: disruption=0.33 (perfect=0.33) 0.33 0.33 0.00 0.00 0.00 0.34
# 100001: disruption=0.33 (perfect=0.33) 0.50 0.00 0.00 0.00 0.00 0.50
# 000001: disruption=0.50 (perfect=0.50) 0.00 0.00 0.00 0.00 0.00 1.00
# 000000: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 0.00 0.00
# 100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
AT_CLEANUP
AT_SETUP([active_backup bundle symmetric_l3 link selection])
AT_KEYWORDS([bundle_action])
AT_CHECK([[ovstest test-bundle 'symmetric_l3,60,active_backup,ofport,NXM_NX_REG0[],slaves:1,2,3,4,5,6']],
[0],
[100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
110000: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
010000: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
011000: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
111000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
101000: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
001000: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00
001100: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00
101100: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
111100: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
011100: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
010100: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
110100: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
100100: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
000100: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 1.00 0.00 0.00
000110: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 1.00 0.00 0.00
100110: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
110110: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
010110: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
011110: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
111110: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
101110: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
001110: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00
001010: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00
101010: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
111010: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
011010: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
010010: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
110010: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
100010: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
000010: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 1.00 0.00
000011: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 0.00 1.00 0.00
100011: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
110011: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
010011: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
011011: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
111011: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
101011: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
001011: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00
001111: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00
101111: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
111111: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
011111: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
010111: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
110111: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
100111: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
000111: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 1.00 0.00 0.00
000101: disruption=0.00 (perfect=0.00) 0.00 0.00 0.00 1.00 0.00 0.00
100101: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
110101: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
010101: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
011101: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
111101: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
101101: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
001101: disruption=1.00 (perfect=1.00) 0.00 0.00 1.00 0.00 0.00 0.00
001001: disruption=0.00 (perfect=0.00) 0.00 0.00 1.00 0.00 0.00 0.00
101001: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
111001: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
011001: disruption=1.00 (perfect=1.00) 0.00 1.00 0.00 0.00 0.00 0.00
010001: disruption=0.00 (perfect=0.00) 0.00 1.00 0.00 0.00 0.00 0.00
110001: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
100001: disruption=0.00 (perfect=0.00) 1.00 0.00 0.00 0.00 0.00 0.00
000001: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 0.00 1.00
000000: disruption=1.00 (perfect=1.00) 0.00 0.00 0.00 0.00 0.00 0.00
100000: disruption=1.00 (perfect=1.00) 1.00 0.00 0.00 0.00 0.00 0.00
])
AT_CLEANUP
AT_SETUP([hrw bundle symmetric_l3 single link selection])
AT_KEYWORDS([bundle_action])
AT_CHECK([[ovstest test-bundle 'symmetric_l3,60,hrw,ofport,NXM_NX_REG0[],slaves:1']],
[0], [ignore])
# 1: disruption=1.00 (perfect=1.00) 1.00
# 0: disruption=1.00 (perfect=1.00) 0.00
# 1: disruption=1.00 (perfect=1.00) 1.00
AT_CLEANUP
AT_SETUP([hrw bundle symmetric_l3 single link selection])
AT_KEYWORDS([bundle_action])
AT_CHECK([[ovstest test-bundle 'symmetric_l3,60,hrw,ofport,NXM_NX_REG0[],slaves:1']],
[0], [ignore])
# 1: disruption=1.00 (perfect=1.00) 1.00
# 0: disruption=1.00 (perfect=1.00) 0.00
# 1: disruption=1.00 (perfect=1.00) 1.00
AT_CLEANUP
AT_SETUP([hrw bundle symmetric_l3 no link selection])
AT_KEYWORDS([bundle_action])
AT_CHECK([[ovstest test-bundle 'symmetric_l3,60,hrw,ofport,NXM_NX_REG0[],slaves:']],
[0], [ignore])
AT_CLEANUP
#: disruption=0.00 (perfect=0.00)
#: disruption=0.00 (perfect=0.00)
AT_SETUP([bundle symmetric_l3 action with many ports])
AT_KEYWORDS([bundle_action])
OVS_VSWITCHD_START
AT_CHECK([ovs-ofctl add-flow br0 'actions=set_field:0x1->metadata,set_field:0x2->metadata,set_field:0x3->metadata,set_field:0x4->metadata,bundle(symmetric_l3,0,hrw,ofport,slaves:[[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]])'])
AT_CHECK([ovs-ofctl dump-flows br0 --no-stats], [0], [dnl
actions=load:0x1->OXM_OF_METADATA[[]],load:0x2->OXM_OF_METADATA[[]],load:0x3->OXM_OF_METADATA[[]],load:0x4->OXM_OF_METADATA[[]],bundle(symmetric_l3,0,hrw,ofport,slaves:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40)
])
OVS_VSWITCHD_STOP
AT_CLEANUP

View File

@ -309,3 +309,274 @@ AT_CHECK([ovs-ofctl parse-flow 'actions=multipath(eth_src,50,modulo_n,1024,0,NXM
])
AT_CLEANUP
AT_SETUP([modulo_n multipath symmetric_l3 link selection])
AT_CHECK([[ovstest test-multipath 'symmetric_l3,50,modulo_n,1,0,NXM_NX_REG0[]']],
[0], [ignore])
# 1 -> 2: disruption=0.50 (perfect=0.50); stddev/expected=0.0000
# 2 -> 3: disruption=0.66 (perfect=0.33); stddev/expected=0.0023
# 3 -> 4: disruption=0.75 (perfect=0.25); stddev/expected=0.0061
# 4 -> 5: disruption=0.80 (perfect=0.20); stddev/expected=0.0082
# 5 -> 6: disruption=0.83 (perfect=0.17); stddev/expected=0.0083
# 6 -> 7: disruption=0.86 (perfect=0.14); stddev/expected=0.0061
# 7 -> 8: disruption=0.88 (perfect=0.12); stddev/expected=0.0103
# 8 -> 9: disruption=0.89 (perfect=0.11); stddev/expected=0.0129
# 9 -> 10: disruption=0.90 (perfect=0.10); stddev/expected=0.0091
#10 -> 11: disruption=0.91 (perfect=0.09); stddev/expected=0.0114
#11 -> 12: disruption=0.91 (perfect=0.08); stddev/expected=0.0073
#12 -> 13: disruption=0.92 (perfect=0.08); stddev/expected=0.0165
#13 -> 14: disruption=0.93 (perfect=0.07); stddev/expected=0.0149
#14 -> 15: disruption=0.93 (perfect=0.07); stddev/expected=0.0127
#15 -> 16: disruption=0.94 (perfect=0.06); stddev/expected=0.0142
#16 -> 17: disruption=0.94 (perfect=0.06); stddev/expected=0.0098
#17 -> 18: disruption=0.94 (perfect=0.06); stddev/expected=0.0159
#18 -> 19: disruption=0.95 (perfect=0.05); stddev/expected=0.0121
#19 -> 20: disruption=0.95 (perfect=0.05); stddev/expected=0.0195
#20 -> 21: disruption=0.95 (perfect=0.05); stddev/expected=0.0120
#21 -> 22: disruption=0.95 (perfect=0.05); stddev/expected=0.0181
#22 -> 23: disruption=0.96 (perfect=0.04); stddev/expected=0.0222
#23 -> 24: disruption=0.96 (perfect=0.04); stddev/expected=0.0164
#24 -> 25: disruption=0.96 (perfect=0.04); stddev/expected=0.0146
#25 -> 26: disruption=0.96 (perfect=0.04); stddev/expected=0.0175
#26 -> 27: disruption=0.96 (perfect=0.04); stddev/expected=0.0231
#27 -> 28: disruption=0.96 (perfect=0.04); stddev/expected=0.0172
#28 -> 29: disruption=0.97 (perfect=0.03); stddev/expected=0.0211
#29 -> 30: disruption=0.97 (perfect=0.03); stddev/expected=0.0213
#30 -> 31: disruption=0.97 (perfect=0.03); stddev/expected=0.0253
#31 -> 32: disruption=0.97 (perfect=0.03); stddev/expected=0.0208
#32 -> 33: disruption=0.97 (perfect=0.03); stddev/expected=0.0223
#33 -> 34: disruption=0.97 (perfect=0.03); stddev/expected=0.0215
#34 -> 35: disruption=0.97 (perfect=0.03); stddev/expected=0.0201
#35 -> 36: disruption=0.97 (perfect=0.03); stddev/expected=0.0220
#36 -> 37: disruption=0.97 (perfect=0.03); stddev/expected=0.0221
#37 -> 38: disruption=0.97 (perfect=0.03); stddev/expected=0.0201
#38 -> 39: disruption=0.97 (perfect=0.03); stddev/expected=0.0215
#39 -> 40: disruption=0.97 (perfect=0.03); stddev/expected=0.0271
#40 -> 41: disruption=0.98 (perfect=0.02); stddev/expected=0.0272
#41 -> 42: disruption=0.98 (perfect=0.02); stddev/expected=0.0208
#42 -> 43: disruption=0.98 (perfect=0.02); stddev/expected=0.0226
#43 -> 44: disruption=0.98 (perfect=0.02); stddev/expected=0.0264
#44 -> 45: disruption=0.98 (perfect=0.02); stddev/expected=0.0233
#45 -> 46: disruption=0.98 (perfect=0.02); stddev/expected=0.0285
#46 -> 47: disruption=0.98 (perfect=0.02); stddev/expected=0.0246
#47 -> 48: disruption=0.98 (perfect=0.02); stddev/expected=0.0282
#48 -> 49: disruption=0.98 (perfect=0.02); stddev/expected=0.0233
#49 -> 50: disruption=0.98 (perfect=0.02); stddev/expected=0.0197
#50 -> 51: disruption=0.98 (perfect=0.02); stddev/expected=0.0317
#51 -> 52: disruption=0.98 (perfect=0.02); stddev/expected=0.0283
#52 -> 53: disruption=0.98 (perfect=0.02); stddev/expected=0.0282
#53 -> 54: disruption=0.98 (perfect=0.02); stddev/expected=0.0273
#54 -> 55: disruption=0.98 (perfect=0.02); stddev/expected=0.0283
#55 -> 56: disruption=0.98 (perfect=0.02); stddev/expected=0.0288
#56 -> 57: disruption=0.98 (perfect=0.02); stddev/expected=0.0263
#57 -> 58: disruption=0.98 (perfect=0.02); stddev/expected=0.0339
#58 -> 59: disruption=0.98 (perfect=0.02); stddev/expected=0.0262
#59 -> 60: disruption=0.98 (perfect=0.02); stddev/expected=0.0309
#60 -> 61: disruption=0.98 (perfect=0.02); stddev/expected=0.0285
#61 -> 62: disruption=0.98 (perfect=0.02); stddev/expected=0.0288
#62 -> 63: disruption=0.98 (perfect=0.02); stddev/expected=0.0298
#63 -> 64: disruption=0.98 (perfect=0.02); stddev/expected=0.0277
AT_CLEANUP
AT_SETUP([hash_threshold multipath symmetric_l3 link selection])
AT_CHECK([[ovstest test-multipath 'symmetric_l3,50,hash_threshold,1,0,NXM_NX_REG0[]']],
[0], [ignore])
# 1 -> 2: disruption=0.50 (perfect=0.50); stddev/expected=0.0000
# 2 -> 3: disruption=0.50 (perfect=0.33); stddev/expected=0.0056
# 3 -> 4: disruption=0.50 (perfect=0.25); stddev/expected=0.0050
# 4 -> 5: disruption=0.50 (perfect=0.20); stddev/expected=0.0074
# 5 -> 6: disruption=0.50 (perfect=0.17); stddev/expected=0.0031
# 6 -> 7: disruption=0.50 (perfect=0.14); stddev/expected=0.0078
# 7 -> 8: disruption=0.50 (perfect=0.12); stddev/expected=0.0085
# 8 -> 9: disruption=0.50 (perfect=0.11); stddev/expected=0.0093
# 9 -> 10: disruption=0.50 (perfect=0.10); stddev/expected=0.0083
#10 -> 11: disruption=0.51 (perfect=0.09); stddev/expected=0.0110
#11 -> 12: disruption=0.50 (perfect=0.08); stddev/expected=0.0124
#12 -> 13: disruption=0.50 (perfect=0.08); stddev/expected=0.0143
#13 -> 14: disruption=0.50 (perfect=0.07); stddev/expected=0.0148
#14 -> 15: disruption=0.50 (perfect=0.07); stddev/expected=0.0099
#15 -> 16: disruption=0.50 (perfect=0.06); stddev/expected=0.0166
#16 -> 17: disruption=0.50 (perfect=0.06); stddev/expected=0.0099
#17 -> 18: disruption=0.50 (perfect=0.06); stddev/expected=0.0194
#18 -> 19: disruption=0.50 (perfect=0.05); stddev/expected=0.0169
#19 -> 20: disruption=0.50 (perfect=0.05); stddev/expected=0.0169
#20 -> 21: disruption=0.50 (perfect=0.05); stddev/expected=0.0185
#21 -> 22: disruption=0.50 (perfect=0.05); stddev/expected=0.0160
#22 -> 23: disruption=0.50 (perfect=0.04); stddev/expected=0.0236
#23 -> 24: disruption=0.50 (perfect=0.04); stddev/expected=0.0147
#24 -> 25: disruption=0.50 (perfect=0.04); stddev/expected=0.0195
#25 -> 26: disruption=0.50 (perfect=0.04); stddev/expected=0.0199
#26 -> 27: disruption=0.50 (perfect=0.04); stddev/expected=0.0227
#27 -> 28: disruption=0.50 (perfect=0.04); stddev/expected=0.0198
#28 -> 29: disruption=0.50 (perfect=0.03); stddev/expected=0.0216
#29 -> 30: disruption=0.50 (perfect=0.03); stddev/expected=0.0233
#30 -> 31: disruption=0.50 (perfect=0.03); stddev/expected=0.0266
#31 -> 32: disruption=0.51 (perfect=0.03); stddev/expected=0.0238
#32 -> 33: disruption=0.50 (perfect=0.03); stddev/expected=0.0194
#33 -> 34: disruption=0.50 (perfect=0.03); stddev/expected=0.0173
#34 -> 35: disruption=0.50 (perfect=0.03); stddev/expected=0.0223
#35 -> 36: disruption=0.50 (perfect=0.03); stddev/expected=0.0220
#36 -> 37: disruption=0.50 (perfect=0.03); stddev/expected=0.0237
#37 -> 38: disruption=0.50 (perfect=0.03); stddev/expected=0.0237
#38 -> 39: disruption=0.50 (perfect=0.03); stddev/expected=0.0251
#39 -> 40: disruption=0.50 (perfect=0.03); stddev/expected=0.0212
#40 -> 41: disruption=0.50 (perfect=0.02); stddev/expected=0.0267
#41 -> 42: disruption=0.50 (perfect=0.02); stddev/expected=0.0242
#42 -> 43: disruption=0.50 (perfect=0.02); stddev/expected=0.0222
#43 -> 44: disruption=0.50 (perfect=0.02); stddev/expected=0.0244
#44 -> 45: disruption=0.50 (perfect=0.02); stddev/expected=0.0231
#45 -> 46: disruption=0.50 (perfect=0.02); stddev/expected=0.0299
#46 -> 47: disruption=0.50 (perfect=0.02); stddev/expected=0.0263
#47 -> 48: disruption=0.50 (perfect=0.02); stddev/expected=0.0307
#48 -> 49: disruption=0.50 (perfect=0.02); stddev/expected=0.0253
#49 -> 50: disruption=0.50 (perfect=0.02); stddev/expected=0.0228
#50 -> 51: disruption=0.50 (perfect=0.02); stddev/expected=0.0273
#51 -> 52: disruption=0.50 (perfect=0.02); stddev/expected=0.0243
#52 -> 53: disruption=0.50 (perfect=0.02); stddev/expected=0.0268
#53 -> 54: disruption=0.50 (perfect=0.02); stddev/expected=0.0251
#54 -> 55: disruption=0.50 (perfect=0.02); stddev/expected=0.0297
#55 -> 56: disruption=0.50 (perfect=0.02); stddev/expected=0.0287
#56 -> 57: disruption=0.50 (perfect=0.02); stddev/expected=0.0299
#57 -> 58: disruption=0.50 (perfect=0.02); stddev/expected=0.0272
#58 -> 59: disruption=0.50 (perfect=0.02); stddev/expected=0.0295
#59 -> 60: disruption=0.50 (perfect=0.02); stddev/expected=0.0312
#60 -> 61: disruption=0.50 (perfect=0.02); stddev/expected=0.0361
#61 -> 62: disruption=0.50 (perfect=0.02); stddev/expected=0.0308
#62 -> 63: disruption=0.50 (perfect=0.02); stddev/expected=0.0283
#63 -> 64: disruption=0.50 (perfect=0.02); stddev/expected=0.0325
AT_CLEANUP
AT_SETUP([hrw multipath symmetric_l3 link selection])
AT_CHECK([[ovstest test-multipath 'symmetric_l3,50,hrw,1,0,NXM_NX_REG0[]']],
[0], [ignore])
# 1 -> 2: disruption=0.50 (perfect=0.50); stddev/expected=0.0000
# 2 -> 3: disruption=0.33 (perfect=0.33); stddev/expected=0.0033
# 3 -> 4: disruption=0.25 (perfect=0.25); stddev/expected=0.0076
# 4 -> 5: disruption=0.20 (perfect=0.20); stddev/expected=0.0059
# 5 -> 6: disruption=0.17 (perfect=0.17); stddev/expected=0.0030
# 6 -> 7: disruption=0.14 (perfect=0.14); stddev/expected=0.0124
# 7 -> 8: disruption=0.13 (perfect=0.12); stddev/expected=0.0072
# 8 -> 9: disruption=0.11 (perfect=0.11); stddev/expected=0.0074
# 9 -> 10: disruption=0.10 (perfect=0.10); stddev/expected=0.0161
#10 -> 11: disruption=0.09 (perfect=0.09); stddev/expected=0.0055
#11 -> 12: disruption=0.08 (perfect=0.08); stddev/expected=0.0092
#12 -> 13: disruption=0.08 (perfect=0.08); stddev/expected=0.0134
#13 -> 14: disruption=0.07 (perfect=0.07); stddev/expected=0.0124
#14 -> 15: disruption=0.07 (perfect=0.07); stddev/expected=0.0156
#15 -> 16: disruption=0.06 (perfect=0.06); stddev/expected=0.0182
#16 -> 17: disruption=0.06 (perfect=0.06); stddev/expected=0.0150
#17 -> 18: disruption=0.06 (perfect=0.06); stddev/expected=0.0109
#18 -> 19: disruption=0.05 (perfect=0.05); stddev/expected=0.0162
#19 -> 20: disruption=0.05 (perfect=0.05); stddev/expected=0.0149
#20 -> 21: disruption=0.05 (perfect=0.05); stddev/expected=0.0148
#21 -> 22: disruption=0.05 (perfect=0.05); stddev/expected=0.0230
#22 -> 23: disruption=0.04 (perfect=0.04); stddev/expected=0.0208
#23 -> 24: disruption=0.04 (perfect=0.04); stddev/expected=0.0210
#24 -> 25: disruption=0.04 (perfect=0.04); stddev/expected=0.0228
#25 -> 26: disruption=0.04 (perfect=0.04); stddev/expected=0.0155
#26 -> 27: disruption=0.04 (perfect=0.04); stddev/expected=0.0208
#27 -> 28: disruption=0.04 (perfect=0.04); stddev/expected=0.0218
#28 -> 29: disruption=0.03 (perfect=0.03); stddev/expected=0.0193
#29 -> 30: disruption=0.03 (perfect=0.03); stddev/expected=0.0169
#30 -> 31: disruption=0.03 (perfect=0.03); stddev/expected=0.0163
#31 -> 32: disruption=0.03 (perfect=0.03); stddev/expected=0.0192
#32 -> 33: disruption=0.03 (perfect=0.03); stddev/expected=0.0212
#33 -> 34: disruption=0.03 (perfect=0.03); stddev/expected=0.0240
#34 -> 35: disruption=0.03 (perfect=0.03); stddev/expected=0.0227
#35 -> 36: disruption=0.03 (perfect=0.03); stddev/expected=0.0230
#36 -> 37: disruption=0.03 (perfect=0.03); stddev/expected=0.0183
#37 -> 38: disruption=0.03 (perfect=0.03); stddev/expected=0.0227
#38 -> 39: disruption=0.03 (perfect=0.03); stddev/expected=0.0255
#39 -> 40: disruption=0.03 (perfect=0.03); stddev/expected=0.0247
#40 -> 41: disruption=0.02 (perfect=0.02); stddev/expected=0.0228
#41 -> 42: disruption=0.02 (perfect=0.02); stddev/expected=0.0247
#42 -> 43: disruption=0.02 (perfect=0.02); stddev/expected=0.0265
#43 -> 44: disruption=0.02 (perfect=0.02); stddev/expected=0.0250
#44 -> 45: disruption=0.02 (perfect=0.02); stddev/expected=0.0258
#45 -> 46: disruption=0.02 (perfect=0.02); stddev/expected=0.0196
#46 -> 47: disruption=0.02 (perfect=0.02); stddev/expected=0.0235
#47 -> 48: disruption=0.02 (perfect=0.02); stddev/expected=0.0314
#48 -> 49: disruption=0.02 (perfect=0.02); stddev/expected=0.0293
#49 -> 50: disruption=0.02 (perfect=0.02); stddev/expected=0.0241
#50 -> 51: disruption=0.02 (perfect=0.02); stddev/expected=0.0291
#51 -> 52: disruption=0.02 (perfect=0.02); stddev/expected=0.0304
#52 -> 53: disruption=0.02 (perfect=0.02); stddev/expected=0.0307
#53 -> 54: disruption=0.02 (perfect=0.02); stddev/expected=0.0250
#54 -> 55: disruption=0.02 (perfect=0.02); stddev/expected=0.0290
#55 -> 56: disruption=0.02 (perfect=0.02); stddev/expected=0.0284
#56 -> 57: disruption=0.02 (perfect=0.02); stddev/expected=0.0272
#57 -> 58: disruption=0.02 (perfect=0.02); stddev/expected=0.0272
#58 -> 59: disruption=0.02 (perfect=0.02); stddev/expected=0.0304
#59 -> 60: disruption=0.02 (perfect=0.02); stddev/expected=0.0345
#60 -> 61: disruption=0.02 (perfect=0.02); stddev/expected=0.0251
#61 -> 62: disruption=0.02 (perfect=0.02); stddev/expected=0.0249
#62 -> 63: disruption=0.02 (perfect=0.02); stddev/expected=0.0285
#63 -> 64: disruption=0.02 (perfect=0.02); stddev/expected=0.0285
AT_CLEANUP
AT_SETUP([iter_hash symmetric_l3 multipath link selection])
AT_CHECK([[ovstest test-multipath 'symmetric_l3,50,iter_hash,1,0,NXM_NX_REG0[]']],
[0], [ignore])
# 1 -> 2: disruption=0.50 (perfect=0.50); stddev/expected=0.0000
# 2 -> 3: disruption=0.42 (perfect=0.33); stddev/expected=0.0034
# 3 -> 4: disruption=0.25 (perfect=0.25); stddev/expected=0.0082
# 4 -> 5: disruption=0.42 (perfect=0.20); stddev/expected=0.0073
# 5 -> 6: disruption=0.17 (perfect=0.17); stddev/expected=0.0040
# 6 -> 7: disruption=0.14 (perfect=0.14); stddev/expected=0.0069
# 7 -> 8: disruption=0.13 (perfect=0.12); stddev/expected=0.0131
# 8 -> 9: disruption=0.45 (perfect=0.11); stddev/expected=0.0093
# 9 -> 10: disruption=0.10 (perfect=0.10); stddev/expected=0.0127
#10 -> 11: disruption=0.09 (perfect=0.09); stddev/expected=0.0134
#11 -> 12: disruption=0.08 (perfect=0.08); stddev/expected=0.0101
#12 -> 13: disruption=0.08 (perfect=0.08); stddev/expected=0.0127
#13 -> 14: disruption=0.07 (perfect=0.07); stddev/expected=0.0115
#14 -> 15: disruption=0.07 (perfect=0.07); stddev/expected=0.0100
#15 -> 16: disruption=0.06 (perfect=0.06); stddev/expected=0.0111
#16 -> 17: disruption=0.47 (perfect=0.06); stddev/expected=0.0137
#17 -> 18: disruption=0.05 (perfect=0.06); stddev/expected=0.0204
#18 -> 19: disruption=0.05 (perfect=0.05); stddev/expected=0.0082
#19 -> 20: disruption=0.05 (perfect=0.05); stddev/expected=0.0124
#20 -> 21: disruption=0.05 (perfect=0.05); stddev/expected=0.0203
#21 -> 22: disruption=0.05 (perfect=0.05); stddev/expected=0.0196
#22 -> 23: disruption=0.04 (perfect=0.04); stddev/expected=0.0183
#23 -> 24: disruption=0.04 (perfect=0.04); stddev/expected=0.0212
#24 -> 25: disruption=0.04 (perfect=0.04); stddev/expected=0.0176
#25 -> 26: disruption=0.04 (perfect=0.04); stddev/expected=0.0173
#26 -> 27: disruption=0.04 (perfect=0.04); stddev/expected=0.0159
#27 -> 28: disruption=0.03 (perfect=0.04); stddev/expected=0.0168
#28 -> 29: disruption=0.03 (perfect=0.03); stddev/expected=0.0190
#29 -> 30: disruption=0.03 (perfect=0.03); stddev/expected=0.0305
#30 -> 31: disruption=0.03 (perfect=0.03); stddev/expected=0.0282
#31 -> 32: disruption=0.03 (perfect=0.03); stddev/expected=0.0255
#32 -> 33: disruption=0.49 (perfect=0.03); stddev/expected=0.0220
#33 -> 34: disruption=0.03 (perfect=0.03); stddev/expected=0.0188
#34 -> 35: disruption=0.03 (perfect=0.03); stddev/expected=0.0203
#35 -> 36: disruption=0.03 (perfect=0.03); stddev/expected=0.0207
#36 -> 37: disruption=0.03 (perfect=0.03); stddev/expected=0.0261
#37 -> 38: disruption=0.03 (perfect=0.03); stddev/expected=0.0226
#38 -> 39: disruption=0.03 (perfect=0.03); stddev/expected=0.0233
#39 -> 40: disruption=0.03 (perfect=0.03); stddev/expected=0.0161
#40 -> 41: disruption=0.03 (perfect=0.02); stddev/expected=0.0303
#41 -> 42: disruption=0.02 (perfect=0.02); stddev/expected=0.0249
#42 -> 43: disruption=0.02 (perfect=0.02); stddev/expected=0.0262
#43 -> 44: disruption=0.02 (perfect=0.02); stddev/expected=0.0260
#44 -> 45: disruption=0.02 (perfect=0.02); stddev/expected=0.0266
#45 -> 46: disruption=0.02 (perfect=0.02); stddev/expected=0.0287
#46 -> 47: disruption=0.02 (perfect=0.02); stddev/expected=0.0213
#47 -> 48: disruption=0.02 (perfect=0.02); stddev/expected=0.0301
#48 -> 49: disruption=0.02 (perfect=0.02); stddev/expected=0.0230
#49 -> 50: disruption=0.02 (perfect=0.02); stddev/expected=0.0248
#50 -> 51: disruption=0.02 (perfect=0.02); stddev/expected=0.0203
#51 -> 52: disruption=0.02 (perfect=0.02); stddev/expected=0.0235
#52 -> 53: disruption=0.02 (perfect=0.02); stddev/expected=0.0340
#53 -> 54: disruption=0.02 (perfect=0.02); stddev/expected=0.0264
#54 -> 55: disruption=0.02 (perfect=0.02); stddev/expected=0.0292
#55 -> 56: disruption=0.02 (perfect=0.02); stddev/expected=0.0246
#56 -> 57: disruption=0.02 (perfect=0.02); stddev/expected=0.0270
#57 -> 58: disruption=0.02 (perfect=0.02); stddev/expected=0.0299
#58 -> 59: disruption=0.02 (perfect=0.02); stddev/expected=0.0307
#59 -> 60: disruption=0.02 (perfect=0.02); stddev/expected=0.0275
#60 -> 61: disruption=0.02 (perfect=0.02); stddev/expected=0.0289
#61 -> 62: disruption=0.02 (perfect=0.02); stddev/expected=0.0292
#62 -> 63: disruption=0.02 (perfect=0.02); stddev/expected=0.0292
#63 -> 64: disruption=0.02 (perfect=0.02); stddev/expected=0.0307
AT_CLEANUP

View File

@ -382,6 +382,7 @@ LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
hash = flow_hash_symmetric_l4(&flow, 0);
hash = flow_hash_symmetric_l2(&flow, 0);
hash = flow_hash_symmetric_l3l4(&flow, 0, NULL);
hash = flow_hash_symmetric_l3(&flow, 0);
ignore(hash);
/* Convert flow to match. */

View File

@ -409,17 +409,23 @@ actions=note:41.42.43,note:00.01.02.03.04.05.06.07,note
tcp,tp_src=0x1230/0xfff0,tun_id=0x1234,cookie=0x5678,actions=flood
actions=set_tunnel:0x1234,set_tunnel64:0x9876,set_tunnel:0x123456789
actions=multipath(eth_src, 50, hrw, 12, 0, NXM_NX_REG0[0..3]),multipath(symmetric_l4, 1024, iter_hash, 5000, 5050, reg0[0..12])
actions=multipath(eth_src, 50, hrw, 12, 0, NXM_NX_REG0[0..3]),multipath(symmetric_l3, 1024, iter_hash, 5000, 5050, reg0[0..12])
table=1,actions=drop
tun_id=0x1234000056780000/0xffff0000ffff0000,actions=drop
metadata=0x1234ffff5678ffff/0xffff0000ffff0000,actions=drop
actions=bundle(eth_src,50,active_backup,ofport,slaves:1)
actions=bundle(symmetric_l4,60,hrw,ofport,slaves:2,3)
actions=bundle(symmetric_l4,60,hrw,ofport,slaves:)
actions=bundle(symmetric_l3,60,hrw,ofport,slaves:2,3)
actions=bundle(symmetric_l3,60,hrw,ofport,slaves:)
actions=output:1,bundle(eth_src,0,hrw,ofport,slaves:1),output:2
actions=bundle_load(eth_src,50,active_backup,ofport,reg0,slaves:1)
actions=bundle_load(symmetric_l4,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
actions=bundle_load(symmetric_l4,60,hrw,ofport,reg0[0..15],slaves:[2,3])
actions=bundle_load(symmetric_l4,60,hrw,ofport,NXM_NX_REG0[0..30],slaves:)
actions=bundle_load(symmetric_l3,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
actions=bundle_load(symmetric_l3,60,hrw,ofport,reg0[0..15],slaves:[2,3])
actions=bundle_load(symmetric_l3,60,hrw,ofport,NXM_NX_REG0[0..30],slaves:)
actions=output:1,bundle_load(eth_src,0,hrw,ofport,NXM_NX_REG0[16..31],slaves:1),output:2
actions=resubmit:1,resubmit(2),resubmit(,3),resubmit(2,3)
send_flow_rem,actions=output:1,output:NXM_NX_REG0,output:2,output:reg1[16..31],output:3
@ -459,17 +465,23 @@ NXT_FLOW_MOD: ADD table:255 actions=note:41.42.43.00.00.00,note:00.01.02.03.04.0
NXT_FLOW_MOD: ADD table:255 tcp,tun_id=0x1234,tp_src=0x1230/0xfff0 cookie:0x5678 actions=FLOOD
NXT_FLOW_MOD: ADD table:255 actions=set_tunnel:0x1234,set_tunnel64:0x9876,set_tunnel64:0x123456789
NXT_FLOW_MOD: ADD table:255 actions=multipath(eth_src,50,hrw,12,0,NXM_NX_REG0[0..3]),multipath(symmetric_l4,1024,iter_hash,5000,5050,NXM_NX_REG0[0..12])
NXT_FLOW_MOD: ADD table:255 actions=multipath(eth_src,50,hrw,12,0,NXM_NX_REG0[0..3]),multipath(symmetric_l3,1024,iter_hash,5000,5050,NXM_NX_REG0[0..12])
NXT_FLOW_MOD: ADD table:1 actions=drop
NXT_FLOW_MOD: ADD table:255 tun_id=0x1234000056780000/0xffff0000ffff0000 actions=drop
NXT_FLOW_MOD: ADD table:255 metadata=0x1234000056780000/0xffff0000ffff0000 actions=drop
NXT_FLOW_MOD: ADD table:255 actions=bundle(eth_src,50,active_backup,ofport,slaves:1)
NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l4,60,hrw,ofport,slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l4,60,hrw,ofport,slaves:)
NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l3,60,hrw,ofport,slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle(symmetric_l3,60,hrw,ofport,slaves:)
NXT_FLOW_MOD: ADD table:255 actions=output:1,bundle(eth_src,0,hrw,ofport,slaves:1),output:2
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(eth_src,50,active_backup,ofport,NXM_NX_REG0[],slaves:1)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l4,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l4,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l4,60,hrw,ofport,NXM_NX_REG0[0..30],slaves:)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l3,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l3,60,hrw,ofport,NXM_NX_REG0[0..15],slaves:2,3)
NXT_FLOW_MOD: ADD table:255 actions=bundle_load(symmetric_l3,60,hrw,ofport,NXM_NX_REG0[0..30],slaves:)
NXT_FLOW_MOD: ADD table:255 actions=output:1,bundle_load(eth_src,0,hrw,ofport,NXM_NX_REG0[16..31],slaves:1),output:2
NXT_FLOW_MOD: ADD table:255 actions=resubmit:1,resubmit:2,resubmit(,3),resubmit(2,3)
NXT_FLOW_MOD: ADD table:255 send_flow_rem actions=output:1,output:NXM_NX_REG0[],output:2,output:NXM_NX_REG1[16..31],output:3

View File

@ -1421,6 +1421,8 @@ and IPv6, which hash to a constant zero.
Like \fBsymmetric_l3l4+udp\fR, but UDP ports are included in the hash.
This is a more effective hash when asymmetric UDP protocols such as
VXLAN are not a consideration.
.IP \fBsymmetric_l3\fR
Hashes network source address and network destination address.
.IP \fBnw_src\fR
Hashes Network source address only.
.IP \fBnw_dst\fR