Hello, On Fri, 8 Apr 2016, Chris Friesen wrote:
> For local routes that require a particular output interface we do not want to > cache the result. Caching the result causes incorrect behaviour when there > are > multiple source addresses on the interface. The end result being that if the > intended recipient is waiting on that interface for the packet he won't > receive > it because it will be delivered on the loopback interface and the IP_PKTINFO > ipi_ifindex will be set to the loopback interface as well. > > This can be tested by running a program such as "dhcp_release" which attempts > to inject a packet on a particular interface so that it is received by another > program on the same board. The receiving process should see an IP_PKTINFO > ipi_ifndex value of the source interface (e.g., eth1) instead of the loopback > interface (e.g., lo). The packet will still appear on the loopback interface > in tcpdump but the important aspect is that the CMSG info is correct. > > Sample dhcp_release command line: > > dhcp_release eth1 192.168.204.222 02:11:33:22:44:66 > > Signed-off-by: Allain Legacy <allain.leg...@windriver.com> > Signed off-by: Chris Friesen <chris.frie...@windriver.com> > --- > net/ipv4/route.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/net/ipv4/route.c b/net/ipv4/route.c > index 02c6229..437a377 100644 > --- a/net/ipv4/route.c > +++ b/net/ipv4/route.c > @@ -2045,6 +2045,18 @@ static struct rtable *__mkroute_output(const struct > fib_result *res, Your patch is corrupted. I was in the same trap some time ago but with different client: >From Documentation/email-clients.txt: Don't send patches with "format=flowed". This can cause unexpected and unwanted line breaks. Anyways, the change looks good to me and I'll add my Reviewed-by tag the next time. > */ > if (fi && res->prefixlen < 4) > fi = NULL; > + } else if ((type == RTN_LOCAL) && (orig_oif != 0) && > + (orig_oif != dev_out->ifindex)) { > + /* For local routes that require a particular output interface > + * we do not want to cache the result. Caching the result > + * causes incorrect behaviour when there are multiple source > + * addresses on the interface, the end result being that if > the > + * intended recipient is waiting on that interface for the > + * packet he won't receive it because it will be delivered on > + * the loopback interface and the IP_PKTINFO ipi_ifindex will > + * be set to the loopback interface as well. > + */ > + fi = NULL; > } > > fnhe = NULL; Regards -- Julian Anastasov <j...@ssi.bg>