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

Reply via email to