blob: 3ff063d973043d4defa1460cf1619e303d36662c [file] [log] [blame]
Harald Weltef6543322017-07-16 07:35:10 +02001module L1CTL_Test {
2 import from GSM_Types all;
3 import from Osmocom_Types all;
4 import from L1CTL_Types all;
Harald Welte52c713c2017-07-16 15:44:44 +02005 import from L1CTL_PortType all;
Harald Welte9e4725d2017-07-16 23:18:09 +02006 import from LAPDm_Types all;
Harald Weltef6543322017-07-16 07:35:10 +02007
8 const octetstring c_ul_param_req := '1300000000000000001d0000'O;
9 const octetstring c_ul_data_req := '060a0128284018001d000103490615004001c0000000000000000000000000'O;
10 const octetstring c_ul_ccch_mode_req := '1000000002000000'O;
11 const octetstring c_ul_reset_req := '0d00000002000000'O;
12 const octetstring c_ul_dm_est_req := '050000002800000007000367000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005'O;
13 const octetstring c_ul_rach_req := '040000000000000012010008'O;
14
15 const octetstring c_dl_data_ind := '03000000900003670015f5613f3f00002d063f0328e36712ead000002b2b2b2b2b2b2b2b2b2b2b'O;
16
17 type component dummy_CT {
Harald Welte52c713c2017-07-16 15:44:44 +020018 var charstring l1ctl_sock_path := "/tmp/osmocom_l2";
19 port L1CTL_PT L1CTL;
Harald Welte9e4725d2017-07-16 23:18:09 +020020 var ChannelDescription chan_desc;
Harald Welte66110f02017-07-16 21:05:18 +020021 };
22
Harald Welte52c713c2017-07-16 15:44:44 +020023
24 function f_init() runs on dummy_CT {
25 map(self:L1CTL, system:L1CTL);
26 L1CTL.send(L1CTL_connect:{path:=l1ctl_sock_path});
27 L1CTL.receive(L1CTL_connect_result:{result_code := SUCCESS, err:=omit});
Harald Welte66110f02017-07-16 21:05:18 +020028
29 L1CTL.send(t_L1ctlResetReq(L1CTL_RES_T_SCHED));
30 L1CTL.receive;
Harald Welte52c713c2017-07-16 15:44:44 +020031 }
32
Harald Welte9e4725d2017-07-16 23:18:09 +020033 /* a very ppor man's job to check if we can actually still decode the L1CTL binary messages */
34 testcase TC_selftest() runs on dummy_CT {
Harald Weltef6543322017-07-16 07:35:10 +020035 log("L1CTL_PARAM_REQ: ", dec_L1ctlUlMessage(c_ul_param_req));
36 log("L1CTL_DATA_REQ: ", dec_L1ctlUlMessage(c_ul_data_req));
37 log("L1CTL_CCCH_MODE_REQ: ", dec_L1ctlUlMessage(c_ul_ccch_mode_req));
38 log("L1CTL_RESET_REQ: ", dec_L1ctlUlMessage(c_ul_reset_req));
39 log("L1CTL_DM_EST_REQ: ", dec_L1ctlUlMessage(c_ul_dm_est_req));
40 log("L1CTL_RACH_REQ: ", dec_L1ctlUlMessage(c_ul_rach_req));
41 log("L1CTL_DATA_IND: ", dec_L1ctlDlMessage(c_dl_data_ind));
42 setverdict(pass);
43 }
Harald Welte52c713c2017-07-16 15:44:44 +020044
Harald Welte9e4725d2017-07-16 23:18:09 +020045 /* master function establishing a dedicated radio channel */
46 function f_establish_dcch() runs on dummy_CT {
47 var ImmediateAssignment imm_ass;
Harald Welte66110f02017-07-16 21:05:18 +020048 var GsmFrameNumber rach_fn;
49 var uint8_t ra := 23;
Harald Welte66110f02017-07-16 21:05:18 +020050
Harald Welte66110f02017-07-16 21:05:18 +020051 /* send FB/SB req to sync to cell */
52 f_L1CTL_FBSB(L1CTL, { false, 871 }, CCCH_MODE_COMBINED);
53 /* send RACH request and obtain FN at which it was sent */
54 rach_fn := f_L1CTL_RACH(L1CTL, ra);
55 /* wait for receiving matching IMM ASS */
56 imm_ass := f_L1CTL_WAIT_IMM_ASS(L1CTL, ra, rach_fn)
57 /* send DM_EST_REQ */
58 f_L1CTL_DM_EST_REQ_IA(L1CTL, imm_ass);
59
Harald Welte9e4725d2017-07-16 23:18:09 +020060 chan_desc := imm_ass.chan_desc;
61 }
Harald Welte66110f02017-07-16 21:05:18 +020062
Harald Welte9e4725d2017-07-16 23:18:09 +020063 /* send some data over an established dedicated radio channel */
64 function f_send_l2(template RslLinkId link_id, octetstring l2_data) runs on dummy_CT {
65 L1CTL.send(t_L1CTL_DATA_REQ(chan_desc.chan_nr, link_id, l2_data));
66 }
67
68 /* send some data over an established dedicated radio channel */
69 function f_send_l2_lapdm_b(template RslLinkId link_id, template LapdmFrameB b) runs on dummy_CT {
70 var octetstring l2_data := enc_LapdmFrameB(valueof(b));
71 L1CTL.send(t_L1CTL_DATA_REQ(chan_desc.chan_nr, link_id, l2_data));
72 }
73
74
75 function f_recv_l2() runs on dummy_CT return octetstring {
76 var L1ctlDlMessage dl;
77 var octetstring l2_data;
78 timer T := 5.0;
79 T.start
80 alt {
81 [] L1CTL.receive(t_L1CTL_DATA_IND(chan_desc.chan_nr)) -> value dl { l2_data := dl.payload.data_ind.payload };
82 [] L1CTL.receive { repeat; };
83 [] T.timeout { setverdict(fail, "Timeout waiting for DL data"); };
84 }
85 return l2_data;
86 }
87
88 /* release the dedicated radio channel */
89 function f_release_dcch() runs on dummy_CT {
90 L1CTL.send(t_L1CTL_DM_REL_REQ(chan_desc.chan_nr));
91 }
92
93 template LapdmFrameB LAPDm_SABM(template GsmSapi sapi, template octetstring payload) := {
94 addr := tr_LapdmAddr(sapi, false),
95 ctrl := t_LapdmCtrlSABM(true),
96 len := t_LapdmLengthIndicator(lengthof(payload)),
97 payload := payload
98 }
99
100 testcase TC_l1ctl() runs on dummy_CT {
101 f_init();
102
103 f_establish_dcch();
104
105 f_send_l2_lapdm_b(ts_RslLinkID_DCCH(0), LAPDm_SABM(0, 'FEFE'O));
106 f_recv_l2();
107
108 //f_send_l2(ts_RslLinkID_DCCH(0), '000102030405060708090a0b0c0d0e0f10111213141516'O);
109
110 f_release_dcch();
Harald Welte66110f02017-07-16 21:05:18 +0200111
112 setverdict(pass);
113 }
114
Harald Weltef6543322017-07-16 07:35:10 +0200115 control {
Harald Welte9e4725d2017-07-16 23:18:09 +0200116 execute(TC_selftest());
Harald Welte52c713c2017-07-16 15:44:44 +0200117 execute(TC_l1ctl());
Harald Weltef6543322017-07-16 07:35:10 +0200118 }
119}