1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2001-2017. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20%%
21-module(testobj).
22
23-include("RANAP.hrl").
24
25-compile(export_all).
26
27-define(ranap, 'RANAP').
28
29
30%% These are possible Reason-values for sccp_disconnect_req in RANPM
31%%
32%% 0,0,0,0,0,1,0,0,  % Message-type
33%% 0,0,0,0,0,0,0,0,  % Dest local ref (dummy) - 3 octets
34%% 0,0,0,0,0,0,0,0,
35%% 0,0,0,0,0,0,0,1,
36%% 0,0,0,0,0,0,0,0,  % Source local ref (dummy) - 3 octets
37%% 0,0,0,0,0,0,0,0,
38%% 0,0,0,0,0,0,1,0,
39
40run() ->
41    ok = run_com_id(),
42    ok = run_dir_tsf_2cn(),
43    ok = run_dir_tsf_2rnc(),
44    ok = run_init_ue(),
45    ok = run_iu_rel_cmd(),
46    ok = run_iu_rel_cmp(),
47    ok = run_rab_ass_rsp_delete(),
48    ok = run_rab_ass_rsp_setup(),
49    ok = run_rab_create(),
50    ok = run_rab_rel(),
51    ok = run_reset(),
52    ok = run_reset_res(),
53    ok = run_sm_cmd(),
54    ok = run_sm_cmp(),
55    ok = run_sm_rej().
56
57
58ranap_pdu_contents(Enc,Type) ->
59  {initiatingMessage, #'InitiatingMessage'{
60    procedureCode = Type,
61    criticality = ignore, %{'Criticality', ignore}, %XXX
62    value = Enc
63  }}.
64
65ranap_pdu_contents_outcome(Enc,Type) ->
66  {outcome, #'Outcome'{
67    procedureCode = Type,
68    criticality = ignore,%XXX
69    value = Enc
70  }}.
71
72ranap_pdu_contents_suc(Enc,Type) ->
73  {successfulOutcome, #'SuccessfulOutcome'{
74    procedureCode = Type,
75    criticality = ignore,%XXX
76    value = Enc
77  }}.
78
79ranap_pdu_contents_unsuc(Enc,Type) ->
80  {unsuccessfulOutcome, #'UnsuccessfulOutcome'{
81    procedureCode = Type,
82    criticality = ignore,%XXX
83    value = Enc
84  }}.
85
86
87
88run_rab_rel() ->
89    RAS = rab_release_request(),
90    io:format("~w~n~n", [RAS]),
91    RanapRAS = ranap_pdu_contents(RAS,0),               % 0=Rab Assignment Procedure
92    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapRAS),
93    EncRanapRAS = lists:flatten(Tmp2),
94    io:format("~w~n~n", [EncRanapRAS]),
95    {ok,{initiatingMessage,
96	 #'InitiatingMessage'{procedureCode=ProcedureCode,
97			      criticality=Criticality,
98			      value=DecGeneral}}} =
99	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapRAS),
100    io:format("~w~n~n", [DecGeneral]),
101    case DecGeneral of
102	{'RAB-AssignmentRequest',[{_ProtIEField,_Code,_Crit,DecRel}],_ASN1novalue} ->
103	    io:format("~w~n~n", [DecRel])
104    end,
105    case DecRel of
106	[[{_ProtIEField1,_Code1,_Crit1,DecRelList}]] ->
107	    io:format("~w~n~n", [DecRelList])
108    end,
109    ok.
110
111run_rab_create() ->
112    RabID = [0,1,0,1,0,1,0,1],
113    Teid = [0,13,83,211],
114    SgsnIP = [0,0,0,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0],
115    RAS = rab_create_request(RabID, Teid, SgsnIP),
116    io:format("~w~n~n", [RAS]),
117    RanapRAS = ranap_pdu_contents(RAS,0),                     % 0=Rab Assignment Procedure
118    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapRAS),
119    EncRanapRAS = lists:flatten(Tmp2),
120    io:format("~w~n~n", [EncRanapRAS]),
121    {ok,{initiatingMessage,
122	 #'InitiatingMessage'{procedureCode=ProcedureCode,
123			      criticality=Criticality,
124			      value=DecGeneral}}} =
125	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapRAS),
126    io:format("~w~n~n", [DecGeneral]),
127    case DecGeneral of
128	{'RAB-AssignmentRequest',[{_ProtIEField,_Code,_Crit,DecSetOrMod}],_ASN1novalue} ->
129	    io:format("~w~n~n", [DecSetOrMod])
130    end,
131    case DecSetOrMod of
132	[[{'ProtocolIE-FieldPair',_Code1,_Crit1,DecSetOrModFirst,_Crit2,DecSetOrModSecond}]] ->
133	    io:format("~w~n~n", [DecSetOrModFirst]),
134	    io:format("~w~n~n", [DecSetOrModSecond])
135    end,
136    ok.
137
138decode_initiating_ras(ProcedureCode,Crit,Val) ->
139    case ProcedureCode of
140        0 -> % RAB-Assignment
141	    wrapper_decode(?ranap, 'RAB-AssignmentRequest',Val)
142    end.
143
144
145run_rab_ass_rsp_setup() ->
146    RAR = rab_assignment_response_setup(),
147    io:format("~w~n~n", [RAR]),
148    RanapRAR = ranap_pdu_contents_outcome(RAR,0),                     % 0=Rab Assignment Procedure
149    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapRAR),
150    EncRanapRAR = lists:flatten(Tmp2),
151    io:format("~w~n~n", [EncRanapRAR]),
152	{ok,{outcome,
153	  #'Outcome'{procedureCode=ProcedureCode,
154		     criticality=Criticality,
155		     value=DecGeneral}}} =
156	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapRAR),
157    io:format("~w~n~n", [DecGeneral]),
158    case DecGeneral of
159	{'RAB-AssignmentResponse',[{_ProtIEField,52,_Crit,DecSetOrMod}], _ASN1novalue} ->
160	    io:format("Setup or Modified: ~w~n~n", [DecSetOrMod])
161    end,
162    case DecSetOrMod of
163	[[{_ProtIEField1,51,_Crit1,DecSetOrModFirst}]] ->
164	    io:format("Setup or Modified: ~w~n~n", [DecSetOrModFirst])
165    end,
166    ok.
167
168run_rab_ass_rsp_delete() ->
169    RAR = rab_assignment_response_delete(),
170    io:format("~w~n~n", [RAR]),
171    RanapRAR = ranap_pdu_contents_outcome(RAR,0),                     % 0=Rab Assignment Procedure
172    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapRAR),
173    EncRanapRAR = lists:flatten(Tmp2),
174    io:format("~w~n~n", [EncRanapRAR]),
175	{ok,{outcome,
176	  #'Outcome'{procedureCode=ProcedureCode,
177		     criticality=Criticality,
178		     value=DecGeneral}}} =
179	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapRAR),
180    io:format("~w~n~n", [DecGeneral]),
181    case DecGeneral of
182	{'RAB-AssignmentResponse',[{_ProtIEField2,43,_Crit2,DecRelsd}], _ASN1novalue} ->
183	    io:format("Released: ~w~n~n", [DecRelsd])
184    end,
185    case DecRelsd of
186	[[{_ProtIEField3,_Code3,_Crit3,DecRelsdItem}]] ->
187	    io:format("Released: ~w~n~n", [DecRelsdItem])
188    end,
189    ok.
190
191decode_initiating_rar(ProcedureCode,Crit,Val) ->
192    case ProcedureCode of
193        0 -> % RAB-Assignment
194	    wrapper_decode(?ranap, 'RAB-AssignmentResponse',Val)
195    end.
196
197
198
199run_init_ue() ->
200    INI = initial_ue(),
201    io:format("~w~n~n", [INI]),
202    RanapINI = ranap_pdu_contents(INI, 19),                     % 19 = InitialUE-Message
203    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapINI),
204    EncRanapINI = lists:flatten(Tmp2),
205    io:format("~w~n~n", [EncRanapINI]),
206
207    {ok,{initiatingMessage,
208	 #'InitiatingMessage'{procedureCode=ProcedureCode,
209			      criticality=Criticality,
210			      value=DecGeneral}}} =
211	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapINI),
212    io:format("~w~n~n", [DecGeneral]),
213    case DecGeneral of
214	{'InitialUE-Message',[{_ProtIEField,Code,_Crit,DecCN},
215			      {_ProtIEField1,Code1,_Crit1,
216			       {_LAI,LaiPlmnid,LaiLac,_ASN1novalue}},
217			      {_ProtIEField2,Code2,_Crit2,DecRAC},
218			      {_ProtIEField3,Code3,_Crit3,
219			       {_SAI,SaiPlmnid,SaiLac,SaiSac,_ASN1novalue}},
220			      {_ProtIEField4,Code4,_Crit4,DecNASPDU},
221			      {_ProtIEField5,Code5,_Crit5,DecIUSCID},
222			      {_ProtIEField6,Code6,_Crit6,
223			       {_GRI,GlPlmnid,GlRNCID}}],_ASN1novalue} ->
224	    io:format("CN Dom Ind: ~w~n", [DecCN]),
225	    io:format("Code: ~w~n~n", [Code]),
226	    io:format("LaiPlmnid: ~w~n", [LaiPlmnid]),
227	    io:format("LaiLac: ~w~n", [LaiLac]),
228	    io:format("Code: ~w~n~n", [Code1]),
229	    io:format("RAC: ~w~n", [DecRAC]),
230	    io:format("Code: ~w~n~n", [Code2]),
231	    io:format("SaiPlmnid: ~w~n", [SaiPlmnid]),
232	    io:format("SaiLac: ~w~n", [SaiLac]),
233	    io:format("SaiSac: ~w~n", [SaiSac]),
234	    io:format("Code: ~w~n~n", [Code3]),
235	    io:format("NAS-PDU: ~w~n", [DecNASPDU]),
236	    io:format("Code: ~w~n~n", [Code4]),
237	    io:format("Iu Sign Con Id: ~w~n", [DecIUSCID]),
238	    io:format("Code: ~w~n~n", [Code5]),
239	    io:format("GlPlmnid: ~w~n", [GlPlmnid]),
240	    io:format("GlRNCID: ~w~n", [GlRNCID]),
241	    io:format("Code: ~w~n~n", [Code6])
242    end,
243    ok.
244
245%  NasPdu = extract_ie({init_ue},'InitUE-MessageIEsNAS-PDU',ListsinLists),
246%  io:format("Tebax~n~w~n~n", [NasPdu]),
247%  ok.
248
249decode_initiating_ini(ProcedureCode,Crit,Val) ->
250    case ProcedureCode of
251        19 -> % InitialUE-Message
252	    wrapper_decode(?ranap, 'InitialUE-Message',Val)
253    end.
254
255
256run_dir_tsf_2cn() ->
257    DIR = direct_transfer_cn(),
258    io:format("~w~n~n", [DIR]),
259    RanapDIR = ranap_pdu_contents(DIR, 20),                     % 20 = DirectTransfer
260    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapDIR),
261    EncRanapDIR = lists:flatten(Tmp2),
262    io:format("~w~n~n", [EncRanapDIR]),
263    {ok,{initiatingMessage,
264	 #'InitiatingMessage'{procedureCode=ProcedureCode,
265			      criticality=Criticality,
266			      value=DecGeneral}}} =
267	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapDIR),
268    io:format("~w~n~n", [DecGeneral]),
269    case DecGeneral of
270	{'DirectTransfer',
271	 [{_ProtIEField1,_Code1,_Crit1,DecNASPDU},
272	  {_ProtIEField2,_Code2,_Crit2,DecLAI},
273	  {_ProtIEField3,_Code3,_Crit3,DecRAC}],
274	 _ASN1novalue} ->
275	    io:format("NAS-PDU: ~w~n~n", [DecNASPDU]),
276	    io:format("LAI:     ~w~n~n", [DecLAI]),
277	    io:format("RAC:     ~w~n~n", [DecRAC])
278    end,
279    ok.
280
281run_dir_tsf_2rnc() ->
282    DIR = direct_transfer_rnc(),
283    io:format("~w~n~n", [DIR]),
284    RanapDIR = ranap_pdu_contents(DIR, 20),                     % 20 = DirectTransfer
285    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapDIR),
286    EncRanapDIR = lists:flatten(Tmp2),
287    io:format("~w~n~n", [EncRanapDIR]),
288    {ok,{initiatingMessage,
289	 #'InitiatingMessage'{procedureCode=ProcedureCode,
290			      criticality=Criticality,
291			      value=DecGeneral}}} =
292	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapDIR),
293    io:format("~w~n~n", [DecGeneral]),
294    case DecGeneral of
295	{'DirectTransfer',
296	 [{_ProtIEField1,_Code1,_Crit1,DecNASPDU},
297	  {_ProtIEField2,_Code2,_Crit2,DecSAPI}],
298	 _ASN1novalue} ->
299	    io:format("NAS-PDU: ~w~n~n", [DecNASPDU]),
300	    io:format("SAPI:    m~w~n~n", [DecSAPI])
301    end,
302    ok.
303
304decode_initiating_dir(ProcedureCode,Crit,Val) ->
305    io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
306    case ProcedureCode of
307        20 -> % DirectTransfer
308	    wrapper_decode(?ranap, 'DirectTransfer',Val)
309    end.
310
311%  List = tuple2list(Dec),
312%  io:format("~w~n~n", [List]),
313%  NasPdu = extract_ie({dir_trans},'DirTransIEs-NAS-PDU',List),
314%  io:format("~w~n~n", [NasPdu]),
315%  ok.
316
317
318run_iu_rel_cmd() ->
319    IUR = iu_release_command(),
320    io:format("~w~n~n", [IUR]),
321    RanapIUR = ranap_pdu_contents(IUR, 1),                 % 1 = Iu-Release
322    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUR),
323    EncRanapIUR = lists:flatten(Tmp2),
324    io:format("~w~n~n", [EncRanapIUR]),
325    {ok,{initiatingMessage,
326	 #'InitiatingMessage'{procedureCode=ProcedureCode,
327			      criticality=Criticality,
328			      value=DecGeneral}}} =
329	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUR),
330    io:format("General: ~w~n~n", [DecGeneral]),
331    case DecGeneral of
332	{'Iu-ReleaseCommand',[{_ProtIEField,_Code,_Crit,DecCause}],_ASN1novalue} ->
333	    io:format("Cause: ~w~n~n", [DecCause])
334    end.
335
336run_iu_rel_cmp() ->
337    IUP = iu_release_complete(),
338    io:format("~w~n~n", [IUP]),
339    RanapIUP = ranap_pdu_contents_suc(IUP, 1),                % 1 = Iu-Release
340    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP),
341    EncRanapIUP = lists:flatten(Tmp2),
342    io:format("~w~n~n", [EncRanapIUP]),
343    {ok,{successfulOutcome,
344	 #'SuccessfulOutcome'{procedureCode=ProcedureCode,
345			      criticality=Criticality,
346			      value=DecGeneral}}} =
347	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUP),
348    io:format("~w~n~n", [DecGeneral]).
349
350% run_iu_rel_req() ->
351%     IUP = iu_release_request(),
352%     io:format("~w~n~n", [IUP]),
353%     {ok, Tmp} = wrapper_encode(?ranap, 'Iu-ReleaseRequest', IUP),
354%     EncIUP = lists:flatten(Tmp),
355%     RanapIUP = ranap_pdu_contents(EncIUP, 1),                % 1 = Iu-Release
356%     {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP),
357%     EncRanapIUP = lists:flatten(Tmp2),
358%     io:format("~w~n~n", [EncRanapIUP]),
359%     case wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUP) of
360% 	{ok,{initiatingMessage,
361% 	  #'InitiatingMessage'{procedureCode=ProcedureCode,
362% 		     criticality=Criticality,
363% 		     value=Value}}} ->
364% 	    DecGeneral = decode_initiating_iu(ProcedureCode,Criticality,Value)
365%     end,
366%     io:format("~w~n~n", [DecGeneral]).
367
368decode_initiating_iu(ProcedureCode,Crit,Val) ->
369    case ProcedureCode of
370        1 -> % Iu-Release
371	    wrapper_decode(?ranap, 'Iu-ReleaseComplete',Val)
372    end.
373
374
375
376
377
378run_com_id() ->
379    COM = common_id(),
380    io:format("~w~n~n", [COM]),
381    RanapCOM = ranap_pdu_contents(COM, 15),                     % 15 = CommonID
382    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapCOM),
383    EncRanapCOM = lists:flatten(Tmp2),
384    io:format("~w~n~n", [EncRanapCOM]),
385	{ok,{initiatingMessage,
386	     #'InitiatingMessage'{procedureCode=ProcedureCode,
387				  criticality=Criticality,
388				  value=DecGeneral}}} =
389	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapCOM),
390    io:format("DecGeneral: ~w~n~n", [DecGeneral]),
391    case DecGeneral of
392	{'CommonID',[{_ProtIEField,23,_Crit,DecCause}],_ASN1novalue} ->
393	    io:format("Cause: ~w~n~n", [DecCause]);
394	Error ->
395	    io:format("Error: ~w~n~n", [Error])
396    end.
397
398
399decode_common_id(ProcedureCode,Crit,Val) ->
400    case ProcedureCode of
401        15 -> % Common ID
402	    wrapper_decode(?ranap, 'CommonID',Val);
403	Error ->
404	    io:format("Error: ~w~n~n", [Error])
405    end.
406
407
408
409
410run_sm_cmd() ->
411    DIR = security_mode_cmd(),
412    io:format("~w~n~n", [DIR]),
413    RanapDIR = ranap_pdu_contents(DIR, 6),                  % 6 = Sec Mode
414    io:format("~w~n~n", [RanapDIR]),
415    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapDIR),
416    EncRanapDIR = lists:flatten(Tmp2),
417    io:format("~w~n~n", [EncRanapDIR]),
418    {ok,{initiatingMessage,
419	 #'InitiatingMessage'{procedureCode=ProcedureCode,
420			      criticality=Criticality,
421			      value=DecGeneral}}} =
422	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapDIR),
423    io:format("~w~n~n", [DecGeneral]),
424    case DecGeneral of
425	{'SecurityModeCommand',
426	 [{_ProtIEField1,12,_Crit1,DecIPI},
427	  {_ProtIEField2,11,_Crit2,DecEI},
428	  {_ProtIEField3,75,_Crit3,DecKS}],
429	 _ASN1novalue} ->
430	    io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPI]),
431	    io:format("Encryption Information: ~w~n~n", [DecEI]),
432	    io:format("Key Status: ~w~n~n", [DecKS])
433    end,
434    ok.
435
436run_sm_cmp() ->
437    DIR = security_mode_cmp(),
438    io:format("~w~n~n", [DIR]),
439    RanapDIR = ranap_pdu_contents_suc(DIR, 6),                     % 6 = Sec Mode
440    io:format("~w~n~n", [RanapDIR]),
441    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapDIR),
442    EncRanapDIR = lists:flatten(Tmp2),
443    io:format("~w~n~n", [EncRanapDIR]),
444    {ok,{successfulOutcome,
445	 #'SuccessfulOutcome'{procedureCode=ProcedureCode,
446			      criticality=Criticality,
447			      value=DecGeneral}}} =
448	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapDIR),
449    io:format("~w~n~n", [DecGeneral]),
450    case DecGeneral of
451	{'SecurityModeComplete',
452	 [{_ProtIEField1,6,_Crit1,DecIPA},
453	  {_ProtIEField2,5,_Crit2,DecEI}],
454	 _ASN1novalue} ->
455	    io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPA]),
456	    io:format("Encryption Information: ~w~n~n", [DecEI])
457    end,
458    ok.
459
460run_sm_rej() ->
461    DIR = security_mode_rej(),
462    io:format("~w~n~n", [DIR]),
463    RanapDIR = ranap_pdu_contents_unsuc(DIR, 6),                     % 6 = Sec Mode
464    io:format("~w~n~n", [RanapDIR]),
465    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapDIR),
466    EncRanapDIR = lists:flatten(Tmp2),
467    io:format("~w~n~n", [EncRanapDIR]),
468    {ok,{unsuccessfulOutcome,
469	 #'UnsuccessfulOutcome'{procedureCode=ProcedureCode,
470				criticality=Criticality,
471				value=DecGeneral}}} =
472	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapDIR),
473    io:format("~w~n~n", [DecGeneral]),
474%     case DecGeneral of
475% 	{ok,{'SecurityModeReject',
476% 	      [{_ProtIEField1,6,_Crit1,Value1},
477% 	       {_ProtIEField2,5,_Crit2,Value2}],
478% 	      _ASN1novalue}} ->
479% 	    io:format("Value1: ~w~n~n", [Value1]),
480% 	    io:format("Value2: ~w~n~n", [Value2]),
481% 	    {ok,DecIPA} = wrapper_decode(?ranap, 'IntegrityProtectionAlgorithm', Value1),
482% 	    {ok,DecEI} = wrapper_decode(?ranap, 'EncryptionAlgorithm', Value2),
483% 	    io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPA]),
484% 	    io:format("Encryption Information: ~w~n~n", [DecEI])
485%     end,
486    ok.
487
488decode_initiating_sm(ProcedureCode,Crit,Val) ->
489    io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
490    case ProcedureCode of
491        6 -> % Sec Mode
492	    wrapper_decode(?ranap, 'SecurityModeCommand',Val)
493    end.
494
495decode_suc_sm(ProcedureCode,Criticality,Value) ->
496    io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
497    case ProcedureCode of
498        6 -> % Sec Mode
499	    wrapper_decode(?ranap, 'SecurityModeComplete',Value)
500    end.
501
502decode_unsuc_sm(ProcedureCode,Criticality,Value) ->
503    io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
504    case ProcedureCode of
505        6 -> % Sec Mode
506	    wrapper_decode(?ranap, 'SecurityModeReject',Value)
507    end.
508
509
510
511
512
513
514
515run_reset() ->
516    IUP = reset(),
517    io:format("Reset: ~w~n~n", [IUP]),
518    RanapIUP = ranap_pdu_contents(IUP, 9),                % 9 = Reset
519    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP),
520    EncRanapIUP = lists:flatten(Tmp2),
521    io:format("Coded Reset: ~w~n~n", [EncRanapIUP]),
522    {ok,{initiatingMessage,
523	 #'InitiatingMessage'{procedureCode=ProcedureCode,
524		    criticality=Criticality,
525		    value=DecGeneral}}} =
526	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUP),
527    io:format("Decoded Reset: ~w~n~n", [DecGeneral]),
528
529    IUP1 = reset_ack(),
530    io:format("Reset Ack:~w~n~n", [IUP1]),
531    RanapIUP1 = ranap_pdu_contents_suc(IUP1, 9),          % 9 = Reset
532    {ok, Tmp21} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP1),
533    EncRanapIUP1 = lists:flatten(Tmp21),
534    io:format("Coded Reset Ack: ~w~n~n", [EncRanapIUP1]),
535    {ok,{successfulOutcome,
536	 #'SuccessfulOutcome'{procedureCode=ProcedureCode1,
537		    criticality=Criticality1,
538		    value=DecGeneral1}}} =
539	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUP1),
540    io:format("Decoded Reset Ack: ~w~n~n", [DecGeneral1]).
541
542% decode_init_reset(ProcedureCode,Crit,Val) ->
543%     io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
544%     case ProcedureCode of
545%         9 -> % reset
546% 	    wrapper_decode(?ranap, 'Reset',Val)
547%     end.
548
549% decode_init_reset_ack(ProcedureCode,Crit,Val) ->
550%     io:format("ProcedureCode: ~w~n~n", [ProcedureCode]),
551%     case ProcedureCode of
552%         9 -> % reset
553% 	    wrapper_decode(?ranap, 'ResetAcknowledge',Val)
554%     end.
555
556
557
558
559
560
561
562
563
564run_reset_res() ->
565    IUP = reset_res([12,13,14,15,16,17,18,19,20]),
566    io:format("Reset Rsource: ~w~n~n", [IUP]),
567    RanapIUP = ranap_pdu_contents(IUP, 27),            % 27 = Reset Res
568    {ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP),
569    EncRanapIUP = lists:flatten(Tmp2),
570    io:format("Coded Reset Resource: ~w~n~n", [EncRanapIUP]),
571    {ok,{initiatingMessage,
572	 #'InitiatingMessage'{procedureCode=ProcedureCode,
573			      criticality=Criticality,
574			      value=DecGeneral}}} =
575	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapIUP),
576    io:format("Decoded Reset Resource: ~w~n~n", [DecGeneral]),
577%     case DecGeneral of
578% 	{ok,{'ResetResource',
579% 	     [{'ProtocolIE-Field',3,ignore,Value1},
580% 	      {'ProtocolIE-Field',4,ignore,Value2},
581% 	      {'ProtocolIE-Field',77,ignore,Value3},
582% 	      {'ProtocolIE-Field',86,ignore,Value4}],
583% 	     asn1_NOVALUE}} ->
584% 	    io:format("Value1: ~w~n~n", [Value1]),
585% 	    io:format("Value2: ~w~n~n", [Value2]),
586% 	    io:format("Value3: ~w~n~n", [Value3]),
587% 	    io:format("Value4: ~w~n~n", [Value4]),
588% 	    {ok,DecIPA} = wrapper_decode(?ranap, 'CN-DomainIndicator', Value1),
589% 	    {ok,{_Radio,DecEI}} = wrapper_decode(?ranap, 'Cause', Value2),
590% 	    {ok,DecRR} = wrapper_decode(?ranap, 'ResetResourceList', Value3),
591% 	    DecRRI = case DecRR of
592% 			 [[{'ProtocolIE-Field',78,ignore,Value5}]] ->
593% 			     {ok,{_apa,DecRI,_asn1novalue}} =
594% 				 wrapper_decode(?ranap, 'ResetResourceItem', Value5),
595% 			     DecRI
596% 		     end,
597% 	    {ok,{_Gl_id,PLMN_ID,RNC_ID}} = wrapper_decode(?ranap, 'GlobalRNC-ID', Value4),
598% 	    io:format("CN-DomainIndicator: ~w~n~n", [DecIPA]),
599% 	    io:format("Cause: ~w~n~n", [DecEI]),
600% 	    io:format("ResetResourceList: ~w~n~n", [DecRR]),
601% 	    io:format("  ResetResourceItem: ~w~n~n", [DecRRI]),
602% 	    io:format("GlobalRNC-ID: PLMN_ID: ~w, RNC_ID: ~w~n~n", [PLMN_ID,RNC_ID])
603%     end,
604
605    RSA = reset_res_ack([12,13,14,15,16,17,18,19,20]),
606    io:format("~n~nReset Resource Ack:~w~n~n", [RSA]),
607    RanapRSA = ranap_pdu_contents_suc(RSA, 27),             % 27 = Reset Res
608    {ok, Tmp12} = wrapper_encode(?ranap, 'RANAP-PDU', RanapRSA),
609    EncRanapRSA = lists:flatten(Tmp12),
610    io:format("Coded Reset Resource Ack: ~w~n~n", [EncRanapRSA]),
611    {ok,{successfulOutcome,
612	 #'SuccessfulOutcome'{procedureCode=ProcedureCode1,
613			      criticality=Criticality1,
614			      value=DecGeneral1}}} =
615	wrapper_decode(?ranap, 'RANAP-PDU', EncRanapRSA),
616    io:format("Decoded Reset Resource Ack: ~w~n~n", [DecGeneral1]).
617%     case DecGeneral1 of
618% 	{ok,{'ResetResourceAcknowledge',
619% 	     [{'ProtocolIE-Field',3,ignore,Value12},
620% 	      {'ProtocolIE-Field',77,ignore,Value32}],
621% 	     asn1_NOVALUE}} ->
622% 	    io:format("Value1: ~w~n~n", [Value12]),
623% 	    io:format("Value3: ~w~n~n", [Value32]),
624% 	    {ok,DecIPA2} = wrapper_decode(?ranap, 'CN-DomainIndicator', Value12),
625% 	    {ok,DecRR2} = wrapper_decode(?ranap, 'ResetResourceList', Value32),
626% 	    DecRRI2 = case DecRR2 of
627% 			 [[{'ProtocolIE-Field',78,ignore,Value52}]] ->
628% 			     {ok,{_apa2,DecRI2,_asn1novalue2}} =
629% 				 wrapper_decode(?ranap, 'ResetResourceItem', Value52),
630% 			     DecRI2
631% 		     end,
632% 	    io:format("CN-DomainIndicator: ~w~n~n", [DecIPA2]),
633% 	    io:format("ResetResourceList: ~w~n~n", [DecRR2]),
634% 	    io:format("  ResetResourceItem: ~w~n~n", [DecRRI2])
635%     end.
636
637
638
639
640
641%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
642%%
643%% Code for constructing RANAP messages
644%%
645%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
646
647rab_release_request() ->
648     #'RAB-AssignmentRequest'{
649       protocolIEs = rab_assign_request_release_ies()
650    }.
651
652rab_assign_request_release_ies() ->
653    [rab_assign_release_rab_release_list()].
654
655rab_assign_release_rab_release_list() ->
656    #'ProtocolIE-Field'{
657      id = 41,               % 41 = id-RAB-ReleaseList
658      criticality = ignore,%XXX
659      value = rab_release_list()
660    }.
661
662rab_release_list() ->
663    [release_lists()].
664
665release_lists() ->
666    [rab_release_item_ies()].
667
668rab_release_item_ies() ->
669    #'ProtocolIE-Field'{
670        id = 40,                                % 40 = id-RAB-ReleaseItem
671	criticality = ignore,%XXX
672	value = rab_release_item()}.
673
674rab_release_item() ->
675	   #'RAB-ReleaseItem'{'rAB-ID' = rab_id(),
676			      cause = cause_nas()}.
677
678cause_nas() ->
679    {nAS, 'normal-release'}.
680
681
682
683
684
685
686rab_create_request(Rabid, Teid, SgsnIP) ->
687    #'RAB-AssignmentRequest'{
688		    protocolIEs =
689		    rab_assign_create_request_ies(Rabid, Teid, SgsnIP)
690		   }.
691
692rab_assign_create_request_ies(Rabid, Teid, SgsnIP) ->
693    [rab_assign_setup_or_modify_list(Rabid, Teid, SgsnIP)].
694
695rab_assign_setup_or_modify_list(Rabid, Teid, SgsnIP) ->
696    #'ProtocolIE-Field'{
697       id = 54,                                  %id-RAB-SetupOrModifyList
698       criticality = ignore,%XXX
699       value = rab_setup_or_modify_list(Rabid, Teid, SgsnIP)
700       }.
701
702rab_setup_or_modify_list(Rabid, Teid, SgsnIP) ->
703    [setup_or_modify_lists(Rabid, Teid, SgsnIP)].
704
705setup_or_modify_lists(Rabid, Teid, SgsnIP) ->
706      [rab_setup_or_modify_item_ies(Rabid, Teid, SgsnIP)].
707
708rab_setup_or_modify_item_ies(Rabid, Teid, SgsnIP) ->
709      #'ProtocolIE-FieldPair'{
710      id = 53,
711      firstCriticality = reject, %{'Criticality',reject},
712      firstValue = rab_setup_or_modify_item_first(Rabid, Teid, SgsnIP),
713      secondCriticality = ignore, %{'Criticality', ignore}
714      secondValue = rab_setup_or_modify_item_second()
715     }.
716
717rab_setup_or_modify_item_first(Rabid, Teid, SgsnIP) ->
718    #'RAB-SetupOrModifyItemFirst'{
719				'rAB-ID' = Rabid, %ras_rab_id(Rabid),
720				'rAB-Parameters' = rab_parameters(),
721				userPlaneInformation = user_plane_information(),
722				transportLayerAddress = SgsnIP,
723				iuTransportAssociation = ras_iu_transport_association(Teid)
724			       }.
725
726ras_iu_transport_association(Teid) ->
727    {'gTP-TEI', Teid}.
728
729rab_id() ->
730    [0,1,0,1,0,1,0,1].
731
732rab_parameters() ->
733  #'RAB-Parameters'{
734        trafficClass = background,
735	'rAB-AsymmetryIndicator' = 'symmetric-bidirectional',
736	maxBitrate = [200000],
737	deliveryOrder = 'delivery-order-not-requested',
738	'maxSDU-Size' = 11,
739	'sDU-Parameters' = sdu_parameters(),
740	trafficHandlingPriority = 14 %{'TrafficHandlingPriority', 14} %14=lowest
741   }.
742
743user_plane_information() ->
744  #'UserPlaneInformation'{
745    userPlaneMode = 'support-mode-for-predefined-SDU-sizes',
746    'uP-ModeVersions' = 2#1010101010101010
747  }.
748
749transport_layer_address() ->
750  [1,1,0,0,1,1,0,0,1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,1,1,1].
751%  1               2               3             4
752
753iu_transport_association() ->
754    {'gTP-TEI', [31,32,33,34]}.
755
756sdu_parameters() ->
757    [#'SDU-Parameters_SEQOF'{
758       'sDU-ErrorRatio' = sdu_error_ratio(),
759       residualBitErrorRatio = residual_bit_error_ratio(),
760       deliveryOfErroneousSDU = no
761    }].
762
763sdu_error_ratio() ->
764   #'SDU-ErrorRatio'{
765      mantissa = 9,
766      exponent = 4
767   }.
768
769residual_bit_error_ratio() ->
770    #'ResidualBitErrorRatio'{
771	mantissa = 9,
772	exponent = 5
773    }.
774
775%allocationOrRetentionPriority() ->
776%  #'AllocationOrRetentionPriority'{
777%    priorityLevel = lowest,
778%    'pre-emptionCapability' = {'Pre-emptionCapability','can-trigger-pre-emption'},
779%    'pre-emptionVulnerability' = {'Pre-emptionVulnerability','not-vulnerable-to-pre-emption'},
780%    queuingAllowed = {'QueuingAllowed','queueing-allowed'}
781%  }.
782
783rab_setup_or_modify_item_second() -> % returns OpenType value
784    #'RAB-SetupOrModifyItemSecond'{
785				 'pDP-TypeInformation' = ['ipv4'],
786				 dataVolumeReportingIndication = 'do-not-report',
787				 'dl-GTP-PDU-SequenceNumber' = 1,
788				 'ul-GTP-PDU-SequenceNumber' = 2,
789				 'dl-N-PDU-SequenceNumber' = 0,
790				 'ul-N-PDU-SequenceNumber' = 0
791				}.
792
793
794
795
796rab_assignment_response_setup() ->
797     #'RAB-AssignmentResponse'{
798       protocolIEs = rab_assignement_response_ies_setup()
799    }.
800
801rab_assignement_response_ies_setup() ->
802    [rab_ass_rsp_setup_or_modified_list()].
803
804rab_ass_rsp_setup_or_modified_list() ->
805  #'ProtocolIE-Field'{
806    id = 52,                                  % 52=RAB-AssignRABSetupOrModifiedList
807    criticality = ignore,%XXX
808    value = rab_setup_or_modified_list()
809  }.
810
811rab_setup_or_modified_list() ->
812    [rab_setup_or_modified_item_list()].
813
814rab_setup_or_modified_item_list() ->
815    [rab_setup_or_modified_item_ies()].
816
817rab_setup_or_modified_item_ies() ->
818    #'ProtocolIE-Field'{
819       id = 51,                                    % 51 = RAB-SetupOrModifiedItemIEs
820       criticality = reject, %{'Criticality', reject},
821       value = rab_setup_or_modified_item()
822    }.
823
824rab_setup_or_modified_item() ->
825    #'RAB-SetupOrModifiedItem'{
826			    'rAB-ID' = rab_id(),
827			    transportLayerAddress = transport_layer_address(),
828			    iuTransportAssociation = iu_transport_association()
829			   }.
830
831
832
833
834
835
836rab_assignment_response_delete() ->
837     #'RAB-AssignmentResponse'{
838       protocolIEs = rab_assignement_response_ies_delete()
839    }.
840
841rab_assignement_response_ies_delete() ->
842    [rab_ass_rsp_rab_release_list()].
843
844rab_ass_rsp_rab_release_list() ->
845    #'ProtocolIE-Field'{
846      id = 43,                                  % 41 = RAB-AssignRABReleasedList
847      criticality = ignore,%XXX
848      value = rab_released_list()
849  }.
850
851rab_released_list() ->
852    [released_lists()].
853
854released_lists() ->
855    [rab_released_item_ies()].      % 'ReleasedLists'
856
857rab_released_item_ies() ->
858    #'ProtocolIE-Field'{
859      id = 42,                                  % 42 = RAB-ReleaseItemIEs
860      criticality = ignore,%XXX
861      value = rab_released_item()
862    }.
863
864rab_released_item() ->
865    #'RAB-ReleasedItem'{
866		   'rAB-ID' = rab_id()
867		  }.
868
869
870
871initial_ue() ->
872    #'InitialUE-Message'{
873	    protocolIEs = initial_ue_ies()
874	   }.
875
876initial_ue_ies() ->
877    [cn_domain_ind(),
878     init_lai(),
879     init_rac(),
880     init_sai(),
881     init_nas_pdu(),
882     init_iu_sign_con_id(),
883     init_global_rnc_id_initial_ue()].
884
885
886cn_domain_indicator() ->
887    'ps-domain'.
888
889init_lai() ->
890  #'ProtocolIE-Field'{
891    id = 15,                                 % 15 = LAI
892    criticality = ignore,%XXX
893    value = lai()
894  }.
895
896lai() ->
897    #'LAI'{'pLMN-ID' = [25,26,27],
898	   lAC = [25,26]}.
899
900init_rac() ->
901  #'ProtocolIE-Field'{
902    id = 55,                                % 55 = RAC
903    criticality = ignore,%XXX
904    value = rac()
905  }.
906
907rac() ->
908    [25].
909
910init_sai() ->
911  #'ProtocolIE-Field'{
912    id = 58,                                 % 58 = SAI
913    criticality = ignore,%XXX
914    value = sai()
915  }.
916
917sai() ->
918    #'SAI'{'pLMN-ID' = [28,29,30],                  %KOLLA!!!!
919	   lAC = [30,31],
920	   sAC = [32,33]}.
921
922init_nas_pdu() ->
923  #'ProtocolIE-Field'{
924    id = 16,                              % 16 = NAS-PDU
925    criticality = ignore,%XXX
926    value = pdu_ar()
927  }.
928
929pdu_ac()->
930    [16#08,
931     16#03].
932
933pdu_ar() ->
934    [16#08,		% Skip indicator | Protocol discriminator
935     16#01,		% Attach Request
936     16#01,16#b7,	% MsNetworkCapability
937     16#21,      	% Cksn | AttachType
938     16#55,16#06,	% DrxParameter
939     16#05,16#61,16#86,16#14,16#09,16#f7, % MsId
940     16#21,16#63,16#54,16#ac,16#dc,16#d5, % OldRai
941     16#0a,16#f0,16#f1,16#f2,16#f3,16#f4, % MsRaCap
942     16#f5,16#f6,16#f7,16#f8,16#f9        % MsRaCap continues
943     %%16#19,16#ab,16#cd,16#ef,             % P-TMSI signature
944     %%16#17,16#5b,                         % Requested READY timer
945     %%16#91                                % TMSI status
946    ].
947
948pdu_pdp() ->
949    [2#01001010,  % Transaction_id | Protocol_disc
950     2#01000001,  % Message_type
951     2#00001001,  % Nsapi
952     1,           % Llc_sapi (dummie_value)
953     1,1,1,1,     % QoS dummie_value=1 (19 octets)
954     1,1,1,1,1,
955     1,1,1,1,1,
956     1,1,1,1,1,
957     7,           % PDP_Address (Ltot=7),
958     2#00000001,  % ietf/etsi organisation
959     2#00100001,  % IPv4
960     198,         % IP address MSD
961     124,
962     56,
963     124,              % IP address LSD
964     1,                % APN optional (octet1=IEI)
965     25,               % APN total length
966     4,                % length lable1
967     116,101,115,116,  % lable1 = test
968     4,                % length lable2
969     116,101,115,116,  % lable2 = test
970     4,                % length lable3
971     116,101,115,116,  % lable3 = test
972     4,                % length lable3
973     116,101,115,116,  % lable4 = test
974     4,                % length label5
975     103,112,114,115
976    ].
977
978pdu_auth_rsp() ->
979    [8,16#13,0,1,2,3,16#21,2,0,1].
980
981pdu_auth_fail() ->
982    [8,16#1C,1,16#22,2,0,1].
983
984init_iu_sign_con_id() ->
985  #'ProtocolIE-Field'{
986    id = 79,                              % 79 = id-IuSigConId
987    criticality = ignore,%XXX
988    value = iu_sign_con_id()
989  }.
990
991iu_sign_con_id() ->
992    53245.
993% 		       [1,0,1,0,1,0,1,0,
994% 			1,0,1,0,1,0,1,0,
995% 			1,0,1,0,1,0,1,1]
996
997init_global_rnc_id_initial_ue() ->
998  #'ProtocolIE-Field'{
999    id = 86,                              % 86 = id-GlobalRNC-ID
1000    criticality = ignore,%XXX
1001    value = global_rnc_id()
1002  }.
1003
1004global_rnc_id() ->
1005    #'GlobalRNC-ID'{'pLMN-ID' = [10,11,12], 'rNC-ID' = 2048}.
1006
1007direct_transfer_cn() ->
1008    #'DirectTransfer'{
1009		    protocolIEs = direct_transfer_cn_ies()
1010		   }.
1011
1012direct_transfer_cn_ies() ->
1013    [dir_cn_nas_pdu(),
1014     dir_lai(),
1015     dir_rac()].
1016
1017dir_cn_nas_pdu() ->
1018    #'ProtocolIE-Field'{
1019      id = 16,                                % 16 = id-NAS-PDU
1020      criticality = ignore,%XXX
1021      value = pdu_auth_fail()
1022    }.
1023
1024dir_lai() ->
1025    #'ProtocolIE-Field'{
1026      id = 15,                                % 15 = id-LAI
1027      criticality = ignore,%XXX
1028      value = lai()
1029    }.
1030
1031dir_rac() ->
1032    #'ProtocolIE-Field'{
1033      id = 55,                                % 55 = id-RAC
1034      criticality = ignore,%XXX
1035      value = rac()
1036    }.
1037
1038
1039
1040
1041
1042
1043direct_transfer_rnc() ->
1044    #'DirectTransfer'{
1045		     protocolIEs = direct_transfer_rnc_ies()
1046		    }.
1047
1048direct_transfer_rnc_ies() ->
1049    [dir_rnc_nas_pdu(),
1050     dir_sapi()].
1051
1052dir_rnc_nas_pdu() ->
1053    #'ProtocolIE-Field'{
1054      id = 16,                                % 16 = id-NAS-PDU
1055      criticality = ignore,%XXX
1056      value = pdu_auth_rsp()
1057    }.
1058
1059dir_sapi() ->
1060    #'ProtocolIE-Field'{
1061      id = 59,                                % 59 = id-SAPI
1062      criticality = ignore,%XXX
1063      value = sapi()
1064    }.
1065
1066sapi() ->
1067    'normal-priority'.
1068
1069
1070
1071
1072
1073iu_release_command() ->
1074    #'Iu-ReleaseCommand'{
1075		    protocolIEs = iu_rel_command_ies()
1076		   }.
1077
1078iu_rel_command_ies() ->
1079    [iu_relcomcause_nas()].
1080
1081iu_relcomcause_nas() ->
1082    #'ProtocolIE-Field'{
1083        id = 4,                                   % 4 = Id-Cause
1084        criticality = ignore,%XXX
1085	value = cause()
1086    }.
1087
1088cause() ->
1089    cause_nas().
1090
1091% cause() ->
1092%     {ok,Bytes} =
1093%  	wrapper_encode(?ranap,'CauseNAS',
1094% 		      {'CauseNAS', 'normal-release'}),
1095%     Bytes.
1096
1097
1098
1099
1100
1101
1102iu_release_complete() ->
1103    #'Iu-ReleaseComplete'{
1104		     protocolIEs = iu_rel_comp_ies()
1105		    }.
1106
1107iu_rel_comp_ies() ->
1108  [].
1109%    'iu-RelCompRABDataVolumeReportList' = asn1_NOVALUE,
1110%    'iu-RelCompRABReleasedListIuRelComp' = asn1_NOVALUE,
1111%    'iu-RelCompCriticalityDiagnostics' = asn1_NOVALUE
1112%  }.
1113
1114
1115
1116
1117
1118
1119
1120
1121common_id() ->
1122    #'CommonID'{
1123	   protocolIEs = common_id_ies()
1124	  }.
1125
1126common_id_ies() ->
1127    [common_id_imsi()].
1128
1129common_id_imsi() ->
1130    #'ProtocolIE-Field'{
1131        id = 23,                            % 23 = Perm. NAS ID (IMSI)
1132        criticality = ignore, %ignore,%XXX      %XXX
1133	value = imsi()
1134    }.
1135
1136imsi() ->
1137    {iMSI, [1,2,3,4,5,6,7,8]}.
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148security_mode_cmd() ->
1149    #'SecurityModeCommand'{
1150		   protocolIEs = security_mode_cmd_ies()
1151		  }.
1152
1153security_mode_cmd_ies() ->
1154     [security_mode_cmd_integ(),
1155      security_mode_cmd_encr(),
1156      security_mode_cmd_keystat()
1157     ].
1158
1159security_mode_cmd_integ() ->
1160    #'ProtocolIE-Field'{
1161        id = 12,                            % 12 = Integ info
1162        criticality = ignore,%{'Criticality', ignore},
1163	value = integ_info()
1164    }.
1165
1166integ_info() ->
1167    #'IntegrityProtectionInformation'{
1168	    permittedAlgorithms = perm_integ_algs(),
1169	    key = key() }.
1170
1171perm_integ_algs() ->
1172    [integ_prot_alg()].
1173
1174integ_prot_alg() ->
1175    'standard-UMTS-integrity-algorithm-UIA1'.
1176
1177key() ->
1178    [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1179     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1180     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1181     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1182     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1183     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1184     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1185     1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0].
1186
1187
1188
1189security_mode_cmd_encr() ->
1190    #'ProtocolIE-Field'{
1191        id = 11,                            % 11 = Encr info
1192        criticality = ignore,%{'Criticality', ignore},
1193	value = encr_info()
1194    }.
1195
1196encr_info() ->
1197    #'EncryptionInformation'{
1198	   permittedAlgorithms = perm_encr_algs(),
1199	   key = key() }.
1200
1201perm_encr_algs() ->
1202    [encr_prot_alg()].
1203
1204encr_prot_alg() ->
1205    'standard-UMTS-encryption-algorith-UEA1'.
1206
1207security_mode_cmd_keystat() ->
1208    #'ProtocolIE-Field'{
1209        id = 75,                            % 75 = id-KeyStatus
1210        criticality = ignore,%{'Criticality', ignore},
1211	value = key_status()
1212    }.
1213
1214key_status() ->
1215    new.
1216
1217
1218
1219
1220
1221security_mode_cmp() ->
1222    #'SecurityModeComplete'{
1223		   protocolIEs = security_mode_cmp_ies()
1224		  }.
1225
1226security_mode_cmp_ies() ->
1227    [security_mode_cmp_ch_integ_prot_alg(),
1228     security_mode_cmp_ch_encr_alg()
1229    ].
1230
1231security_mode_cmp_ch_integ_prot_alg() ->
1232    #'ProtocolIE-Field'{
1233        id = 6,                            % 6 = Chosen Integ prot alg
1234        criticality = ignore,%XXX
1235	value = ch_integ_prot_alg()
1236    }.
1237
1238ch_integ_prot_alg() ->
1239    'standard-UMTS-integrity-algorithm-UIA1'.
1240
1241
1242security_mode_cmp_ch_encr_alg() ->
1243    #'ProtocolIE-Field'{
1244        id = 5,                            % 5 = Chosen Encr alg
1245        criticality = ignore,%XXX
1246	value = ch_encr_alg()
1247    }.
1248
1249ch_encr_alg() ->
1250    'standard-UMTS-encryption-algorith-UEA1'.
1251
1252
1253
1254
1255security_mode_rej() ->
1256    #'SecurityModeReject'{
1257		   protocolIEs = security_mode_rej_ies()
1258		  }.
1259
1260security_mode_rej_ies() ->
1261    [security_mode_rej_cause()].
1262
1263
1264security_mode_rej_cause() ->
1265    #'ProtocolIE-Field'{
1266        id = 4,                                % 4 = Id-Cause
1267        criticality = ignore,%XXX
1268	value = cause_radio()                   % Se Reset
1269    }.
1270
1271
1272
1273
1274
1275
1276
1277
1278reset() ->
1279    #'Reset'{
1280       protocolIEs = reset_ies()
1281      }.
1282reset_ies() ->
1283    [reset_cause(),
1284     cn_domain_ind(),     % Se initial Ue
1285     init_global_rnc_id() %  ---- " ----
1286    ].
1287
1288init_global_rnc_id() ->
1289  #'ProtocolIE-Field'{
1290    id = 86,                              % 86 = id-GlobalRNC-ID
1291    criticality = ignore,%XXX
1292    value = global_rnc_id()
1293  }.
1294
1295reset_cause() ->
1296    #'ProtocolIE-Field'{
1297        id = 4,                            % 4 = id-Cause
1298        criticality = ignore,%XXX
1299	value = cause_radio()
1300    }.
1301%cause_open() ->
1302%    {ok,Bytes} =
1303%	wrapper_encode(?ranap,'Cause', cause_radio()),
1304%    Bytes.
1305cause_radio() ->
1306    {radioNetwork, 'release-due-to-utran-generated-reason'}.
1307
1308
1309cn_domain_ind(IEs) when atom(IEs)->
1310    setelement(1,cn_domain_ind(),IEs).
1311
1312cn_domain_ind() ->
1313  #'ProtocolIE-Field'{
1314    id = 3,                                    % 3 = InitUE-MessageIEsCN-DomainIndicator
1315    criticality = ignore,%XXX
1316    value = cn_domain_indicator()
1317  }.
1318
1319
1320
1321
1322reset_ack() ->
1323    #'ResetAcknowledge'{
1324	   protocolIEs = reset_ack_ies()
1325	  }.
1326reset_ack_ies() ->
1327    [cn_domain_ind()].    % Se initial Ue
1328
1329
1330
1331
1332
1333reset_res(IuSCId) ->
1334    #'ResetResource'{
1335	   protocolIEs = reset_res_ies(IuSCId)
1336	  }.
1337
1338reset_res_ies(IuSCId) ->
1339    [
1340     cn_domain_ind()       % Se initial Ue
1341     ,reset_cause()        % Se reset
1342     ,reset_res_list(IuSCId)
1343     ,init_global_rnc_id_reset_res() %  ---- " ----
1344    ].
1345
1346init_global_rnc_id_reset_res() ->
1347  #'ProtocolIE-Field'{
1348    id = 86,                              % 86 = id-GlobalRNC-ID
1349    criticality = ignore,%XXX
1350    value = global_rnc_id()
1351  }.
1352
1353reset_res_list(IuSCId) ->
1354    #'ProtocolIE-Field'{
1355      id = 77,               % 77 = id-IuSigConIdList
1356      criticality = ignore,%XXX
1357      value = res_list(IuSCId)
1358    }.
1359
1360res_list(IuSCId) ->
1361    iu_Sig_Con_Id_list(IuSCId,[]).
1362
1363iu_Sig_Con_Id_list([],List) ->
1364    List;
1365
1366iu_Sig_Con_Id_list([IuSCId|T],List) ->
1367    Ie = [iu_Sig_Con_Id_ie(IuSCId)],
1368    iu_Sig_Con_Id_list(T,[Ie|List]).
1369
1370iu_Sig_Con_Id_ie(IuSCId) ->
1371    #'ProtocolIE-Field'{
1372        id = 78,              % 78 = id-IuSigConIdItem
1373	criticality = ignore,%XXX
1374	value = iu_Sig_Con_Id_item(IuSCId)}.
1375
1376iu_Sig_Con_Id_item(IuSCId) ->
1377	   #'ResetResourceItem'{
1378        	iuSigConId = IuSCId
1379% 53432
1380% 			     [1,0,1,0,1,0,1,0,
1381% 			      1,0,1,0,1,0,1,0,
1382% 			      1,0,1,0,1,0,1,0]
1383			      }.
1384
1385
1386reset_res_ack(IuSCId) ->
1387     #'ResetResourceAcknowledge'{
1388	       protocolIEs = reset_res_ack_ies(IuSCId)
1389	      }.
1390reset_res_ack_ies(IuSCId) ->
1391    [
1392     cn_domain_ind()       % Se initial Ue
1393     ,reset_res_list(IuSCId)     % Se Reset Ressource
1394    ].
1395
1396
1397int2bin(Int) ->
1398    EmptyList = [],
1399    BitList_b1 = [Int band 2#1 | EmptyList],
1400    BitList_b2 = [(Int bsr 1) band 2#1 | BitList_b1],
1401    BitList_b3 = [(Int bsr 2) band 2#1 | BitList_b2],
1402    BitList_b4 = [(Int bsr 3) band 2#1 | BitList_b3],
1403    BitList_b5 = [(Int bsr 4) band 2#1 | BitList_b4],
1404    BitList_b6 = [(Int bsr 5) band 2#1 | BitList_b5],
1405    BitList_b7 = [(Int bsr 6) band 2#1 | BitList_b6],
1406    BitList = [(Int bsr 7) band 2#1 | BitList_b7],
1407    io:format("~n~w~n", [BitList]).
1408
1409
1410%%%%%%%%%%%%%%%%% wrappers %%%%%%%%%%%%%%%%%%%%%%%%
1411
1412wrapper_encode(Module,Type,Value) ->
1413    case Module:encode(Type, Value) of
1414	{ok,X} when is_binary(X) ->
1415	    {ok, binary_to_list(X)};
1416	Error ->
1417	    Error
1418    end.
1419
1420wrapper_decode(Module, Type, Bytes) when is_binary(Bytes) ->
1421    Module:decode(Type, Bytes);
1422wrapper_decode(Module, Type, Bytes) when is_list(Bytes) ->
1423    Module:decode(Type, list_to_binary(Bytes)).
1424