diff options
author | Sebastian Benoit <benno@cvs.openbsd.org> | 2019-05-10 16:51:14 +0000 |
---|---|---|
committer | Sebastian Benoit <benno@cvs.openbsd.org> | 2019-05-10 16:51:14 +0000 |
commit | 90a4a3692209ab55cca643cad035a816404fff7c (patch) | |
tree | f0dfd06bd527f3f8960941c5337e6b69a859c1a0 /sbin/dhclient | |
parent | 032ef8d187f210dc6b0f4946908d35e1e170a795 (diff) |
Make it possible to switch between wireless and physical interfacs
(again?): when adding the default route, set it with the interface
address of the interface we are configuring. This way its possible to
have two default routes (from two running dhclient processes) in the
routing table. Since wireless interfaces have a higher prio value,
when a physical interface is connected it will be prefered (for new
connections).
ok krw@ mumble yes mumble claudio@
Diffstat (limited to 'sbin/dhclient')
-rw-r--r-- | sbin/dhclient/kroute.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c index 462e67487af..79e7436151a 100644 --- a/sbin/dhclient/kroute.c +++ b/sbin/dhclient/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.161 2019/02/23 13:37:34 krw Exp $ */ +/* $OpenBSD: kroute.c,v 1.162 2019/05/10 16:51:13 benno Exp $ */ /* * Copyright 2012 Kenneth R Westerback <krw@openbsd.org> @@ -60,7 +60,7 @@ void get_rtaddrs(int, struct sockaddr *, struct sockaddr **); unsigned int route_in_rtstatic(struct rt_msghdr *, uint8_t *, unsigned int); void flush_routes(int, int, int, uint8_t *, unsigned int); void add_route(char *, int, int, struct in_addr, struct in_addr, - struct in_addr, int); + struct in_addr, struct in_addr, int); void set_routes(char *, int, int, int, struct in_addr, struct in_addr, uint8_t *, unsigned int); @@ -370,13 +370,14 @@ flush_routes(int index, int routefd, int rdomain, */ void add_route(char *name, int rdomain, int routefd, struct in_addr dest, - struct in_addr netmask, struct in_addr gateway, int flags) + struct in_addr netmask, struct in_addr gateway, struct in_addr ifa, + int flags) { char destbuf[INET_ADDRSTRLEN]; char maskbuf[INET_ADDRSTRLEN]; struct iovec iov[5]; struct rt_msghdr rtm; - struct sockaddr_in sadest, sagateway, samask; + struct sockaddr_in sadest, sagateway, samask, saifa; int index, iovcnt = 0; index = if_nametoindex(name); @@ -429,6 +430,19 @@ add_route(char *name, int rdomain, int routefd, struct in_addr dest, iov[iovcnt].iov_base = &samask; iov[iovcnt++].iov_len = sizeof(samask); + if (ifa.s_addr != INADDR_ANY) { + /* Add the ifa */ + memset(&saifa, 0, sizeof(saifa)); + saifa.sin_len = sizeof(saifa); + saifa.sin_family = AF_INET; + saifa.sin_addr.s_addr = ifa.s_addr; + + rtm.rtm_msglen += sizeof(saifa); + iov[iovcnt].iov_base = &saifa; + iov[iovcnt++].iov_len = sizeof(saifa); + rtm.rtm_addrs |= RTA_IFA; + } + if (writev(routefd, iov, iovcnt) == -1) { if (errno != EEXIST || log_getverbose() != 0) { strlcpy(destbuf, inet_ntoa(dest), @@ -476,7 +490,7 @@ set_routes(char *name, int index, int rdomain, int routefd, struct in_addr addr, * -iface $addr */ add_route(name, rdomain, routefd, dest, netmask, - addr, RTF_STATIC | RTF_CLONING); + addr, any, RTF_STATIC | RTF_CLONING); } else if (netmask.s_addr == INADDR_ANY) { /* * DEFAULT ROUTE @@ -501,7 +515,8 @@ set_routes(char *name, int index, int rdomain, int routefd, struct in_addr addr, * */ add_route(name, rdomain, routefd, gateway, - broadcast, addr, RTF_STATIC | RTF_CLONING); + broadcast, addr, any, + RTF_STATIC | RTF_CLONING); } if (memcmp(&gateway, &addr, sizeof(addr)) == 0) { @@ -511,15 +526,16 @@ set_routes(char *name, int index, int rdomain, int routefd, struct in_addr addr, * route add default -iface $addr */ add_route(name, rdomain, routefd, any, any, - gateway, RTF_STATIC); + gateway, any, RTF_STATIC); } else { /* * DEFAULT ROUTE IS VIA GATEWAY * - * route add default $gateway + * route add default $gateway -ifa $addr + * */ add_route(name, rdomain, routefd, any, any, - gateway, RTF_STATIC | RTF_GATEWAY); + gateway, addr, RTF_STATIC | RTF_GATEWAY); } } else { /* @@ -528,7 +544,7 @@ set_routes(char *name, int index, int rdomain, int routefd, struct in_addr addr, * route add -net $dest -netmask $netmask $gateway */ add_route(name, rdomain, routefd, dest, netmask, - gateway, RTF_STATIC | RTF_GATEWAY); + gateway, any, RTF_STATIC | RTF_GATEWAY); } } } |