extern int             ip_local_out(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,
+extern int             ip_append_data(struct sock *sk, struct flowi4 *fl4,
                                       int getfrag(void *from, char *to, int offset, int len,
                                                   int odd, struct sk_buff *skb),
                                void *from, int len, int protolen,
                                struct rtable **rt,
                                unsigned int flags);
 extern int             ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb);
-extern ssize_t         ip_append_page(struct sock *sk, struct page *page,
+extern ssize_t         ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
                                int offset, size_t size, int flags);
 extern struct sk_buff  *__ip_make_skb(struct sock *sk,
                                      struct flowi4 *fl4,
 
                                       (length - transhdrlen));
 }
 
-static int __ip_append_data(struct sock *sk, struct sk_buff_head *queue,
+static int __ip_append_data(struct sock *sk,
+                           struct flowi4 *fl4,
+                           struct sk_buff_head *queue,
                            struct inet_cork *cork,
                            int getfrag(void *from, char *to, int offset,
                                        int len, int odd, struct sk_buff *skb),
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (cork->length + length > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport,
+               ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport,
                               mtu-exthdrlen);
                return -EMSGSIZE;
        }
  *
  *     LATER: length must be adjusted by pad at tail, when it is required.
  */
-int ip_append_data(struct sock *sk,
+int ip_append_data(struct sock *sk, struct flowi4 *fl4,
                   int getfrag(void *from, char *to, int offset, int len,
                               int odd, struct sk_buff *skb),
                   void *from, int length, int transhdrlen,
                transhdrlen = 0;
        }
 
-       return __ip_append_data(sk, &sk->sk_write_queue, &inet->cork.base, getfrag,
+       return __ip_append_data(sk, fl4, &sk->sk_write_queue, &inet->cork.base, getfrag,
                                from, length, transhdrlen, flags);
 }
 
-ssize_t        ip_append_page(struct sock *sk, struct page *page,
+ssize_t        ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
                       int offset, size_t size, int flags)
 {
        struct inet_sock *inet = inet_sk(sk);
        maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
 
        if (cork->length + size > 0xFFFF - fragheaderlen) {
-               ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, mtu);
+               ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport, mtu);
                return -EMSGSIZE;
        }
 
        if (err)
                return ERR_PTR(err);
 
-       err = __ip_append_data(sk, &queue, &cork, getfrag,
+       err = __ip_append_data(sk, fl4, &queue, &cork, getfrag,
                               from, length, transhdrlen, flags);
        if (err) {
                __ip_flush_pending_frames(sk, &queue, &cork);
        sk->sk_priority = skb->priority;
        sk->sk_protocol = ip_hdr(skb)->protocol;
        sk->sk_bound_dev_if = arg->bound_dev_if;
-       ip_append_data(sk, ip_reply_glue_bits, arg->iov->iov_base, len, 0,
+       ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, len, 0,
                       &ipc, &rt, MSG_DONTWAIT);
        if ((skb = skb_peek(&sk->sk_write_queue)) != NULL) {
                if (arg->csumoffset >= 0)
 
 
        getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
 
+       fl4 = &inet->cork.fl.u.ip4;
        if (up->pending) {
                /*
                 * There are pending frames.
        if (connected)
                rt = (struct rtable *)sk_dst_check(sk, 0);
 
-       fl4 = &inet->cork.fl.u.ip4;
        if (rt == NULL) {
                struct net *net = sock_net(sk);
 
 
 do_append_data:
        up->len += ulen;
-       err = ip_append_data(sk, getfrag, msg->msg_iov, ulen,
-                       sizeof(struct udphdr), &ipc, &rt,
-                       corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
+       err = ip_append_data(sk, fl4, getfrag, msg->msg_iov, ulen,
+                            sizeof(struct udphdr), &ipc, &rt,
+                            corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
        if (err)
                udp_flush_pending_frames(sk);
        else if (!corkreq)
 int udp_sendpage(struct sock *sk, struct page *page, int offset,
                 size_t size, int flags)
 {
+       struct inet_sock *inet = inet_sk(sk);
        struct udp_sock *up = udp_sk(sk);
        int ret;
 
                return -EINVAL;
        }
 
-       ret = ip_append_page(sk, page, offset, size, flags);
+       ret = ip_append_page(sk, &inet->cork.fl.u.ip4,
+                            page, offset, size, flags);
        if (ret == -EOPNOTSUPP) {
                release_sock(sk);
                return sock_no_sendpage(sk->sk_socket, page, offset,