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