From: Denis Fondras Subject: [pppd] Use IF rtable when changing route To: tech@openbsd.org Date: Sun, 17 Mar 2024 17:55:57 +0100 When ppp0 is not in the default VRF, pppd(8) cannot add a default route as it tries on default rdomain and fails with "Couldn't add default route: Network is unreachable". This diff adds rdomain support and fix a little bug. OK ? Index: fsm.c =================================================================== RCS file: /cvs/src/usr.sbin/pppd/fsm.c,v retrieving revision 1.8 diff -u -p -r1.8 fsm.c --- fsm.c 27 Oct 2009 23:59:53 -0000 1.8 +++ fsm.c 17 Mar 2024 16:46:19 -0000 @@ -413,6 +413,7 @@ fsm_rconfreq(f, id, inp, len) if( f->callbacks->down ) (*f->callbacks->down)(f); /* Inform upper layers */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */ + f->state = REQSENT; break; case STOPPED: @@ -448,7 +449,7 @@ fsm_rconfreq(f, id, inp, len) f->nakloops = 0; } else { - /* we sent CONFACK or CONFREJ */ + /* we sent CONFNACK or CONFREJ */ if (f->state != ACKRCVD) f->state = REQSENT; if( code == CONFNAK ) Index: sys-bsd.c =================================================================== RCS file: /cvs/src/usr.sbin/pppd/sys-bsd.c,v retrieving revision 1.33 diff -u -p -r1.33 sys-bsd.c --- sys-bsd.c 19 Feb 2024 16:39:03 -0000 1.33 +++ sys-bsd.c 17 Mar 2024 16:46:19 -0000 @@ -133,6 +133,7 @@ static unsigned char inbuf[512]; /* buff static int sockfd; /* socket for doing interface ioctls */ +static int rtable = 0; /* the interface rdomain */ static int if_is_up; /* the interface is currently up */ static u_int32_t ifaddrs[2]; /* local and remote addresses we set */ static u_int32_t default_route_gateway; /* gateway addr for default route */ @@ -933,6 +934,11 @@ sifup(u) syslog(LOG_ERR, "ioctl(SIOCSIFFLAGS): %m"); return 0; } + if (ioctl(sockfd, SIOCGIFRDOMAIN, (caddr_t) &ifr) == -1) { + syslog(LOG_ERR, "ioctl (SIOCGIFRDOMAIN): %m"); + return 0; + } + rtable = ifr.ifr_rdomainid; if_is_up = 1; return 1; } @@ -1118,6 +1124,7 @@ dodefaultroute(g, cmd) rtmsg.hdr.rtm_version = RTM_VERSION; rtmsg.hdr.rtm_seq = ++rtm_seq; rtmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK; + rtmsg.hdr.rtm_tableid = rtable; rtmsg.dst.sin_len = sizeof(rtmsg.dst); rtmsg.dst.sin_family = AF_INET; rtmsg.gway.sin_len = sizeof(rtmsg.gway); @@ -1181,6 +1188,7 @@ sifproxyarp(unit, hisaddr) arpmsg.hdr.rtm_seq = ++rtm_seq; arpmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY; arpmsg.hdr.rtm_inits = RTV_EXPIRE; + arpmsg.hdr.rtm_tableid = rtable; arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp); arpmsg.dst.sin_family = AF_INET; arpmsg.dst.sin_addr.s_addr = hisaddr;