Download raw body.
pppd(8): add support for rdomain
With this diff, we can run the PPP interface in an rdomain and get a default
route installed in the right routing domain.
Index: sys/net/ppp_tty.c
===================================================================
RCS file: /cvs/src/sys/net/ppp_tty.c,v
diff -u -p -r1.54 ppp_tty.c
--- sys/net/ppp_tty.c 2 Jan 2022 22:36:04 -0000 1.54
+++ sys/net/ppp_tty.c 17 Aug 2024 08:01:33 -0000
@@ -371,6 +371,7 @@ pppwrite(struct tty *tp, struct uio *uio
bcopy(mtod(m0, u_char *), dst.sa_data, PPP_HDRLEN);
m0->m_data += PPP_HDRLEN;
m0->m_len -= PPP_HDRLEN;
+ m0->m_pkthdr.ph_rtableid = sc->sc_if.if_rdomain;
return sc->sc_if.if_output(&sc->sc_if, m0, &dst, NULL);
}
Index: usr.sbin/pppd/sys-bsd.c
===================================================================
RCS file: /cvs/src/usr.sbin/pppd/sys-bsd.c,v
diff -u -p -r1.35 sys-bsd.c
--- usr.sbin/pppd/sys-bsd.c 10 Aug 2024 05:32:28 -0000 1.35
+++ usr.sbin/pppd/sys-bsd.c 17 Aug 2024 08:01:34 -0000
@@ -1032,6 +1032,22 @@ cifaddr(int u, u_int32_t o, u_int32_t h)
}
/*
+ * getrtableid - return routing table id of ppp interface
+ */
+int
+getrtableid(void)
+{
+ struct ifreq ifr;
+ int tableid = 0;
+
+ strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+ if (ioctl(sockfd, SIOCGIFRDOMAIN, (caddr_t) &ifr) == 0)
+ tableid = ifr.ifr_rdomainid;
+
+ return tableid;
+}
+
+/*
* sifdefaultroute - assign a default route through the address given.
*/
int
@@ -1073,6 +1089,7 @@ dodefaultroute(u_int32_t g, int cmd)
rtmsg.hdr.rtm_type = cmd == 's'? RTM_ADD: RTM_DELETE;
rtmsg.hdr.rtm_flags = RTF_UP | RTF_GATEWAY;
rtmsg.hdr.rtm_version = RTM_VERSION;
+ rtmsg.hdr.rtm_tableid = getrtableid();
rtmsg.hdr.rtm_seq = ++rtm_seq;
rtmsg.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
rtmsg.dst.sin_len = sizeof(rtmsg.dst);
pppd(8): add support for rdomain