diff options
Diffstat (limited to 'networking/libiproute/iprule.c')
-rw-r--r-- | networking/libiproute/iprule.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c index 9938b4793..53b11e16c 100644 --- a/networking/libiproute/iprule.c +++ b/networking/libiproute/iprule.c | |||
@@ -24,6 +24,11 @@ | |||
24 | #include "rt_names.h" | 24 | #include "rt_names.h" |
25 | #include "utils.h" | 25 | #include "utils.h" |
26 | 26 | ||
27 | #include <linux/version.h> | ||
28 | /* RTA_TABLE is not a define, can't test with ifdef. */ | ||
29 | /* As a proxy, test which kernels toolchain expects: */ | ||
30 | #define HAVE_RTA_TABLE (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) | ||
31 | |||
27 | /* If you add stuff here, update iprule_full_usage */ | 32 | /* If you add stuff here, update iprule_full_usage */ |
28 | static const char keywords[] ALIGN1 = | 33 | static const char keywords[] ALIGN1 = |
29 | "from\0""to\0""preference\0""order\0""priority\0" | 34 | "from\0""to\0""preference\0""order\0""priority\0" |
@@ -120,9 +125,12 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM, | |||
120 | printf("iif %s ", (char*)RTA_DATA(tb[RTA_IIF])); | 125 | printf("iif %s ", (char*)RTA_DATA(tb[RTA_IIF])); |
121 | } | 126 | } |
122 | 127 | ||
128 | #if HAVE_RTA_TABLE | ||
123 | if (tb[RTA_TABLE]) | 129 | if (tb[RTA_TABLE]) |
124 | printf("lookup %s ", rtnl_rttable_n2a(*(uint32_t*)RTA_DATA(tb[RTA_TABLE]))); | 130 | printf("lookup %s ", rtnl_rttable_n2a(*(uint32_t*)RTA_DATA(tb[RTA_TABLE]))); |
125 | else if (r->rtm_table) | 131 | else |
132 | #endif | ||
133 | if (r->rtm_table) | ||
126 | printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table)); | 134 | printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table)); |
127 | 135 | ||
128 | if (tb[FRA_SUPPRESS_PREFIXLEN]) { | 136 | if (tb[FRA_SUPPRESS_PREFIXLEN]) { |
@@ -266,12 +274,15 @@ static int iprule_modify(int cmd, char **argv) | |||
266 | NEXT_ARG(); | 274 | NEXT_ARG(); |
267 | if (rtnl_rttable_a2n(&tid, *argv)) | 275 | if (rtnl_rttable_a2n(&tid, *argv)) |
268 | invarg_1_to_2(*argv, "table ID"); | 276 | invarg_1_to_2(*argv, "table ID"); |
269 | if (tid < 256) | 277 | |
270 | req.r.rtm_table = tid; | 278 | #if HAVE_RTA_TABLE |
271 | else { | 279 | if (tid > 255) { |
272 | req.r.rtm_table = RT_TABLE_UNSPEC; | 280 | req.r.rtm_table = RT_TABLE_UNSPEC; |
273 | addattr32(&req.n, sizeof(req), RTA_TABLE, tid); | 281 | addattr32(&req.n, sizeof(req), RTA_TABLE, tid); |
274 | } | 282 | } else |
283 | #endif | ||
284 | req.r.rtm_table = tid; | ||
285 | |||
275 | table_ok = 1; | 286 | table_ok = 1; |
276 | } else if (key == ARG_suppress_prefixlength) { | 287 | } else if (key == ARG_suppress_prefixlength) { |
277 | int prefix_length; | 288 | int prefix_length; |