summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/dhclient/dhclient.c18
-rw-r--r--sbin/dhclient/dhcpd.h4
-rw-r--r--sbin/dhclient/kroute.c91
-rw-r--r--sbin/dhclient/privsep.h3
4 files changed, 28 insertions, 88 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index dc0feac7bff..fb3b3cd0122 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.253 2013/06/09 17:31:54 krw Exp $ */
+/* $OpenBSD: dhclient.c,v 1.254 2013/06/09 22:39:51 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -2290,21 +2290,24 @@ void
add_default_route(int rdomain, struct in_addr addr, struct in_addr gateway)
{
struct in_addr netmask, dest;
- int addrs;
+ int addrs, flags;
memset(&netmask, 0, sizeof(netmask));
memset(&dest, 0, sizeof(dest));
addrs = RTA_DST | RTA_NETMASK;
+ flags = 0;
/*
* When 'addr' and 'gateway' are identical the desired behaviour is
* to emulate the '-iface' variant of 'route'. This is done by
* claiming there is no gateway address to use.
*/
- if (bcmp(&gateway, &addr, sizeof(addr)) != 0)
+ if (bcmp(&gateway, &addr, sizeof(addr)) != 0) {
addrs |= RTA_GATEWAY;
+ flags |= RTF_GATEWAY | RTF_STATIC;
+ }
- add_route(rdomain, dest, netmask, gateway, addrs);
+ add_route(rdomain, dest, netmask, gateway, addrs, flags);
}
void
@@ -2314,7 +2317,7 @@ add_static_routes(int rdomain, struct option_data *static_routes)
u_int8_t *addr;
int i;
- memset(&netmask, 0, sizeof(netmask)); /* Always 0 for class addrs. */
+ memset(&netmask, 0, sizeof(netmask)); /* Not used for CLASSFULL! */
for (i = 0; (i + 7) < static_routes->len; i += 8) {
addr = &static_routes->data[i];
@@ -2328,7 +2331,7 @@ add_static_routes(int rdomain, struct option_data *static_routes)
/* XXX Order implies priority but we're ignoring that. */
add_route(rdomain, dest, netmask, gateway,
- RTA_DST | RTA_GATEWAY);
+ RTA_DST | RTA_GATEWAY, RTF_GATEWAY | RTF_STATIC);
}
}
@@ -2361,6 +2364,7 @@ void add_classless_static_routes(int rdomain,
continue; /* OBSD TCP/IP doesn't support this. */
add_route(rdomain, dest, netmask, gateway,
- RTA_DST | RTA_GATEWAY | RTA_NETMASK);
+ RTA_DST | RTA_GATEWAY | RTA_NETMASK,
+ RTF_GATEWAY | RTF_STATIC);
}
}
diff --git a/sbin/dhclient/dhcpd.h b/sbin/dhclient/dhcpd.h
index 26b15b88a9b..282bb8795a7 100644
--- a/sbin/dhclient/dhcpd.h
+++ b/sbin/dhclient/dhcpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhcpd.h,v 1.120 2013/06/09 15:06:34 krw Exp $ */
+/* $OpenBSD: dhcpd.h,v 1.121 2013/06/09 22:39:51 krw Exp $ */
/*
* Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -343,4 +343,4 @@ void add_address(char *, int, struct in_addr, struct in_addr);
void flush_routes(char *, int);
-void add_route(int, struct in_addr, struct in_addr, struct in_addr, int);
+void add_route(int, struct in_addr, struct in_addr, struct in_addr, int, int);
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c
index 2b40fd26993..eda78953b6f 100644
--- a/sbin/dhclient/kroute.c
+++ b/sbin/dhclient/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.53 2013/06/09 17:31:54 krw Exp $ */
+/* $OpenBSD: kroute.c,v 1.54 2013/06/09 22:39:51 krw Exp $ */
/*
* Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -172,7 +172,7 @@ priv_flush_routes(struct imsg_flush_routes *imsg)
void
add_route(int rdomain, struct in_addr dest, struct in_addr netmask,
- struct in_addr gateway, int addrs)
+ struct in_addr gateway, int addrs, int flags)
{
struct imsg_add_route imsg;
int rslt;
@@ -184,6 +184,7 @@ add_route(int rdomain, struct in_addr dest, struct in_addr netmask,
imsg.gateway = gateway;
imsg.netmask = netmask;
imsg.addrs = addrs;
+ imsg.flags = flags;
rslt = imsg_compose(unpriv_ibuf, IMSG_ADD_ROUTE, 0, 0, -1,
&imsg, sizeof(imsg));
@@ -213,6 +214,8 @@ priv_add_route(struct imsg_add_route *imsg)
rtm.rtm_tableid = imsg->rdomain;
rtm.rtm_priority = RTP_NONE;
rtm.rtm_msglen = sizeof(rtm);
+ rtm.rtm_addrs = imsg->addrs;
+ rtm.rtm_flags = imsg->flags;
iov[iovcnt].iov_base = &rtm;
iov[iovcnt++].iov_len = sizeof(rtm);
@@ -224,7 +227,6 @@ priv_add_route(struct imsg_add_route *imsg)
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = imsg->dest.s_addr;
- rtm.rtm_addrs |= RTA_DST;
rtm.rtm_msglen += sizeof(dest);
iov[iovcnt].iov_base = &dest;
@@ -238,8 +240,6 @@ priv_add_route(struct imsg_add_route *imsg)
gateway.sin_family = AF_INET;
gateway.sin_addr.s_addr = imsg->gateway.s_addr;
- rtm.rtm_flags |= RTF_GATEWAY | RTF_STATIC;
- rtm.rtm_addrs |= RTA_GATEWAY;
rtm.rtm_msglen += sizeof(gateway);
iov[iovcnt].iov_base = &gateway;
@@ -253,7 +253,6 @@ priv_add_route(struct imsg_add_route *imsg)
mask.sin_family = AF_INET;
mask.sin_addr.s_addr = imsg->netmask.s_addr;
- rtm.rtm_addrs |= RTA_NETMASK;
rtm.rtm_msglen += sizeof(mask);
iov[iovcnt].iov_base = &mask;
@@ -411,13 +410,10 @@ add_address(char *ifname, int rdomain, struct in_addr addr,
void
priv_add_address(struct imsg_add_address *imsg)
{
+ struct imsg_add_route rimsg;
struct ifaliasreq ifaliasreq;
- struct rt_msghdr rtm;
- struct sockaddr_in dest, gateway;
- struct sockaddr_rtlabel label;
- struct iovec iov[4];
struct sockaddr_in *in;
- int s, i, iovcnt = 0;
+ int s;
if (imsg->addr.s_addr == INADDR_ANY) {
/* Notification that the active_addr has been deleted. */
@@ -460,74 +456,13 @@ priv_add_address(struct imsg_add_address *imsg)
/*
* Add the 127.0.0.1 route for the specified address.
*/
+ memset(&rimsg, 0, sizeof(rimsg));
+ rimsg.dest.s_addr = imsg->addr.s_addr;
+ rimsg.gateway.s_addr = inet_addr("127.0.0.1");
+ rimsg.addrs = RTA_DST | RTA_GATEWAY;
+ rimsg.flags = RTF_GATEWAY | RTF_STATIC;
- if ((s = socket(AF_ROUTE, SOCK_RAW, 0)) == -1)
- error("Routing Socket open failed: %s", strerror(errno));
-
- /* Build RTM header */
-
- memset(&rtm, 0, sizeof(rtm));
-
- rtm.rtm_version = RTM_VERSION;
- rtm.rtm_type = RTM_ADD;
- rtm.rtm_tableid = imsg->rdomain;
- rtm.rtm_priority = RTP_NONE;
- rtm.rtm_msglen = sizeof(rtm);
-
- iov[iovcnt].iov_base = &rtm;
- iov[iovcnt++].iov_len = sizeof(rtm);
-
- /* Set destination address */
-
- memset(&dest, 0, sizeof(dest));
-
- dest.sin_len = sizeof(dest);
- dest.sin_family = AF_INET;
- dest.sin_addr.s_addr = imsg->addr.s_addr;
-
- rtm.rtm_addrs |= RTA_DST;
- rtm.rtm_msglen += sizeof(dest);
-
- iov[iovcnt].iov_base = &dest;
- iov[iovcnt++].iov_len = sizeof(dest);
-
- /* Set gateway address */
-
- memset(&gateway, 0, sizeof(gateway));
-
- gateway.sin_len = sizeof(gateway);
- gateway.sin_family = AF_INET;
- gateway.sin_addr.s_addr = inet_addr("127.0.0.1");
-
- rtm.rtm_flags |= RTF_GATEWAY;
- rtm.rtm_addrs |= RTA_GATEWAY;
- rtm.rtm_msglen += sizeof(gateway);
-
- iov[iovcnt].iov_base = &gateway;
- iov[iovcnt++].iov_len = sizeof(gateway);
-
- /* Add our label so we can identify the route as our creation. */
- if (create_route_label(&label) == 0) {
- rtm.rtm_addrs |= RTA_LABEL;
- rtm.rtm_msglen += sizeof(label);
- iov[iovcnt].iov_base = &label;
- iov[iovcnt++].iov_len = sizeof(label);
- }
-
- /* Check for EEXIST since other dhclient may not be done. */
- for (i = 0; i < 5; i++) {
- if (writev(s, iov, iovcnt) != -1)
- break;
- if (errno == ENETUNREACH) {
- /* Not our responsibility to ensure 127/8 exists. */
- break;
- } else if (errno != EEXIST)
- error("failed to add 127.0.0.1 route: %s",
- strerror(errno));
- sleep(1);
- }
-
- close(s);
+ priv_add_route(&rimsg);
active_addr = imsg->addr;
}
diff --git a/sbin/dhclient/privsep.h b/sbin/dhclient/privsep.h
index c436fd09d34..4af9d745d7b 100644
--- a/sbin/dhclient/privsep.h
+++ b/sbin/dhclient/privsep.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: privsep.h,v 1.21 2013/06/09 15:06:34 krw Exp $ */
+/* $OpenBSD: privsep.h,v 1.22 2013/06/09 22:39:51 krw Exp $ */
/*
* Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -55,6 +55,7 @@ struct imsg_add_route {
struct in_addr gateway;
int rdomain;
int addrs;
+ int flags;
};
struct imsg_hup {