comparison src/g23m-gprs/sndcp/sndcp_sds.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
comparison
equal deleted inserted replaced
182:f02d0a0e1849 183:219afcfc6250
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : sndcp_sds.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This modul is part of the entity SNDCP and implements all
18 | functions to handles the incoming process internal signals as
19 | described in the SDL-documentation (SD-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23
24 #define ENTITY_SNDCP
25
26 /*==== INCLUDES =============================================================*/
27
28 #include "typedefs.h" /* to get Condat data types */
29 #include "vsi.h" /* to get a lot of macros */
30 #include "macdef.h"
31 #include "gsm.h" /* to get a lot of macros */
32 #include "prim.h" /* to get the definitions of used SAP and directions */
33
34 #include "dti.h"
35
36 #include "sndcp.h" /* to get the global entity definitions */
37 #include "sndcp_f.h" /* to get the functions to access the global arrays*/
38
39 #include "sndcp_sdf.h" /* to get the internal functions of this service */
40 #include "sndcp_nds.h" /* to get signals to nd service */
41
42
43 /*==== CONST ================================================================*/
44
45 /*==== LOCAL VARS ===========================================================*/
46
47 /*==== PRIVATE FUNCTIONS ====================================================*/
48
49 /*==== PUBLIC FUNCTIONS =====================================================*/
50
51 /*
52 +------------------------------------------------------------------------------
53 | Function : sig_cia_sd_cia_decomp_ind
54 +------------------------------------------------------------------------------
55 | Description : Handles the internal signal SIG_CIA_SD_CIA_DECOMP_CNF
56 |
57 | Parameters : cia_decomp_ind, p_id
58 |
59 +------------------------------------------------------------------------------
60 */
61 GLOBAL void sig_cia_sd_cia_decomp_ind (T_CIA_DECOMP_IND* cia_decomp_ind, UBYTE p_id)
62 {
63 UBYTE sapi_index = 0;
64 UBYTE sapi = 0;
65 UBYTE nsapi = cia_decomp_ind->pdu_ref.ref_nsapi;
66 BOOL rec = FALSE;
67 T_SN_UNITDATA_IND* sn_unitdata_ind = NULL;
68
69 TRACE_ISIG( "sig_cia_sd_cia_decomp_ind" );
70
71 /*
72 * set service instance according to sapi in primitive
73 */
74 sndcp_get_nsapi_sapi(cia_decomp_ind->pdu_ref.ref_nsapi, &sapi);
75 sndcp_get_sapi_index(sapi, &sapi_index);
76 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
77
78 switch( sndcp_get_nsapi_rec_state(nsapi) )
79 {
80 case SD_UNACK_DISCARD:
81 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
82 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
83 {
84 MALLOC(sn_unitdata_ind, sizeof(T_SN_UNITDATA_IND));
85
86 #ifdef _SNDCP_DTI_2_
87 sn_unitdata_ind->desc_list2.first = cia_decomp_ind->desc_list2.first;
88 sn_unitdata_ind->desc_list2.list_len =
89 cia_decomp_ind->desc_list2.list_len;
90 #endif /*_SNDCP_DTI_2_*/
91
92 #ifdef SNDCP_TRACE_ALL
93 sndcp_data->cia.cia_decomp_ind_number[nsapi] --;
94 TRACE_EVENT_P1("number of cia_decomp_ind: % d",
95 sndcp_data->cia.cia_decomp_ind_number[nsapi]);
96 #endif /* SNDCP_TRACE_ALL */
97
98
99 sn_unitdata_ind->nsapi = nsapi;
100
101 sn_unitdata_ind->p_id = p_id;
102 sd_is_nsapi_rec(nsapi, &rec);
103 if (rec) {
104 sig_sd_nd_unitdata_ind(nsapi, sn_unitdata_ind);
105 sd_set_nsapi_rec(nsapi, FALSE);
106 sd_get_unitdata_if_nec(sapi);
107 } else {
108 if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] NEQ NULL)
109 {
110 #ifndef NTRACE
111 #ifdef SNDCP_TRACE_ALL
112 TRACE_EVENT_P1("Discard cur_sn.. in %s", sndcp_data->sd->state_name);
113 #endif /* SNDCP_TRACE_ALL */
114 #endif /* NTRACE */
115 sd_delete_cur_sn_unitdata_ind(nsapi);
116 }
117 sndcp_data->sd->cur_sn_unitdata_ind[nsapi] = sn_unitdata_ind;
118 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_WAIT_NSAPI);
119 }
120 }
121 MFREE(cia_decomp_ind);
122 break;
123 default:
124 TRACE_ERROR( "SIG_CIA_SD_CIA_DECOMP_IND unexpected" );
125 MFREE_PRIM(cia_decomp_ind);
126 break;
127 }
128 } /* sig_cia_sd_cia_decomp_ind() */
129
130 /*
131 +------------------------------------------------------------------------------
132 | Function : sig_mg_sd_delete_npdus
133 +------------------------------------------------------------------------------
134 | Description : Handles the internal signal SIG_MG_SD_DELETE_NPDUS
135 |
136 | Parameters :
137 |
138 +------------------------------------------------------------------------------
139 */
140 GLOBAL void sig_mg_sd_delete_npdus (UBYTE nsapi,
141 UBYTE sapi)
142 {
143 UBYTE sapi_index = 0;
144
145 TRACE_ISIG( "sig_mg_sd_delete_npdus" );
146
147 /*
148 * set service instance according to sapi in primitive
149 */
150 sndcp_get_sapi_index(sapi, &sapi_index);
151 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
152
153 switch( sndcp_get_nsapi_rec_state(nsapi) )
154 {
155 case SD_UNACK_DISCARD:
156 break;
157 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
158 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
159 if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] != NULL) {
160 sd_delete_cur_sn_unitdata_ind(nsapi);
161 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT);
162 } else {
163 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT);
164 }
165 break;
166 case SD_UNACK_WAIT_NSAPI:
167 if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] != NULL) {
168 sd_delete_cur_sn_unitdata_ind(nsapi);
169 sd_get_unitdata_if_nec(sapi);
170 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT);
171 }
172 break;
173 default:
174 TRACE_ERROR( "SIG_MG_SD_DELETE_NPDUS unexpected" );
175 break;
176 }
177 } /* sig_mg_sd_delete_npdus() */
178
179 /*
180 +------------------------------------------------------------------------------
181 | Function : sig_mg_sd_getunitdata
182 +------------------------------------------------------------------------------
183 | Description : Handles the internal signal SIG_MG_SD_GETUNITDATA
184 |
185 | Parameters : sapi
186 |
187 +------------------------------------------------------------------------------
188 */
189 GLOBAL void sig_mg_sd_getunitdata (UBYTE sapi, UBYTE nsapi)
190 {
191 UBYTE sapi_index = 0;
192
193 TRACE_ISIG( "sig_mg_sd_getunitdata" );
194
195 /*
196 * set service instance according to sapi in primitive
197 */
198 sndcp_get_sapi_index(sapi, &sapi_index);
199 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
200
201 switch( GET_STATE(SD) )
202 {
203 case SD_DEFAULT:
204 sd_get_unitdata_if_nec(sapi);
205 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT);
206 break;
207 default:
208 TRACE_ERROR( "SIG_MG_SD_GETUNITDATA unexpected" );
209 break;
210 }
211 } /* sig_mg_sd_getunitdata() */
212
213
214
215
216 /*
217 +------------------------------------------------------------------------------
218 | Function : sig_nd_sd_getunitdata_req
219 +------------------------------------------------------------------------------
220 | Description : Handles the internal signal SIG_ND_SD_GETUNITDATA_REQ
221 |
222 | Parameters : affected sapi, affected nsapi
223 |
224 +------------------------------------------------------------------------------
225 */
226 GLOBAL void sig_nd_sd_getunitdata_req (UBYTE sapi,
227 UBYTE nsapi)
228 {
229 UBYTE sapi_index = 0;
230
231 TRACE_ISIG( "sig_nd_sd_getunitdata_req" );
232
233 /*
234 * set service instance according to sapi in primitive
235 */
236 sndcp_get_sapi_index(sapi, &sapi_index);
237 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
238
239 switch( sndcp_get_nsapi_rec_state(nsapi) )
240 {
241 case SD_UNACK_DISCARD:
242 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
243 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
244 sd_set_nsapi_rec(nsapi, TRUE);
245 break;
246 case SD_UNACK_WAIT_NSAPI:
247 if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] NEQ NULL) {
248 /*
249 * Send the just reassembled N-PDU (must be present because of state!).
250 */
251 sig_sd_nd_unitdata_ind(nsapi, sndcp_data->sd->cur_sn_unitdata_ind[nsapi]);
252 sndcp_data->sd->cur_sn_unitdata_ind[nsapi] = NULL;
253 sd_get_unitdata_if_nec(sapi);
254 sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT);
255 } else {
256 /*
257 * Set the receptive for the given nsapi.
258 */
259 sd_set_nsapi_rec(nsapi, TRUE);
260 }
261 break;
262 default:
263 TRACE_ERROR( "SIG_ND_SD_GETUNITDATA_REQ unexpected" );
264 break;
265 }
266 } /* sig_nd_sd_getunitdata_req() */
267
268 /*
269 +------------------------------------------------------------------------------
270 | Function : sig_mg_sd_reset_ind
271 +------------------------------------------------------------------------------
272 | Description : Handles the internal signal SIG_MG_SD_RESET_IND
273 |
274 | Parameters : affected nsapi
275 |
276 +------------------------------------------------------------------------------
277 */
278 GLOBAL void sig_mg_sd_reset_ind (UBYTE nsapi)
279 {
280 TRACE_ISIG( "sig_mg_sd_reset_ind" );
281
282 switch( sndcp_get_nsapi_rec_state(nsapi) )
283 {
284 case SD_UNACK_DISCARD:
285 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
286 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
287 case SD_UNACK_WAIT_NSAPI:
288 sndcp_data->cur_dcomp[nsapi] = 0;
289 sndcp_data->cur_pcomp[nsapi] = 0;
290 break;
291 default:
292 TRACE_ERROR( "SIG_MG_SD_RESET_IND unexpected" );
293 break;
294 }
295 } /* sig_mg_sd_reset_ind() */
296
297
298 /*
299 +------------------------------------------------------------------------------
300 | Function : sig_pd_sd_unitdata_ind
301 +------------------------------------------------------------------------------
302 | Description : Handles the signal PD_SD_UNITDATA_IND
303 |
304 | Parameters : *ll_unitdata_ind - Ptr to primitive payload
305 |
306 +------------------------------------------------------------------------------
307 */
308 GLOBAL void sig_pd_sd_unitdata_ind ( T_LL_UNITDATA_IND *ll_unitdata_ind )
309 {
310 UBYTE sapi_index = 0;
311 BOOL valid = FALSE;
312 UBYTE nsapi = 0;
313
314 TRACE_ISIG( "sig_pd_sd_unitdata_ind" );
315
316 /*
317 * set service instance according to sapi in primitive
318 */
319 sndcp_get_sapi_index(ll_unitdata_ind->sapi, &sapi_index);
320 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
321
322 sd_get_nsapi(ll_unitdata_ind, &nsapi);
323 sndcp_data->big_head[nsapi] = FALSE;
324
325 /*
326 * LLC has now "used up" it's pending LL_GETUNITDATA_REQ and will have
327 * to wait for the next one.
328 */
329 sndcp_data->sd->llc_may_send = FALSE;
330
331 switch( sndcp_get_nsapi_rec_state(nsapi) )
332 {
333 case SD_UNACK_DISCARD:
334 /*
335 * Invalid segments are discarded without error notification
336 */
337 sd_is_seg_valid(ll_unitdata_ind, &valid);
338 if (!valid) {
339 if (ll_unitdata_ind != NULL) {
340 UBYTE sapi = ll_unitdata_ind->sapi;
341 PFREE(ll_unitdata_ind);
342 sd_get_unitdata_if_nec(sapi);
343 }
344 return;
345 }
346 if (sd_f_bit(ll_unitdata_ind)) {
347 if (sd_m_bit(ll_unitdata_ind)) {
348 sd_un_d_f1_m1(ll_unitdata_ind);
349 } else {
350 sd_un_d_f1_m0(ll_unitdata_ind);
351 }
352 } else {
353 if (sd_m_bit(ll_unitdata_ind)) {
354 sd_un_d_f0_m1(ll_unitdata_ind);
355 } else {
356 sd_un_d_f0_m0(ll_unitdata_ind);
357 }
358 }
359 break;
360 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
361 /*
362 * Invalid segments are discarded without error notification
363 */
364 sd_is_seg_valid(ll_unitdata_ind, &valid);
365 if (!valid) {
366 if (ll_unitdata_ind != NULL) {
367 UBYTE sapi = ll_unitdata_ind->sapi;
368 PFREE (ll_unitdata_ind);
369 sd_get_unitdata_if_nec(sapi);
370 }
371 return;
372 }
373 if (sd_f_bit(ll_unitdata_ind)) {
374 if (sd_m_bit(ll_unitdata_ind)) {
375 sd_un_f_f1_m1(ll_unitdata_ind);
376 } else {
377 sd_un_f_f1_m0(ll_unitdata_ind);
378 }
379 } else {
380 if (sd_m_bit(ll_unitdata_ind)) {
381 sd_un_f_f0_m1(ll_unitdata_ind);
382 } else {
383 sd_un_f_f0_m0(ll_unitdata_ind);
384 }
385 }
386
387 break;
388 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
389 /*
390 * Invalid segments are discarded without error notification
391 */
392 sd_is_seg_valid(ll_unitdata_ind, &valid);
393 if (!valid) {
394 if (ll_unitdata_ind != NULL) {
395 UBYTE sapi = ll_unitdata_ind->sapi;
396 PFREE(ll_unitdata_ind);
397 sd_get_unitdata_if_nec(sapi);
398 }
399 return;
400 }
401 if (sd_f_bit(ll_unitdata_ind)) {
402 if (sd_m_bit(ll_unitdata_ind)) {
403 sd_un_s_f1_m1(ll_unitdata_ind);
404 } else {
405 sd_un_s_f1_m0(ll_unitdata_ind);
406 }
407 } else {
408 if (sd_m_bit(ll_unitdata_ind)) {
409 sd_un_s_f0_m1(ll_unitdata_ind);
410 } else {
411 sd_un_s_f0_m0(ll_unitdata_ind);
412 }
413 }
414
415 break;
416
417 case SD_UNACK_WAIT_NSAPI:
418 /*
419 * This NSAPI is waiting for the DL flow control prim
420 * from upper layer. The data for other NSAPI's could get passed,
421 * but since this packet is for the blocked NSAPI, the prim is discarded
422 * and next packet is not requested.
423 */
424 if (ll_unitdata_ind != NULL) {
425 PFREE (ll_unitdata_ind);
426 }
427 break;
428
429 default:
430 TRACE_ERROR( "SIG_PD_SD_UNITDATA_IND unexpected" );
431 if (ll_unitdata_ind != NULL) {
432 UBYTE sapi = ll_unitdata_ind->sapi;
433 PFREE (ll_unitdata_ind);
434 sd_get_unitdata_if_nec(sapi);
435 }
436 break;
437 }
438
439 } /* sig_pd_sd_unitdata_ind() */
440
441 /*
442 +------------------------------------------------------------------------------
443 | Function : sig_cia_sd_getunitdata
444 +------------------------------------------------------------------------------
445 | Description : Handles the internal signal SIG_CIA_SD_GETUNITDATA
446 |
447 | Parameters : sapi
448 |
449 +------------------------------------------------------------------------------
450 */
451 GLOBAL void sig_cia_sd_getunitdata (UBYTE sapi, UBYTE nsapi)
452 {
453 UBYTE sapi_index = 0;
454
455 TRACE_ISIG( "sig_cia_sd_getunitdata" );
456
457 /*
458 * set service instance according to sapi in primitive
459 */
460 sndcp_get_sapi_index(sapi, &sapi_index);
461 sndcp_data->sd = & sndcp_data->sd_base[sapi_index];
462
463 switch( sndcp_get_nsapi_rec_state(nsapi) )
464 {
465 case SD_UNACK_DISCARD:
466 case SD_UNACK_RECEIVE_FIRST_SEGMENT:
467 case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT:
468 case SD_UNACK_WAIT_NSAPI:
469 sd_get_unitdata_if_nec(sapi);
470 break;
471 default:
472 TRACE_ERROR( "SIG_CIA_SD_GETUNITDATA unexpected" );
473 break;
474 }
475 } /* sig_cia_sd_getunitdata() */
476