blob: 69d5e6917e74bc77a2e5f370c9f746e69cdb3b2e [file] [log] [blame]
Harald Welte318e4d52015-09-10 18:47:08 +02001#include <osmocom/core/msgb.h>
2#include <osmocom/core/utils.h>
3
4#include <unistd.h>
5#include <errno.h>
6#include <string.h>
7
8#include "asn1helpers.h"
9
10#include "hnbgw.h"
Harald Welte350814a2015-09-10 22:32:15 +020011#include "hnbgw_ranap.h"
Harald Welte318e4d52015-09-10 18:47:08 +020012#include "rua_common.h"
13#include "rua_ies_defs.h"
14
15static int hnbgw_rua_tx(struct hnb_context *ctx, struct msgb *msg)
16{
17 if (!msg)
18 return -EINVAL;
19
20 msgb_ppid(msg) = IUH_PPI_RUA;
21 return osmo_wqueue_enqueue(&ctx->wqueue, msg);
22}
23
Harald Weltee2e5d4d2015-09-10 23:49:45 +020024int rua_tx_udt(struct msgb *inmsg)
Harald Welte64b4ebe2015-09-10 19:29:59 +020025{
Harald Weltee2e5d4d2015-09-10 23:49:45 +020026 RUA_ConnectionlessTransfer_t out;
27 RUA_ConnectionlessTransferIEs_t ies;
28 struct msgb *msg;
29 int rc;
Harald Welte64b4ebe2015-09-10 19:29:59 +020030
Harald Weltee2e5d4d2015-09-10 23:49:45 +020031 memset(&ies, 0, sizeof(ies));
32 ies.ranaP_Message.buf = inmsg->data;
33 ies.ranaP_Message.size = msgb_length(inmsg);
34
35 /* FIXME: msgb_free(msg)? ownership not yet clear */
36
37 memset(&out, 0, sizeof(out));
38 rc = rua_encode_connectionlesstransferies(&out, &ies);
39 if (rc < 0)
40 return rc;
41
42 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_ConnectionlessTransfer,
43 RUA_Criticality_reject,
44 &asn_DEF_RUA_ConnectionlessTransfer,
45 &out);
46 msg->dst = inmsg->dst;
47
48 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
49
50 return hnbgw_rua_tx(msg->dst, msg);
Harald Welte64b4ebe2015-09-10 19:29:59 +020051}
52
Harald Welte350814a2015-09-10 22:32:15 +020053static int rua_rx_init_connect(struct msgb *msg, ANY_t *in)
Harald Welte64b4ebe2015-09-10 19:29:59 +020054{
55 RUA_ConnectIEs_t ies;
56 uint32_t context_id;
57 int rc;
58
59 rc = rua_decode_connecties(&ies, in);
60 if (rc < 0)
61 return rc;
62
63 context_id = asn1bitstr_to_u32(&ies.context_ID);
64
65 DEBUGP(DMAIN, "Connect.req(ctx=0x%x, %s)\n", context_id,
66 ies.establishment_Cause == RUA_Establishment_Cause_emergency_call
67 ? "emergency" : "normal");
Harald Welte350814a2015-09-10 22:32:15 +020068 /* FIXME */
Harald Welte64b4ebe2015-09-10 19:29:59 +020069}
70
Harald Welte350814a2015-09-10 22:32:15 +020071static int rua_rx_init_disconnect(struct msgb *msg, ANY_t *in)
Harald Welte64b4ebe2015-09-10 19:29:59 +020072{
73 RUA_DisconnectIEs_t ies;
74 uint32_t context_id;
75 int rc;
76
77 rc = rua_decode_disconnecties(&ies, in);
78 if (rc < 0)
79 return rc;
80
81 context_id = asn1bitstr_to_u32(&ies.context_ID);
82
83 DEBUGP(DMAIN, "Disconnect.req(ctx=0x%x,cause=%s)\n", context_id,
84 rua_cause_str(&ies.cause));
Harald Welte350814a2015-09-10 22:32:15 +020085 /* FIXME */
Harald Welte64b4ebe2015-09-10 19:29:59 +020086}
87
Harald Welte350814a2015-09-10 22:32:15 +020088static int rua_rx_init_dt(struct msgb *msg, ANY_t *in)
Harald Welte64b4ebe2015-09-10 19:29:59 +020089{
90 RUA_DirectTransferIEs_t ies;
91 uint32_t context_id;
92 int rc;
93
94 rc = rua_decode_directtransferies(&ies, in);
95 if (rc < 0)
96 return rc;
97
98 context_id = asn1bitstr_to_u32(&ies.context_ID);
99
100 DEBUGP(DMAIN, "Data.req(ctx=0x%x)\n", context_id);
Harald Welte350814a2015-09-10 22:32:15 +0200101 /* FIXME */
Harald Welte64b4ebe2015-09-10 19:29:59 +0200102
103}
104
Harald Welte350814a2015-09-10 22:32:15 +0200105static int rua_rx_init_udt(struct msgb *msg, ANY_t *in)
Harald Welte64b4ebe2015-09-10 19:29:59 +0200106{
107 RUA_ConnectionlessTransferIEs_t ies;
108 int rc;
109
110 rc = rua_decode_connectionlesstransferies(&ies, in);
111 if (rc < 0)
112 return rc;
113
114 DEBUGP(DMAIN, "UData.req()\n");
115
Harald Welte350814a2015-09-10 22:32:15 +0200116 /* FIXME: pass on to RANAP */
117 rc = hnbgw_ranap_rx(msg, ies.ranaP_Message.buf, ies.ranaP_Message.size);
118 /* FIXME: what to do with the asn1c-allocated memory */
119
120 return rc;
Harald Welte64b4ebe2015-09-10 19:29:59 +0200121}
122
Harald Welte350814a2015-09-10 22:32:15 +0200123
124static int rua_rx_init_err_ind(struct msgb *msg, ANY_t *in)
Harald Welte64b4ebe2015-09-10 19:29:59 +0200125{
126 RUA_ErrorIndicationIEs_t ies;
127 int rc;
128
129 rc = rua_decode_errorindicationies(&ies, in);
130 if (rc < 0)
131 return rc;
132
133}
Harald Welte318e4d52015-09-10 18:47:08 +0200134
Harald Welte350814a2015-09-10 22:32:15 +0200135static int rua_rx_initiating_msg(struct msgb *msg, RUA_InitiatingMessage_t *imsg)
Harald Welte318e4d52015-09-10 18:47:08 +0200136{
137 int rc;
138
139 switch (imsg->procedureCode) {
140 case RUA_ProcedureCode_id_Connect:
Harald Welte350814a2015-09-10 22:32:15 +0200141 rc = rua_rx_init_connect(msg, &imsg->value);
Harald Welte318e4d52015-09-10 18:47:08 +0200142 break;
143 case RUA_ProcedureCode_id_DirectTransfer:
Harald Welte350814a2015-09-10 22:32:15 +0200144 rc = rua_rx_init_dt(msg, &imsg->value);
Harald Welte318e4d52015-09-10 18:47:08 +0200145 break;
146 case RUA_ProcedureCode_id_Disconnect:
Harald Welte350814a2015-09-10 22:32:15 +0200147 rc = rua_rx_init_disconnect(msg, &imsg->value);
Harald Welte318e4d52015-09-10 18:47:08 +0200148 break;
149 case RUA_ProcedureCode_id_ConnectionlessTransfer:
Harald Welte350814a2015-09-10 22:32:15 +0200150 rc = rua_rx_init_udt(msg, &imsg->value);
Harald Welte318e4d52015-09-10 18:47:08 +0200151 break;
152 case RUA_ProcedureCode_id_ErrorIndication:
Harald Welte350814a2015-09-10 22:32:15 +0200153 rc = rua_rx_init_err_ind(msg, &imsg->value);
Harald Welte64b4ebe2015-09-10 19:29:59 +0200154 break;
Harald Welte318e4d52015-09-10 18:47:08 +0200155 case RUA_ProcedureCode_id_privateMessage:
156 break;
157 default:
Harald Welte64b4ebe2015-09-10 19:29:59 +0200158 return -1;
Harald Welte318e4d52015-09-10 18:47:08 +0200159 }
160}
161
Harald Welte350814a2015-09-10 22:32:15 +0200162static int rua_rx_successful_outcome_msg(struct msgb *msg, RUA_SuccessfulOutcome_t *in)
Harald Welte318e4d52015-09-10 18:47:08 +0200163{
164
165}
166
Harald Welte350814a2015-09-10 22:32:15 +0200167static int rua_rx_unsuccessful_outcome_msg(struct msgb *msg, RUA_UnsuccessfulOutcome_t *in)
Harald Welte318e4d52015-09-10 18:47:08 +0200168{
169
170}
171
172
Harald Welte350814a2015-09-10 22:32:15 +0200173static int _hnbgw_rua_rx(struct msgb *msg, RUA_RUA_PDU_t *pdu)
Harald Welte318e4d52015-09-10 18:47:08 +0200174{
175 int rc;
176
177 /* it's a bit odd that we can't dispatch on procedure code, but
178 * that's not possible */
179 switch (pdu->present) {
180 case RUA_RUA_PDU_PR_initiatingMessage:
Harald Welte350814a2015-09-10 22:32:15 +0200181 rc = rua_rx_initiating_msg(msg, &pdu->choice.initiatingMessage);
Harald Welte318e4d52015-09-10 18:47:08 +0200182 break;
183 case RUA_RUA_PDU_PR_successfulOutcome:
Harald Welte350814a2015-09-10 22:32:15 +0200184 rc = rua_rx_successful_outcome_msg(msg, &pdu->choice.successfulOutcome);
Harald Welte318e4d52015-09-10 18:47:08 +0200185 break;
186 case RUA_RUA_PDU_PR_unsuccessfulOutcome:
Harald Welte350814a2015-09-10 22:32:15 +0200187 rc = rua_rx_unsuccessful_outcome_msg(msg, &pdu->choice.unsuccessfulOutcome);
Harald Welte318e4d52015-09-10 18:47:08 +0200188 break;
189 default:
190 return -1;
191 }
192}
193
194int hnbgw_rua_rx(struct hnb_context *hnb, struct msgb *msg)
195{
196 RUA_RUA_PDU_t _pdu, *pdu = &_pdu;
197 asn_dec_rval_t dec_ret;
198 int rc;
199
200 /* decode and handle to _hnbgw_hnbap_rx() */
201
202 memset(pdu, 0, sizeof(*pdu));
203 dec_ret = aper_decode(NULL, &asn_DEF_RUA_RUA_PDU, (void **) &pdu,
204 msg->data, msgb_length(msg), 0, 0);
205 if (dec_ret.code != RC_OK) {
206 LOGP(DMAIN, LOGL_ERROR, "Error in ASN.1 decode\n");
207 return rc;
208 }
209
Harald Welte350814a2015-09-10 22:32:15 +0200210 rc = _hnbgw_rua_rx(msg, pdu);
Harald Welte318e4d52015-09-10 18:47:08 +0200211
212 return rc;
213}
214
215
216int hnbgw_rua_init(void)
217{
218
219}