Date: Mon, 30 Apr 2012 17:46:30 -0700 From: prabhakar lakhera <prabhakar.lakhera@gmail.com> To: freebsd-net@freebsd.org Subject: Question on rtredirect code Message-ID: <CALg%2BrhW1_PPT%2B%2Bw0B4JGHLGXf%2B48KYyGaxQ6MjrVE0=_V=C_=w@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
Hi, The rtredirect code has the following code lines: */* verify the gateway is directly reachable */* 521 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L521> if ((ifa = ifa_ifwithnet <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=ifa_ifwithnet>(gateway <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=gateway>, 0)) == NULL <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=NULL>) { 522 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L522> error <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=error> = ENETUNREACH <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=ENETUNREACH>; 523 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L523> goto out <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=out>; 524 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L524> } Later on we check for the validity of the redirect message. One of the criteria is the comparison of rt_ifa with ifa: */** 527 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L527> * * If the redirect isn't from our current router for this dst,* 528 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L528> * * it's either old or wrong. If it redirects us to ourselves,* 529 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L529> * * we have a routing loop, perhaps as a result of an interface* 530 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L530> * * going down recently.* 531 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L531> * */* 532 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L532> if (!(flags <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=flags> & RTF_DONE <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=RTF_DONE>) && rt <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=rt> && 533 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L533> (!sa_equal <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=sa_equal>(src <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=src>, rt <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=rt>->rt_gateway) || rt <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=rt>->rt_ifa != ifa)) 534 <http://fxr.watson.org/fxr/source/net/route.c?v=FREEBSD9#L534> error <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=error> = EINVAL <http://fxr.watson.org/fxr/ident?v=FREEBSD9;im=excerpts;i=EINVAL>; TCP IP illustrated vol 2 comments on the code: "The interface for the new gateway (the fia returned by ifa_ifwithnet) must equal the curent interface for destination (rt_ifa), that is new gateway must be on the same network as the current gateway." One thing to note here is that we are comparing ifa to compare for interface (ifp). It could be that the code was not revisited in later BSD releases but it seems to suggest that when the code was written hosting multiple ifa in same ifp or different ifp was not thought of/supported. Does the above code still stand good? To me it seems that it needs to be corrected. Comments are welcome. Best, Prabhakar
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALg%2BrhW1_PPT%2B%2Bw0B4JGHLGXf%2B48KYyGaxQ6MjrVE0=_V=C_=w>