42
42
fprintf(stderr, "ACTION := [ table TABLE_ID ]\n");
43
43
fprintf(stderr, " [ prohibit | reject | unreachable ]\n");
44
44
fprintf(stderr, " [ realms [SRCREALM/]DSTREALM ]\n");
45
fprintf(stderr, " [ goto NUMBER ]\n");
45
46
fprintf(stderr, "TABLE_ID := [ local | main | default | NUMBER ]\n");
67
parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
68
parse_rtattr(tb, FRA_MAX, RTM_RTA(r), len);
69
70
if (r->rtm_family == AF_INET)
78
79
if (n->nlmsg_type == RTM_DELRULE)
79
80
fprintf(fp, "Deleted ");
82
fprintf(fp, "%u:\t", *(unsigned*)RTA_DATA(tb[RTA_PRIORITY]));
83
fprintf(fp, "%u:\t", *(unsigned*)RTA_DATA(tb[FRA_PRIORITY]));
84
85
fprintf(fp, "0:\t");
86
87
if (r->rtm_flags & FIB_RULE_INVERT)
87
88
fprintf(fp, "not ");
90
91
if (r->rtm_src_len != host_len) {
91
92
fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family,
92
RTA_PAYLOAD(tb[RTA_SRC]),
93
RTA_DATA(tb[RTA_SRC]),
93
RTA_PAYLOAD(tb[FRA_SRC]),
94
RTA_DATA(tb[FRA_SRC]),
94
95
abuf, sizeof(abuf)),
98
99
fprintf(fp, "from %s ", format_host(r->rtm_family,
99
RTA_PAYLOAD(tb[RTA_SRC]),
100
RTA_DATA(tb[RTA_SRC]),
100
RTA_PAYLOAD(tb[FRA_SRC]),
101
RTA_DATA(tb[FRA_SRC]),
101
102
abuf, sizeof(abuf))
107
108
fprintf(fp, "from all ");
111
112
if (r->rtm_dst_len != host_len) {
112
113
fprintf(fp, "to %s/%u ", rt_addr_n2a(r->rtm_family,
113
RTA_PAYLOAD(tb[RTA_DST]),
114
RTA_DATA(tb[RTA_DST]),
114
RTA_PAYLOAD(tb[FRA_DST]),
115
RTA_DATA(tb[FRA_DST]),
115
116
abuf, sizeof(abuf)),
119
120
fprintf(fp, "to %s ", format_host(r->rtm_family,
120
RTA_PAYLOAD(tb[RTA_DST]),
121
RTA_DATA(tb[RTA_DST]),
121
RTA_PAYLOAD(tb[FRA_DST]),
122
RTA_DATA(tb[FRA_DST]),
122
123
abuf, sizeof(abuf)));
124
125
} else if (r->rtm_dst_len) {
130
131
fprintf(fp, "tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1, sizeof(b1)));
132
if (tb[RTA_PROTOINFO] || tb[RTA_FWMASK]) {
134
if (tb[FRA_FWMARK] || tb[FRA_FWMASK]) {
133
135
__u32 mark = 0, mask = 0;
135
if (tb[RTA_PROTOINFO])
136
mark = *(__u32*)RTA_DATA(tb[RTA_PROTOINFO]);
138
mark = *(__u32*)RTA_DATA(tb[FRA_FWMARK]);
138
if (tb[RTA_FWMASK] &&
139
(mask = *(__u32*)RTA_DATA(tb[RTA_FWMASK])) != 0xFFFFFFFF)
140
if (tb[FRA_FWMASK] &&
141
(mask = *(__u32*)RTA_DATA(tb[FRA_FWMASK])) != 0xFFFFFFFF)
140
142
fprintf(fp, "fwmark 0x%x/0x%x ", mark, mask);
142
144
fprintf(fp, "fwmark 0x%x ", mark);
146
fprintf(fp, "iif %s ", (char*)RTA_DATA(tb[RTA_IIF]));
147
if (tb[FRA_IFNAME]) {
148
fprintf(fp, "iif %s ", (char*)RTA_DATA(tb[FRA_IFNAME]));
149
if (r->rtm_flags & FIB_RULE_DEV_DETACHED)
150
fprintf(fp, "[detached] ");
149
153
table = rtm_get_table(r, tb);
151
155
fprintf(fp, "lookup %s ", rtnl_rttable_n2a(table, b1, sizeof(b1)));
154
__u32 to = *(__u32*)RTA_DATA(tb[RTA_FLOW]);
158
__u32 to = *(__u32*)RTA_DATA(tb[FRA_FLOW]);
155
159
__u32 from = to>>16;
171
175
abuf, sizeof(abuf)));
173
177
fprintf(fp, "masquerade");
174
} else if (r->rtm_type != RTN_UNICAST)
178
} else if (r->rtm_type == FR_ACT_GOTO) {
179
fprintf(fp, "goto ");
181
fprintf(fp, "%u", *(__u32 *) RTA_DATA(tb[FRA_GOTO]));
184
if (r->rtm_flags & FIB_RULE_UNRESOLVED)
185
fprintf(fp, " [unresolved]");
186
} else if (r->rtm_type == FR_ACT_NOP)
188
else if (r->rtm_type != RTN_UNICAST)
175
189
fprintf(fp, "%s", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1)));
177
191
fprintf(fp, "\n");
240
254
get_prefix(&dst, *argv, req.r.rtm_family);
241
255
req.r.rtm_src_len = dst.bitlen;
242
addattr_l(&req.n, sizeof(req), RTA_SRC, &dst.data, dst.bytelen);
256
addattr_l(&req.n, sizeof(req), FRA_SRC, &dst.data, dst.bytelen);
243
257
} else if (strcmp(*argv, "to") == 0) {
246
260
get_prefix(&dst, *argv, req.r.rtm_family);
247
261
req.r.rtm_dst_len = dst.bitlen;
248
addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen);
262
addattr_l(&req.n, sizeof(req), FRA_DST, &dst.data, dst.bytelen);
249
263
} else if (matches(*argv, "preference") == 0 ||
250
264
matches(*argv, "order") == 0 ||
251
265
matches(*argv, "priority") == 0) {
254
268
if (get_u32(&pref, *argv, 0))
255
269
invarg("preference value is invalid\n", *argv);
256
addattr32(&req.n, sizeof(req), RTA_PRIORITY, pref);
270
addattr32(&req.n, sizeof(req), FRA_PRIORITY, pref);
257
271
} else if (strcmp(*argv, "tos") == 0) {
269
283
if (get_u32(&fwmark, *argv, 0))
270
284
invarg("fwmark value is invalid\n", *argv);
271
addattr32(&req.n, sizeof(req), RTA_PROTOINFO, fwmark);
285
addattr32(&req.n, sizeof(req), FRA_FWMARK, fwmark);
273
287
if (get_u32(&fwmask, slash+1, 0))
274
288
invarg("fwmask value is invalid\n", slash+1);
275
addattr32(&req.n, sizeof(req), RTA_FWMASK, fwmask);
289
addattr32(&req.n, sizeof(req), FRA_FWMASK, fwmask);
277
291
} else if (matches(*argv, "realms") == 0) {
280
294
if (get_rt_realms(&realm, *argv))
281
295
invarg("invalid realms\n", *argv);
282
addattr32(&req.n, sizeof(req), RTA_FLOW, realm);
296
addattr32(&req.n, sizeof(req), FRA_FLOW, realm);
283
297
} else if (matches(*argv, "table") == 0 ||
284
298
strcmp(*argv, "lookup") == 0) {
290
304
req.r.rtm_table = tid;
292
306
req.r.rtm_table = RT_TABLE_UNSPEC;
293
addattr32(&req.n, sizeof(req), RTA_TABLE, tid);
307
addattr32(&req.n, sizeof(req), FRA_TABLE, tid);
296
310
} else if (strcmp(*argv, "dev") == 0 ||
297
311
strcmp(*argv, "iif") == 0) {
299
addattr_l(&req.n, sizeof(req), RTA_IIF, *argv, strlen(*argv)+1);
313
addattr_l(&req.n, sizeof(req), FRA_IFNAME, *argv, strlen(*argv)+1);
300
314
} else if (strcmp(*argv, "nat") == 0 ||
301
315
matches(*argv, "map-to") == 0) {
312
326
if (matches(*argv, "help") == 0)
314
if (rtnl_rtntype_a2n(&type, *argv))
328
else if (matches(*argv, "goto") == 0) {
332
if (get_u32(&target, *argv, 0))
333
invarg("invalid target\n", *argv);
334
addattr32(&req.n, sizeof(req), FRA_GOTO, target);
335
} else if (matches(*argv, "nop") == 0)
337
else if (rtnl_rtntype_a2n(&type, *argv))
315
338
invarg("Failed to parse rule type", *argv);
316
339
req.r.rtm_type = type;
337
361
struct rtnl_handle rth2;
338
362
struct rtmsg *r = NLMSG_DATA(n);
339
363
int len = n->nlmsg_len;
340
struct rtattr * tb[RTA_MAX+1];
364
struct rtattr * tb[FRA_MAX+1];
342
366
len -= NLMSG_LENGTH(sizeof(*r));
346
parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
370
parse_rtattr(tb, FRA_MAX, RTM_RTA(r), len);
348
if (tb[RTA_PRIORITY]) {
372
if (tb[FRA_PRIORITY]) {
349
373
n->nlmsg_type = RTM_DELRULE;
350
374
n->nlmsg_flags = NLM_F_REQUEST;