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