diff options
Diffstat (limited to 'net/ipv6/sit.c')
| -rw-r--r-- | net/ipv6/sit.c | 47 | 
1 files changed, 20 insertions, 27 deletions
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 43b33373adb..1cca5761aea 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -250,11 +250,6 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net,  	dev_net_set(dev, net); -	if (strchr(name, '%')) { -		if (dev_alloc_name(dev, name) < 0) -			goto failed_free; -	} -  	nt = netdev_priv(dev);  	nt->parms = *parms; @@ -401,11 +396,6 @@ out:  	return err;  } -static void prl_entry_destroy_rcu(struct rcu_head *head) -{ -	kfree(container_of(head, struct ip_tunnel_prl_entry, rcu_head)); -} -  static void prl_list_destroy_rcu(struct rcu_head *head)  {  	struct ip_tunnel_prl_entry *p, *n; @@ -433,7 +423,7 @@ ipip6_tunnel_del_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a)  		     p = &x->next) {  			if (x->addr == a->addr) {  				*p = x->next; -				call_rcu(&x->rcu_head, prl_entry_destroy_rcu); +				kfree_rcu(x, rcu_head);  				t->prl_count--;  				goto out;  			} @@ -452,7 +442,7 @@ out:  }  static int -isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t) +isatap_chksrc(struct sk_buff *skb, const struct iphdr *iph, struct ip_tunnel *t)  {  	struct ip_tunnel_prl_entry *p;  	int ok = 1; @@ -465,7 +455,8 @@ isatap_chksrc(struct sk_buff *skb, struct iphdr *iph, struct ip_tunnel *t)  		else  			skb->ndisc_nodetype = NDISC_NODETYPE_NODEFAULT;  	} else { -		struct in6_addr *addr6 = &ipv6_hdr(skb)->saddr; +		const struct in6_addr *addr6 = &ipv6_hdr(skb)->saddr; +  		if (ipv6_addr_is_isatap(addr6) &&  		    (addr6->s6_addr32[3] == iph->saddr) &&  		    ipv6_chk_prefix(addr6, t->dev)) @@ -499,7 +490,7 @@ static int ipip6_err(struct sk_buff *skb, u32 info)     8 bytes of packet payload. It means, that precise relaying of     ICMP in the real Internet is absolutely infeasible.   */ -	struct iphdr *iph = (struct iphdr*)skb->data; +	const struct iphdr *iph = (const struct iphdr *)skb->data;  	const int type = icmp_hdr(skb)->type;  	const int code = icmp_hdr(skb)->code;  	struct ip_tunnel *t; @@ -557,7 +548,7 @@ out:  	return err;  } -static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb) +static inline void ipip6_ecn_decapsulate(const struct iphdr *iph, struct sk_buff *skb)  {  	if (INET_ECN_is_ce(iph->tos))  		IP6_ECN_set_ce(ipv6_hdr(skb)); @@ -565,7 +556,7 @@ static inline void ipip6_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)  static int ipip6_rcv(struct sk_buff *skb)  { -	struct iphdr *iph; +	const struct iphdr *iph;  	struct ip_tunnel *tunnel;  	if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) @@ -621,7 +612,7 @@ out:   * comes from 6rd / 6to4 (RFC 3056) addr space.   */  static inline -__be32 try_6rd(struct in6_addr *v6dst, struct ip_tunnel *tunnel) +__be32 try_6rd(const struct in6_addr *v6dst, struct ip_tunnel *tunnel)  {  	__be32 dst = 0; @@ -664,8 +655,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  {  	struct ip_tunnel *tunnel = netdev_priv(dev);  	struct pcpu_tstats *tstats; -	struct iphdr  *tiph = &tunnel->parms.iph; -	struct ipv6hdr *iph6 = ipv6_hdr(skb); +	const struct iphdr  *tiph = &tunnel->parms.iph; +	const struct ipv6hdr *iph6 = ipv6_hdr(skb);  	u8     tos = tunnel->parms.iph.tos;  	__be16 df = tiph->frag_off;  	struct rtable *rt;     			/* Route to the other host */ @@ -673,8 +664,9 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  	struct iphdr  *iph;			/* Our new IP header */  	unsigned int max_headroom;		/* The extra header space needed */  	__be32 dst = tiph->daddr; +	struct flowi4 fl4;  	int    mtu; -	struct in6_addr *addr6; +	const struct in6_addr *addr6;  	int addr_type;  	if (skb->protocol != htons(ETH_P_IPV6)) @@ -693,7 +685,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  			goto tx_error;  		} -		addr6 = (struct in6_addr*)&neigh->primary_key; +		addr6 = (const struct in6_addr*)&neigh->primary_key;  		addr_type = ipv6_addr_type(addr6);  		if ((addr_type & IPV6_ADDR_UNICAST) && @@ -718,7 +710,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  			goto tx_error;  		} -		addr6 = (struct in6_addr*)&neigh->primary_key; +		addr6 = (const struct in6_addr*)&neigh->primary_key;  		addr_type = ipv6_addr_type(addr6);  		if (addr_type == IPV6_ADDR_ANY) { @@ -732,7 +724,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  		dst = addr6->s6_addr32[3];  	} -	rt = ip_route_output_ports(dev_net(dev), NULL, +	rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,  				   dst, tiph->saddr,  				   0, 0,  				   IPPROTO_IPV6, RT_TOS(tos), @@ -826,8 +818,8 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,  	iph->frag_off		=	df;  	iph->protocol		=	IPPROTO_IPV6;  	iph->tos		=	INET_ECN_encapsulate(tos, ipv6_get_dsfield(iph6)); -	iph->daddr		=	rt->rt_dst; -	iph->saddr		=	rt->rt_src; +	iph->daddr		=	fl4.daddr; +	iph->saddr		=	fl4.saddr;  	if ((iph->ttl = tiph->ttl) == 0)  		iph->ttl	=	iph6->hop_limit; @@ -849,13 +841,14 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)  {  	struct net_device *tdev = NULL;  	struct ip_tunnel *tunnel; -	struct iphdr *iph; +	const struct iphdr *iph; +	struct flowi4 fl4;  	tunnel = netdev_priv(dev);  	iph = &tunnel->parms.iph;  	if (iph->daddr) { -		struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL, +		struct rtable *rt = ip_route_output_ports(dev_net(dev), &fl4, NULL,  							  iph->daddr, iph->saddr,  							  0, 0,  							  IPPROTO_IPV6,  |