X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fvport-gre.c;h=86137565a381015b22fe4f19315ff020dad7d00f;hb=29c71cfa0c137abd49bfa346c1b871d2543071ae;hp=4f7be00687e90b180e0320876cb52e11fe197f25;hpb=5ebaf571f9a3531d06eb52b62ac237ab7292f7b0;p=sliver-openvswitch.git diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c index 4f7be0068..86137565a 100644 --- a/datapath/vport-gre.c +++ b/datapath/vport-gre.c @@ -16,6 +16,8 @@ * 02110-1301, USA */ +#include +#if IS_ENABLED(CONFIG_NET_IPGRE_DEMUX) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include @@ -24,8 +26,6 @@ #include #include #include -#include -#include #include #include #include @@ -33,10 +33,11 @@ #include #include #include +#include +#include #include #include - #include #include #include @@ -44,7 +45,6 @@ #include #include "datapath.h" -#include "tunnel.h" #include "vport.h" /* Returns the least-significant 32 bits of a __be64. */ @@ -110,7 +110,7 @@ static int gre_rcv(struct sk_buff *skb, return PACKET_REJECT; key = key_to_tunnel_id(tpi->key, tpi->seq); - tnl_tun_key_init(&tun_key, ip_hdr(skb), key, filter_tnl_flags(tpi->flags)); + ovs_flow_tun_key_init(&tun_key, ip_hdr(skb), key, filter_tnl_flags(tpi->flags)); ovs_vport_receive(vport, skb, &tun_key); return PACKET_RCVD; @@ -120,15 +120,12 @@ static int __send(struct vport *vport, struct sk_buff *skb, int tunnel_hlen, __be32 seq, __be16 gre64_flag) { - struct net *net = ovs_dp_get_net(vport->dp); struct rtable *rt; int min_headroom; __be16 df; __be32 saddr; int err; - forward_ip_summed(skb, true); - /* Route lookup */ saddr = OVS_CB(skb)->tun_key->ipv4_src; rt = find_route(ovs_dp_get_net(vport->dp), @@ -136,7 +133,7 @@ static int __send(struct vport *vport, struct sk_buff *skb, OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_GRE, OVS_CB(skb)->tun_key->ipv4_tos, - skb_get_mark(skb)); + skb->mark); if (IS_ERR(rt)) { err = PTR_ERR(rt); goto error; @@ -156,9 +153,14 @@ static int __send(struct vport *vport, struct sk_buff *skb, goto err_free_rt; } - if (unlikely(vlan_deaccel_tag(skb))) { - err = -ENOMEM; - goto err_free_rt; + if (vlan_tx_tag_present(skb)) { + if (unlikely(!__vlan_put_tag(skb, + skb->vlan_proto, + vlan_tx_tag_get(skb)))) { + err = -ENOMEM; + goto err_free_rt; + } + vlan_set_tci(skb, 0); } /* Push Tunnel header. */ @@ -173,10 +175,10 @@ static int __send(struct vport *vport, struct sk_buff *skb, skb->local_df = 1; - return iptunnel_xmit(net, rt, skb, saddr, + return iptunnel_xmit(rt, skb, saddr, OVS_CB(skb)->tun_key->ipv4_dst, IPPROTO_GRE, OVS_CB(skb)->tun_key->ipv4_tos, - OVS_CB(skb)->tun_key->ipv4_ttl, df); + OVS_CB(skb)->tun_key->ipv4_ttl, df, false); err_free_rt: ip_rt_put(rt); error: @@ -333,17 +335,19 @@ static __be32 be64_get_high32(__be64 x) static int gre64_send(struct vport *vport, struct sk_buff *skb) { - int hlen; + int hlen = GRE_HEADER_SECTION + /* GRE Hdr */ + GRE_HEADER_SECTION + /* GRE Key */ + GRE_HEADER_SECTION; /* GRE SEQ */ __be32 seq; if (unlikely(!OVS_CB(skb)->tun_key)) return -EINVAL; - hlen = ip_gre_calc_hlen(OVS_CB(skb)->tun_key->tun_flags) - + GRE_HEADER_SECTION; + if (OVS_CB(skb)->tun_key->tun_flags & TUNNEL_CSUM) + hlen += GRE_HEADER_SECTION; seq = be64_get_high32(OVS_CB(skb)->tun_key->tun_id); - return __send(vport, skb, hlen, seq, TUNNEL_SEQ); + return __send(vport, skb, hlen, seq, (TUNNEL_KEY|TUNNEL_SEQ)); } const struct vport_ops ovs_gre64_vport_ops = { @@ -353,3 +357,4 @@ const struct vport_ops ovs_gre64_vport_ops = { .get_name = gre_get_name, .send = gre64_send, }; +#endif