Lines Matching defs:kt

276 	struct ktable	 *kt;
297 kt = krt[rtableid] = calloc(1, sizeof(struct ktable));
298 if (kt == NULL) {
304 strlcpy(kt->descr, name, sizeof(kt->descr));
305 RB_INIT(&kt->krt);
306 RB_INIT(&kt->krt6);
307 RB_INIT(&kt->knt);
308 TAILQ_INIT(&kt->krn);
309 kt->fib_conf = kt->fib_sync = fs;
310 kt->rtableid = rtableid;
311 kt->nhtableid = rdomid;
313 ktable_get(kt->nhtableid)->nhrefcnt++;
316 if (fetchtable(kt) == -1)
320 kt->state = RECONF_REINIT;
329 struct ktable *kt, *nkt;
331 if ((kt = ktable_get(rtableid)) == NULL)
335 kr_fib_decouple(kt->rtableid);
338 nkt = ktable_get(kt->nhtableid);
343 * If kt->nhrefcnt > 0 then kt == nkt and nothing needs to be done.
344 * If kt != nkt then kt->nhrefcnt must be 0 and kt must be killed.
346 * free so check that kt != nkt).
348 if (kt != nkt && nkt->nhrefcnt <= 0)
350 if (kt->nhrefcnt <= 0)
351 ktable_destroy(kt);
355 ktable_destroy(struct ktable *kt)
358 kr_fib_decouple(kt->rtableid);
360 log_debug("%s: freeing ktable %s rtableid %u", __func__, kt->descr,
361 kt->rtableid);
363 if (kt->rtableid == kt->nhtableid)
364 knexthop_clear(kt);
365 kroute_clear(kt);
366 kroute6_clear(kt);
367 kr_net_clear(kt);
369 krt[kt->rtableid] = NULL;
370 free(kt);
384 struct ktable *kt, *rkt;
412 kt = ktable_get(rtableid);
413 if (kt == NULL) {
419 if (kt->state == RECONF_DELETE) {
420 kt->fib_conf = !(flags & F_RIB_NOFIBSYNC);
421 kt->state = RECONF_KEEP;
422 } else if (!kt->fib_conf)
423 kt->fib_conf = !(flags & F_RIB_NOFIBSYNC);
425 strlcpy(kt->descr, name, sizeof(kt->descr));
461 struct ktable *kt;
463 if ((kt = ktable_get(rtableid)) == NULL)
468 if (!knexthop_true_nexthop(kt, kf))
469 return kroute_remove(kt, kf, 1);
472 return (kr4_change(kt, kf));
474 return (kr6_change(kt, kf));
476 return (krVPN4_change(kt, kf));
478 return (krVPN6_change(kt, kf));
488 kr4_change(struct ktable *kt, struct kroute_full *kf)
500 if ((kr = kroute_find(kt, &kf->prefix, kf->prefixlen,
502 if (kroute_insert(kt, kf) == -1)
518 knexthop_update(kt, kf);
520 if (send_rtmsg(RTM_CHANGE, kt, kf))
528 kr6_change(struct ktable *kt, struct kroute_full *kf)
540 if ((kr6 = kroute6_find(kt, &kf->prefix, kf->prefixlen,
542 if (kroute_insert(kt, kf) == -1)
559 knexthop_update(kt, kf);
561 if (send_rtmsg(RTM_CHANGE, kt, kf))
569 krVPN4_change(struct ktable *kt, struct kroute_full *kf)
597 if ((kr = kroute_find(kt, &kf->prefix, kf->prefixlen,
599 if (kroute_insert(kt, kf) == -1)
617 if (send_rtmsg(RTM_CHANGE, kt, kf))
625 krVPN6_change(struct ktable *kt, struct kroute_full *kf)
653 if ((kr6 = kroute6_find(kt, &kf->prefix, kf->prefixlen,
655 if (kroute_insert(kt, kf) == -1)
674 if (send_rtmsg(RTM_CHANGE, kt, kf))
684 struct ktable *kt;
686 if ((kt = ktable_get(rtableid)) == NULL)
691 return kroute_remove(kt, kf, 1);
697 struct ktable *kt;
701 if ((kt = ktable_get(rtableid)) == NULL)
705 RB_FOREACH_SAFE(kr, kroute_tree, &kt->krt, next)
707 if (kroute_remove(kt, kr_tofull(kr), 1) == -1)
710 RB_FOREACH_SAFE(kr6, kroute6_tree, &kt->krt6, next6)
712 if (kroute_remove(kt, kr6_tofull(kr6), 1) == -1)
716 kt->fib_sync = 0;
734 struct ktable *kt;
738 if ((kt = ktable_get(rtableid)) == NULL) /* table does not exist */
741 if (kt->fib_sync) /* already coupled */
744 kt->fib_sync = 1;
746 RB_FOREACH(kr, kroute_tree, &kt->krt)
748 if (send_rtmsg(RTM_ADD, kt, kr_tofull(kr)))
751 RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
753 if (send_rtmsg(RTM_ADD, kt, kr6_tofull(kr6)))
756 log_info("kernel routing table %u (%s) coupled", kt->rtableid,
757 kt->descr);
772 struct ktable *kt;
776 if ((kt = ktable_get(rtableid)) == NULL) /* table does not exist */
779 if (!kt->fib_sync) /* already decoupled */
782 RB_FOREACH(kr, kroute_tree, &kt->krt)
784 if (send_rtmsg(RTM_DELETE, kt, kr_tofull(kr)))
787 RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
789 if (send_rtmsg(RTM_DELETE, kt, kr6_tofull(kr6)))
793 kt->fib_sync = 0;
795 log_info("kernel routing table %u (%s) decoupled", kt->rtableid,
796 kt->descr);
823 struct ktable *kt;
826 if ((kt = ktable_get(rtableid)) == NULL) {
830 if ((h = knexthop_find(kt, addr)) != NULL) {
840 if (knexthop_insert(kt, h) == -1)
850 struct ktable *kt;
853 if ((kt = ktable_get(rtableid)) == NULL) {
858 if ((kn = knexthop_find(kt, addr)) == NULL)
861 knexthop_remove(kt, kn);
891 struct ktable *kt;
913 kt = ktable_get(tableid);
914 if (kt == NULL) {
920 RB_FOREACH(kr, kroute_tree, &kt->krt) {
932 RB_FOREACH(kr6, kroute6_tree, &kt->krt6) {
949 kt = ktable_get(tableid);
950 if (kt == NULL) {
958 kr = kroute_match(kt, &addr, 1);
967 kr6 = kroute6_match(kt, &addr, 1);
978 kt = ktable_get(tableid);
979 if (kt == NULL) {
984 RB_FOREACH(h, knexthop_tree, KT2KNT(kt)) {
1024 if ((kt = ktable_get(i)) == NULL)
1027 ktab = *kt;
1068 kr_net_redist_add(struct ktable *kt, struct network_config *net,
1080 xr = RB_INSERT(kredist_tree, &kt->kredist, r);
1105 kr_net_redist_del(struct ktable *kt, struct network_config *net, int dynamic)
1114 r = RB_FIND(kredist_tree, &kt->kredist, &node);
1118 if (RB_REMOVE(kredist_tree, &kt->kredist, r) == NULL) {
1130 kr_net_match(struct ktable *kt, struct network_config *net, uint16_t flags,
1135 TAILQ_FOREACH(xn, &kt->krn, entry) {
1173 if (kr_net_redist_add(kt, net, &xn->net.attrset, 1))
1180 kr_net_find(struct ktable *kt, struct network *n)
1184 TAILQ_FOREACH(xn, &kt->krn, entry) {
1202 struct ktable *kt;
1204 if ((kt = ktable_get(rtableid)) == NULL)
1211 xn = kr_net_find(kt, n);
1218 TAILQ_INSERT_TAIL(&kt->krn, n, entry);
1223 kr_net_clear(struct ktable *kt)
1227 TAILQ_FOREACH_SAFE(n, &kt->krn, entry, xn) {
1228 TAILQ_REMOVE(&kt->krn, n, entry);
1230 kr_net_redist_del(kt, &n->net, 0);
1236 kr_redistribute(int type, struct ktable *kt, struct kroute_full *kf)
1251 kr_net_redist_del(kt, &net, 1);
1305 if (kr_net_match(kt, &net, kf->flags, loflag) == 0)
1307 kr_net_redist_del(kt, &net, 1);
1313 struct ktable *kt;
1318 if ((kt = ktable_get(i)) == NULL)
1320 kt->state = RECONF_DELETE;
1323 TAILQ_FOREACH(n, &kt->krn, entry)
1331 struct ktable *kt;
1336 if ((kt = ktable_get(i - 1)) == NULL)
1338 if (kt->state == RECONF_DELETE) {
1341 } else if (kt->state == RECONF_REINIT) {
1342 if (kt->fib_sync != kt->fib_conf) {
1343 kt->fib_sync = kt->fib_conf;
1344 if (kt->fib_sync)
1345 fetchtable(kt);
1350 TAILQ_FOREACH_SAFE(n, &kt->krn, entry, xn) {
1352 TAILQ_REMOVE(&kt->krn, n, entry);
1354 kr_net_redist_del(kt, &n->net, 0);
1364 struct ktable *kt;
1373 if ((kt = ktable_get(rid)) == NULL)
1377 if (kt->rtableid == kt->nhtableid)
1378 RB_FOREACH(nh, knexthop_tree, KT2KNT(kt))
1379 knexthop_validate(kt, nh);
1381 TAILQ_FOREACH(n, &kt->krn, entry)
1383 kr_net_redist_add(kt, &n->net,
1390 RB_FOREACH(kr, kroute_tree, &kt->krt)
1391 kr_redistribute(IMSG_NETWORK_ADD, kt,
1393 RB_FOREACH(kr6, kroute6_tree, &kt->krt6)
1394 kr_redistribute(IMSG_NETWORK_ADD, kt,
1593 kroute_find(struct ktable *kt, const struct bgpd_addr *prefix,
1603 kn = RB_FIND(kroute_tree, &kt->krt, &s);
1605 tmp = RB_PREV(kroute_tree, &kt->krt, kn);
1611 tmp = RB_PREV(kroute_tree, &kt->krt, kn);
1642 kroute_insert(struct ktable *kt, struct kroute_full *kf)
1685 if ((krm = RB_INSERT(kroute_tree, &kt->krt, kr)) != NULL) {
1694 if (send_rtmsg(RTM_ADD, kt, kf))
1722 if ((kr6m = RB_INSERT(kroute6_tree, &kt->krt6, kr6)) != NULL) {
1731 if (send_rtmsg(RTM_ADD, kt, kf))
1737 RB_FOREACH(n, knexthop_tree, KT2KNT(kt))
1740 knexthop_validate(kt, n);
1746 kr_redistribute(IMSG_NETWORK_ADD, kt, kf);
1754 kroute4_remove(struct ktable *kt, struct kroute_full *kf, int any)
1760 if ((kr = kroute_find(kt, &kf->prefix, kf->prefixlen,
1784 RB_REMOVE(kroute_tree, &kt->krt, krm);
1787 if (RB_INSERT(kroute_tree, &kt->krt, kr) != NULL) {
1810 RB_FOREACH(n, knexthop_tree, KT2KNT(kt)) {
1812 knexthop_validate(kt, n);
1824 kroute6_remove(struct ktable *kt, struct kroute_full *kf, int any)
1830 if ((kr = kroute6_find(kt, &kf->prefix, kf->prefixlen,
1854 RB_REMOVE(kroute6_tree, &kt->krt6, krm);
1857 if (RB_INSERT(kroute6_tree, &kt->krt6, kr) != NULL) {
1879 RB_FOREACH(n, knexthop_tree, KT2KNT(kt)) {
1881 knexthop_validate(kt, n);
1894 kroute_remove(struct ktable *kt, struct kroute_full *kf, int any)
1901 multipath = kroute4_remove(kt, kf, any);
1905 multipath = kroute6_remove(kt, kf, any);
1919 send_rtmsg(RTM_DELETE, kt, kf);
1923 kr_redistribute(IMSG_NETWORK_REMOVE, kt, kf);
1929 kroute_clear(struct ktable *kt)
1933 while ((kr = RB_MIN(kroute_tree, &kt->krt)) != NULL)
1934 kroute_remove(kt, kr_tofull(kr), 1);
1938 kroute6_find(struct ktable *kt, const struct bgpd_addr *prefix,
1949 kn6 = RB_FIND(kroute6_tree, &kt->krt6, &s);
1951 tmp = RB_PREV(kroute6_tree, &kt->krt6, kn6);
1957 tmp = RB_PREV(kroute6_tree, &kt->krt6, kn6);
1989 kroute6_clear(struct ktable *kt)
1993 while ((kr = RB_MIN(kroute6_tree, &kt->krt6)) != NULL)
1994 kroute_remove(kt, kr6_tofull(kr), 1);
1998 knexthop_find(struct ktable *kt, struct bgpd_addr *addr)
2005 return (RB_FIND(knexthop_tree, KT2KNT(kt), &s));
2009 knexthop_insert(struct ktable *kt, struct knexthop *kn)
2011 if (RB_INSERT(knexthop_tree, KT2KNT(kt), kn) != NULL) {
2018 knexthop_validate(kt, kn);
2024 knexthop_remove(struct ktable *kt, struct knexthop *kn)
2026 kroute_detach_nexthop(kt, kn);
2027 RB_REMOVE(knexthop_tree, KT2KNT(kt), kn);
2032 knexthop_clear(struct ktable *kt)
2036 while ((kn = RB_MIN(knexthop_tree, KT2KNT(kt))) != NULL)
2037 knexthop_remove(kt, kn);
2066 struct ktable *kt;
2076 if ((kt = ktable_get(kif->rdomain)) != NULL)
2077 knexthop_track(kt, kif->ifindex);
2174 knexthop_true_nexthop(struct ktable *kt, struct kroute_full *kf)
2191 kn = knexthop_find(kt, &kf->nexthop);
2223 knexthop_validate(struct ktable *kt, struct knexthop *kn)
2230 kroute_detach_nexthop(kt, kn);
2232 if ((kt = ktable_get(kt->nhtableid)) == NULL)
2237 kr = kroute_match(kt, &kn->nexthop, 0);
2254 kr6 = kroute6_match(kt, &kn->nexthop, 0);
2272 knexthop_track(struct ktable *kt, u_short ifindex)
2276 RB_FOREACH(kn, knexthop_tree, KT2KNT(kt))
2278 knexthop_validate(kt, kn);
2285 knexthop_update(struct ktable *kt, struct kroute_full *kf)
2289 RB_FOREACH(kn, knexthop_tree, KT2KNT(kt))
2347 kroute_match(struct ktable *kt, struct bgpd_addr *key, int matchany)
2355 if ((kr = kroute_find(kt, &masked, i, RTP_ANY)) != NULL)
2364 kroute6_match(struct ktable *kt, struct bgpd_addr *key, int matchany)
2372 if ((kr6 = kroute6_find(kt, &masked, i, RTP_ANY)) != NULL)
2381 kroute_detach_nexthop(struct ktable *kt, struct knexthop *kn)
2394 RB_FOREACH(s, knexthop_tree, KT2KNT(kt))
2582 struct ktable *kt;
2613 kt = ktable_get(kif->rdomain);
2614 if (kt == NULL)
2617 knexthop_track(kt, ifindex);
2691 send_rtmsg(int action, struct ktable *kt, struct kroute_full *kf)
2704 if (!kt->fib_sync)
2711 hdr.rtm_tableid = kt->rtableid;
2856 fetchtable(struct ktable *kt)
2870 mib[6] = kt->rtableid;
2873 if (kt->rtableid != 0 && errno == EINVAL)
2901 send_rtmsg(RTM_DELETE, kt, &kf);
2903 kroute_insert(kt, &kf);
2994 struct ktable *kt;
3029 if ((kt = ktable_get(rtm->rtm_tableid)) == NULL)
3041 if (kr_fib_change(kt, &kf, rtm->rtm_type,
3046 if (kr_fib_delete(kt, &kf, mpath) == -1)
3157 kr_fib_delete(struct ktable *kt, struct kroute_full *kf, int mpath)
3159 return kroute_remove(kt, kf, !mpath);
3163 kr_fib_change(struct ktable *kt, struct kroute_full *kf, int type, int mpath)
3174 if ((kr = kroute_find(kt, &kf->prefix, kf->prefixlen,
3217 kt, kr_tofull(kr));
3222 kt, kr_tofull(kr));
3226 kt, kr_tofull(kr));
3229 knexthop_update(kt, kf);
3235 kroute_insert(kt, kf);
3239 if ((kr6 = kroute6_find(kt, &kf->prefix, kf->prefixlen,
3289 kt, kr6_tofull(kr6));
3294 kt, kr6_tofull(kr6));
3298 kt, kr6_tofull(kr6));
3301 knexthop_update(kt, kf);
3307 kroute_insert(kt, kf);