comparison smsc-daemon/gsup_rx.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
comparison
equal deleted inserted replaced
2:2067c55e2c79 3:8680979baeb1
1 /*
2 * This C module is part of proto-smsc-daemon concoction, a prototype/test
3 * implementation of a GSUP-based GSM SMSC. It is based on the osmo-demo-euse
4 * program from OsmoHLR package.
5 *
6 * proto-smsc-daemon author: Mychaela N. Falconia <falcon@freecalypso.org>,
7 * no copyright.
8 *
9 * osmo-demo-euse author: Harald Welte <laforge@gnumonks.org>, (C) 2018, AGPL3+
10 */
11
12 #include <ctype.h>
13 #include <string.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <errno.h>
17 #include <signal.h>
18
19 #include <osmocom/core/msgb.h>
20 #include <osmocom/core/select.h>
21 #include <osmocom/core/application.h>
22 #include <osmocom/core/utils.h>
23 #include <osmocom/core/logging.h>
24
25 #include <osmocom/gsm/gsup.h>
26
27 #include <osmocom/gsupclient/gsup_client.h>
28
29 #include "logging.h"
30
31 extern void record_mo_sm(struct osmo_gsup_message *gmsg);
32
33 static void send_gsup_response(struct osmo_gsup_client *gsupc,
34 struct osmo_gsup_message *orig_msg)
35 {
36 struct osmo_gsup_message resp = {0};
37 struct msgb *resp_msg;
38
39 resp.message_type = OSMO_GSUP_TO_MSGT_RESULT(orig_msg->message_type);
40 OSMO_STRLCPY_ARRAY(resp.imsi, orig_msg->imsi);
41 resp.message_class = OSMO_GSUP_MESSAGE_CLASS_SMS;
42 resp.sm_rp_mr = orig_msg->sm_rp_mr;
43 resp.destination_name = orig_msg->source_name;
44 resp.destination_name_len = orig_msg->source_name_len;
45
46 resp_msg = osmo_gsup_client_msgb_alloc();
47 OSMO_ASSERT(resp_msg);
48 osmo_gsup_encode(resp_msg, &resp);
49 osmo_gsup_client_send(gsupc, resp_msg);
50 }
51
52 static void handle_mo_forward_sm(struct osmo_gsup_client *gsupc,
53 struct osmo_gsup_message *gmsg)
54 {
55 if (!gmsg->sm_rp_mr) {
56 LOGP(DMAIN, LOGL_ERROR,
57 "error in MO-FORWARD-SM: missing SM-RP-MR\n");
58 return;
59 }
60 if (!gmsg->sm_rp_da_type) {
61 LOGP(DMAIN, LOGL_ERROR,
62 "error in MO-FORWARD-SM: missing SM-RP-DA\n");
63 return;
64 }
65 if (!gmsg->sm_rp_oa_type) {
66 LOGP(DMAIN, LOGL_ERROR,
67 "error in MO-FORWARD-SM: missing SM-RP-OA\n");
68 return;
69 }
70 if (!gmsg->sm_rp_ui) {
71 LOGP(DMAIN, LOGL_ERROR,
72 "error in MO-FORWARD-SM: missing SM-RP-UI\n");
73 return;
74 }
75 record_mo_sm(gmsg);
76 send_gsup_response(gsupc, gmsg);
77 }
78
79 static void handle_ready_for_sm(struct osmo_gsup_client *gsupc,
80 struct osmo_gsup_message *gmsg)
81 {
82 if (!gmsg->sm_rp_mr) {
83 LOGP(DMAIN, LOGL_ERROR,
84 "error in READY-FOR-SM: missing SM-RP-MR\n");
85 return;
86 }
87 send_gsup_response(gsupc, gmsg);
88 }
89
90 int gsupc_read_cb(struct osmo_gsup_client *gsupc, struct msgb *msg)
91 {
92 struct osmo_gsup_message gsup_msg = {0};
93 int rc;
94
95 rc = osmo_gsup_decode(msgb_l2(msg), msgb_l2len(msg), &gsup_msg);
96 if (rc < 0) {
97 LOGP(DMAIN, LOGL_ERROR, "Error decoding GSUP: %s\n", msgb_hexdump(msg));
98 return rc;
99 }
100 DEBUGP(DMAIN, "Rx GSUP %s: %s\n", osmo_gsup_message_type_name(gsup_msg.message_type),
101 msgb_hexdump(msg));
102
103 switch (gsup_msg.message_type) {
104 case OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST:
105 handle_mo_forward_sm(gsupc, &gsup_msg);
106 break;
107 case OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST:
108 handle_ready_for_sm(gsupc, &gsup_msg);
109 break;
110 default:
111 LOGP(DMAIN, LOGL_ERROR, "Unhandled GSUP message type %s\n",
112 osmo_gsup_message_type_name(gsup_msg.message_type));
113 break;
114 }
115
116 msgb_free(msg);
117 return 0;
118 }