diff options
author | 2009-09-26 18:24:58 +0000 | |
---|---|---|
committer | 2009-09-26 18:24:58 +0000 | |
commit | 0ab89b342df8b1e7ac860a348c6c46bd00355a83 (patch) | |
tree | 8d2648513be4c036fefacc21fc8631e7805e0fc0 | |
parent | Whitespace cleanup. (diff) | |
download | wireguard-openbsd-0ab89b342df8b1e7ac860a348c6c46bd00355a83.tar.xz wireguard-openbsd-0ab89b342df8b1e7ac860a348c6c46bd00355a83.zip |
Preliminary rdomain support.
ok claudio@
-rw-r--r-- | usr.sbin/ripd/interface.c | 17 | ||||
-rw-r--r-- | usr.sbin/ripd/kroute.c | 11 | ||||
-rw-r--r-- | usr.sbin/ripd/parse.y | 12 | ||||
-rw-r--r-- | usr.sbin/ripd/ripd.c | 5 | ||||
-rw-r--r-- | usr.sbin/ripd/ripd.h | 5 |
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); |