blob: c8e0280d08aed2fd86701d1cc104436cbb4b7946 [file] [log] [blame]
Harald Welted328c1a2015-12-16 23:04:21 +01001
2
3/* This is just some non-compiling work in progress code to generate the
4 * minimum set of RANAP messages that the core network side needs to send
5 * towards the RNC */
6
7int ranap_tx_dt(uint8_t sapi, const uint8_t *nas, unsigned int nas_len)
8{
9 RANAP_DirectTransferIEs_t ies;
10 RANAP_DirectTransfer_t dt;
11 struct msgb *msg;
12 int rc;
13
14 memset(&ies, 0, sizeof(ies));
15
16 /* only SAPI optional field shall be present for CN->RNC */
17 ies.presenceMask = DIRECTTRANSFERIES_RANAP_SAPI_PRESENT;
18
19 if (sapi == 3)
20 ies.sapi = RANAP_SAPI_sapi_3;
21 else
22 ies.sapi = RANAP_SAPI_sapi_0;
23
24 ies.nas_pdu.buf = nas;
25 ies.nas_pdu.size = nas_len;
26
27 rc = ranap_encode_directtransferies(&dt, &ies);
28
29 msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_DirectTransfer,
30 RANAP_Criticality_reject,
31 &asn_DEF_RANAP_DirectTransfer,
32 &dt);
33 /* FIXME: Hand that to RUA or SCCP */
34}
35
36static const enum RANAP_IntegrityProtectionAlgorithm ip_alg[2] = {
37 RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA1,
38 RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA2,
39};
40
41static const enum RANAP_EncryptionAlgorithm enc_alg[2] = {
42 RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA1,
43 RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA2,
44};
45
46int ranap_tx_sec_mod_cmd(void)
47{
48 RANAP_SecurityModeCommandIEs_t ies;
49 RANAP_SecurityModeCommand_t out;
50 struct msgb *msg;
51 int rc;
52
53 memset(&ies, 0, sizeof(ies));
54
55 ies.presenceMask = SECURITYMODECOMMANDIES_RANAP_ENCRYPTIONINFORMATION_PRESENT;
56
57 ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[0]);
58 ASN_SEQUENCE_ADD(&ies.integrityProtectionInformation.permittedAlgorithms, &ip_alg[1]);
59
60 ies.integrityProtectionInformation.key; /* FIXME */
61 if (0) {
62 ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[0]);
63 ASN_SEQUENCE_ADD(&ies.encryptionInformation.permittedAlgorithms, &enc_alg[1]);
64 ies.encryptionInformation.key; /* FIXME */
65 }
66 ies.keyStatus = RANAP_KeyStatus_new; /* FIXME */
67
68 rc = ranap_encode_securitymodecommandies(&out, &ies);
69
70 asn_sequence_empty(&ies.integrityProtectionInformation.permittedAlgorithms);
71 asn_sequence_empty(&ies.encryptionInformation.permittedAlgorithms);
72
73 msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_SecurityModeControl,
74 RANAP_Criticality_reject,
75 &asn_DEF_RANAP_SecurityModeCommand,
76 &out);
77}
78
79int ranap_tx_common_id(const char *imsi)
80{
81 RANAP_CommonID_IEs_t ies;
82 RANAP_CommonID_t out;
83 struct msgb *msg;
84 int rc;
85
86 memset(&ies, 0, sizeof(ies));
87
88 if (imsi) {
89 ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_iMSI;
90 ies.permanentNAS_UE_ID.choice.iMSI; /* FIXME */
91 } else
92 ies.permanentNAS_UE_ID.present = RANAP_PermanentNAS_UE_ID_PR_NOTHING;
93
94 rc = ranap_encode_commonidies(&out, &ies);
95
96 msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_CommonID,
97 RANAP_Criticality_ignore,
98 &asn_DEF_RANAP_CommonID,
99 &out);
100}
101
102int ranap_tx_iu_rel_cmd(RANAP_Cause_t cause)
103{
104 RANAP_Iu_ReleaseCommandIEs_t ies;
105 RANAP_Iu_ReleaseCommand_t out;
106 struct msgb *msg;
107 int rc;
108
109 memset(&ies, 0, sizeof(ies));
110
111 ies.cause = cause;
112
113 rc = ranap_encode_iu_releasecommandies(&out, &ies);
114
115 msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Release,
116 RANAP_Criticality_reject,
117 &asn_DEF_RANAP_ReleaseCommand,
118 &out);
119}
120
121int ranap_tx_paging_cmd(const char *imsi, uint32_t *tmsi, uint32_t cause)
122{
123 RANAP_PagingIEs_s ies;
124 RANAP_Paging_t out;
125
126 memset(&ies, 0, sizeof(ies));
127
128 if (is_ps)
129 ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_ps_domain;
130 else
131 ies.cN_DomainIndicator = RANAP_CN_DomainIndicator_cs_domain;
132
133 ies.permanentNAS_UE_ID; /* FIXME */
134
135 if (tmsi) {
136 ies.presenceMask |= PAGINGIES_RANAP_TEMPORARYUE_ID_PRESENT;
137 if (is_ps) {
138 ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_p_TMSI;
139 ies.temporaryUE_ID.choice.tMSI;
140 } else {
141 ies.temporaryUE_ID.present = RANAP_TemporaryUE_ID_PR_tMSI;
142 ies.temporaryUE_ID.choice.p_TMSI;
143 }
144 }
145
146 if (cause) {
147 ies.presenceMask |= PAGINGIES_RANAP_PAGINGCAUSE_PRESENT;
148 ies.pagingCause = cause;
149 }
150
151 rc = ranap_encode_iu_pagingies(&out, &ies);
152
153 msg = ranap_generate_initiating_message(RANAP_ProcedureCode_id_Iu_Paging,
154 RANAP_Criticality_reject,
155 &asn_DEF_RANAP_Paging,
156 &out);
157}
158
159
160
161static RANAP_RAB_Parameters_t rab_par_voice = {
162 .trafficClass = RANAP_TrafficClass_conversational,
163 .rAB_AsymmetryIndicator = ANAP_RAB_AsymmetryIndicator_symmetric_bidirectional
164 .maxBitrate = ,
165 .deliveryOrder = RANAP_DeliveryOrder_delivery_order_not_requested
166 .maxSDU_Size = 1234,
167 .sDU_Parameters = ,
168};
169
170static RANAP_UserPlaneInformation_t rab_upl_voice = {
171 .userPlaneMode = RANAP_UserPlaneMode_transparent_mode,
172 .uP_ModeVersions = FIXME,
173};
174
175int ranap_tx_rab_assign()
176{
177 RANAP_ProtocolIE_FieldPair_t *pair;
178 RANAP_RAB_AssignmentRequestIEs_t ies;
179 RANAP_RAB_AssignmentRequest_t out;
180
181
182 memset(&ies, 0, sizeof(ies));
183
184 ies.presenceMask = RAB_ASSIGNMENTREQUESTIES_RANAP_RAB_SETUPORMODIFYLIST_PRESENT;
185 /* RANAP_RAB_IE_ContainerPairList_t */
186
187 RANAP_RAB_SetupOrModifyItemFirst_t first;
188
189 first.rAB_ID = FIXME;
190 first.nAS_SynchronisationIndicator = FIXME;
191 first.rAB_Parameters = &rab_par_voice;
192 first.userPlaneInformation = &rab_upl_voice;
193 first.transportLayerInformation = NULL;
194
195 RANAP_RAB_SetupOrModifyItemSecond_t second;
196
197
198 pair = ranap_new_ie_pair(RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem,
199 RANAP_Criticality_reject,
200 SetupOrModifyItemFirst, &first,
201 RANAP_Criticality_ignore,
202 SetupOrModifyItemSecond, &second);
203
204 ASN_SEQUENCE_ADD(&ies.raB_SetupOrModifyList.list, pair);
205
206 rc = ranap_encode_rab_assignmentrequesties(&out, &ies);
207}