Rebased to current git and applied. Thanks!

On Tue, Dec 13, 2016 at 1:58 PM,  <[email protected]> wrote:
> From: Lukasz Nowak <[email protected]>
>
> Linux kernel, starting from 2.6.19 allows ip table ids to have 32-bit values.
> In order to preserve compatibility, the old 8-bit field: rtm_table is still
> in use when table id is lower than 256.
>
> Add support for the 32-bit table id (RTA_TABLE attribute) in:
> - ip route print
> - ip route modify
> - ip rule print
> - ip rule modify
>
> Add printing of table ids to ip route.
>
> Changes are compatible with the mainline iproute2 utilities.
>
> These changes are required for compatibility with ConnMan, which by default
> uses table ids greater than 255.
>
> Signed-off-by: Lukasz Nowak <[email protected]>
> ---
>  networking/libiproute/iproute.c | 24 ++++++++++++++++++++----
>  networking/libiproute/iprule.c  | 11 +++++++++--
>  2 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
> index 6ecd5f7..d5af498 100644
> --- a/networking/libiproute/iproute.c
> +++ b/networking/libiproute/iproute.c
> @@ -87,6 +87,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl 
> *who UNUSED_PARAM,
>         inet_prefix dst;
>         inet_prefix src;
>         int host_len = -1;
> +       uint32_t tid;
>
>         if (n->nlmsg_type != RTM_NEWROUTE && n->nlmsg_type != RTM_DELROUTE) {
>                 fprintf(stderr, "Not a route: %08x %08x %08x\n",
> @@ -99,6 +100,14 @@ static int FAST_FUNC print_route(const struct sockaddr_nl 
> *who UNUSED_PARAM,
>         if (len < 0)
>                 bb_error_msg_and_die("wrong nlmsg len %d", len);
>
> +       memset(tb, 0, sizeof(tb));
> +       parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
> +
> +       if (tb[RTA_TABLE])
> +               tid = *(uint32_t *)RTA_DATA(tb[RTA_TABLE]);
> +       else
> +               tid = r->rtm_table;
> +
>         if (r->rtm_family == AF_INET6)
>                 host_len = 128;
>         else if (r->rtm_family == AF_INET)
> @@ -128,7 +137,7 @@ static int FAST_FUNC print_route(const struct sockaddr_nl 
> *who UNUSED_PARAM,
>                         }
>                 }
>         } else {
> -               if (G_filter.tb > 0 && G_filter.tb != r->rtm_table) {
> +               if (G_filter.tb > 0 && G_filter.tb != tid) {
>                         return 0;
>                 }
>         }
> @@ -157,10 +166,8 @@ static int FAST_FUNC print_route(const struct 
> sockaddr_nl *who UNUSED_PARAM,
>                 return 0;
>         }
>
> -       memset(tb, 0, sizeof(tb));
>         memset(&src, 0, sizeof(src));
>         memset(&dst, 0, sizeof(dst));
> -       parse_rtattr(tb, RTA_MAX, RTM_RTA(r), len);
>
>         if (tb[RTA_SRC]) {
>                 src.bitlen = r->rtm_src_len;
> @@ -283,6 +290,10 @@ static int FAST_FUNC print_route(const struct 
> sockaddr_nl *who UNUSED_PARAM,
>         if (tb[RTA_OIF]) {
>                 printf("dev %s ", 
> ll_index_to_name(*(int*)RTA_DATA(tb[RTA_OIF])));
>         }
> +#if ENABLE_FEATURE_IP_RULE
> +       if (tid && tid != RT_TABLE_MAIN && !G_filter.tb)
> +               printf("table %s ", rtnl_rttable_n2a(tid));
> +#endif
>
>         /* Todo: parse & show "proto kernel", "scope link" here */
>
> @@ -434,7 +445,12 @@ IF_FEATURE_IP_RULE(ARG_table,)
>                         NEXT_ARG();
>                         if (rtnl_rttable_a2n(&tid, *argv))
>                                 invarg(*argv, "table");
> -                       req.r.rtm_table = tid;
> +                       if (tid < 256)
> +                               req.r.rtm_table = tid;
> +                       else {
> +                               req.r.rtm_table = RT_TABLE_UNSPEC;
> +                               addattr32(&req.n, sizeof(req), RTA_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 774a3e2..3fac7c5 100644
> --- a/networking/libiproute/iprule.c
> +++ b/networking/libiproute/iprule.c
> @@ -119,7 +119,9 @@ static int FAST_FUNC print_rule(const struct sockaddr_nl 
> *who UNUSED_PARAM,
>                 printf("iif %s ", (char*)RTA_DATA(tb[RTA_IIF]));
>         }
>
> -       if (r->rtm_table)
> +       if (tb[RTA_TABLE])
> +               printf("lookup %s ", 
> rtnl_rttable_n2a(*(uint32_t*)RTA_DATA(tb[RTA_TABLE])));
> +       else if (r->rtm_table)
>                 printf("lookup %s ", rtnl_rttable_n2a(r->rtm_table));
>
>         if (tb[RTA_FLOW]) {
> @@ -259,7 +261,12 @@ static int iprule_modify(int cmd, char **argv)
>                         NEXT_ARG();
>                         if (rtnl_rttable_a2n(&tid, *argv))
>                                 invarg(*argv, "table ID");
> -                       req.r.rtm_table = tid;
> +                       if (tid < 256)
> +                               req.r.rtm_table = tid;
> +                       else {
> +                               req.r.rtm_table = RT_TABLE_UNSPEC;
> +                               addattr32(&req.n, sizeof(req), RTA_TABLE, 
> tid);
> +                       }
>                         table_ok = 1;
>                 } else if (key == ARG_dev ||
>                            key == ARG_iif
> --
> 2.7.4
>
> _______________________________________________
> busybox mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to