return 0;
if ((filter.tos^r->rtm_tos)&filter.tosmask)
return 0;
- if (filter.rdst.family) {
- if (r->rtm_family != filter.rdst.family ||
- filter.rdst.bitlen > r->rtm_dst_len)
- return 0;
- } else if (filter.rdst.flags & PREFIXLEN_SPECIFIED) {
- if (filter.rdst.bitlen > r->rtm_dst_len)
- return 0;
- }
- if (filter.mdst.family) {
- if (r->rtm_family != filter.mdst.family ||
- (filter.mdst.bitlen >= 0 &&
- filter.mdst.bitlen < r->rtm_dst_len))
- return 0;
- } else if (filter.mdst.flags & PREFIXLEN_SPECIFIED) {
- if (filter.mdst.bitlen >= 0 &&
- filter.mdst.bitlen < r->rtm_dst_len)
- return 0;
- }
- if (filter.rsrc.family) {
- if (r->rtm_family != filter.rsrc.family ||
- filter.rsrc.bitlen > r->rtm_src_len)
- return 0;
- } else if (filter.rsrc.flags & PREFIXLEN_SPECIFIED) {
- if (filter.rsrc.bitlen > r->rtm_src_len)
- return 0;
- }
- if (filter.msrc.family) {
- if (r->rtm_family != filter.msrc.family ||
- (filter.msrc.bitlen >= 0 &&
- filter.msrc.bitlen < r->rtm_src_len))
- return 0;
- } else if (filter.msrc.flags & PREFIXLEN_SPECIFIED) {
- if (filter.msrc.bitlen >= 0 &&
- filter.msrc.bitlen < r->rtm_src_len)
- return 0;
- }
+ if (filter.rdst.family &&
+ (r->rtm_family != filter.rdst.family || filter.rdst.bitlen > r->rtm_dst_len))
+ return 0;
+ if (filter.mdst.family &&
+ (r->rtm_family != filter.mdst.family ||
+ (filter.mdst.bitlen >= 0 && filter.mdst.bitlen < r->rtm_dst_len)))
+ return 0;
+ if (filter.rsrc.family &&
+ (r->rtm_family != filter.rsrc.family || filter.rsrc.bitlen > r->rtm_src_len))
+ return 0;
+ if (filter.msrc.family &&
+ (r->rtm_family != filter.msrc.family ||
+ (filter.msrc.bitlen >= 0 && filter.msrc.bitlen < r->rtm_src_len)))
+ return 0;
if (filter.rvia.family) {
int family = r->rtm_family;
if (tb[RTA_DST])
memcpy(&dst.data, RTA_DATA(tb[RTA_DST]), (r->rtm_dst_len+7)/8);
- if (filter.rsrc.family || filter.msrc.family ||
- filter.rsrc.flags & PREFIXLEN_SPECIFIED ||
- filter.msrc.flags & PREFIXLEN_SPECIFIED) {
+ if (filter.rsrc.family || filter.msrc.family) {
if (tb[RTA_SRC])
memcpy(&src.data, RTA_DATA(tb[RTA_SRC]), (r->rtm_src_len+7)/8);
}
memcpy(&prefsrc.data, RTA_DATA(tb[RTA_PREFSRC]), host_len/8);
}
- if ((filter.rdst.family || filter.rdst.flags & PREFIXLEN_SPECIFIED) &&
- inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen))
+ if (filter.rdst.family && inet_addr_match(&dst, &filter.rdst, filter.rdst.bitlen))
return 0;
- if ((filter.mdst.family || filter.mdst.flags & PREFIXLEN_SPECIFIED) &&
+ if (filter.mdst.family && filter.mdst.bitlen >= 0 &&
inet_addr_match(&dst, &filter.mdst, r->rtm_dst_len))
return 0;
- if ((filter.rsrc.family || filter.rsrc.flags & PREFIXLEN_SPECIFIED) &&
- inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen))
+ if (filter.rsrc.family && inet_addr_match(&src, &filter.rsrc, filter.rsrc.bitlen))
return 0;
- if ((filter.msrc.family || filter.msrc.flags & PREFIXLEN_SPECIFIED) &&
- filter.msrc.bitlen >= 0 &&
+ if (filter.msrc.family && filter.msrc.bitlen >= 0 &&
inet_addr_match(&src, &filter.msrc, r->rtm_src_len))
return 0;