summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormichele <michele@openbsd.org>2009-09-26 18:24:58 +0000
committermichele <michele@openbsd.org>2009-09-26 18:24:58 +0000
commit0ab89b342df8b1e7ac860a348c6c46bd00355a83 (patch)
tree8d2648513be4c036fefacc21fc8631e7805e0fc0
parentWhitespace cleanup. (diff)
downloadwireguard-openbsd-0ab89b342df8b1e7ac860a348c6c46bd00355a83.tar.xz
wireguard-openbsd-0ab89b342df8b1e7ac860a348c6c46bd00355a83.zip
Preliminary rdomain support.
ok claudio@
-rw-r--r--usr.sbin/ripd/interface.c17
-rw-r--r--usr.sbin/ripd/kroute.c11
-rw-r--r--usr.sbin/ripd/parse.y12
-rw-r--r--usr.sbin/ripd/ripd.c5
-rw-r--r--usr.sbin/ripd/ripd.h5
5 files changed, 39 insertions, 11 deletions
diff --git a/usr.sbin/ripd/interface.c b/usr.sbin/ripd/interface.c
index 6d1752de309..1960251ecd2 100644
--- a/usr.sbin/ripd/interface.c
+++ b/usr.sbin/ripd/interface.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: interface.c,v 1.7 2009/09/26 11:12:50 michele Exp $ */
+/* $OpenBSD: interface.c,v 1.8 2009/09/26 18:24:58 michele Exp $ */
/*
* Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it>
@@ -72,9 +72,24 @@ static const char * const if_event_names[] = {
void
if_init(struct ripd_conf *xconf, struct iface *iface)
{
+ struct ifreq ifr;
+ u_int rdomain;
+
/* XXX as in ospfd I would like to kill that. This is a design error */
iface->fd = xconf->rip_socket;
+ strlcpy(ifr.ifr_name, iface->name, sizeof(ifr.ifr_name));
+ if (ioctl(iface->fd, SIOCGIFRTABLEID, (caddr_t)&ifr) == -1)
+ rdomain = 0;
+ else {
+ rdomain = ifr.ifr_rdomainid;
+ if (setsockopt(iface->fd, IPPROTO_IP, SO_RDOMAIN, &rdomain,
+ sizeof(rdomain)) == -1)
+ fatal("failed to set rdomain");
+ }
+ if (rdomain != xconf->rdomain)
+ fatalx("interface rdomain mismatch");
+
ripe_demote_iface(iface, 0);
}
diff --git a/usr.sbin/ripd/kroute.c b/usr.sbin/ripd/kroute.c
index 9342f376ac2..cce31b3c755 100644
--- a/usr.sbin/ripd/kroute.c
+++ b/usr.sbin/ripd/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.19 2009/09/24 12:30:36 michele Exp $ */
+/* $OpenBSD: kroute.c,v 1.20 2009/09/26 18:24:58 michele Exp $ */
/*
* Copyright (c) 2004 Esben Norby <norby@openbsd.org>
@@ -47,6 +47,7 @@ struct {
int fib_sync;
int fd;
struct event ev;
+ u_int rdomain;
} kr_state;
struct kroute_node {
@@ -111,7 +112,7 @@ kif_init(void)
}
int
-kr_init(int fs)
+kr_init(int fs, u_int rdomain)
{
int opt = 0, rcvbuf, default_rcvbuf;
socklen_t optlen;
@@ -159,6 +160,7 @@ kr_init(int fs)
flag_all_rip_routers = 1;
kr_state.fib_sync = fs; /* now set correct sync mode */
+ kr_state.rdomain = rdomain;
event_set(&kr_state.ev, kr_state.fd, EV_READ | EV_PERSIST,
kr_dispatch_msg, NULL);
@@ -751,6 +753,7 @@ send_rtmsg(int fd, int action, struct kroute *kroute)
hdr.rtm_version = RTM_VERSION;
hdr.rtm_type = action;
hdr.rtm_priority = RTP_RIP;
+ hdr.rtm_tableid = kr_state.rdomain;
if (action == RTM_CHANGE)
hdr.rtm_fmask = RTF_REJECT|RTF_BLACKHOLE;
hdr.rtm_seq = kr_state.rtseq++; /* overflow doesn't matter */
@@ -848,7 +851,7 @@ fetchtable(void)
mib[3] = AF_INET;
mib[4] = NET_RT_DUMP;
mib[5] = 0;
- mib[6] = 0; /* rtableid */
+ mib[6] = kr_state.rdomain; /* rtableid */
if (sysctl(mib, 7, NULL, &len, NULL, 0) == -1) {
log_warn("sysctl");
@@ -1079,7 +1082,7 @@ dispatch_rtmsg(void)
sa = (struct sockaddr *)(next + rtm->rtm_hdrlen);
get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
- if (rtm->rtm_tableid != 0)
+ if (rtm->rtm_tableid != kr_state.rdomain)
continue;
if (rtm->rtm_pid == kr_state.pid) /* cause by us */
diff --git a/usr.sbin/ripd/parse.y b/usr.sbin/ripd/parse.y
index 92a34309868..f60569c2200 100644
--- a/usr.sbin/ripd/parse.y
+++ b/usr.sbin/ripd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.26 2009/09/26 11:12:50 michele Exp $ */
+/* $OpenBSD: parse.y,v 1.27 2009/09/26 18:24:58 michele Exp $ */
/*
* Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it>
@@ -101,7 +101,7 @@ typedef struct {
%}
-%token SPLIT_HORIZON TRIGGERED_UPDATES FIBUPDATE REDISTRIBUTE
+%token SPLIT_HORIZON TRIGGERED_UPDATES FIBUPDATE REDISTRIBUTE RDOMAIN
%token AUTHKEY AUTHTYPE AUTHMD AUTHMDKEYID
%token INTERFACE RTLABEL
%token COST PASSIVE
@@ -176,6 +176,13 @@ conf_main : SPLIT_HORIZON STRING {
else
conf->options &= ~OPT_TRIGGERED_UPDATES;
}
+ | RDOMAIN NUMBER {
+ if ($2 < 0 || $2 > RT_TABLEID_MAX) {
+ yyerror("invalid rdomain");
+ YYERROR;
+ }
+ conf->rdomain = $2;
+ }
| FIBUPDATE yesno {
if ($2 == 0)
conf->flags |= RIPD_FLAG_NO_FIB_UPDATE;
@@ -403,6 +410,7 @@ lookup(char *s)
{"interface", INTERFACE},
{"no", NO},
{"passive", PASSIVE},
+ {"rdomain", RDOMAIN},
{"redistribute", REDISTRIBUTE},
{"rtlabel", RTLABEL},
{"split-horizon", SPLIT_HORIZON},
diff --git a/usr.sbin/ripd/ripd.c b/usr.sbin/ripd/ripd.c
index b573da4e9c8..e081bb9a584 100644
--- a/usr.sbin/ripd/ripd.c
+++ b/usr.sbin/ripd/ripd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ripd.c,v 1.17 2009/09/26 11:12:50 michele Exp $ */
+/* $OpenBSD: ripd.c,v 1.18 2009/09/26 18:24:58 michele Exp $ */
/*
* Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it>
@@ -265,7 +265,8 @@ main(int argc, char *argv[])
iev_rde->handler, iev_rde);
event_add(&iev_rde->ev, NULL);
- if (kr_init(!(conf->flags & RIPD_FLAG_NO_FIB_UPDATE)) == -1)
+ if (kr_init(!(conf->flags & RIPD_FLAG_NO_FIB_UPDATE),
+ conf->rdomain) == -1)
fatalx("kr_init failed");
event_dispatch();
diff --git a/usr.sbin/ripd/ripd.h b/usr.sbin/ripd/ripd.h
index 8aa4e1b48bc..d9e71680059 100644
--- a/usr.sbin/ripd/ripd.h
+++ b/usr.sbin/ripd/ripd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ripd.h,v 1.19 2009/09/26 11:12:50 michele Exp $ */
+/* $OpenBSD: ripd.h,v 1.20 2009/09/26 18:24:58 michele Exp $ */
/*
* Copyright (c) 2004 Esben Norby <norby@openbsd.org>
@@ -237,6 +237,7 @@ struct ripd_conf {
int options;
int rip_socket;
int redistribute;
+ u_int rdomain;
};
/* kroute */
@@ -310,7 +311,7 @@ struct demote_msg {
};
int kif_init(void);
-int kr_init(int);
+int kr_init(int, u_int);
int kr_change(struct kroute *);
int kr_delete(struct kroute *);
void kr_shutdown(void);