Hello Mart, On 13/04/16(Wed) 09:22, Mart Tõnso wrote: > Ah, yes, sorry about that. Here's the full routing info with ifconfig output: > > # ifconfig > [...] > ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 > priority: 0 > groups: ppp egress > inet 10.128.195.179 --> 10.64.64.64 netmask 0xff000000 ^^^^^^^^^^ Here is the problem. For historical reasons the code that finds a matching interface to attach your route matches your gateway with ppp0's address/netmask.
A workaround would be to change your ppp0 setup to use a /32 mask. A correct fix is included below, I'll be interested to hear if it works for you. > tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 > priority: 0 > groups: tun > status: active > inet 10.88.0.124 --> 10.88.0.124 netmask 0xffffff00 ^^^^^^^^^^^^^^^^^^^^^^^^^^ By the way why do you use the same src and dst address? Index: net/route.c =================================================================== RCS file: /cvs/src/sys/net/route.c,v retrieving revision 1.298 diff -u -p -r1.298 route.c --- net/route.c 26 Mar 2016 21:56:04 -0000 1.298 +++ net/route.c 13 Apr 2016 07:38:11 -0000 @@ -740,20 +740,16 @@ ifa_ifwithroute(int flags, struct sockad ifa = ifaof_ifpforaddr(dst, ifp); if_put(ifp); } else { - ifa = ifa_ifwithnet(gateway, rtableid); - } - } - if (ifa == NULL) { - struct rtentry *rt = rtalloc(gateway, 0, rtableid); - /* The gateway must be local if the same address family. */ - if (!rtisvalid(rt) || ((rt->rt_flags & RTF_GATEWAY) && - rt_key(rt)->sa_family == dst->sa_family)) { + struct rtentry *rt; + + rt = rtalloc(gateway, RT_RESOLVE, rtableid); + if (rt != NULL) + ifa = rt->rt_ifa; rtfree(rt); - return (NULL); } - ifa = rt->rt_ifa; - rtfree(rt); } + if (ifa == NULL) + return (NULL); if (ifa->ifa_addr->sa_family != dst->sa_family) { struct ifaddr *oifa = ifa; ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp);