[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <3e9b7274-7741-1b12-bfb1-db1bb8ae2c4e@gmail.com>
Date: Mon, 18 Jul 2022 08:49:39 -0600
From: David Ahern <dsahern@...il.com>
To: Wojciech Drewek <wojciech.drewek@...el.com>, netdev@...r.kernel.org
Cc: stephen@...workplumber.org
Subject: Re: [PATCH iproute2-next 1/2] lib: Introduce ppp protocols
On 7/14/22 2:25 AM, Wojciech Drewek wrote:
> diff --git a/include/rt_names.h b/include/rt_names.h
> index 1835f3be2bed..6358650db404 100644
> --- a/include/rt_names.h
> +++ b/include/rt_names.h
> @@ -31,6 +31,9 @@ int ll_addr_a2n(char *lladdr, int len, const char *arg);
> const char * ll_proto_n2a(unsigned short id, char *buf, int len);
> int ll_proto_a2n(unsigned short *id, const char *buf);
>
> +const char *ppp_proto_n2a(unsigned short id, char *buf, int len);
> +int ppp_proto_a2n(unsigned short *id, const char *buf);
> +
> const char *nl_proto_n2a(int id, char *buf, int len);
> int nl_proto_a2n(__u32 *id, const char *arg);
>
> diff --git a/include/uapi/linux/ppp_defs.h b/include/uapi/linux/ppp_defs.h
> new file mode 100644
> index 000000000000..0013dc77e3b9
> --- /dev/null
> +++ b/include/uapi/linux/ppp_defs.h
> @@ -0,0 +1,37 @@
> +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
> +/*
> + * ppp_defs.h - PPP definitions.
> + *
> + * Copyright 1994-2000 Paul Mackerras.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * version 2 as published by the Free Software Foundation.
> + */
> +
> +/*
> + * Protocol field values.
> + */
> +#define PPP_IP 0x21 /* Internet Protocol */
> +#define PPP_AT 0x29 /* AppleTalk Protocol */
> +#define PPP_IPX 0x2b /* IPX protocol */
> +#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */
> +#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */
> +#define PPP_MP 0x3d /* Multilink protocol */
> +#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */
> +#define PPP_COMPFRAG 0xfb /* fragment compressed below bundle */
> +#define PPP_COMP 0xfd /* compressed packet */
> +#define PPP_MPLS_UC 0x0281 /* Multi Protocol Label Switching - Unicast */
> +#define PPP_MPLS_MC 0x0283 /* Multi Protocol Label Switching - Multicast */
> +#define PPP_IPCP 0x8021 /* IP Control Protocol */
> +#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
> +#define PPP_IPXCP 0x802b /* IPX Control Protocol */
> +#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
> +#define PPP_CCPFRAG 0x80fb /* CCP at link level (below MP bundle) */
> +#define PPP_CCP 0x80fd /* Compression Control Protocol */
> +#define PPP_MPLSCP 0x80fd /* MPLS Control Protocol */
> +#define PPP_LCP 0xc021 /* Link Control Protocol */
> +#define PPP_PAP 0xc023 /* Password Authentication Protocol */
> +#define PPP_LQR 0xc025 /* Link Quality Report protocol */
> +#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
> +#define PPP_CBCP 0xc029 /* Callback Control Protocol */
> diff --git a/include/utils.h b/include/utils.h
> index 9765fdd231df..0c9022760916 100644
> --- a/include/utils.h
> +++ b/include/utils.h
> @@ -369,4 +369,14 @@ void inc_indent(struct indent_mem *mem);
> void dec_indent(struct indent_mem *mem);
> void print_indent(struct indent_mem *mem);
>
> +struct proto {
> + int id;
> + const char *name;
> +};
> +
> +int __proto_a2n(unsigned short *id, const char *buf,
> + const struct proto *proto_tb, size_t tb_len);
> +const char *__proto_n2a(unsigned short id, char *buf, int len,
> + const struct proto *proto_tb, size_t tb_len);
> +
> #endif /* __UTILS_H__ */
> diff --git a/lib/Makefile b/lib/Makefile
> index 6c98f9a61fdb..ddedd37feb32 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -5,7 +5,7 @@ CFLAGS += -fPIC
>
> UTILOBJ = utils.o utils_math.o rt_names.o ll_map.o ll_types.o ll_proto.o ll_addr.o \
> inet_proto.o namespace.o json_writer.o json_print.o json_print_math.o \
> - names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o
> + names.o color.o bpf_legacy.o bpf_glue.o exec.o fs.o cg_map.o ppp_proto.o
>
> ifeq ($(HAVE_ELF),y)
> ifeq ($(HAVE_LIBBPF),y)
> diff --git a/lib/ll_proto.c b/lib/ll_proto.c
> index 342ea2eefa4c..f067516cde9e 100644
> --- a/lib/ll_proto.c
> +++ b/lib/ll_proto.c
> @@ -28,10 +28,8 @@
>
>
> #define __PF(f,n) { ETH_P_##f, #n },
> -static const struct {
> - int id;
> - const char *name;
> -} llproto_names[] = {
> +
> +static const struct proto llproto_names[] = {
> __PF(LOOP,loop)
> __PF(PUP,pup)
> __PF(PUPAT,pupat)
> @@ -90,31 +88,16 @@ __PF(TEB,teb)
> };
> #undef __PF
>
> -
> -const char * ll_proto_n2a(unsigned short id, char *buf, int len)
> +const char *ll_proto_n2a(unsigned short id, char *buf, int len)
> {
> - int i;
> + size_t len_tb = ARRAY_SIZE(llproto_names);
>
> - id = ntohs(id);
> -
> - for (i=0; !numeric && i<sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
> - if (llproto_names[i].id == id)
> - return llproto_names[i].name;
> - }
> - snprintf(buf, len, "[%d]", id);
> - return buf;
> + return __proto_n2a(id, buf, len, llproto_names, len_tb);
> }
>
> int ll_proto_a2n(unsigned short *id, const char *buf)
> {
> - int i;
> - for (i=0; i < sizeof(llproto_names)/sizeof(llproto_names[0]); i++) {
> - if (strcasecmp(llproto_names[i].name, buf) == 0) {
> - *id = htons(llproto_names[i].id);
> - return 0;
> - }
> - }
> - if (get_be16(id, buf, 0))
> - return -1;
> - return 0;
> + size_t len_tb = ARRAY_SIZE(llproto_names);
> +
> + return __proto_a2n(id, buf, llproto_names, len_tb);
> }
> diff --git a/lib/ppp_proto.c b/lib/ppp_proto.c
> new file mode 100644
> index 000000000000..1c035095f375
> --- /dev/null
> +++ b/lib/ppp_proto.c
> @@ -0,0 +1,52 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Utilities for translating PPP protocols from strings
> + * and vice versa.
> + *
> + * Authors: Wojciech Drewek <wojciech.drewek@...el.com>
> + */
> +
> +#include <linux/ppp_defs.h>
> +#include <linux/if_ether.h>
> +#include "utils.h"
> +#include "rt_names.h"
> +
> +static const struct proto ppp_proto_names[] = {
> + {PPP_IP, "ip"},
> + {PPP_AT, "at"},
> + {PPP_IPX, "ipx"},
> + {PPP_VJC_COMP, "vjc_comp"},
> + {PPP_VJC_UNCOMP, "vjc_uncomp"},
> + {PPP_MP, "mp"},
> + {PPP_IPV6, "ipv6"},
> + {PPP_COMPFRAG, "compfrag"},
> + {PPP_COMP, "comp"},
> + {PPP_MPLS_UC, "mpls_uc"},
> + {PPP_MPLS_MC, "mpls_mc"},
> + {PPP_IPCP, "ipcp"},
> + {PPP_ATCP, "atcp"},
> + {PPP_IPXCP, "ipxcp"},
> + {PPP_IPV6CP, "ipv6cp"},
> + {PPP_CCPFRAG, "ccpfrag"},
> + {PPP_CCP, "ccp"},
> + {PPP_MPLSCP, "mplscp"},
> + {PPP_LCP, "lcp"},
> + {PPP_PAP, "pap"},
> + {PPP_LQR, "lqr"},
> + {PPP_CHAP, "chap"},
> + {PPP_CBCP, "cbcp"},
> +};
> +
> +const char *ppp_proto_n2a(unsigned short id, char *buf, int len)
> +{
> + size_t len_tb = ARRAY_SIZE(ppp_proto_names);
> +
> + return __proto_n2a(id, buf, len, ppp_proto_names, len_tb);
> +}
> +
> +int ppp_proto_a2n(unsigned short *id, const char *buf)
> +{
> + size_t len_tb = ARRAY_SIZE(ppp_proto_names);
> +
> + return __proto_a2n(id, buf, ppp_proto_names, len_tb);
> +}
> diff --git a/lib/utils.c b/lib/utils.c
> index 53d310060284..6b88ba31b335 100644
> --- a/lib/utils.c
> +++ b/lib/utils.c
> @@ -1925,3 +1925,37 @@ void print_indent(struct indent_mem *mem)
> if (mem->indent_level)
> printf("%s", mem->indent_str);
> }
> +
> +const char *__proto_n2a(unsigned short id, char *buf, int len,
> + const struct proto *proto_tb, size_t tb_len)
> +{
> + int i;
> +
> + id = ntohs(id);
> +
> + for (i = 0; !numeric && i < tb_len; i++) {
> + if (proto_tb[i].id == id)
> + return proto_tb[i].name;
> + }
> +
> + snprintf(buf, len, "[%d]", id);
> +
> + return buf;
> +}
> +
> +int __proto_a2n(unsigned short *id, const char *buf,
> + const struct proto *proto_tb, size_t tb_len)
> +{
> + int i;
> +
> + for (i = 0; i < tb_len; i++) {
> + if (strcasecmp(proto_tb[i].name, buf) == 0) {
> + *id = htons(proto_tb[i].id);
> + return 0;
> + }
> + }
> + if (get_be16(id, buf, 0))
> + return -1;
> +
> + return 0;
> +}
Remove the __ from these new functions and add this in a refactoring
patch. Move the PPP additions into a new, standalone patch
Powered by blists - more mailing lists