]> Pileus Git - ~andy/linux/blobdiff - net/dccp/ipv4.c
Merge branch 'for-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
[~andy/linux] / net / dccp / ipv4.c
index 07f5579ca756c90030758b99fff0e43708f115be..176ecdba4a22c0e3b4ec1b2c102032b4d64e763e 100644 (file)
@@ -161,17 +161,10 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
        if (sk->sk_state == DCCP_LISTEN)
                return;
 
-       /* We don't check in the destentry if pmtu discovery is forbidden
-        * on this route. We just assume that no packet_to_big packets
-        * are send back when pmtu discovery is not active.
-        * There is a small race when the user changes this flag in the
-        * route, but I think that's acceptable.
-        */
-       if ((dst = __sk_dst_check(sk, 0)) == NULL)
+       dst = inet_csk_update_pmtu(sk, mtu);
+       if (!dst)
                return;
 
-       dst->ops->update_pmtu(dst, mtu);
-
        /* Something is about to be wrong... Remember soft error
         * for the case, if this connection will not able to recover.
         */
@@ -195,6 +188,14 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
        } /* else let the usual retransmit timer handle it */
 }
 
+static void dccp_do_redirect(struct sk_buff *skb, struct sock *sk)
+{
+       struct dst_entry *dst = __sk_dst_check(sk, 0);
+
+       if (dst)
+               dst->ops->redirect(dst, sk, skb);
+}
+
 /*
  * This routine is called by the ICMP module when it gets some sort of error
  * condition. If err < 0 then the socket should be closed and the error
@@ -259,6 +260,9 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
        }
 
        switch (type) {
+       case ICMP_REDIRECT:
+               dccp_do_redirect(skb, sk);
+               goto out;
        case ICMP_SOURCE_QUENCH:
                /* Just silently ignore these. */
                goto out;
@@ -477,7 +481,7 @@ static struct dst_entry* dccp_v4_route_skb(struct net *net, struct sock *sk,
        struct rtable *rt;
        const struct iphdr *iph = ip_hdr(skb);
        struct flowi4 fl4 = {
-               .flowi4_oif = skb_rtable(skb)->rt_iif,
+               .flowi4_oif = inet_iif(skb),
                .daddr = iph->saddr,
                .saddr = iph->daddr,
                .flowi4_tos = RT_CONN_FLAGS(sk),