Hello,

patch 10


# HG changeset patch
# User MJP
# Date 1452862954 -3600
#      Fri Jan 15 14:02:34 2016 +0100
# Node ID 842c1c22848e171f174cc45ba7b961883fc3c184
# Parent  97146d7e9ebbb07f93d734dbdd7afe942f5cc557
Add: Route functions handle rdomain.

diff -r 97146d7e9ebb -r 842c1c22848e usr.sbin/npppd/pppd/npppd.c
--- usr.sbin/npppd/npppd/npppd.c        Fri Jan 15 14:02:34 2016 +0100
+++ usr.sbin/npppd/npppd/npppd.c        Fri Jan 15 14:02:34 2016 +0100
@@ -588,7 +588,8 @@
                                if (is_first)
                                        in_route_add(&snp->snp_addr,
                                            &snp->snp_mask, &loop,
-                                           LOOPBACK_IFNAME, RTF_BLACKHOLE, 0);
+                                           LOOPBACK_IFNAME, RTF_BLACKHOLE, 0,
+                                           _this->iface[0].rdomain);
                                break;
 
                        case SNP_PPP:
@@ -601,14 +602,16 @@
                                            ppp_framed_ip_address,
                                            &ppp_iface(ppp)->ip4addr,
                                            ppp_iface(ppp)->ifname,
-                                           MRU_IPMTU(ppp->peer_mru));
+                                           MRU_IPMTU(ppp->peer_mru),
+                                           ppp_iface(ppp)->rdomain);
                                } else {
                                        in_route_add(&ppp->
                                            ppp_framed_ip_address,
                                            &ppp->ppp_framed_ip_netmask,
                                            &ppp_iface(ppp)->ip4addr,
                                            ppp_iface(ppp)->ifname, 0,
-                                           MRU_IPMTU(ppp->peer_mru));
+                                           MRU_IPMTU(ppp->peer_mru),
+                                           ppp_iface(ppp)->rdomain);
                                }
                                break;
                        }
@@ -1392,19 +1395,21 @@
                                 */
                                in_route_delete(&ppp->ppp_framed_ip_address,
                                    &ppp->ppp_framed_ip_netmask, &loop,
-                                   RTF_BLACKHOLE);
+                                   RTF_BLACKHOLE, ppp_iface(ppp)->rdomain);
                        /* See the comment for MRU_IPMTU() on ppp.h */
                        if (ppp->ppp_framed_ip_netmask.s_addr == 0xffffffffL) {
                                in_host_route_add(&ppp->ppp_framed_ip_address,
                                    &ppp_iface(ppp)->ip4addr,
                                    ppp_iface(ppp)->ifname,
-                                   MRU_IPMTU(ppp->peer_mru));
+                                   MRU_IPMTU(ppp->peer_mru),
+                                   ppp_iface(ppp)->rdomain);
                        } else {
                                in_route_add(&ppp->ppp_framed_ip_address,
                                    &ppp->ppp_framed_ip_netmask,
                                    &ppp_iface(ppp)->ip4addr,
                                    ppp_iface(ppp)->ifname, 0,
-                                   MRU_IPMTU(ppp->peer_mru));
+                                   MRU_IPMTU(ppp->peer_mru),
+                                   ppp_iface(ppp)->rdomain);
                        }
                }
 #endif
@@ -1413,11 +1418,13 @@
                if (_this->iface[ppp->ifidx].using_pppx == 0) {
                        if (ppp->ppp_framed_ip_netmask.s_addr == 0xffffffffL) {
                                
in_host_route_delete(&ppp->ppp_framed_ip_address,
-                                   &ppp_iface(ppp)->ip4addr);
+                                   &ppp_iface(ppp)->ip4addr,
+                                   ppp_iface(ppp)->rdomain);
                        } else {
                                in_route_delete(&ppp->ppp_framed_ip_address,
                                    &ppp->ppp_framed_ip_netmask,
-                                   &ppp_iface(ppp)->ip4addr, 0);
+                                   &ppp_iface(ppp)->ip4addr, 0,
+                                   ppp_iface(ppp)->rdomain);
                        }
                        if (ppp->snp.snp_next != NULL)
                                /*
@@ -1426,7 +1433,8 @@
                                 */
                                in_route_add(&ppp->snp.snp_addr,
                                    &ppp->snp.snp_mask, &loop, LOOPBACK_IFNAME,
-                                   RTF_BLACKHOLE, 0);
+                                   RTF_BLACKHOLE, 0,
+                                   ppp_iface(ppp)->rdomain);
                }
 #endif
                if (ppp->username[0] != '\0') {
@@ -1729,7 +1737,7 @@
                        radish = slist_itr_next(&rtlist0);
                        in_route_delete(&SIN(radish->rd_route)->sin_addr,
                            &SIN(radish->rd_mask)->sin_addr, &loop,
-                           RTF_BLACKHOLE);
+                           RTF_BLACKHOLE, _this->iface[0].rdomain);
                        count++;
                }
                if (count > 0)
@@ -1741,7 +1749,8 @@
                        radish = slist_itr_next(&rtlist1);
                        in_route_add(&(SIN(radish->rd_route)->sin_addr),
                            &SIN(radish->rd_mask)->sin_addr, &loop,
-                           LOOPBACK_IFNAME, RTF_BLACKHOLE, 0);
+                           LOOPBACK_IFNAME, RTF_BLACKHOLE, 0,
+                           _this->iface[0].rdomain);
                        count++;
                }
                if (count > 0)
diff -r 97146d7e9ebb -r 842c1c22848e usr.sbin/npppd/npppd/npppd_iface.c
--- usr.sbin/npppd/npppd/npppd_iface.c  Fri Jan 15 14:02:34 2016 +0100
+++ usr.sbin/npppd/npppd/npppd_iface.c  Fri Jan 15 14:02:34 2016 +0100
@@ -195,7 +195,7 @@
                /* erase old route */
                if (assigned.s_addr != 0) {
                        gw.s_addr = htonl(INADDR_LOOPBACK);
-                       in_host_route_delete(&assigned, &gw);
+                       in_host_route_delete(&assigned, &gw, _this->rdomain);
                }
 
                assigned.s_addr = _this->ip4addr.s_addr;
@@ -229,7 +229,7 @@
                 * _this->ip4addr.
                 */
                gw.s_addr = htonl(INADDR_LOOPBACK);
-               in_host_route_add(&_this->ip4addr, &gw, LOOPBACK_IFNAME, 0);
+               in_host_route_add(&_this->ip4addr, &gw, LOOPBACK_IFNAME, 0, 
_this->rdomain);
        }
        close(sock); sock = -1;
 
@@ -358,7 +358,7 @@
        if (_this->using_pppx == 0) {
                priv_delete_if_addr(_this->ifname);
                gw.s_addr = htonl(INADDR_LOOPBACK);
-               in_host_route_delete(&_this->ip4addr, &gw);
+               in_host_route_delete(&_this->ip4addr, &gw, _this->rdomain);
        }
        if (_this->devf >= 0) {
 #ifdef USE_NPPPD_PIPEX
diff -r 97146d7e9ebb -r 842c1c22848e usr.sbin/npppd/npppd/npppd_iface.h
--- usr.sbin/npppd/npppd/npppd_iface.h  Fri Jan 15 14:02:34 2016 +0100
+++ usr.sbin/npppd/npppd/npppd_iface.h  Fri Jan 15 14:02:34 2016 +0100
@@ -38,6 +38,8 @@
 
        /** assigned IPv4 address */
        struct in_addr  ip4addr;
+       /** assigned routing domain */
+       int     rdomain;
        /** for event(3)  */
        struct event    ev;
 
diff -r 97146d7e9ebb -r 842c1c22848e usr.sbin/npppd/npppd/npppd_subr.c
--- usr.sbin/npppd/npppd/npppd_subr.c   Fri Jan 15 14:02:34 2016 +0100
+++ usr.sbin/npppd/npppd/npppd_subr.c   Fri Jan 15 14:02:34 2016 +0100
@@ -60,7 +60,7 @@
 #define MINIMUM(a, b)  (((a) < (b)) ? (a) : (b))
 
 static u_int16_t route_seq = 0;
-static int  in_route0(int, struct in_addr *, struct in_addr *, struct in_addr 
*, int, const char *, uint32_t);
+static int  in_route0(int, struct in_addr *, struct in_addr *, struct in_addr 
*, int, const char *, uint32_t, int);
 #define ROUNDUP(a) \
        ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
@@ -130,7 +130,8 @@
 /* Add and delete routing entry. */
 static int
 in_route0(int type, struct in_addr *dest, struct in_addr *mask,
-    struct in_addr *gate, int mtu, const char *ifname, uint32_t rtm_flags)
+    struct in_addr *gate, int mtu, const char *ifname, uint32_t rtm_flags,
+    int rdomain)
 {
        struct rt_msghdr *rtm;
        struct sockaddr_in sdest, smask, sgate;
@@ -175,6 +176,7 @@
                rtm->rtm_flags |= RTF_GATEWAY;
        if (mask == NULL)
                rtm->rtm_flags |= RTF_HOST;
+       rtm->rtm_tableid = rdomain;
 
        if (type == RTM_ADD && mtu > 0) {
                rtm->rtm_inits = RTV_MTU;
@@ -270,32 +272,34 @@
 /** Add host routing entry. */
 int
 in_host_route_add(struct in_addr *dest, struct in_addr *gate,
-    const char *ifname, int mtu)
+    const char *ifname, int mtu, int rdomain)
 {
-       return in_route0(RTM_ADD, dest, NULL, gate, mtu, ifname, 0);
+       return in_route0(RTM_ADD, dest, NULL, gate, mtu, ifname, 0, rdomain);
 }
 
 /** Delete host routing entry. */
 int
-in_host_route_delete(struct in_addr *dest, struct in_addr *gate)
+in_host_route_delete(struct in_addr *dest, struct in_addr *gate, int rdomain)
 {
-       return in_route0(RTM_DELETE, dest, NULL, gate, 0, NULL, 0);
+       return in_route0(RTM_DELETE, dest, NULL, gate, 0, NULL, 0, rdomain);
 }
 
 /** Add network routing entry. */
 int
 in_route_add(struct in_addr *dest, struct in_addr *mask, struct in_addr *gate,
-    const char *ifname, uint32_t rtm_flags, int mtu)
+    const char *ifname, uint32_t rtm_flags, int mtu, int rdomain)
 {
-       return in_route0(RTM_ADD, dest, mask, gate, mtu, ifname, rtm_flags);
+       return in_route0(RTM_ADD, dest, mask, gate, mtu, ifname, rtm_flags,
+           rdomain);
 }
 
 /** Delete network routing entry. */
 int
 in_route_delete(struct in_addr *dest, struct in_addr *mask,
-    struct in_addr *gate, uint32_t rtm_flags)
+    struct in_addr *gate, uint32_t rtm_flags, int rdomain)
 {
-       return in_route0(RTM_DELETE, dest, mask, gate, 0, NULL, rtm_flags);
+       return in_route0(RTM_DELETE, dest, mask, gate, 0, NULL, rtm_flags,
+           rdomain);
 }
 
 /**
@@ -372,7 +376,7 @@
  * Add and delete routing entry for the pool address.
  ***********************************************************************/
 void
-in_addr_range_add_route(struct in_addr_range *range)
+in_addr_range_add_route(struct in_addr_range *range, int rdomain)
 {
        struct in_addr_range *range0;
        struct in_addr dest, mask, loop;
@@ -382,13 +386,13 @@
                mask.s_addr = htonl(range0->mask);
                loop.s_addr = htonl(INADDR_LOOPBACK);
                in_route_add(&dest, &mask, &loop, LOOPBACK_IFNAME,
-                   RTF_BLACKHOLE, 0);
+                   RTF_BLACKHOLE, 0, rdomain);
        }
        log_printf(LOG_INFO, "Added routes for pooled addresses");
 }
 
 void
-in_addr_range_delete_route(struct in_addr_range *range)
+in_addr_range_delete_route(struct in_addr_range *range, int rdomain)
 {
        struct in_addr_range *range0;
        struct in_addr dest, mask, loop;
@@ -398,7 +402,7 @@
                mask.s_addr = htonl(range0->mask);
                loop.s_addr = htonl(INADDR_LOOPBACK);
 
-               in_route_delete(&dest, &mask, &loop, RTF_BLACKHOLE);
+               in_route_delete(&dest, &mask, &loop, RTF_BLACKHOLE, rdomain);
        }
        log_printf(LOG_NOTICE, "Deleted routes for pooled addresses");
 }
diff -r 97146d7e9ebb -r 842c1c22848e usr.sbin/npppd/npppd/npppd_subr.h
--- usr.sbin/npppd/npppd/npppd_subr.h   Fri Jan 15 14:02:34 2016 +0100
+++ usr.sbin/npppd/npppd/npppd_subr.h   Fri Jan 15 14:02:34 2016 +0100
@@ -33,13 +33,13 @@
 #endif
 
 int   load_resolv_conf (struct in_addr *, struct in_addr *);
-int   in_host_route_add (struct in_addr *, struct in_addr *, const char *, 
int);
-int   in_host_route_delete (struct in_addr *, struct in_addr *);
-int   in_route_add (struct in_addr *, struct in_addr *, struct in_addr *, 
const char *, uint32_t, int);
-int   in_route_delete (struct in_addr *, struct in_addr *, struct in_addr *, 
uint32_t);
+int   in_host_route_add (struct in_addr *, struct in_addr *, const char *, 
int, int);
+int   in_host_route_delete (struct in_addr *, struct in_addr *, int);
+int   in_route_add (struct in_addr *, struct in_addr *, struct in_addr *, 
const char *, uint32_t, int, int);
+int   in_route_delete (struct in_addr *, struct in_addr *, struct in_addr *, 
uint32_t, int);
 int   ip_is_idle_packet (const struct ip *, int);
-void  in_addr_range_add_route (struct in_addr_range *);
-void  in_addr_range_delete_route (struct in_addr_range *);
+void  in_addr_range_add_route (struct in_addr_range *, int);
+void  in_addr_range_delete_route (struct in_addr_range *, int);
 int   adjust_tcp_mss(u_char *, int, int);
 
 #ifdef __cplusplus

Reply via email to