Message ID | 4E9FBEA1.2050407@cn.fujitsu.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Gao feng <gaofeng@cn.fujitsu.com> Date: Thu, 20 Oct 2011 14:24:33 +0800 > there are serval problem. > 1:rt->peer maybe null,we should call rt_bind_peer just like the code below. > 2:rt->peer_pmtu_orig is null. if we hasn't send packet before,the func check_peer_pmtu hasn't be called. > so the peer->pmtu_orig is null. > 3:when rt->rt_peer_genid != rt_peer_genid(), we has no need to do dst_metric_set(dst, RTAX_MTU, rt->peer->pmtu_orig), > because check_peer_pmtu will do this. > > what about this patch? In the case where no peer was created and we use default metrics and other settings (can be common for UDP) I don't think it's wise to make an inetpeer lookup every time we check the dst. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Oct 20, 2011 at 02:24:33PM +0800, Gao feng wrote: > > there are serval problem. > 1:rt->peer maybe null,we should call rt_bind_peer just like the code below. If rt->peer is NULL, rt_bind_peer() sets rt->rt_peer_genid = rt_peer_genid(). So your check for rt->rt_peer_genid != rt_peer_genid() is false then and creates cases where an unchecked peer is bound to a route. > 2:rt->peer_pmtu_orig is null. if we hasn't send packet before,the func check_peer_pmtu hasn't be called. > so the peer->pmtu_orig is null. If a peer is bound to a route during slow path route lookup, the peer should be properly initialized with rt_init_metrics(). So rt->peer_pmtu_orig should not be null here as far as I can see. I still think that my original patch fixes the problem. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 04a14db..45782d2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -1655,17 +1655,17 @@ static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer) static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) { struct rtable *rt = (struct rtable *) dst; + struct inet_peer *peer; if (rt_is_expired(rt)) return NULL; - if (rt->rt_peer_genid != rt_peer_genid()) { - struct inet_peer *peer; - if (!rt->peer) - rt_bind_peer(rt, rt->rt_dst, 0); + if (!rt->peer) + rt_bind_peer(rt, rt->rt_dst, 0); - peer = rt->peer; - if (peer) { + peer = rt->peer; + if (peer) { + if (rt->rt_peer_genid != rt_peer_genid()) { check_peer_pmtu(dst, peer); if (peer->redirect_learned.a4 && @@ -1673,9 +1673,12 @@ static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie) if (check_peer_redir(dst, peer)) return NULL; } - } - rt->rt_peer_genid = rt_peer_genid(); + rt->rt_peer_genid = rt_peer_genid(); + + }else if(peer_pmtu_expired(peer)) + dst_metric_set(dst,RTAX_MTU,peer->pmtu_orig); + } return dst; }