diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 50 | 
1 files changed, 26 insertions, 24 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 46cf7bea676..9d4b165837d 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -869,9 +869,9 @@ fail:  	return err;  } -static inline int ip6_rt_check(struct rt6key *rt_key, -			       struct in6_addr *fl_addr, -			       struct in6_addr *addr_cache) +static inline int ip6_rt_check(const struct rt6key *rt_key, +			       const struct in6_addr *fl_addr, +			       const struct in6_addr *addr_cache)  {  	return (rt_key->plen != 128 || !ipv6_addr_equal(fl_addr, &rt_key->addr)) &&  		(addr_cache == NULL || !ipv6_addr_equal(fl_addr, addr_cache)); @@ -879,7 +879,7 @@ static inline int ip6_rt_check(struct rt6key *rt_key,  static struct dst_entry *ip6_sk_dst_check(struct sock *sk,  					  struct dst_entry *dst, -					  struct flowi6 *fl6) +					  const struct flowi6 *fl6)  {  	struct ipv6_pinfo *np = inet6_sk(sk);  	struct rt6_info *rt = (struct rt6_info *)dst; @@ -930,10 +930,10 @@ static int ip6_dst_lookup_tail(struct sock *sk,  		goto out_err_release;  	if (ipv6_addr_any(&fl6->saddr)) { -		err = ipv6_dev_get_saddr(net, ip6_dst_idev(*dst)->dev, -					 &fl6->daddr, -					 sk ? inet6_sk(sk)->srcprefs : 0, -					 &fl6->saddr); +		struct rt6_info *rt = (struct rt6_info *) *dst; +		err = ip6_route_get_saddr(net, rt, &fl6->daddr, +					  sk ? inet6_sk(sk)->srcprefs : 0, +					  &fl6->saddr);  		if (err)  			goto out_err_release;  	} @@ -1150,6 +1150,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  {  	struct inet_sock *inet = inet_sk(sk);  	struct ipv6_pinfo *np = inet6_sk(sk); +	struct inet_cork *cork;  	struct sk_buff *skb;  	unsigned int maxfraglen, fragheaderlen;  	int exthdrlen; @@ -1163,6 +1164,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	if (flags&MSG_PROBE)  		return 0; +	cork = &inet->cork.base;  	if (skb_queue_empty(&sk->sk_write_queue)) {  		/*  		 * setup for corking @@ -1202,7 +1204,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  			/* need source address above miyazawa*/  		}  		dst_hold(&rt->dst); -		inet->cork.dst = &rt->dst; +		cork->dst = &rt->dst;  		inet->cork.fl.u.ip6 = *fl6;  		np->cork.hop_limit = hlimit;  		np->cork.tclass = tclass; @@ -1212,10 +1214,10 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  			if (np->frag_size)  				mtu = np->frag_size;  		} -		inet->cork.fragsize = mtu; +		cork->fragsize = mtu;  		if (dst_allfrag(rt->dst.path)) -			inet->cork.flags |= IPCORK_ALLFRAG; -		inet->cork.length = 0; +			cork->flags |= IPCORK_ALLFRAG; +		cork->length = 0;  		sk->sk_sndmsg_page = NULL;  		sk->sk_sndmsg_off = 0;  		exthdrlen = rt->dst.header_len + (opt ? opt->opt_flen : 0) - @@ -1223,12 +1225,12 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  		length += exthdrlen;  		transhdrlen += exthdrlen;  	} else { -		rt = (struct rt6_info *)inet->cork.dst; +		rt = (struct rt6_info *)cork->dst;  		fl6 = &inet->cork.fl.u.ip6;  		opt = np->cork.opt;  		transhdrlen = 0;  		exthdrlen = 0; -		mtu = inet->cork.fragsize; +		mtu = cork->fragsize;  	}  	hh_len = LL_RESERVED_SPACE(rt->dst.dev); @@ -1238,7 +1240,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - sizeof(struct frag_hdr);  	if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) { -		if (inet->cork.length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) { +		if (cork->length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {  			ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);  			return -EMSGSIZE;  		} @@ -1267,7 +1269,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	 * --yoshfuji  	 */ -	inet->cork.length += length; +	cork->length += length;  	if (length > mtu) {  		int proto = sk->sk_protocol;  		if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){ @@ -1292,7 +1294,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,  	while (length > 0) {  		/* Check if the remaining data fits into current packet. */ -		copy = (inet->cork.length <= mtu && !(inet->cork.flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len; +		copy = (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - skb->len;  		if (copy < length)  			copy = maxfraglen - skb->len; @@ -1317,7 +1319,7 @@ alloc_new_skb:  			 * we know we need more fragment(s).  			 */  			datalen = length + fraggap; -			if (datalen > (inet->cork.length <= mtu && !(inet->cork.flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen) +			if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen)  				datalen = maxfraglen - fragheaderlen;  			fraglen = datalen + fragheaderlen; @@ -1481,7 +1483,7 @@ alloc_new_skb:  	}  	return 0;  error: -	inet->cork.length -= length; +	cork->length -= length;  	IP6_INC_STATS(sock_net(sk), rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);  	return err;  } @@ -1497,10 +1499,10 @@ static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)  		np->cork.opt = NULL;  	} -	if (inet->cork.dst) { -		dst_release(inet->cork.dst); -		inet->cork.dst = NULL; -		inet->cork.flags &= ~IPCORK_ALLFRAG; +	if (inet->cork.base.dst) { +		dst_release(inet->cork.base.dst); +		inet->cork.base.dst = NULL; +		inet->cork.base.flags &= ~IPCORK_ALLFRAG;  	}  	memset(&inet->cork.fl, 0, sizeof(inet->cork.fl));  } @@ -1515,7 +1517,7 @@ int ip6_push_pending_frames(struct sock *sk)  	struct net *net = sock_net(sk);  	struct ipv6hdr *hdr;  	struct ipv6_txoptions *opt = np->cork.opt; -	struct rt6_info *rt = (struct rt6_info *)inet->cork.dst; +	struct rt6_info *rt = (struct rt6_info *)inet->cork.base.dst;  	struct flowi6 *fl6 = &inet->cork.fl.u.ip6;  	unsigned char proto = fl6->flowi6_proto;  	int err = 0;  |