diff options
author | Wojciech Drewek <wojciech.drewek@intel.com> | 2022-07-29 10:50:33 +0200 |
---|---|---|
committer | David Ahern <dsahern@kernel.org> | 2022-07-29 11:22:42 -0600 |
commit | 653c7517fd0853870eef78bec43f87b75771f4b7 (patch) | |
tree | a05dd69bff08c35b9af65809d2be5c9f722e5c5f | |
parent | 876e792412fd3e8e2d3338a5d36cbb1e4f2b5a4e (diff) |
lib: refactor ll_proto functions
Move core logic of ll_proto_n2a and ll_proto_a2n
to utils.c and make it more generic by allowing to
pass table of protocols as argument (proto_tb).
Introduce struct proto with protocol ID and name to
allow this. This wil allow to use those functions by
other use cases.
Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com>
Acked-by: Guillaume Nault <gnault@redhat.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
-rw-r--r-- | include/utils.h | 10 | ||||
-rw-r--r-- | lib/ll_proto.c | 33 | ||||
-rw-r--r-- | lib/utils.c | 34 |
3 files changed, 52 insertions, 25 deletions
diff --git a/include/utils.h b/include/utils.h index 9765fdd2..eeb23a64 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/ll_proto.c b/lib/ll_proto.c index 342ea2ee..925e2caa 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/utils.c b/lib/utils.c index 53d31006..dd3cdb31 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; +} |