On Sun, May 21, 2017 at 11:01:34PM +0200, Dean Luga wrote:
@@ -1394,7 +1404,8 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h) struct rtattr *a[BIRD_RTA_MAX]; int new = h->nlmsg_type == RTM_NEWROUTE;
- net_addr dst; + net_addr dst, sadr_src; + net_fill_ip6(&sadr_src, IP6_NONE, 0); u32 oif = ~0; u32 table_id; u32 priority = 0; @@ -1420,6 +1431,9 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h) if (!nl_parse_attrs(RTM_RTA(i), rtm_attr_want6, a, sizeof(a))) return;
+ if (a[RTA_SRC]) + net_fill_ip6(&sadr_src, rta_get_ip6(a[RTA_SRC]), i->rtm_src_len); + if (a[RTA_DST]) net_fill_ip6(&dst, rta_get_ip6(a[RTA_DST]), i->rtm_dst_len); else @@ -1496,7 +1510,15 @@ nl_parse_route(struct nl_parse_state *s, struct nlmsghdr *h) src = KRT_SRC_ALIEN; }
- net *net = net_get(p->p.main_channel->table, &dst); + net *net; + if (p->p.main_channel->table->addr_type == NET_SADR_IP6) + { + net_addr_sadr_ip6 sadr_addr = + NET_ADDR_SADR_IP6(net_prefix(&dst), net_pxlen(&dst), net_prefix(&sadr_src), net_pxlen(&sadr_src)); + net = net_get(p->p.main_channel->table, (net_addr *)&sadr_addr); + } + else + net = net_get(p->p.main_channel->table, &dst);
IMHO there should be check that if the found protocol is not SADR, then routes with RTA_SRC other than ::/0 should be ignored, in the same way like routes with IIF or ToS are ignored: if (a[RTA_IIF]) SKIP("IIF set\n"); if (i->rtm_tos != 0) /* We don't support TOS */ SKIP("TOS %02x\n", i->rtm_tos); -- Elen sila lumenn' omentielvo Ondrej 'Santiago' Zajicek (email: santiago@crfreenet.org) OpenPGP encrypted e-mails preferred (KeyID 0x11DEADC3, wwwkeys.pgp.net) "To err is human -- to blame it on a computer is even more so."