inet: Pass flowi to ->queue_xmit().
authorDavid S. Miller <davem@davemloft.net>
Sat, 7 May 2011 05:23:20 +0000 (22:23 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 8 May 2011 22:28:28 +0000 (15:28 -0700)
This allows us to acquire the exact route keying information from the
protocol, however that might be managed.

It handles all of the possibilities, from the simplest case of storing
the key in inet->cork.fl to the more complex setup SCTP has where
individual transports determine the flow.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet6_connection_sock.h
include/net/inet_connection_sock.h
include/net/ip.h
net/dccp/output.c
net/ipv4/ip_output.c
net/ipv4/tcp_output.c
net/ipv6/inet6_connection_sock.c
net/l2tp/l2tp_core.c
net/l2tp/l2tp_ip.c
net/sctp/protocol.c

index ff013505236ba3c6f37c7185a5827030eab89e38..3207e58ee0198a6d185eea363950e15329c98ea6 100644 (file)
@@ -41,5 +41,5 @@ extern void inet6_csk_reqsk_queue_hash_add(struct sock *sk,
 
 extern void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
 
-extern int inet6_csk_xmit(struct sk_buff *skb);
+extern int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl);
 #endif /* _INET6_CONNECTION_SOCK_H */
index 4367d913c0e221a90ec56dda6e4d1799ebeca217..96546cae1cba8c485a8db33a23fa8444c9833350 100644 (file)
@@ -36,7 +36,7 @@ struct tcp_congestion_ops;
  * (i.e. things that depend on the address family)
  */
 struct inet_connection_sock_af_ops {
-       int         (*queue_xmit)(struct sk_buff *skb);
+       int         (*queue_xmit)(struct sk_buff *skb, struct flowi *fl);
        void        (*send_check)(struct sock *sk, struct sk_buff *skb);
        int         (*rebuild_header)(struct sock *sk);
        int         (*conn_request)(struct sock *sk, struct sk_buff *skb);
index 095e392d5f16f89c08dd370fd10ff40716a8103a..acf8b7814c4e58224a4f05c89b490e25481e477e 100644 (file)
@@ -104,7 +104,7 @@ extern int          ip_do_nat(struct sk_buff *skb);
 extern void            ip_send_check(struct iphdr *ip);
 extern int             __ip_local_out(struct sk_buff *skb);
 extern int             ip_local_out(struct sk_buff *skb);
-extern int             ip_queue_xmit(struct sk_buff *skb);
+extern int             ip_queue_xmit(struct sk_buff *skb, struct flowi *fl);
 extern void            ip_init(void);
 extern int             ip_append_data(struct sock *sk,
                                       int getfrag(void *from, char *to, int offset, int len,
index 136d41cbcd02a903527643d69e397f0ceed26b9c..fab108e51e5a8fe1fe3a80de27735c56ef037a1d 100644 (file)
@@ -43,7 +43,7 @@ static void dccp_skb_entail(struct sock *sk, struct sk_buff *skb)
 static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 {
        if (likely(skb != NULL)) {
-               const struct inet_sock *inet = inet_sk(sk);
+               struct inet_sock *inet = inet_sk(sk);
                const struct inet_connection_sock *icsk = inet_csk(sk);
                struct dccp_sock *dp = dccp_sk(sk);
                struct dccp_skb_cb *dcb = DCCP_SKB_CB(skb);
@@ -136,7 +136,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
 
                DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
 
-               err = icsk->icsk_af_ops->queue_xmit(skb);
+               err = icsk->icsk_af_ops->queue_xmit(skb, &inet->cork.fl);
                return net_xmit_eval(err);
        }
        return -ENOBUFS;
index 4ba26d4040eda126526ab2d6a95f5af9515b41c5..14ee1e47720c522b5bb35cc2ff71aff0402acc48 100644 (file)
@@ -312,7 +312,7 @@ int ip_output(struct sk_buff *skb)
                            !(IPCB(skb)->flags & IPSKB_REROUTED));
 }
 
-int ip_queue_xmit(struct sk_buff *skb)
+int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl)
 {
        struct sock *sk = skb->sk;
        struct inet_sock *inet = inet_sk(sk);
@@ -332,7 +332,7 @@ int ip_queue_xmit(struct sk_buff *skb)
                goto packet_routed;
 
        /* Make sure we can route this packet. */
-       fl4 = &inet->cork.fl.u.ip4;
+       fl4 = &fl->u.ip4;
        rt = (struct rtable *)__sk_dst_check(sk, 0);
        if (rt == NULL) {
                __be32 daddr;
index 17388c7f49c4544127c63f1aefc18c8e3c0bf4ed..882e0b0964d045bba56b6fff551d9c0033fe8505 100644 (file)
@@ -899,7 +899,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
                TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS,
                              tcp_skb_pcount(skb));
 
-       err = icsk->icsk_af_ops->queue_xmit(skb);
+       err = icsk->icsk_af_ops->queue_xmit(skb, &inet->cork.fl);
        if (likely(err <= 0))
                return err;
 
index f2c5b0fc0f218a0294b1c4308a46374bc3410d99..8a58e8cf6646b2bbe886bde46cdb72c7b548822a 100644 (file)
@@ -203,7 +203,7 @@ struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie)
        return dst;
 }
 
-int inet6_csk_xmit(struct sk_buff *skb)
+int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
 {
        struct sock *sk = skb->sk;
        struct inet_sock *inet = inet_sk(sk);
index 78530299ae38d456638f5404e76631675b7c28ae..9be095e00450a20cfa61af1885b731fc451d652d 100644 (file)
@@ -954,7 +954,7 @@ static int l2tp_build_l2tpv3_header(struct l2tp_session *session, void *buf)
 }
 
 static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
-                         size_t data_len)
+                         struct flowi *fl, size_t data_len)
 {
        struct l2tp_tunnel *tunnel = session->tunnel;
        unsigned int len = skb->len;
@@ -987,7 +987,7 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
 
        /* Queue the packet to IP for output */
        skb->local_df = 1;
-       error = ip_queue_xmit(skb);
+       error = ip_queue_xmit(skb, fl);
 
        /* Update stats */
        if (error >= 0) {
@@ -1028,6 +1028,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
        int data_len = skb->len;
        struct l2tp_tunnel *tunnel = session->tunnel;
        struct sock *sk = tunnel->sock;
+       struct flowi *fl;
        struct udphdr *uh;
        struct inet_sock *inet;
        __wsum csum;
@@ -1070,10 +1071,11 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
        skb_dst_drop(skb);
        skb_dst_set(skb, dst_clone(__sk_dst_get(sk)));
 
+       inet = inet_sk(sk);
+       fl = &inet->cork.fl;
        switch (tunnel->encap) {
        case L2TP_ENCAPTYPE_UDP:
                /* Setup UDP header */
-               inet = inet_sk(sk);
                __skb_push(skb, sizeof(*uh));
                skb_reset_transport_header(skb);
                uh = udp_hdr(skb);
@@ -1111,7 +1113,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
 
        l2tp_skb_set_owner_w(skb, sk);
 
-       l2tp_xmit_core(session, skb, data_len);
+       l2tp_xmit_core(session, skb, fl, data_len);
 out_unlock:
        bh_unlock_sock(sk);
 
index 1ca74892ff09dc68812730fe05d25eb40593a978..f7fb09ecaf890350b8cd7527f136fe3f7cabd49e 100644 (file)
@@ -508,7 +508,7 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
        skb_dst_set(skb, dst_clone(&rt->dst));
 
        /* Queue the packet to IP for output */
-       rc = ip_queue_xmit(skb);
+       rc = ip_queue_xmit(skb, &inet->cork.fl);
 
 error:
        /* Update stats */
index 69fbc55cf18ed60b5b6ff920dfc4db6fc55a1ea7..847193b7995f01ca628a800da8a9018f33bedac3 100644 (file)
@@ -855,7 +855,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
                         IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
 
        SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
-       return ip_queue_xmit(skb);
+       return ip_queue_xmit(skb, &transport->fl);
 }
 
 static struct sctp_af sctp_af_inet;