get rid of two more implicit ktable_get with rdomain 0
ie. ktable_get(/* XXX */ 0)
should not change anything when run in rdomain 0.
ok?
(benno_more_rdomain_instead_of_0.diff)
diff --git usr.sbin/bgpd/bgpd.c usr.sbin/bgpd/bgpd.c
index 03dec715288..8299102340b 100644
--- usr.sbin/bgpd/bgpd.c
+++ usr.sbin/bgpd/bgpd.c
@@ -296,7 +296,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix
route recvfd sendfd",
}
if (pfd[PFD_SOCK_ROUTE].revents & POLLIN) {
- if (kr_dispatch_msg() == -1)
+ if (kr_dispatch_msg(conf->default_tableid) == -1)
quit = 1;
}
@@ -351,7 +351,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix
route recvfd sendfd",
control_cleanup(conf->csock);
control_cleanup(conf->rcsock);
carp_demote_shutdown();
- kr_shutdown(conf->fib_priority);
+ kr_shutdown(conf->fib_priority, conf->default_tableid);
pftable_clear_all();
free_config(conf);
diff --git usr.sbin/bgpd/bgpd.h usr.sbin/bgpd/bgpd.h
index 5e6a4eaae26..0c55d2a8645 100644
--- usr.sbin/bgpd/bgpd.h
+++ usr.sbin/bgpd/bgpd.h
@@ -1079,13 +1079,13 @@ void ktable_postload(u_int8_t);
int ktable_exists(u_int, u_int *);
int kr_change(u_int, struct kroute_full *, u_int8_t);
int kr_delete(u_int, struct kroute_full *, u_int8_t);
-void kr_shutdown(u_int8_t);
+void kr_shutdown(u_int8_t, u_int);
void kr_fib_couple(u_int, u_int8_t);
void kr_fib_couple_all(u_int8_t);
void kr_fib_decouple(u_int, u_int8_t);
void kr_fib_decouple_all(u_int8_t);
void kr_fib_update_prio_all(u_int8_t);
-int kr_dispatch_msg(void);
+int kr_dispatch_msg(u_int rdomain);
int kr_nexthop_add(u_int32_t, struct bgpd_addr *,
struct bgpd_config *);
void kr_nexthop_delete(u_int32_t, struct bgpd_addr *,
diff --git usr.sbin/bgpd/kroute.c usr.sbin/bgpd/kroute.c
index 5907f0cef67..1f1b7a3cfdc 100644
--- usr.sbin/bgpd/kroute.c
+++ usr.sbin/bgpd/kroute.c
@@ -135,8 +135,8 @@ void knexthop_clear(struct ktable
*);
struct kif_node *kif_find(int);
int kif_insert(struct kif_node *);
-int kif_remove(struct kif_node *);
-void kif_clear(void);
+int kif_remove(struct kif_node *, u_int);
+void kif_clear(u_int);
int kif_kr_insert(struct kroute_node *);
int kif_kr_remove(struct kroute_node *);
@@ -161,14 +161,14 @@ u_int8_t prefixlen_classful(in_addr_t);
u_int8_t mask2prefixlen(in_addr_t);
u_int8_t mask2prefixlen6(struct sockaddr_in6 *);
void get_rtaddrs(int, struct sockaddr *, struct sockaddr **);
-void if_change(u_short, int, struct if_data *);
-void if_announce(void *);
+void if_change(u_short, int, struct if_data *, u_int rdomain);
+void if_announce(void *, u_int);
int send_rtmsg(int, int, struct ktable *, struct kroute *,
u_int8_t);
int send_rt6msg(int, int, struct ktable *, struct kroute6 *,
u_int8_t);
-int dispatch_rtmsg(void);
+int dispatch_rtmsg(u_int rdomain);
int fetchtable(struct ktable *, u_int8_t);
int fetchifs(int);
int dispatch_rtmsg_addr(struct rt_msghdr *,
@@ -759,13 +759,13 @@ krVPN4_delete(struct ktable *kt, struct kroute_full *kl,
u_int8_t fib_prio)
}
void
-kr_shutdown(u_int8_t fib_prio)
+kr_shutdown(u_int8_t fib_prio, u_int rdomain)
{
u_int i;
for (i = krt_size; i > 0; i--)
ktable_free(i - 1, fib_prio);
- kif_clear();
+ kif_clear(rdomain);
}
void
@@ -870,9 +870,9 @@ kr_fib_update_prio_all(u_int8_t fib_prio)
}
int
-kr_dispatch_msg(void)
+kr_dispatch_msg(u_int rdomain)
{
- return (dispatch_rtmsg());
+ return (dispatch_rtmsg(rdomain));
}
int
@@ -1923,7 +1923,7 @@ kif_insert(struct kif_node *kif)
}
int
-kif_remove(struct kif_node *kif)
+kif_remove(struct kif_node *kif, u_int rdomain)
{
struct ktable *kt;
struct kif_kr *kkr;
@@ -1934,7 +1934,7 @@ kif_remove(struct kif_node *kif)
return (-1);
}
- if ((kt = ktable_get(/* XXX */ 0)) == NULL)
+ if ((kt = ktable_get(rdomain)) == NULL)
goto done;
while ((kkr = LIST_FIRST(&kif->kroute_l)) != NULL) {
@@ -1956,12 +1956,12 @@ done:
}
void
-kif_clear(void)
+kif_clear(u_int rdomain)
{
struct kif_node *kif;
while ((kif = RB_MIN(kif_tree, &kit)) != NULL)
- kif_remove(kif);
+ kif_remove(kif, rdomain);
}
int
@@ -2474,7 +2474,8 @@ get_rtaddrs(int addrs, struct sockaddr *sa, struct
sockaddr **rti_info)
}
void
-if_change(u_short ifindex, int flags, struct if_data *ifd)
+if_change(u_short ifindex, int flags, struct if_data *ifd,
+ u_int rdomain)
{
struct ktable *kt;
struct kif_node *kif;
@@ -2488,6 +2489,9 @@ if_change(u_short ifindex, int flags, struct if_data *ifd)
return;
}
+ log_info("%s: ifindex %u, ifi_rdomain %u", __func__, ifindex,
+ ifd->ifi_rdomain);
+
kif->k.flags = flags;
kif->k.link_state = ifd->ifi_link_state;
kif->k.if_type = ifd->ifi_type;
@@ -2501,7 +2505,7 @@ if_change(u_short ifindex, int flags, struct if_data *ifd)
kif->k.nh_reachable = reachable;
- kt = ktable_get(/* XXX */ 0);
+ kt = ktable_get(rdomain);
LIST_FOREACH(kkr, &kif->kroute_l, entry) {
if (reachable)
@@ -2528,7 +2532,7 @@ if_change(u_short ifindex, int flags, struct if_data *ifd)
}
void
-if_announce(void *msg)
+if_announce(void *msg, u_int rdomain)
{
struct if_announcemsghdr *ifan;
struct kif_node *kif;
@@ -2548,7 +2552,7 @@ if_announce(void *msg)
break;
case IFAN_DEPARTURE:
kif = kif_find(ifan->ifan_index);
- kif_remove(kif);
+ kif_remove(kif, rdomain);
break;
}
}
@@ -3081,7 +3085,7 @@ fetchifs(int ifindex)
}
int
-dispatch_rtmsg(void)
+dispatch_rtmsg(u_int rdomain)
{
char buf[RT_BUF_SIZE];
ssize_t n;
@@ -3108,7 +3112,7 @@ dispatch_rtmsg(void)
rtm = (struct rt_msghdr *)next;
if (lim < next + sizeof(u_short) ||
lim < next + rtm->rtm_msglen)
- fatalx("dispatch_rtmsg: partial rtm in buffer");
+ fatalx("%s: partial rtm in buffer", __func__);
if (rtm->rtm_version != RTM_VERSION)
continue;
@@ -3137,10 +3141,10 @@ dispatch_rtmsg(void)
case RTM_IFINFO:
memcpy(&ifm, next, sizeof(ifm));
if_change(ifm.ifm_index, ifm.ifm_flags,
- &ifm.ifm_data);
+ &ifm.ifm_data, rdomain);
break;
case RTM_IFANNOUNCE:
- if_announce(next);
+ if_announce(next, rdomain);
break;
default:
/* ignore for now */