//int type; - read-only
//int typemask; - unused
//int tos, tosmask; - unused
- int iif, iifmask;
- int oif, oifmask;
+ int iif;
+ int oif;
//int realm, realmmask; - unused
//inet_prefix rprefsrc; - read-only
inet_prefix rvia;
) {
return 0;
}
- if (G_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
- ) {
- return 0;
+ if (G_filter.oif != 0) {
+ if (!tb[RTA_OIF])
+ return 0;
+ if (G_filter.oif != *(int*)RTA_DATA(tb[RTA_OIF]))
+ return 0;
}
if (G_filter.flushb) {
+ /* We are creating route flush commands */
+
+ if (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
+ ) {
+ return 0;
+ }
+
struct nlmsghdr *fn;
if (NLMSG_ALIGN(G_filter.flushp) + n->nlmsg_len > G_filter.flushe) {
if (flush_update())
return 0;
}
+ /* We are printing routes */
+
if (n->nlmsg_type == RTM_DELROUTE) {
printf("Deleted ");
}
RTA_DATA(tb[RTA_GATEWAY]),
abuf, sizeof(abuf)));
}
- if (tb[RTA_OIF] && G_filter.oifmask != -1) {
+ if (tb[RTA_OIF]) {
printf("dev %s ", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
}
+ /* Todo: parse & show "proto kernel", "scope link" here */
+
if (tb[RTA_PREFSRC] && /*G_filter.rprefsrc.bitlen - always 0*/ 0 != host_len) {
/* Do not use format_host(). It is our local addr
and symbolic name will not be useful.
printf(" error %d", ci->rta_error);
}
}
- if (tb[RTA_IIF] && G_filter.iifmask != -1) {
+ if (tb[RTA_IIF] && G_filter.iif == 0) {
printf(" iif %s", ll_index_to_name(*(int*)RTA_DATA(tb[RTA_IIF])));
}
bb_putchar('\n');
if (id) {
idx = xll_name_to_index(id);
G_filter.iif = idx;
- G_filter.iifmask = -1;
}
if (od) {
idx = xll_name_to_index(od);
G_filter.oif = idx;
- G_filter.oifmask = -1;
}
}