register diag_msg via the diag_cmd dispatch table
diff --git a/src/diag_cmd.c b/src/diag_cmd.c
index b1f4dc4..e540670 100644
--- a/src/diag_cmd.c
+++ b/src/diag_cmd.c
@@ -52,10 +52,6 @@
 		diag_log_handle(di, msg);
 		msgb_free(msg);
 		return 1;
-	case DIAG_EXT_MSG_F:
-		diag_rx_ext_msg_f(di, msg);
-		msgb_free(msg);
-		return 1;
 	default:
 		if (cmd_handlers[cmd]) {
 			(cmd_handlers[cmd])(di, msg);
diff --git a/src/diag_msg.c b/src/diag_msg.c
index f3b9c5d..661d1d1 100644
--- a/src/diag_msg.c
+++ b/src/diag_msg.c
@@ -26,6 +26,7 @@
 
 #include "protocol/protocol.h"
 #include "diag_msg.h"
+#include "diag_cmd.h"
 #include "protocol/diagcmd.h"
 
 struct diag_set_rt_mask_req {
@@ -78,7 +79,7 @@
 }
 
 /* handler for EXT MSG */
-int diag_rx_ext_msg_f(struct diag_instance *di, struct msgb *msgb)
+static void diag_rx_ext_msg_f(struct diag_instance *di, struct msgb *msgb)
 {
 	const uint8_t *data = msgb_data(msgb);
 	const size_t len = msgb_length(msgb);
@@ -88,7 +89,7 @@
 
 	if (len < sizeof(struct ext_log_msg)) {
 		printf("too short ext_log_msg.\n");
-		return -1;
+		return;
 	}
 
 	msg = (struct ext_log_msg *) data;
@@ -123,7 +124,13 @@
 		break;
 	}
 	fputc('\n', stdout);
-	return 0;
 }
 
+struct diag_cmd_dispatch_tbl cmd_tbl[] = {
+	{ DIAG_EXT_MSG_F, diag_rx_ext_msg_f },
+};
 
+static __attribute__((constructor)) void on_dso_load_msg(void)
+{
+	diag_cmd_reg_dispatch(cmd_tbl, ARRAY_SIZE(cmd_tbl));
+}
diff --git a/src/diag_msg.h b/src/diag_msg.h
index f3240ce..88a505d 100644
--- a/src/diag_msg.h
+++ b/src/diag_msg.h
@@ -6,5 +6,3 @@
 
 struct msgb *gen_msg_config_set_rt_mask(uint16_t ssid, uint32_t runtime_mask);
 int diag_msg_config_set_rt_mask(struct diag_instance *di, uint16_t ssid, uint32_t runtime_mask);
-
-int diag_rx_ext_msg_f(struct diag_instance *di, struct msgb *msg);