aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/raw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/raw.c')
-rw-r--r--net/ipv4/raw.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 007e2eb769d3..3ccda5ae8a27 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)
292{ 292{
293 /* Charge it to the socket. */ 293 /* Charge it to the socket. */
294 294
295 if (ip_queue_rcv_skb(sk, skb) < 0) { 295 ipv4_pktinfo_prepare(skb);
296 if (sock_queue_rcv_skb(sk, skb) < 0) {
296 kfree_skb(skb); 297 kfree_skb(skb);
297 return NET_RX_DROP; 298 return NET_RX_DROP;
298 } 299 }
@@ -327,6 +328,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
327 unsigned int iphlen; 328 unsigned int iphlen;
328 int err; 329 int err;
329 struct rtable *rt = *rtp; 330 struct rtable *rt = *rtp;
331 int hlen, tlen;
330 332
331 if (length > rt->dst.dev->mtu) { 333 if (length > rt->dst.dev->mtu) {
332 ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport, 334 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,
336 if (flags&MSG_PROBE) 338 if (flags&MSG_PROBE)
337 goto out; 339 goto out;
338 340
341 hlen = LL_RESERVED_SPACE(rt->dst.dev);
342 tlen = rt->dst.dev->needed_tailroom;
339 skb = sock_alloc_send_skb(sk, 343 skb = sock_alloc_send_skb(sk,
340 length + LL_ALLOCATED_SPACE(rt->dst.dev) + 15, 344 length + hlen + tlen + 15,
341 flags & MSG_DONTWAIT, &err); 345 flags & MSG_DONTWAIT, &err);
342 if (skb == NULL) 346 if (skb == NULL)
343 goto error; 347 goto error;
344 skb_reserve(skb, LL_RESERVED_SPACE(rt->dst.dev)); 348 skb_reserve(skb, hlen);
345 349
346 skb->priority = sk->sk_priority; 350 skb->priority = sk->sk_priority;
347 skb->mark = sk->sk_mark; 351 skb->mark = sk->sk_mark;