view 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 source

/*
 * 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);
}