Merge commit 'tip/tracing/core' into oprofile/core
[safe/jmp/linux-2.6] / net / ipv4 / ip_output.c
index 2470262..d1bcc9f 100644 (file)
@@ -51,6 +51,7 @@
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/highmem.h>
+#include <linux/slab.h>
 
 #include <linux/socket.h>
 #include <linux/sockios.h>
@@ -119,7 +120,7 @@ static int ip_dev_loopback_xmit(struct sk_buff *newskb)
        newskb->pkt_type = PACKET_LOOPBACK;
        newskb->ip_summed = CHECKSUM_UNNECESSARY;
        WARN_ON(!skb_dst(newskb));
-       netif_rx(newskb);
+       netif_rx_ni(newskb);
        return 0;
 }
 
@@ -254,7 +255,7 @@ int ip_mc_output(struct sk_buff *skb)
         */
 
        if (rt->rt_flags&RTCF_MULTICAST) {
-               if ((!sk || inet_sk(sk)->mc_loop)
+               if (sk_mc_loop(sk)
 #ifdef CONFIG_IP_MROUTE
                /* Small optimization: do not loopback not local frames,
                   which returned after forwarding; they will be  dropped
@@ -264,9 +265,11 @@ int ip_mc_output(struct sk_buff *skb)
 
                   This check is duplicated in ip_mr_input at the moment.
                 */
-                   && ((rt->rt_flags&RTCF_LOCAL) || !(IPCB(skb)->flags&IPSKB_FORWARDED))
+                   &&
+                   ((rt->rt_flags & RTCF_LOCAL) ||
+                    !(IPCB(skb)->flags & IPSKB_FORWARDED))
 #endif
-               ) {
+                  ) {
                        struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
                        if (newskb)
                                NF_HOOK(PF_INET, NF_INET_POST_ROUTING, newskb,
@@ -329,21 +332,22 @@ int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
                __be32 daddr;
 
                /* Use correct destination address if we have options. */
-               daddr = inet->daddr;
+               daddr = inet->inet_daddr;
                if(opt && opt->srr)
                        daddr = opt->faddr;
 
                {
                        struct flowi fl = { .oif = sk->sk_bound_dev_if,
+                                           .mark = sk->sk_mark,
                                            .nl_u = { .ip4_u =
                                                      { .daddr = daddr,
-                                                       .saddr = inet->saddr,
+                                                       .saddr = inet->inet_saddr,
                                                        .tos = RT_CONN_FLAGS(sk) } },
                                            .proto = sk->sk_protocol,
                                            .flags = inet_sk_flowi_flags(sk),
                                            .uli_u = { .ports =
-                                                      { .sport = inet->sport,
-                                                        .dport = inet->dport } } };
+                                                      { .sport = inet->inet_sport,
+                                                        .dport = inet->inet_dport } } };
 
                        /* If this fails, retransmit mechanism of transport layer will
                         * keep trying until route appears or the connection times
@@ -378,7 +382,7 @@ packet_routed:
 
        if (opt && opt->optlen) {
                iph->ihl += opt->optlen >> 2;
-               ip_options_build(skb, opt, inet->daddr, rt, 0);
+               ip_options_build(skb, opt, inet->inet_daddr, rt, 0);
        }
 
        ip_select_ident_more(iph, &rt->u.dst, sk,
@@ -500,8 +504,8 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
                        if (skb->sk) {
                                frag->sk = skb->sk;
                                frag->destructor = sock_wfree;
-                               truesizes += frag->truesize;
                        }
+                       truesizes += frag->truesize;
                }
 
                /* Everything is OK. Generate! */
@@ -813,6 +817,8 @@ int ip_append_data(struct sock *sk,
                        inet->cork.addr = ipc->addr;
                }
                rt = *rtp;
+               if (unlikely(!rt))
+                       return -EFAULT;
                /*
                 * We steal reference to this route, caller should not release it
                 */
@@ -843,7 +849,8 @@ int ip_append_data(struct sock *sk,
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (inet->cork.length + length > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu-exthdrlen);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport,
+                              mtu-exthdrlen);
                return -EMSGSIZE;
        }
 
@@ -1097,7 +1104,7 @@ ssize_t   ip_append_page(struct sock *sk, struct page *page,
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (inet->cork.length + size > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->dport, mtu);
+               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, mtu);
                return -EMSGSIZE;
        }
 
@@ -1243,7 +1250,6 @@ int ip_push_pending_frames(struct sock *sk)
                skb->len += tmp_skb->len;
                skb->data_len += tmp_skb->len;
                skb->truesize += tmp_skb->truesize;
-               __sock_put(tmp_skb->sk);
                tmp_skb->destructor = NULL;
                tmp_skb->sk = NULL;
        }
@@ -1303,7 +1309,7 @@ int ip_push_pending_frames(struct sock *sk)
        err = ip_local_out(skb);
        if (err) {
                if (err > 0)
-                       err = inet->recverr ? net_xmit_errno(err) : 0;
+                       err = net_xmit_errno(err);
                if (err)
                        goto error;
        }