blob: 268f6acd170684e63f21a1872ff69a85f9db22db [file] [log] [blame]
Harald Welteb66c5d02016-01-03 18:04:28 +01001#include <stdint.h>
Harald Welte7ac7e042015-12-24 15:53:30 +01002#include <osmocom/netif/stream.h>
3
Neels Hofmeyr83457922016-08-26 23:56:44 +02004#include <osmocom/rua/rua_common.h>
5#include <osmocom/rua/rua_ies_defs.h>
Neels Hofmeyrdf63de22016-08-18 13:13:55 +02006#include <osmocom/rua/rua_msg_factory.h>
Harald Welte7ac7e042015-12-24 15:53:30 +01007#include "asn1helpers.h"
Neels Hofmeyrdf63de22016-08-18 13:13:55 +02008#include <osmocom/iuh/hnbgw.h>
Harald Welteb66c5d02016-01-03 18:04:28 +01009
Harald Welte7ac7e042015-12-24 15:53:30 +010010
11struct msgb *rua_new_udt(struct msgb *inmsg)
12{
13 RUA_ConnectionlessTransfer_t out;
14 RUA_ConnectionlessTransferIEs_t ies;
15 struct msgb *msg;
16 int rc;
17
18 memset(&ies, 0, sizeof(ies));
Harald Welteb66c5d02016-01-03 18:04:28 +010019 OCTET_STRING_fromBuf(&ies.ranaP_Message, inmsg->data, msgb_length(inmsg));
Harald Welte7ac7e042015-12-24 15:53:30 +010020 msgb_free(inmsg);
21
22 memset(&out, 0, sizeof(out));
23 rc = rua_encode_connectionlesstransferies(&out, &ies);
24 if (rc < 0)
25 return NULL;
26
27 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_ConnectionlessTransfer,
28 RUA_Criticality_reject,
29 &asn_DEF_RUA_ConnectionlessTransfer,
30 &out);
31
32 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_ConnectionlessTransfer, &out);
33
34 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
35
36 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
37
38 return msg;
39}
40
41struct msgb *rua_new_conn(int is_ps, uint32_t context_id, struct msgb *inmsg)
42{
43 RUA_Connect_t out;
44 RUA_ConnectIEs_t ies;
45 struct msgb *msg;
46 uint32_t ctxidbuf;
47 int rc;
48
49 memset(&ies, 0, sizeof(ies));
50 if (is_ps)
51 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
52 else
53 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
54 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
55 ies.establishment_Cause = RUA_Establishment_Cause_normal_call;
Harald Welteb66c5d02016-01-03 18:04:28 +010056 OCTET_STRING_fromBuf(&ies.ranaP_Message, inmsg->data, msgb_length(inmsg));
Harald Welte7ac7e042015-12-24 15:53:30 +010057 msgb_free(inmsg);
58
59 memset(&out, 0, sizeof(out));
60 rc = rua_encode_connecties(&out, &ies);
61 if (rc < 0)
62 return NULL;
63
Harald Welte7ac7e042015-12-24 15:53:30 +010064 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_Connect,
65 RUA_Criticality_reject,
66 &asn_DEF_RUA_Connect,
67 &out);
68
69 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_Connect, &out);
70
71 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
72
73 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
74
75 return msg;
76}
77
78struct msgb *rua_new_dt(int is_ps, uint32_t context_id, struct msgb *inmsg)
79{
80 RUA_DirectTransfer_t out;
81 RUA_DirectTransferIEs_t ies;
82 struct msgb *msg;
83 uint32_t ctxidbuf;
84 int rc;
85
86 memset(&ies, 0, sizeof(ies));
87 if (is_ps)
88 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
89 else
90 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
91 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
Harald Welteb66c5d02016-01-03 18:04:28 +010092 OCTET_STRING_fromBuf(&ies.ranaP_Message, inmsg->data, msgb_length(inmsg));
Harald Welte7ac7e042015-12-24 15:53:30 +010093 msgb_free(inmsg);
94
95 memset(&out, 0, sizeof(out));
96 rc = rua_encode_directtransferies(&out, &ies);
97 if (rc < 0)
98 return NULL;
99
Harald Welte7ac7e042015-12-24 15:53:30 +0100100 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_DirectTransfer,
101 RUA_Criticality_reject,
102 &asn_DEF_RUA_DirectTransfer,
103 &out);
104
105 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_DirectTransfer, &out);
106
107 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
108
109 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
110
111 return msg;
112}
113
114struct msgb *rua_new_disc(int is_ps, uint32_t context_id, struct msgb *inmsg)
115{
116 RUA_Disconnect_t out;
117 RUA_DisconnectIEs_t ies;
118 struct msgb *msg;
119 uint32_t ctxidbuf;
120 int rc;
121
122 memset(&ies, 0, sizeof(ies));
123 if (is_ps)
124 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_ps_domain;
125 else
126 ies.cN_DomainIndicator = RUA_CN_DomainIndicator_cs_domain;
127 asn1_u24_to_bitstring(&ies.context_ID, &ctxidbuf, context_id);
128 /* FIXME: make cause configurable */
129 ies.cause.present = RUA_Cause_PR_radioNetwork;
130 ies.cause.choice.radioNetwork = RUA_CauseRadioNetwork_normal;
131 if (inmsg && inmsg->data&& msgb_length(inmsg)) {
132 ies.presenceMask |= DISCONNECTIES_RUA_RANAP_MESSAGE_PRESENT;
Harald Welteb66c5d02016-01-03 18:04:28 +0100133 OCTET_STRING_fromBuf(&ies.ranaP_Message, inmsg->data, msgb_length(inmsg));
Harald Welte7ac7e042015-12-24 15:53:30 +0100134 }
Harald Weltecee5a282015-12-26 08:43:31 +0100135 msgb_free(inmsg);
Harald Welte7ac7e042015-12-24 15:53:30 +0100136
137 memset(&out, 0, sizeof(out));
138 rc = rua_encode_disconnecties(&out, &ies);
139 if (rc < 0)
140 return NULL;
141
Harald Welte7ac7e042015-12-24 15:53:30 +0100142 msg = rua_generate_initiating_message(RUA_ProcedureCode_id_Disconnect,
143 RUA_Criticality_reject,
144 &asn_DEF_RUA_Disconnect,
145 &out);
146
147 ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_RUA_Disconnect, &out);
148
149 DEBUGP(DMAIN, "transmitting RUA payload of %u bytes\n", msgb_length(msg));
150
151 msgb_sctp_ppid(msg) = IUH_PPI_RUA;
152
153 return msg;
154}