[PATCH v2 2/2] iproute/iprule: restore support for kernel versions missing RTA_TABLE routing attribute

Denys Vlasenko vda.linux at googlemail.com
Fri Oct 27 17:26:07 UTC 2017


Applied, thanks!

On Thu, Oct 19, 2017 at 12:05 AM, Eugene Rudoy <gene.devel at gmail.com> wrote:
> iproute/iprule applets fail to compile when compiled using kernel versions < 2.6.19
>
>  iproute.c: In function 'print_route':
>  iproute.c:85:9: error: 'RTA_TABLE' undeclared (first use in this function)
>  iproute.c:85:9: note: each undeclared identifier is reported only once for each function it appears in
>  iproute.c: In function 'iproute_modify':
>  iproute.c:467:36: error: 'RTA_TABLE' undeclared (first use in this function)
>
> Fix it by partially #ifdef'ing the code added in b42107f21538e39d9a344376372f8261aed589b2
>
> Signed-off-by: Eugene Rudoy <gene.devel at gmail.com>
> ---
>
>  v2: change the order of if/else-branches to reduce the number of #ifdef's
>      as suggested by Walter Harms
> ---
>  networking/libiproute/iproute.c | 14 ++++++++++----
>  networking/libiproute/iprule.c  | 19 ++++++++++++++-----
>  2 files changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
> index e8b26cb2f..9b3d9c3b8 100644
> --- a/networking/libiproute/iproute.c
> +++ b/networking/libiproute/iproute.c
> @@ -14,6 +14,9 @@
>  #include "rt_names.h"
>  #include "utils.h"
>
> +#include <linux/version.h>
> +#define HAVE_RTA_TABLE (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
> +
>  #ifndef RTAX_RTTVAR
>  #define RTAX_RTTVAR RTAX_HOPS
>  #endif
> @@ -81,9 +84,11 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM,
>         memset(tb, 0, sizeof(tb));
>         parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
>
> +#if HAVE_RTA_TABLE
>         if (tb[RTA_TABLE])
>                 tid = *(uint32_t *)RTA_DATA(tb[RTA_TABLE]);
>         else
> +#endif
>                 tid = r->rtm_table;
>
>         if (r->rtm_family == AF_INET6)
> @@ -459,12 +464,13 @@ IF_FEATURE_IP_RULE(ARG_table,)
>                         NEXT_ARG();
>                         if (rtnl_rttable_a2n(&tid, *argv))
>                                 invarg_1_to_2(*argv, keyword_table);
> -                       if (tid < 256)
> -                               req.r.rtm_table = tid;
> -                       else {
> +#if HAVE_RTA_TABLE
> +                       if (tid > 255) {
>                                 req.r.rtm_table = RT_TABLE_UNSPEC;
>                                 addattr32(&req.n, sizeof(req), RTA_TABLE, tid);
> -                       }
> +                       } else
> +#endif
> +                               req.r.rtm_table = tid;
>  #endif
>                 } else if (arg == ARG_dev || arg == ARG_oif) {
>                         NEXT_ARG();
> diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c
> index 9938b4793..772890982 100644
> --- a/networking/libiproute/iprule.c
> +++ b/networking/libiproute/iprule.c
> @@ -24,6 +24,9 @@
>  #include "rt_names.h"
>  #include "utils.h"
>
> +#include <linux/version.h>
> +#define HAVE_RTA_TABLE (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19))
> +
>  /* If you add stuff here, update iprule_full_usage */
>  static const char keywords[] ALIGN1 =
>         "from\0""to\0""preference\0""order\0""priority\0"
> @@ -120,9 +123,12 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl *who UNUSED_PARAM,
>                 printf("iif %s ", (char*)RTA_DATA(tb[RTA_IIF]));
>         }
>
> +#if HAVE_RTA_TABLE
>         if (tb[RTA_TABLE])
>                 printf("lookup %s ", rtnl_rttable_n2a(*(uint32_t*)RTA_DATA(tb[RTA_TABLE])));
> -       else if (r->rtm_table)
> +       else
> +#endif
> +       if (r->rtm_table)
>                 printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table));
>
>         if (tb[FRA_SUPPRESS_PREFIXLEN]) {
> @@ -266,12 +272,15 @@ static int iprule_modify(int cmd, char **argv)
>                         NEXT_ARG();
>                         if (rtnl_rttable_a2n(&tid, *argv))
>                                 invarg_1_to_2(*argv, "table ID");
> -                       if (tid < 256)
> -                               req.r.rtm_table = tid;
> -                       else {
> +
> +#if HAVE_RTA_TABLE
> +                       if (tid > 255) {
>                                 req.r.rtm_table = RT_TABLE_UNSPEC;
>                                 addattr32(&req.n, sizeof(req), RTA_TABLE, tid);
> -                       }
> +                       } else
> +#endif
> +                               req.r.rtm_table = tid;
> +
>                         table_ok = 1;
>                 } else if (key == ARG_suppress_prefixlength) {
>                         int prefix_length;
> --
> 2.14.2
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list