#include <net/ipip.h>
#include <net/inet_ecn.h>
#include <net/xfrm.h>
+#include <net/dsfield.h>
/*
This version of net/ipv6/sit.c is cloned of net/ipv4/ip_gre.c
static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
{
- if (INET_ECN_is_ce(iph->tos) &&
- INET_ECN_is_not_ce(ip6_get_dsfield(skb->nh.ipv6h)))
+ if (INET_ECN_is_ce(iph->tos))
IP6_ECN_set_ce(skb->nh.ipv6h);
}
}
}
if (rt->rt_type != RTN_UNICAST) {
+ ip_rt_put(rt);
tunnel->stat.tx_carrier_errors++;
goto tx_error_icmp;
}
iph->frag_off = 0;
iph->protocol = IPPROTO_IPV6;
- iph->tos = INET_ECN_encapsulate(tos, ip6_get_dsfield(iph6));
+ iph->tos = INET_ECN_encapsulate(tos, ipv6_get_dsfield(iph6));
iph->daddr = rt->rt_dst;
iph->saddr = rt->rt_src;
ipip6_tunnel_setup);
if (!ipip6_fb_tunnel_dev) {
err = -ENOMEM;
- goto fail;
+ goto err1;
}
ipip6_fb_tunnel_dev->init = ipip6_fb_tunnel_init;
if ((err = register_netdev(ipip6_fb_tunnel_dev)))
- goto fail;
+ goto err2;
out:
return err;
- fail:
- inet_del_protocol(&sit_protocol, IPPROTO_IPV6);
+ err2:
free_netdev(ipip6_fb_tunnel_dev);
+ err1:
+ inet_del_protocol(&sit_protocol, IPPROTO_IPV6);
goto out;
}