Download raw body.
[pppd] Use IF rtable when changing route
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;
[pppd] Use IF rtable when changing route