diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 22 | 
1 files changed, 12 insertions, 10 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 2c7a1639388..009a7b2aa1e 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -314,7 +314,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)  }  static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, -			struct rtable *rt, +			struct rtable **rtp,  			unsigned int flags)  {  	struct inet_sock *inet = inet_sk(sk); @@ -323,25 +323,27 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,  	struct sk_buff *skb;  	unsigned int iphlen;  	int err; +	struct rtable *rt = *rtp; -	if (length > rt->u.dst.dev->mtu) { +	if (length > rt->dst.dev->mtu) {  		ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, -			       rt->u.dst.dev->mtu); +			       rt->dst.dev->mtu);  		return -EMSGSIZE;  	}  	if (flags&MSG_PROBE)  		goto out;  	skb = sock_alloc_send_skb(sk, -				  length + LL_ALLOCATED_SPACE(rt->u.dst.dev) + 15, +				  length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15,  				  flags & MSG_DONTWAIT, &err);  	if (skb == NULL)  		goto error; -	skb_reserve(skb, LL_RESERVED_SPACE(rt->u.dst.dev)); +	skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev));  	skb->priority = sk->sk_priority;  	skb->mark = sk->sk_mark; -	skb_dst_set(skb, dst_clone(&rt->u.dst)); +	skb_dst_set(skb, &rt->dst); +	*rtp = NULL;  	skb_reset_network_header(skb);  	iph = ip_hdr(skb); @@ -373,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,  		iph->check   = 0;  		iph->tot_len = htons(length);  		if (!iph->id) -			ip_select_ident(iph, &rt->u.dst, NULL); +			ip_select_ident(iph, &rt->dst, NULL);  		iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);  	} @@ -382,7 +384,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,  			skb_transport_header(skb))->type);  	err = NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, -		      rt->u.dst.dev, dst_output); +		      rt->dst.dev, dst_output);  	if (err > 0)  		err = net_xmit_errno(err);  	if (err) @@ -576,7 +578,7 @@ back_from_confirm:  	if (inet->hdrincl)  		err = raw_send_hdrinc(sk, msg->msg_iov, len, -					rt, msg->msg_flags); +					&rt, msg->msg_flags);  	 else {  		if (!ipc.addr) @@ -604,7 +606,7 @@ out:  	return len;  do_confirm: -	dst_confirm(&rt->u.dst); +	dst_confirm(&rt->dst);  	if (!(msg->msg_flags & MSG_PROBE) || len)  		goto back_from_confirm;  	err = 0;  |