Index | Thread | Search

From:
Denis Fondras <openbsd@ledeuns.net>
Subject:
[pppd] Use IF rtable when changing route
To:
tech@openbsd.org
Date:
Sun, 17 Mar 2024 17:55:57 +0100

Download raw body.

Thread
  • Denis Fondras:

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