Skip to content

Commit

Permalink
datapath: Account for "openvswitch: Add support for checksums on UDP …
Browse files Browse the repository at this point in the history
…tunnels."

Upstream commit:
    openvswitch: Add support for checksums on UDP tunnels.

    Currently, it isn't possible to request checksums on the outer UDP
    header of tunnels - the TUNNEL_CSUM flag is ignored. This adds
    support for requesting that UDP checksums be computed on transmit
    and properly reported if they are present on receive.

    Signed-off-by: Jesse Gross <jesse@nicira.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Upstream: b8693877 ("openvswitch: Add support for checksums on UDP tunnels.")
Signed-off-by: Jesse Gross <jesse@nicira.com>
  • Loading branch information
jessegross committed Feb 19, 2015
1 parent d35e26f commit c8eddf8
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
4 changes: 4 additions & 0 deletions datapath/linux/compat/include/net/vxlan.h
Expand Up @@ -77,6 +77,10 @@ struct vxlanhdr_gbp {
#define VXLAN_F_GBP 0x800
#endif

#ifndef VXLAN_F_UDP_CSUM
#define VXLAN_F_UDP_CSUM 0x40
#endif

#ifndef VXLAN_F_RCV_FLAGS
#define VXLAN_F_RCV_FLAGS VXLAN_F_GBP
#endif
Expand Down
5 changes: 3 additions & 2 deletions datapath/linux/compat/vxlan.c
Expand Up @@ -191,8 +191,9 @@ int vxlan_xmit_skb(struct vxlan_sock *vs,
struct vxlanhdr *vxh;
int min_headroom;
int err;
bool udp_sum = !!(vxflags & VXLAN_F_UDP_CSUM);

skb = udp_tunnel_handle_offloads(skb, false, true);
skb = udp_tunnel_handle_offloads(skb, udp_sum, true);
if (IS_ERR(skb))
return PTR_ERR(skb);

Expand Down Expand Up @@ -224,7 +225,7 @@ int vxlan_xmit_skb(struct vxlan_sock *vs,

return udp_tunnel_xmit_skb(rt, skb, src, dst, tos,
ttl, df, src_port, dst_port, xnet,
true);
!udp_sum);
}

static void rcu_free_vs(struct rcu_head *rcu)
Expand Down
7 changes: 5 additions & 2 deletions datapath/vport-vxlan.c
Expand Up @@ -72,7 +72,7 @@ static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb,
__be64 key;
__be16 flags;

flags = TUNNEL_KEY;
flags = TUNNEL_KEY | (udp_hdr(skb)->check != 0 ? TUNNEL_CSUM : 0);
vxlan_port = vxlan_vport(vport);
if (vxlan_port->exts & VXLAN_F_GBP && md->gbp)
flags |= TUNNEL_VXLAN_OPT;
Expand Down Expand Up @@ -228,6 +228,7 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb)
__be32 saddr;
__be16 df;
int err;
u32 vxflags;

if (unlikely(!OVS_CB(skb)->egress_tun_info)) {
err = -EINVAL;
Expand All @@ -253,13 +254,15 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb)
src_port = udp_flow_src_port(net, skb, 0, 0, true);
md.vni = htonl(be64_to_cpu(tun_key->tun_id) << 8);
md.gbp = vxlan_ext_gbp(skb);
vxflags = vxlan_port->exts |
(tun_key->tun_flags & TUNNEL_CSUM ? VXLAN_F_UDP_CSUM : 0);

err = vxlan_xmit_skb(vxlan_port->vs, rt, skb,
saddr, tun_key->ipv4_dst,
tun_key->ipv4_tos,
tun_key->ipv4_ttl, df,
src_port, dst_port,
&md, false, vxlan_port->exts);
&md, false, vxflags);
if (err < 0)
ip_rt_put(rt);
return err;
Expand Down

0 comments on commit c8eddf8

Please sign in to comment.