On 06/10/14 at 04:47pm, Jesse Gross wrote: > 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 <je...@nicira.com> > --- > datapath/vport-lisp.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c > index a1e2b2b..af9a71e 100644 > --- a/datapath/vport-lisp.c > +++ b/datapath/vport-lisp.c > @@ -173,8 +173,12 @@ 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 > + hash = jhash2((const u32 *)&pkt_key->ipv6.addr, > + sizeof(pkt_key->ipv6.addr) / sizeof(u32), 0);
Perhaps check for ETH_P_IPV6 and WARN() on the else branch? OTOH, unlikely that is ever to happen ;-) Acked-by: Thomas Graf <tg...@suug.ch> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev