blob: d1dcbf695784cd55e469bae2c8bde384040f384a [file] [log] [blame]
Harald Welte7ac7e042015-12-24 15:53:30 +01001#include "rua_common.h"
2#include "rua_ies_defs.h"
3#include <osmocom/netif/stream.h>
4
5#include "hnbgw.h"
6#include "asn1helpers.h"
7
8struct msgb *rua_new_udt(struct msgb *inmsg)
9{
10 RUA_ConnectionlessTransfer_t out;
11 RUA_ConnectionlessTransferIEs_t ies;
12 struct msgb *msg;
13 int rc;
14
15 memset(&ies, 0, sizeof(ies));
16 OCTET_STRING_fromBuf(&ies.ranaP_Message.buf, inmsg->data, msgb_length(inmsg));
17 msgb_free(inmsg);
18
19 memset(&out, 0, sizeof(out));
20 rc = rua_encode_connectionlesstransferies(&out, &ies);
21 if (rc < 0)
22 return NULL;
23
24 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_ConnectionlessTransfer,
25 RUA_Criticality_reject,
26 &asn_DEF_RUA_ConnectionlessTransfer,
27 &out);
28
29 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_ConnectionlessTransfer, &out);
30
31 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
32
33 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
34
35 return msg;
36}
37
38struct msgb *rua_new_conn(int is_ps, uint32_t context_id, struct msgb *inmsg)
39{
40 RUA_Connect_t out;
41 RUA_ConnectIEs_t ies;
42 struct msgb *msg;
43 uint32_t ctxidbuf;
44 int rc;
45
46 memset(&ies, 0, sizeof(ies));
47 if (is_ps)
48 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
49 else
50 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
51 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
52 ies.establishment_Cause = RUA_Establishment_Cause_normal_call;
53 OCTET_STRING_fromBuf(&ies.ranaP_Message.buf, inmsg->data, msgb_length(inmsg));
54 msgb_free(inmsg);
55
56 memset(&out, 0, sizeof(out));
57 rc = rua_encode_connecties(&out, &ies);
58 if (rc < 0)
59 return NULL;
60
Harald Welte7ac7e042015-12-24 15:53:30 +010061 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_Connect,
62 RUA_Criticality_reject,
63 &asn_DEF_RUA_Connect,
64 &out);
65
66 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_Connect, &out);
67
68 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
69
70 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
71
72 return msg;
73}
74
75struct msgb *rua_new_dt(int is_ps, uint32_t context_id, struct msgb *inmsg)
76{
77 RUA_DirectTransfer_t out;
78 RUA_DirectTransferIEs_t ies;
79 struct msgb *msg;
80 uint32_t ctxidbuf;
81 int rc;
82
83 memset(&ies, 0, sizeof(ies));
84 if (is_ps)
85 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
86 else
87 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
88 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
89 OCTET_STRING_fromBuf(&ies.ranaP_Message.buf, inmsg->data, msgb_length(inmsg));
90 msgb_free(inmsg);
91
92 memset(&out, 0, sizeof(out));
93 rc = rua_encode_directtransferies(&out, &ies);
94 if (rc < 0)
95 return NULL;
96
Harald Welte7ac7e042015-12-24 15:53:30 +010097 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_DirectTransfer,
98 RUA_Criticality_reject,
99 &asn_DEF_RUA_DirectTransfer,
100 &out);
101
102 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_DirectTransfer, &out);
103
104 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
105
106 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
107
108 return msg;
109}
110
111struct msgb *rua_new_disc(int is_ps, uint32_t context_id, struct msgb *inmsg)
112{
113 RUA_Disconnect_t out;
114 RUA_DisconnectIEs_t ies;
115 struct msgb *msg;
116 uint32_t ctxidbuf;
117 int rc;
118
119 memset(&ies, 0, sizeof(ies));
120 if (is_ps)
121 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
122 else
123 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
124 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
125 /* FIXME: make cause configurable */
126 ies.cause.present = RUA_Cause_PR_radioNetwork;
127 ies.cause.choice.radioNetwork = RUA_CauseRadioNetwork_normal;
128 if (inmsg && inmsg->data&& msgb_length(inmsg)) {
129 ies.presenceMask |= DISCONNECTIES_RUA_RANAP_MESSAGE_PRESENT;
130 OCTET_STRING_fromBuf(&ies.ranaP_Message.buf, inmsg->data, msgb_length(inmsg));
Harald Welte7ac7e042015-12-24 15:53:30 +0100131 }
Harald Weltecee5a282015-12-26 08:43:31 +0100132 msgb_free(inmsg);
Harald Welte7ac7e042015-12-24 15:53:30 +0100133
134 memset(&out, 0, sizeof(out));
135 rc = rua_encode_disconnecties(&out, &ies);
136 if (rc < 0)
137 return NULL;
138
Harald Welte7ac7e042015-12-24 15:53:30 +0100139 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_Disconnect,
140 RUA_Criticality_reject,
141 &asn_DEF_RUA_Disconnect,
142 &out);
143
144 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_Disconnect, &out);
145
146 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
147
148 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
149
150 return msg;
151}