aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ip/ip6_inlines.h
diff options
context:
space:
mode:
authorTakeru Hayasaka <hayatake396@gmail.com>2023-01-17 04:45:58 +0900
committerNeale Ranns <neale@graphiant.com>2023-03-31 06:04:42 +0000
commitb23c6f4f29b53afa6be2735b30b08fcb115f20cc (patch)
tree59cca6452dca4b17fbce112ca8f4e5b3004565b7 /src/vnet/ip/ip6_inlines.h
parent55686e1c59f8bcf399f5ff58b3ca1030a415009c (diff)
ip: support flow-hash gtpv1teid
support with GTPv1 TEID added to the flow hash. This can able to ECMP to PGW and parallelization. Type: feature Change-Id: I6f758579027caf6123831ef2db7afe17e424a6eb Signed-off-by: Takeru Hayasaka <hayatake396@gmail.com>
Diffstat (limited to 'src/vnet/ip/ip6_inlines.h')
-rw-r--r--src/vnet/ip/ip6_inlines.h16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/vnet/ip/ip6_inlines.h b/src/vnet/ip/ip6_inlines.h
index 9c2be60b267..4a2b91b9ec9 100644
--- a/src/vnet/ip/ip6_inlines.h
+++ b/src/vnet/ip/ip6_inlines.h
@@ -50,14 +50,16 @@ ip6_compute_flow_hash (const ip6_header_t * ip,
flow_hash_config_t flow_hash_config)
{
tcp_header_t *tcp;
+ udp_header_t *udp = (void *) (ip + 1);
+ gtpv1u_header_t *gtpu = (void *) (udp + 1);
u64 a, b, c;
u64 t1, t2;
+ u32 t3;
uword is_tcp_udp = 0;
+ uword is_udp = ip->protocol == IP_PROTOCOL_UDP;
u8 protocol = ip->protocol;
- if (PREDICT_TRUE
- ((ip->protocol == IP_PROTOCOL_TCP)
- || (ip->protocol == IP_PROTOCOL_UDP)))
+ if (PREDICT_TRUE ((ip->protocol == IP_PROTOCOL_TCP) || is_udp))
{
is_tcp_udp = 1;
tcp = (void *) (ip + 1);
@@ -113,7 +115,13 @@ ip6_compute_flow_hash (const ip6_header_t * ip,
((flow_hash_config & IP_FLOW_HASH_FL) ? ip6_flow_label_network_order (ip) :
0);
c ^= t1;
-
+ if (PREDICT_TRUE (is_udp) &&
+ PREDICT_FALSE ((flow_hash_config & IP_FLOW_HASH_GTPV1_TEID) &&
+ udp->dst_port == GTPV1_PORT_BE))
+ {
+ t3 = gtpu->teid;
+ a ^= t3;
+ }
hash_mix64 (a, b, c);
return (u32) c;
}