On 2016-12-06 00:12, Piotr Durlej wrote:
Hi,I dislike cross-posting/repeated posting but I was advised to do so by mpi@. I just want to make sure my previous mail sent to bugs@ hasn't gone unnoticed. The problem is that ripd(8) is unable to determine the interface on which a RIP packet was received when the source and destination addresses of the interface do not share the same subnet. Additionally, when ran with the -d switch, ripd(8) produces the following error message every time a valid RIP packet is received on the interface in question: "recv_packet: cannot find a matching interface". Here is an example: Script started on Wed Nov 23 08:58:36 2016 # ifconfig gre0 gre0: flags=9011<UP,POINTOPOINT,LINK0,MULTICAST> mtu 1476 index 5 priority 0 llprio 3 groups: gre tunnel: inet 192.168.0.1 -> 192.168.0.2 inet 192.168.1.1 --> 192.168.1.2 netmask 0xffffffff # ripd -dv startup [...] recv_packet: cannot find a matching interface ^C [...] terminating # tcpdump -s1500 -vnlpi gre0 tcpdump: listening on gre0, link-type LOOP 08:59:37.627530 192.168.1.2.520 > 224.0.0.9.520: [udp sum ok] RIPv2-resp [items 2]: {172.22.1.0/255.255.255.0}(1) {192.168.0.0/255.255.255.0}(1) [tos 0xc0] [ttl 1] (id 47684, len 72) ^C 1 packets received by filter 0 packets dropped by kernel # ^D Script done on Wed Nov 23 09:00:10 2016 And here is a patch: diff --git a/usr.sbin/ripd/packet.c b/usr.sbin/ripd/packet.c index 37b4a91..b956ec0 100644 --- a/usr.sbin/ripd/packet.c +++ b/usr.sbin/ripd/packet.c@@ -232,15 +232,17 @@ find_iface(struct ripd_conf *xconf, unsigned int ifindex, struct in_addr src)/* returned interface needs to be active */ LIST_FOREACH(iface, &xconf->iface_list, entry) { - if (ifindex != 0 && ifindex == iface->ifindex && - !iface->passive && (iface->addr.s_addr & + if (ifindex == 0 || ifindex != iface->ifindex) + continue; + + if (iface->passive) + continue; + + if ((iface->addr.s_addr & iface->mask.s_addr) == (src.s_addr & iface->mask.s_addr)) - /* - * XXX may fail on P2P links because src and dst don't - * have to share a common subnet on the otherhand - * checking something like this will help to support - * multiple networks configured on one interface. - */ + return (iface); + + if (iface->dst.s_addr && iface->dst.s_addr == src.s_addr) return (iface); } Kind regards, Piotr
Any thoughts? Is the patch ok, wrong, accepted, rejected or unnoticed? Kind regards, Piotr
