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);