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 */
 
  * (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);
 
 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,
 
 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);
 
                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;
 
                            !(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);
                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;
 
                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;
 
 
        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);
 
 }
 
 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;
 
        /* 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) {
        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;
        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);
 
        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);
 
 
        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 */
 
                         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;