X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fvport-vxlan.c;h=cc9477dd17d2f8a413635fd3d85766ac3a9a619e;hb=HEAD;hp=5546820e63b6009c9c069b5dcf5f7f3e2b0dbfe4;hpb=cc36576070df622d0fc7a6e26ce01027e12b5b59;p=sliver-openvswitch.git diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c index 5546820e6..cc9477dd1 100644 --- a/datapath/vport-vxlan.c +++ b/datapath/vport-vxlan.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 2011 Nicira, Inc. - * Copyright (c) 2012 Cisco Systems, Inc. + * Copyright (c) 2013 Nicira, Inc. + * Copyright (c) 2013 Cisco Systems, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public @@ -20,7 +20,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) #include #include @@ -32,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -42,18 +40,15 @@ #include #include "datapath.h" -#include "tunnel.h" #include "vport.h" -#define OVS_VXLAN_RCV_PRIORITY 8 - /** * struct vxlan_port - Keeps track of open UDP ports - * @vh: vxlan_handler created for the port. + * @vs: vxlan_sock created for the port. * @name: vport name. */ struct vxlan_port { - struct vxlan_handler *vh; + struct vxlan_sock *vs; char name[IFNAMSIZ]; }; @@ -63,26 +58,25 @@ static inline struct vxlan_port *vxlan_vport(const struct vport *vport) } /* Called with rcu_read_lock and BH disabled. */ -static int vxlan_rcv(struct vxlan_handler *vh, struct sk_buff *skb, __be32 vx_vni) +static void vxlan_rcv(struct vxlan_sock *vs, struct sk_buff *skb, __be32 vx_vni) { - struct vport *vport = vh->data; - struct iphdr *iph; struct ovs_key_ipv4_tunnel tun_key; + struct vport *vport = vs->data; + struct iphdr *iph; __be64 key; /* Save outer tunnel values */ iph = ip_hdr(skb); key = cpu_to_be64(ntohl(vx_vni) >> 8); - tnl_tun_key_init(&tun_key, iph, key, TUNNEL_KEY); + ovs_flow_tun_key_init(&tun_key, iph, key, TUNNEL_KEY); ovs_vport_receive(vport, skb, &tun_key); - return PACKET_RCVD; } static int vxlan_get_options(const struct vport *vport, struct sk_buff *skb) { struct vxlan_port *vxlan_port = vxlan_vport(vport); - __be16 dst_port = inet_sport(vxlan_port->vh->vs->sock->sk); + __be16 dst_port = inet_sport(vxlan_port->vs->sock->sk); if (nla_put_u16(skb, OVS_TUNNEL_ATTR_DST_PORT, ntohs(dst_port))) return -EMSGSIZE; @@ -93,7 +87,7 @@ static void vxlan_tnl_destroy(struct vport *vport) { struct vxlan_port *vxlan_port = vxlan_vport(vport); - vxlan_handler_put(vxlan_port->vh); + vxlan_sock_release(vxlan_port->vs); ovs_vport_deferred_free(vport); } @@ -103,7 +97,7 @@ static struct vport *vxlan_tnl_create(const struct vport_parms *parms) struct net *net = ovs_dp_get_net(parms->dp); struct nlattr *options = parms->options; struct vxlan_port *vxlan_port; - struct vxlan_handler *vh; + struct vxlan_sock *vs; struct vport *vport; struct nlattr *a; u16 dst_port; @@ -130,13 +124,12 @@ static struct vport *vxlan_tnl_create(const struct vport_parms *parms) vxlan_port = vxlan_vport(vport); strncpy(vxlan_port->name, parms->name, IFNAMSIZ); - vh = vxlan_handler_add(net, htons(dst_port), vxlan_rcv, - vport, OVS_VXLAN_RCV_PRIORITY, true); - if (IS_ERR(vh)) { + vs = vxlan_sock_add(net, htons(dst_port), vxlan_rcv, vport, true, false); + if (IS_ERR(vs)) { ovs_vport_free(vport); - return (void *)vh; + return (void *)vs; } - vxlan_port->vh = vh; + vxlan_port->vs = vs; return vport; @@ -146,9 +139,9 @@ error: static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) { - struct vxlan_port *vxlan_port = vxlan_vport(vport); - __be16 dst_port = inet_sport(vxlan_port->vh->vs->sock->sk); struct net *net = ovs_dp_get_net(vport->dp); + struct vxlan_port *vxlan_port = vxlan_vport(vport); + __be16 dst_port = inet_sport(vxlan_port->vs->sock->sk); struct rtable *rt; __be16 src_port; __be32 saddr; @@ -162,8 +155,6 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) goto error; } - forward_ip_summed(skb, true); - /* Route lookup */ saddr = OVS_CB(skb)->tun_key->ipv4_src; rt = find_route(ovs_dp_get_net(vport->dp), @@ -171,7 +162,7 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_UDP, OVS_CB(skb)->tun_key->ipv4_tos, - skb_get_mark(skb)); + skb->mark); if (IS_ERR(rt)) { err = PTR_ERR(rt); goto error; @@ -182,10 +173,10 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb) skb->local_df = 1; - inet_get_local_port_range(&port_min, &port_max); + inet_get_local_port_range(net, &port_min, &port_max); src_port = vxlan_src_port(port_min, port_max, skb); - err = vxlan_xmit_skb(net, vxlan_port->vh, rt, skb, + err = vxlan_xmit_skb(vxlan_port->vs, rt, skb, saddr, OVS_CB(skb)->tun_key->ipv4_dst, OVS_CB(skb)->tun_key->ipv4_tos, OVS_CB(skb)->tun_key->ipv4_ttl, df, @@ -211,6 +202,3 @@ const struct vport_ops ovs_vxlan_vport_ops = { .get_options = vxlan_get_options, .send = vxlan_tnl_send, }; -#else -#warning VXLAN tunneling will not be available on kernels before 2.6.26 -#endif /* Linux kernel < 2.6.26 */