aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWojciech Drewek <wojciech.drewek@intel.com>2022-07-29 10:50:33 +0200
committerDavid Ahern <dsahern@kernel.org>2022-07-29 11:22:42 -0600
commit653c7517fd0853870eef78bec43f87b75771f4b7 (patch)
treea05dd69bff08c35b9af65809d2be5c9f722e5c5f
parent876e792412fd3e8e2d3338a5d36cbb1e4f2b5a4e (diff)
downloadiproute2-653c7517fd0853870eef78bec43f87b75771f4b7.tar.gz
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.h10
-rw-r--r--lib/ll_proto.c33
-rw-r--r--lib/utils.c34
3 files changed, 52 insertions, 25 deletions
diff --git a/include/utils.h b/include/utils.h
index 9765fdd23..eeb23a64f 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 342ea2eef..925e2caa0 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 53d310060..dd3cdb312 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;
+}