diff smsc-daemon/record_mo.c @ 3:8680979baeb1

smsc-daemon: first version put together
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 17 Aug 2023 22:56:49 -0800
parents
children cef4677a4cf8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smsc-daemon/record_mo.c	Thu Aug 17 22:56:49 2023 -0800
@@ -0,0 +1,96 @@
+/*
+ * This C module is part of proto-smsc-daemon concoction, a prototype/test
+ * implementation of a GSUP-based GSM SMSC.  It is based on the osmo-demo-euse
+ * program from OsmoHLR package.
+ *
+ * proto-smsc-daemon author: Mychaela N. Falconia <falcon@freecalypso.org>,
+ * no copyright.
+ *
+ * osmo-demo-euse author: Harald Welte <laforge@gnumonks.org>, (C) 2018, AGPL3+
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <signal.h>
+#include <time.h>
+
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/application.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/logging.h>
+
+#include <osmocom/gsm/gsup.h>
+#include <osmocom/gsm/gsm48_ie.h>
+
+#include <osmocom/gsupclient/gsup_client.h>
+
+#include "logging.h"
+
+extern FILE *smsc_log_file;
+
+static void format_addr(char *ie_name, enum osmo_gsup_sms_sm_rp_oda_t type,
+			size_t len, const uint8_t *data)
+{
+	int skip_byte;
+	uint8_t lv_buf[255];
+	char decode_buf[520];
+
+	fprintf(smsc_log_file, "%s: ", ie_name);
+	switch (type) {
+	case OSMO_GSUP_SMS_SM_RP_ODA_IMSI:
+		fputs("IMSI ", smsc_log_file);
+		skip_byte = 0;
+		break;
+	case OSMO_GSUP_SMS_SM_RP_ODA_MSISDN:
+		fprintf(smsc_log_file, "MSISDN TON=%u NPI=%u ",
+			(data[0] & 0x70) >> 4, data[0] & 0x0F);
+		skip_byte = 1;
+		break;
+	case OSMO_GSUP_SMS_SM_RP_ODA_SMSC_ADDR:
+		fprintf(smsc_log_file, "SMSC TON=%u NPI=%u ",
+			(data[0] & 0x70) >> 4, data[0] & 0x0F);
+		skip_byte = 1;
+		break;
+	case OSMO_GSUP_SMS_SM_RP_ODA_NULL:
+		fputs("NULL\n", smsc_log_file);
+		return;
+	default:
+		fputs("Invalid!\n", smsc_log_file);
+		return;
+	}
+	OSMO_ASSERT(len >= 1 && len <= 254);
+	lv_buf[0] = len - skip_byte;
+	memcpy(lv_buf + 1, data + skip_byte, len - skip_byte);
+	gsm48_decode_bcd_number2(decode_buf, sizeof decode_buf,
+				 lv_buf, sizeof lv_buf, 0);
+	fprintf(smsc_log_file, "%s\n", decode_buf[0] ? decode_buf : "<empty>");
+}
+
+void record_mo_sm(struct osmo_gsup_message *gmsg)
+{
+	time_t curtime;
+	struct tm *tm;
+	const uint8_t *dp, *endp;
+
+	time(&curtime);
+	tm = gmtime(&curtime);
+	fprintf(smsc_log_file, "\n%d-%02d-%02dT%02d:%02d:%02dZ Rx MO SM\n",
+		tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+		tm->tm_hour, tm->tm_min, tm->tm_sec);
+	fprintf(smsc_log_file, "IMSI: %s\n", gmsg->imsi);
+	fprintf(smsc_log_file, "SM-RP-MR: 0x%02X\n", gmsg->sm_rp_mr);
+	format_addr("SM-RP-DA", gmsg->sm_rp_da_type, gmsg->sm_rp_da_len,
+			gmsg->sm_rp_da);
+	format_addr("SM-RP-OA", gmsg->sm_rp_oa_type, gmsg->sm_rp_oa_len,
+			gmsg->sm_rp_oa);
+	fprintf(smsc_log_file, "SM-RP-UI: %u bytes\n", gmsg->sm_rp_ui_len);
+	dp = gmsg->sm_rp_ui;
+	endp = dp + gmsg->sm_rp_ui_len;
+	while (dp < endp)
+		fprintf(smsc_log_file, "%02X", *dp++);
+	putc('\n', smsc_log_file);
+}