]> err.no Git - linux-2.6/blobdiff - net/ipv4/ip_sockglue.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
[linux-2.6] / net / ipv4 / ip_sockglue.c
index f8ab654b6a35de9a762a3e301646a2183aa7af64..4d544573f48adb373e9553141702250a350e3f4e 100644 (file)
@@ -59,7 +59,7 @@ static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
        struct in_pktinfo info;
        struct rtable *rt = (struct rtable *)skb->dst;
 
-       info.ipi_addr.s_addr = skb->nh.iph->daddr;
+       info.ipi_addr.s_addr = ip_hdr(skb)->daddr;
        if (rt) {
                info.ipi_ifindex = rt->rt_iif;
                info.ipi_spec_dst.s_addr = rt->rt_spec_dst;
@@ -73,13 +73,13 @@ static void ip_cmsg_recv_pktinfo(struct msghdr *msg, struct sk_buff *skb)
 
 static void ip_cmsg_recv_ttl(struct msghdr *msg, struct sk_buff *skb)
 {
-       int ttl = skb->nh.iph->ttl;
+       int ttl = ip_hdr(skb)->ttl;
        put_cmsg(msg, SOL_IP, IP_TTL, sizeof(int), &ttl);
 }
 
 static void ip_cmsg_recv_tos(struct msghdr *msg, struct sk_buff *skb)
 {
-       put_cmsg(msg, SOL_IP, IP_TOS, 1, &skb->nh.iph->tos);
+       put_cmsg(msg, SOL_IP, IP_TOS, 1, &ip_hdr(skb)->tos);
 }
 
 static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
@@ -87,7 +87,8 @@ static void ip_cmsg_recv_opts(struct msghdr *msg, struct sk_buff *skb)
        if (IPCB(skb)->opt.optlen == 0)
                return;
 
-       put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen, skb->nh.iph+1);
+       put_cmsg(msg, SOL_IP, IP_RECVOPTS, IPCB(skb)->opt.optlen,
+                ip_hdr(skb) + 1);
 }
 
 
@@ -268,18 +269,21 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
        serr = SKB_EXT_ERR(skb);
        serr->ee.ee_errno = err;
        serr->ee.ee_origin = SO_EE_ORIGIN_ICMP;
-       serr->ee.ee_type = skb->h.icmph->type;
-       serr->ee.ee_code = skb->h.icmph->code;
+       serr->ee.ee_type = icmp_hdr(skb)->type;
+       serr->ee.ee_code = icmp_hdr(skb)->code;
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
        serr->ee.ee_data = 0;
-       serr->addr_offset = (u8*)&(((struct iphdr*)(skb->h.icmph+1))->daddr) - skb->nh.raw;
+       serr->addr_offset = (u8 *)&(((struct iphdr *)(icmp_hdr(skb) + 1))->daddr) -
+                                  skb_network_header(skb);
        serr->port = port;
 
-       skb->h.raw = payload;
-       if (!skb_pull(skb, payload - skb->data) ||
-           sock_queue_err_skb(sk, skb))
-               kfree_skb(skb);
+       if (skb_pull(skb, payload - skb->data) != NULL) {
+               skb_reset_transport_header(skb);
+               if (sock_queue_err_skb(sk, skb) == 0)
+                       return;
+       }
+       kfree_skb(skb);
 }
 
 void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 info)
@@ -298,7 +302,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
 
        skb_put(skb, sizeof(struct iphdr));
        skb_reset_network_header(skb);
-       iph = skb->nh.iph;
+       iph = ip_hdr(skb);
        iph->daddr = daddr;
 
        serr = SKB_EXT_ERR(skb);
@@ -309,11 +313,11 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
        serr->ee.ee_data = 0;
-       serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw;
+       serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
        serr->port = port;
 
-       skb->h.raw = skb->tail;
-       __skb_pull(skb, skb->tail - skb->data);
+       __skb_pull(skb, skb_tail_pointer(skb) - skb->data);
+       skb_reset_transport_header(skb);
 
        if (sock_queue_err_skb(sk, skb))
                kfree_skb(skb);
@@ -355,7 +359,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
        sin = (struct sockaddr_in *)msg->msg_name;
        if (sin) {
                sin->sin_family = AF_INET;
-               sin->sin_addr.s_addr = *(__be32*)(skb->nh.raw + serr->addr_offset);
+               sin->sin_addr.s_addr = *(__be32 *)(skb_network_header(skb) +
+                                                  serr->addr_offset);
                sin->sin_port = serr->port;
                memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
        }
@@ -367,7 +372,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
                struct inet_sock *inet = inet_sk(sk);
 
                sin->sin_family = AF_INET;
-               sin->sin_addr.s_addr = skb->nh.iph->saddr;
+               sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
                sin->sin_port = 0;
                memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
                if (inet->cmsg_flags)
@@ -537,7 +542,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                inet->hdrincl = val ? 1 : 0;
                break;
        case IP_MTU_DISCOVER:
-               if (val<0 || val>2)
+               if (val<0 || val>3)
                        goto e_inval;
                inet->pmtudisc = val;
                break;