- if (filter.flushb &&
- r->rtm_family == AF_INET6 &&
- r->rtm_dst_len == 0 &&
- r->rtm_type == RTN_UNREACHABLE &&
- tb[RTA_PRIORITY] &&
- *(int*)RTA_DATA(tb[RTA_PRIORITY]) == -1)
+ if (tb[RTA_SRC]) {
+ src.bitlen = r->rtm_src_len;
+ src.bytelen = (r->rtm_family == AF_INET6 ? 16 : 4);
+ memcpy(src.data, RTA_DATA(tb[RTA_SRC]), src.bytelen);
+ }
+ if (tb[RTA_DST]) {
+ dst.bitlen = r->rtm_dst_len;
+ dst.bytelen = (r->rtm_family == AF_INET6 ? 16 : 4);
+ memcpy(dst.data, RTA_DATA(tb[RTA_DST]), dst.bytelen);
+ }
+
+ if (G_filter.rdst.family
+ && inet_addr_match(&dst, &G_filter.rdst, G_filter.rdst.bitlen)
+ ) {
+ return 0;
+ }
+ if (G_filter.mdst.family
+ && G_filter.mdst.bitlen >= 0
+ && inet_addr_match(&dst, &G_filter.mdst, r->rtm_dst_len)
+ ) {
+ return 0;
+ }
+ if (G_filter.rsrc.family
+ && inet_addr_match(&src, &G_filter.rsrc, G_filter.rsrc.bitlen)
+ ) {