From 31125ebd8f9b946dc69baadb0f4b2043760e5f6e Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Tue, 10 Jun 2014 10:38:33 -0700 Subject: [PATCH] lisp: Use IP addresses rather than flow on hash failure. When calculating the source port for the UDP header, LISP primarily uses skb_get_hash() but needs a backup in case this fails. The current backup is a hash of the entire flow key but this includes many fields that probably would not be considered to be part of a flow in many situations. It assumes that all fields, including those not used, are zeroed out which will soon not be the case. This switches to using a hash of the IP addresses instead, which solves both problems. These should always be present since LISP encapsulates L3 packets. Signed-off-by: Jesse Gross Acked-by: Thomas Graf --- datapath/vport-lisp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c index a1e2b2b69ca..86c7c5b9188 100644 --- a/datapath/vport-lisp.c +++ b/datapath/vport-lisp.c @@ -173,8 +173,15 @@ static u16 get_src_port(struct net *net, struct sk_buff *skb) if (!hash) { struct sw_flow_key *pkt_key = OVS_CB(skb)->pkt_key; - hash = jhash2((const u32 *)pkt_key, - sizeof(*pkt_key) / sizeof(u32), 0); + if (skb->protocol == htons(ETH_P_IP)) + hash = jhash2((const u32 *)&pkt_key->ipv4.addr, + sizeof(pkt_key->ipv4.addr) / sizeof(u32), 0); + else if (skb->protocol == htons(ETH_P_IPV6)) + hash = jhash2((const u32 *)&pkt_key->ipv6.addr, + sizeof(pkt_key->ipv6.addr) / sizeof(u32), 0); + else + pr_warn_once("LISP inner protocol is not IP when " + "calculating hash.\n"); } inet_get_local_port_range(net, &low, &high);