diff options
Diffstat (limited to 'net/ipv4/raw.c')
| -rw-r--r-- | net/ipv4/raw.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 007e2eb769d..3ccda5ae8a2 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -292,7 +292,8 @@ static int raw_rcv_skb(struct sock * sk, struct sk_buff * skb)  {  	/* Charge it to the socket. */ -	if (ip_queue_rcv_skb(sk, skb) < 0) { +	ipv4_pktinfo_prepare(skb); +	if (sock_queue_rcv_skb(sk, skb) < 0) {  		kfree_skb(skb);  		return NET_RX_DROP;  	} @@ -327,6 +328,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,  	unsigned int iphlen;  	int err;  	struct rtable *rt = *rtp; +	int hlen, tlen;  	if (length > rt->dst.dev->mtu) {  		ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport, @@ -336,12 +338,14 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,  	if (flags&MSG_PROBE)  		goto out; +	hlen = LL_RESERVED_SPACE(rt->dst.dev); +	tlen = rt->dst.dev->needed_tailroom;  	skb = sock_alloc_send_skb(sk, -				  length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15, +				  length + hlen + tlen + 15,  				  flags & MSG_DONTWAIT, &err);  	if (skb == NULL)  		goto error; -	skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev)); +	skb_reserve(skb, hlen);  	skb->priority = sk->sk_priority;  	skb->mark = sk->sk_mark;  |