Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/external/bsd/dhcpcd/dist Handle static routes in IPv4. Routi...
details: https://anonhg.NetBSD.org/src/rev/308aab2d890c
branches: trunk
changeset: 813532:308aab2d890c
user: christos <christos%NetBSD.org@localhost>
date: Mon Feb 01 16:47:00 2016 +0000
description:
Handle static routes in IPv4. Routing messages for static routes have a
gateway address of AF_INET, not AF_LINK. Find the interface for that gateway.
XXX: We need to do the same for IPv6...
diffstat:
external/bsd/dhcpcd/dist/if-bsd.c | 23 ++++++++++++++++++-----
external/bsd/dhcpcd/dist/ipv4.c | 33 ++++++++++++++++++++++++++++++++-
external/bsd/dhcpcd/dist/ipv4.h | 4 +++-
3 files changed, 53 insertions(+), 7 deletions(-)
diffs (126 lines):
diff -r 1c05a7682b60 -r 308aab2d890c external/bsd/dhcpcd/dist/if-bsd.c
--- a/external/bsd/dhcpcd/dist/if-bsd.c Mon Feb 01 16:32:28 2016 +0000
+++ b/external/bsd/dhcpcd/dist/if-bsd.c Mon Feb 01 16:47:00 2016 +0000
@@ -1,5 +1,5 @@
#include <sys/cdefs.h>
- __RCSID("$NetBSD: if-bsd.c,v 1.26 2016/01/07 20:09:43 roy Exp $");
+ __RCSID("$NetBSD: if-bsd.c,v 1.27 2016/02/01 16:47:00 christos Exp $");
/*
* dhcpcd - DHCP client daemon
@@ -466,6 +466,8 @@
char *cp;
struct sockaddr *sa, *rti_info[RTAX_MAX];
struct sockaddr_dl *sdl;
+ struct sockaddr_in *sin;
+ struct ipv4_addr *ia;
cp = (char *)(void *)(rtm + 1);
sa = (struct sockaddr *)(void *)cp;
@@ -504,9 +506,22 @@
sdl = (struct sockaddr_dl *)(void *)rti_info[RTAX_IFP];
rt->iface = if_findsdl(ctx, sdl);
} else if (rtm->rtm_addrs & RTA_GATEWAY) {
- sdl = (struct sockaddr_dl *)(void *)rti_info[RTAX_GATEWAY];
- if (sdl->sdl_family == AF_LINK)
+ sa = rti_info[RTAX_GATEWAY];
+ switch (sa->sa_family) {
+ case AF_LINK:
+ sdl = (void *)sa;
rt->iface = if_findsdl(ctx, sdl);
+ break;
+ case AF_INET:
+ sin = (void *)sa;
+ if ((ia = ipv4_findmaskaddr(ctx, &sin->sin_addr)))
+ rt->iface = ia->iface;
+ break;
+ default:
+ logger(ctx, LOG_ERR, "%s: Bad family %d", __func__,
+ sa->sa_family);
+ return -1;
+ }
}
/* If we don't have an interface and it's a host route, it maybe
@@ -514,8 +529,6 @@
if (rt->iface == NULL &&
!(~rtm->rtm_flags & (RTF_HOST | RTF_GATEWAY)))
{
- struct ipv4_addr *ia;
-
if ((ia = ipv4_findaddr(ctx, &rt->dest)))
rt->iface = ia->iface;
}
diff -r 1c05a7682b60 -r 308aab2d890c external/bsd/dhcpcd/dist/ipv4.c
--- a/external/bsd/dhcpcd/dist/ipv4.c Mon Feb 01 16:32:28 2016 +0000
+++ b/external/bsd/dhcpcd/dist/ipv4.c Mon Feb 01 16:47:00 2016 +0000
@@ -1,5 +1,5 @@
#include <sys/cdefs.h>
- __RCSID("$NetBSD: ipv4.c,v 1.19 2016/01/07 20:09:43 roy Exp $");
+ __RCSID("$NetBSD: ipv4.c,v 1.20 2016/02/01 16:47:00 christos Exp $");
/*
* dhcpcd - DHCP client daemon
@@ -132,6 +132,23 @@
return NULL;
}
+static struct ipv4_addr *
+ipv4_iffindmaskaddr(struct interface *ifp, const struct in_addr *addr)
+{
+ struct ipv4_state *state;
+ struct ipv4_addr *ap;
+
+ state = IPV4_STATE(ifp);
+ if (state) {
+ TAILQ_FOREACH(ap, &state->addrs, next) {
+ if ((ap->addr.s_addr & ap->net.s_addr) ==
+ (addr->s_addr & ap->net.s_addr))
+ return ap;
+ }
+ }
+ return NULL;
+}
+
struct ipv4_addr *
ipv4_iffindlladdr(struct interface *ifp)
{
@@ -162,6 +179,20 @@
return NULL;
}
+struct ipv4_addr *
+ipv4_findmaskaddr(struct dhcpcd_ctx *ctx, const struct in_addr *addr)
+{
+ struct interface *ifp;
+ struct ipv4_addr *ap;
+
+ TAILQ_FOREACH(ifp, ctx->ifaces, next) {
+ ap = ipv4_iffindmaskaddr(ifp, addr);
+ if (ap)
+ return ap;
+ }
+ return NULL;
+}
+
int
ipv4_srcaddr(const struct rt *rt, struct in_addr *addr)
{
diff -r 1c05a7682b60 -r 308aab2d890c external/bsd/dhcpcd/dist/ipv4.h
--- a/external/bsd/dhcpcd/dist/ipv4.h Mon Feb 01 16:32:28 2016 +0000
+++ b/external/bsd/dhcpcd/dist/ipv4.h Mon Feb 01 16:47:00 2016 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ipv4.h,v 1.14 2015/11/30 16:33:00 roy Exp $ */
+/* $NetBSD: ipv4.h,v 1.15 2016/02/01 16:47:00 christos Exp $ */
/*
* dhcpcd - DHCP client daemon
@@ -123,6 +123,8 @@
const struct in_addr *, const struct in_addr *);
struct ipv4_addr *ipv4_iffindlladdr(struct interface *);
struct ipv4_addr *ipv4_findaddr(struct dhcpcd_ctx *, const struct in_addr *);
+struct ipv4_addr *ipv4_findmaskaddr(struct dhcpcd_ctx *,
+ const struct in_addr *);
int ipv4_srcaddr(const struct rt *, struct in_addr *);
void ipv4_handleifa(struct dhcpcd_ctx *, int, struct if_head *, const char *,
const struct in_addr *, const struct in_addr *, const struct in_addr *,
Home |
Main Index |
Thread Index |
Old Index