40 |
} |
} |
41 |
*/ |
*/ |
42 |
|
|
43 |
static int print_rule(const struct sockaddr_nl *who UNUSED_PARAM, |
static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM, |
44 |
struct nlmsghdr *n, void *arg UNUSED_PARAM) |
struct nlmsghdr *n, void *arg UNUSED_PARAM) |
45 |
{ |
{ |
46 |
struct rtmsg *r = NLMSG_DATA(n); |
struct rtmsg *r = NLMSG_DATA(n); |
78 |
if (tb[RTA_SRC]) { |
if (tb[RTA_SRC]) { |
79 |
if (r->rtm_src_len != host_len) { |
if (r->rtm_src_len != host_len) { |
80 |
printf("%s/%u", rt_addr_n2a(r->rtm_family, |
printf("%s/%u", rt_addr_n2a(r->rtm_family, |
|
RTA_PAYLOAD(tb[RTA_SRC]), |
|
81 |
RTA_DATA(tb[RTA_SRC]), |
RTA_DATA(tb[RTA_SRC]), |
82 |
abuf, sizeof(abuf)), |
abuf, sizeof(abuf)), |
83 |
r->rtm_src_len |
r->rtm_src_len |
98 |
if (tb[RTA_DST]) { |
if (tb[RTA_DST]) { |
99 |
if (r->rtm_dst_len != host_len) { |
if (r->rtm_dst_len != host_len) { |
100 |
printf("to %s/%u ", rt_addr_n2a(r->rtm_family, |
printf("to %s/%u ", rt_addr_n2a(r->rtm_family, |
|
RTA_PAYLOAD(tb[RTA_DST]), |
|
101 |
RTA_DATA(tb[RTA_DST]), |
RTA_DATA(tb[RTA_DST]), |
102 |
abuf, sizeof(abuf)), |
abuf, sizeof(abuf)), |
103 |
r->rtm_dst_len |
r->rtm_dst_len |
113 |
} |
} |
114 |
|
|
115 |
if (r->rtm_tos) { |
if (r->rtm_tos) { |
116 |
printf("tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1, sizeof(b1))); |
printf("tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1)); |
117 |
} |
} |
118 |
if (tb[RTA_PROTOINFO]) { |
if (tb[RTA_PROTOINFO]) { |
119 |
printf("fwmark %#x ", *(uint32_t*)RTA_DATA(tb[RTA_PROTOINFO])); |
printf("fwmark %#x ", *(uint32_t*)RTA_DATA(tb[RTA_PROTOINFO])); |
124 |
} |
} |
125 |
|
|
126 |
if (r->rtm_table) |
if (r->rtm_table) |
127 |
printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table, b1, sizeof(b1))); |
printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table, b1)); |
128 |
|
|
129 |
if (tb[RTA_FLOW]) { |
if (tb[RTA_FLOW]) { |
130 |
uint32_t to = *(uint32_t*)RTA_DATA(tb[RTA_FLOW]); |
uint32_t to = *(uint32_t*)RTA_DATA(tb[RTA_FLOW]); |
132 |
to &= 0xFFFF; |
to &= 0xFFFF; |
133 |
if (from) { |
if (from) { |
134 |
printf("realms %s/", |
printf("realms %s/", |
135 |
rtnl_rtrealm_n2a(from, b1, sizeof(b1))); |
rtnl_rtrealm_n2a(from, b1)); |
136 |
} |
} |
137 |
printf("%s ", |
printf("%s ", |
138 |
rtnl_rtrealm_n2a(to, b1, sizeof(b1))); |
rtnl_rtrealm_n2a(to, b1)); |
139 |
} |
} |
140 |
|
|
141 |
if (r->rtm_type == RTN_NAT) { |
if (r->rtm_type == RTN_NAT) { |
148 |
} else |
} else |
149 |
printf("masquerade"); |
printf("masquerade"); |
150 |
} else if (r->rtm_type != RTN_UNICAST) |
} else if (r->rtm_type != RTN_UNICAST) |
151 |
fputs(rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1)), stdout); |
fputs(rtnl_rtntype_n2a(r->rtm_type, b1), stdout); |
152 |
|
|
153 |
bb_putchar('\n'); |
bb_putchar('\n'); |
154 |
/*fflush(stdout);*/ |
/*fflush_all();*/ |
155 |
return 0; |
return 0; |
156 |
} |
} |
157 |
|
|
166 |
|
|
167 |
if (*argv) { |
if (*argv) { |
168 |
//bb_error_msg("\"rule show\" needs no arguments"); |
//bb_error_msg("\"rule show\" needs no arguments"); |
169 |
bb_warn_ignoring_args(1); |
bb_warn_ignoring_args(*argv); |
170 |
return -1; |
return -1; |
171 |
} |
} |
172 |
|
|
236 |
key == ARG_priority) { |
key == ARG_priority) { |
237 |
uint32_t pref; |
uint32_t pref; |
238 |
NEXT_ARG(); |
NEXT_ARG(); |
239 |
if (get_u32(&pref, *argv, 0)) |
pref = get_u32(*argv, "preference"); |
|
invarg(*argv, "preference"); |
|
240 |
addattr32(&req.n, sizeof(req), RTA_PRIORITY, pref); |
addattr32(&req.n, sizeof(req), RTA_PRIORITY, pref); |
241 |
} else if (key == ARG_tos) { |
} else if (key == ARG_tos) { |
242 |
uint32_t tos; |
uint32_t tos; |
247 |
} else if (key == ARG_fwmark) { |
} else if (key == ARG_fwmark) { |
248 |
uint32_t fwmark; |
uint32_t fwmark; |
249 |
NEXT_ARG(); |
NEXT_ARG(); |
250 |
if (get_u32(&fwmark, *argv, 0)) |
fwmark = get_u32(*argv, "fwmark"); |
|
invarg(*argv, "fwmark"); |
|
251 |
addattr32(&req.n, sizeof(req), RTA_PROTOINFO, fwmark); |
addattr32(&req.n, sizeof(req), RTA_PROTOINFO, fwmark); |
252 |
} else if (key == ARG_realms) { |
} else if (key == ARG_realms) { |
253 |
uint32_t realm; |
uint32_t realm; |