[MERGED] libosmocore[master]: Use value_string for ctrl_type

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Max gerrit-no-reply at lists.osmocom.org
Wed Mar 1 16:37:59 UTC 2017


Max has submitted this change and it was merged.

Change subject: Use value_string for ctrl_type
......................................................................


Use value_string for ctrl_type

Use value_string for enum ctrl_type instead of custom code. Add
corresponding unit tests.

Related: OS#1615
Change-Id: Icd4e96dd9f00876cb70b43cfcf42ab4f10311b28
---
M .gitignore
M include/osmocom/ctrl/control_cmd.h
M src/ctrl/control_cmd.c
M tests/Makefile.am
A tests/ctrl/ctrl_test.c
A tests/ctrl/ctrl_test.ok
M tests/testsuite.at
7 files changed, 74 insertions(+), 37 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/.gitignore b/.gitignore
index ad8354e..48642ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -59,7 +59,7 @@
 tests/testsuite
 tests/testsuite.dir/
 tests/testsuite.log
-
+tests/ctrl/ctrl_test
 tests/utils/utils_test
 tests/stats/stats_test
 tests/kasumi/kasumi_test
diff --git a/include/osmocom/ctrl/control_cmd.h b/include/osmocom/ctrl/control_cmd.h
index a63557d..d82c9af 100644
--- a/include/osmocom/ctrl/control_cmd.h
+++ b/include/osmocom/ctrl/control_cmd.h
@@ -4,7 +4,7 @@
 #include <osmocom/core/talloc.h>
 #include <osmocom/core/write_queue.h>
 #include <osmocom/core/logging.h>
-
+#include <osmocom/core/utils.h>
 #include <osmocom/vty/vector.h>
 
 #define CTRL_CMD_ERROR		-1
@@ -22,7 +22,7 @@
 };
 
 enum ctrl_type {
-	CTRL_TYPE_UNKNOWN,
+	CTRL_TYPE_UNKNOWN = 0,
 	CTRL_TYPE_GET,
 	CTRL_TYPE_SET,
 	CTRL_TYPE_GET_REPLY,
@@ -31,6 +31,8 @@
 	CTRL_TYPE_ERROR
 };
 
+extern const struct value_string ctrl_type_vals[];
+
 struct ctrl_connection {
 	struct llist_head list_entry;
 
diff --git a/src/ctrl/control_cmd.c b/src/ctrl/control_cmd.c
index 2cf66cf..1cc8247 100644
--- a/src/ctrl/control_cmd.c
+++ b/src/ctrl/control_cmd.c
@@ -33,41 +33,21 @@
 
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/talloc.h>
-
+#include <osmocom/core/utils.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/vector.h>
 
 extern vector ctrl_node_vec;
 
-static struct ctrl_cmd_map ccm[] = {
-	{"GET", CTRL_TYPE_GET},
-	{"SET", CTRL_TYPE_SET},
-	{"GET_REPLY", CTRL_TYPE_GET_REPLY},
-	{"SET_REPLY", CTRL_TYPE_SET_REPLY},
-	{"TRAP", CTRL_TYPE_TRAP},
-	{"ERROR", CTRL_TYPE_ERROR},
-	{NULL}
+const struct value_string ctrl_type_vals[] = {
+	{ CTRL_TYPE_GET,	"GET" },
+	{ CTRL_TYPE_SET,	"SET" },
+	{ CTRL_TYPE_GET_REPLY,	"GET_REPLY" },
+	{ CTRL_TYPE_SET_REPLY,	"SET_REPLY" },
+	{ CTRL_TYPE_TRAP,	"TRAP" },
+	{ CTRL_TYPE_ERROR,	"ERROR" },
+	{ CTRL_TYPE_UNKNOWN,	NULL }
 };
-
-static int ctrl_cmd_str2type(char *s)
-{
-	int i;
-	for (i=0; ccm[i].cmd != NULL; i++) {
-		if (strcasecmp(s, ccm[i].cmd) == 0)
-			return ccm[i].type;
-	}
-	return CTRL_TYPE_UNKNOWN;
-}
-
-static char *ctrl_cmd_type2str(int type)
-{
-	int i;
-	for (i=0; ccm[i].cmd != NULL; i++) {
-		if (ccm[i].type == type)
-			return ccm[i].cmd;
-	}
-	return NULL;
-}
 
 /* Functions from libosmocom */
 extern vector cmd_make_descvec(const char *string, const char *descstr);
@@ -308,7 +288,7 @@
 		goto err;
 	}
 
-	cmd->type = ctrl_cmd_str2type(tmp);
+	cmd->type = get_string_value(ctrl_type_vals, tmp);
 	if (cmd->type == CTRL_TYPE_UNKNOWN) {
 		cmd->type = CTRL_TYPE_ERROR;
 		cmd->id = "err";
@@ -403,7 +383,8 @@
 struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd)
 {
 	struct msgb *msg;
-	char *type, *tmp;
+	const char *type;
+	char *tmp;
 
 	if (!cmd->id)
 		return NULL;
@@ -412,7 +393,7 @@
 	if (!msg)
 		return NULL;
 
-	type = ctrl_cmd_type2str(cmd->type);
+	type = get_value_string(ctrl_type_vals, cmd->type);
 
 	switch (cmd->type) {
 	case CTRL_TYPE_GET:
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f6d4db3..35b9150 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -11,7 +11,7 @@
 		 logging/logging_test fr/fr_test codec/codec_test	\
 		 loggingrb/loggingrb_test strrb/strrb_test              \
 		 vty/vty_test comp128/comp128_test utils/utils_test	\
-		 smscb/gsm0341_test stats/stats_test			\
+		 smscb/gsm0341_test stats/stats_test ctrl/ctrl_test	\
 		 bitvec/bitvec_test msgb/msgb_test bits/bitcomp_test	\
 		 tlv/tlv_test gsup/gsup_test oap/oap_test fsm/fsm_test	\
 		 write_queue/wqueue_test socket/socket_test
@@ -41,6 +41,9 @@
 
 auth_milenage_test_SOURCES = auth/milenage_test.c
 auth_milenage_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la
+
+ctrl_ctrl_test_SOURCES = ctrl/ctrl_test.c
+ctrl_ctrl_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/ctrl/libosmoctrl.la
 
 gea_gea_test_SOURCES = gea/gea_test.c
 gea_gea_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la
@@ -164,7 +167,7 @@
 EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE)		\
              timer/timer_test.ok sms/sms_test.ok ussd/ussd_test.ok	\
              smscb/smscb_test.ok bits/bitrev_test.ok a5/a5_test.ok	\
-             conv/conv_test.ok auth/milenage_test.ok			\
+             conv/conv_test.ok auth/milenage_test.ok ctrl/ctrl_test.ok	\
              lapd/lapd_test.ok gsm0408/gsm0408_test.ok			\
              gsm0808/gsm0808_test.ok gb/bssgp_fc_tests.err		\
              gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh			\
diff --git a/tests/ctrl/ctrl_test.c b/tests/ctrl/ctrl_test.c
new file mode 100644
index 0000000..3bbab76
--- /dev/null
+++ b/tests/ctrl/ctrl_test.c
@@ -0,0 +1,36 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include <osmocom/core/utils.h>
+#include <osmocom/ctrl/control_cmd.h>
+
+inline void check_type(enum ctrl_type c)
+{
+	const char *t = get_value_string(ctrl_type_vals, c);
+	int v = get_string_value(ctrl_type_vals, t);
+
+	printf("ctrl type %d is %s ", c, t);
+	if (v < 0)
+		printf("[PARSE FAILED]\n");
+	else
+		printf("-> %d %s\n", v, c != v ? "FAIL" : "OK");
+}
+
+int main(int argc, char **argv)
+{
+	printf("Checking ctrl types...\n");
+
+	check_type(CTRL_TYPE_UNKNOWN);
+	check_type(CTRL_TYPE_GET);
+	check_type(CTRL_TYPE_SET);
+	check_type(CTRL_TYPE_GET_REPLY);
+	check_type(CTRL_TYPE_SET_REPLY);
+	check_type(CTRL_TYPE_TRAP);
+	check_type(CTRL_TYPE_ERROR);
+	check_type(64);
+
+	return 0;
+}
diff --git a/tests/ctrl/ctrl_test.ok b/tests/ctrl/ctrl_test.ok
new file mode 100644
index 0000000..c4b05e9
--- /dev/null
+++ b/tests/ctrl/ctrl_test.ok
@@ -0,0 +1,9 @@
+Checking ctrl types...
+ctrl type 0 is unknown 0x0 [PARSE FAILED]
+ctrl type 1 is GET -> 1 OK
+ctrl type 2 is SET -> 2 OK
+ctrl type 3 is GET_REPLY -> 3 OK
+ctrl type 4 is SET_REPLY -> 4 OK
+ctrl type 5 is TRAP -> 5 OK
+ctrl type 6 is ERROR -> 6 OK
+ctrl type 64 is unknown 0x40 [PARSE FAILED]
diff --git a/tests/testsuite.at b/tests/testsuite.at
index a3be0e7..6d8c5d3 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -9,6 +9,12 @@
 AT_CHECK([$abs_top_builddir/tests/a5/a5_test], [0], [expout])
 AT_CLEANUP
 
+AT_SETUP([ctrl])
+AT_KEYWORDS([ctrl])
+cat $abs_srcdir/ctrl/ctrl_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/ctrl/ctrl_test], [0], [expout])
+AT_CLEANUP
+
 AT_SETUP([kasumi])
 AT_KEYWORDS([kasumi])
 cat $abs_srcdir/kasumi/kasumi_test.ok > expout

-- 
To view, visit https://gerrit.osmocom.org/1895
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Icd4e96dd9f00876cb70b43cfcf42ab4f10311b28
Gerrit-PatchSet: 4
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list