comparison src/g23m-gprs/sndcp/sndcp_suap.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_suap.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 primitives as described in
19 | the SDL-documentation (SUA-statemachine)
20 +-----------------------------------------------------------------------------
21 */
22
23 #define ENTITY_SNDCP
24
25 /*==== INCLUDES =============================================================*/
26
27 #include "typedefs.h" /* to get Condat data types */
28 #include "vsi.h" /* to get a lot of macros */
29 #include "macdef.h"
30 #include "prim.h" /* to get the definitions of used SAP and directions */
31
32 #include "dti.h"
33
34 #include "sndcp.h" /* to get the global entity definitions */
35 #include "sndcp_f.h" /* to get the functions to access the global arrays*/
36
37 #include "sndcp_suaf.h" /* to get internal functions of service sua */
38 #include "sndcp_nus.h" /* to get signal functions to service nu */
39
40
41 /*==== CONST ================================================================*/
42
43 /*==== LOCAL VARS ===========================================================*/
44
45 /*==== PRIVATE FUNCTIONS ====================================================*/
46
47 /*==== PUBLIC FUNCTIONS =====================================================*/
48
49
50
51 /*
52 +------------------------------------------------------------------------------
53 | Function : sua_ll_data_cnf
54 +------------------------------------------------------------------------------
55 | Description : Handles the primitive LL_DATA_CNF
56 |
57 | Parameters : *ll_data_cnf - Ptr to primitive payload
58 |
59 +------------------------------------------------------------------------------
60 */
61 GLOBAL void sua_ll_data_cnf ( T_LL_DATA_CNF *ll_data_cnf )
62 {
63 BOOL complete = FALSE;
64 BOOL found = FALSE;
65 T_SEG_INFO* help = NULL;
66 T_SEG_INFO* last_help = NULL;
67 UBYTE sapi_index = 0;
68 UBYTE refi = 0;
69
70 TRACE_FUNCTION( "sua_ll_data_cnf" );
71
72 /*
73 * set service instance according to sapi in primitive
74 */
75 sndcp_get_sapi_index(ll_data_cnf->sapi, &sapi_index);
76 sndcp_data->sua = & sndcp_data->sua_base[sapi_index];
77
78 TRACE_EVENT_P1("ll_data_cnf->c_reference1: %d", ll_data_cnf->c_reference1);
79
80 switch( GET_STATE( SUA ) )
81 {
82 case SUA_LLC_NOT_RECEPTIVE_SUSPEND:
83 case SUA_LLC_RECEPTIVE_SUSPEND:
84 case SUA_LLC_NOT_RECEPTIVE:
85 case SUA_LLC_RECEPTIVE:
86 for (refi = 0; refi < ll_data_cnf->c_reference1; refi++) {
87 complete = FALSE;
88 found = FALSE;
89 last_help = NULL;
90 help = sndcp_data->sua->first_seg_info;
91 if (help == NULL) {
92 /*
93 * There are no N-PDUs buffered. CNF must be wrong.
94 */
95 if (ll_data_cnf != NULL) {
96 TRACE_EVENT("There are no N-PDUs buffered. CNF must be wrong.");
97 PFREE(ll_data_cnf);
98 }
99 return;
100 }
101 while (help != NULL && !found) {
102 TRACE_EVENT_P1("ll_data_cnf->reference1[refi].ref_nsapi: %d",
103 ll_data_cnf->reference1[refi].ref_nsapi);
104 TRACE_EVENT_P1("ll_data_cnf->reference1[refi].ref_npdu_num: %d",
105 ll_data_cnf->reference1[refi].ref_npdu_num);
106 TRACE_EVENT_P1("ll_data_cnf->reference1[refi].ref_seg_num: %d",
107 ll_data_cnf->reference1[refi].ref_seg_num);
108 if (ll_data_cnf->reference1[refi].ref_nsapi == help->nsapi &&
109 ll_data_cnf->reference1[refi].ref_npdu_num == help->npdu_number)
110 {
111 TRACE_EVENT_P1("ll_data_cnf->reference1[refi].ref_seg_num: %d",
112 ll_data_cnf->reference1[refi].ref_seg_num);
113 TRACE_EVENT_P1("old help->cnf_segments: %d", help->cnf_segments);
114 help->cnf_segments +=
115 1 << ll_data_cnf->reference1[refi].ref_seg_num;
116 TRACE_EVENT_P1("new help->cnf_segments: %d", help->cnf_segments);
117 found = TRUE;
118 }
119 last_help = help;
120 help = help->next;
121 }
122 if (!found) {
123 /*
124 * No affected NPDU found.
125 */
126 if (ll_data_cnf != NULL) {
127 TRACE_EVENT("No affected NPDU found.");
128 PFREE(ll_data_cnf);
129 }
130 return;
131 }
132
133 /*
134 * If the affected N-PDU is completely confirmed, notify service nu and
135 * free last_help.
136 */
137
138 TRACE_EVENT_P1("last_help->number_of_segments: %d",
139 last_help->number_of_segments);
140 TRACE_EVENT_P1("last_help->cnf_segments: %d",
141 last_help->cnf_segments);
142
143 if (last_help->number_of_segments == SNDCP_SEGMENT_NUMBERS_ACK) {
144 if (last_help->cnf_segments ==
145 SNDCP_MAX_COMPLETE /*4294967295 == 2**32 - 1*/) {
146 complete = TRUE;
147 }
148 } else if (last_help->cnf_segments ==
149 ((ULONG)(1 << last_help->number_of_segments) - 1)) {
150 complete = TRUE;
151 }
152 if (complete) {
153 /*
154 * Notify service nu.
155 */
156 sig_sua_nu_data_cnf
157 (ll_data_cnf->reference1[refi].ref_nsapi,
158 (UBYTE)ll_data_cnf->reference1[refi].ref_npdu_num);
159 /*
160 * Free last_help.
161 */
162 help = sndcp_data->sua->first_seg_info;
163 if (help == last_help) {
164 sndcp_data->sua->first_seg_info = help->next;
165 MFREE(help);
166 help = NULL;
167 } else {
168 T_SEG_INFO* help_next = help->next;
169 while (help->next != last_help) {
170 help = help->next;
171 }
172 help_next = help->next;
173 help->next = help_next->next;
174 MFREE (help_next);
175 }
176 }
177 } /* for refi */
178 break;
179 default:
180 TRACE_ERROR( "LL_DATA_CNF unexpected" );
181 break;
182 }
183 if (ll_data_cnf != NULL) {
184 PFREE(ll_data_cnf);
185 }
186
187 } /* sua_ll_data_cnf() */
188
189
190 #ifdef _SNDCP_DTI_2_
191 /*
192 +------------------------------------------------------------------------------
193 | Function : sua_ll_ready_ind
194 +------------------------------------------------------------------------------
195 | Description : Handles the primitive LL_READY_IND
196 |
197 | Parameters : *ll_ready_ind - Ptr to primitive payload
198 |
199 +------------------------------------------------------------------------------
200 */
201 GLOBAL void sua_ll_ready_ind ( T_LL_READY_IND *ll_ready_ind )
202 {
203 U8 sapi_index = 0;
204
205 TRACE_FUNCTION( "sua_ll_ready_ind" );
206
207 /*
208 * set service instance according to sapi in primitive
209 */
210 sndcp_get_sapi_index(ll_ready_ind->sapi, &sapi_index);
211 sndcp_data->sua = & sndcp_data->sua_base[sapi_index];
212
213 switch( GET_STATE( SUA ) )
214 {
215 case SUA_LLC_NOT_RECEPTIVE_SUSPEND:
216 /*
217 * Is queue with outgoing LL_DESC_REQs empty?
218 */
219 if (sndcp_data->sua->ll_desc_q_read ==
220 sndcp_data->sua->ll_desc_q_write) {
221 if (sndcp_data->sua->cia_state == CIA_IDLE) {
222 sua_next_sn_data_req(ll_ready_ind->sapi);
223 }
224 }
225 SET_STATE(SUA, SUA_LLC_RECEPTIVE_SUSPEND);
226 break;
227 case SUA_LLC_RECEPTIVE_SUSPEND:
228 break;
229 case SUA_LLC_NOT_RECEPTIVE:
230 /*
231 * Is queue with outgoing LL_DESC_REQs empty?
232 */
233 if (sndcp_data->sua->ll_desc_q_read ==
234 sndcp_data->sua->ll_desc_q_write) {
235 SET_STATE(SUA, SUA_LLC_RECEPTIVE);
236 if (sndcp_data->sua->cia_state == CIA_IDLE) {
237 sua_next_sn_data_req(ll_ready_ind->sapi);
238 }
239 } else { /* sndcp_data->sua.ll_desc_q is not empty */
240 /*
241 * Send next ll_desc_req from queue.
242 */
243 T_LL_DESC_REQ* ll_desc_req =
244 sndcp_data->sua->ll_desc_q[sndcp_data->sua->ll_desc_q_read];
245
246 U8 ll_desc_sapi = ll_desc_req->sapi;
247 U8 ll_desc_seg_pos = ll_desc_req->seg_pos;
248 U8 ll_desc_nsapi = sua_get_nsapi(ll_desc_req);
249
250 sndcp_data->sua->ll_desc_q[sndcp_data->sua->ll_desc_q_read] = NULL;
251 sndcp_data->sua->ll_desc_q_read =
252 (sndcp_data->sua->ll_desc_q_read + 1) % SNDCP_SEGMENT_NUMBERS_ACK;
253
254 #ifdef _SIMULATION_
255 su_send_ll_data_req_test(ll_desc_req);
256 #else /* _SIMULATION_ */
257 PSEND(hCommLLC, ll_desc_req);
258 #endif /* _SIMULATION_ */
259
260 if ((ll_desc_seg_pos & SEG_POS_LAST) > 0) {
261 sig_sua_nu_ready_ind( ll_desc_nsapi );
262 sua_next_sn_data_req( ll_desc_sapi );
263 sndcp_data->sua->cia_state = CIA_IDLE;
264 }
265
266
267 } /* sndcp_data->sua.ll_desc_q is not empty */
268 break;
269 case SUA_LLC_RECEPTIVE:
270 break;
271 default:
272 TRACE_ERROR( "LL_READY_IND unexpected" );
273 break;
274 }
275 if (ll_ready_ind != NULL) {
276 PFREE (ll_ready_ind);
277 }
278
279 } /* su_ll_ready_ind() */
280 #else /* _SNDCP_DTI_2_ */
281 /*
282 +------------------------------------------------------------------------------
283 | Function : sua_ll_ready_ind
284 +------------------------------------------------------------------------------
285 | Description : Handles the primitive LL_READY_IND
286 |
287 | Parameters : *ll_ready_ind - Ptr to primitive payload
288 |
289 +------------------------------------------------------------------------------
290 */
291 GLOBAL void sua_ll_ready_ind ( T_LL_READY_IND *ll_ready_ind )
292 {
293 UBYTE sapi_index = 0;
294
295 TRACE_FUNCTION( "sua_ll_ready_ind" );
296
297 /*
298 * set service instance according to sapi in primitive
299 */
300 sndcp_get_sapi_index(ll_ready_ind->sapi, &sapi_index);
301 sndcp_data->sua = & sndcp_data->sua_base[sapi_index];
302
303 switch( GET_STATE( SUA ) )
304 {
305 case SUA_LLC_NOT_RECEPTIVE_SUSPEND:
306 /*
307 * Is queue with outgoing LL_DATA_REQs empty?
308 */
309 if (sndcp_data->sua->ll_data_q_read ==
310 sndcp_data->sua->ll_data_q_write) {
311 if (sndcp_data->sua->cia_state == CIA_IDLE) {
312 sua_next_sn_data_req(ll_ready_ind->sapi);
313 }
314 }
315 SET_STATE(SUA, SUA_LLC_RECEPTIVE_SUSPEND);
316 break;
317 case SUA_LLC_RECEPTIVE_SUSPEND:
318 break;
319 case SUA_LLC_NOT_RECEPTIVE:
320 /*
321 * Is queue with outgoing LL_DATA_REQs empty?
322 */
323 if (sndcp_data->sua->ll_data_q_read ==
324 sndcp_data->sua->ll_data_q_write) {
325 SET_STATE(SUA, SUA_LLC_RECEPTIVE);
326 if (sndcp_data->sua->cia_state == CIA_IDLE) {
327 sua_next_sn_data_req(ll_ready_ind->sapi);
328 }
329 } else { /* sndcp_data->sua.ll_data_q is not empty */
330 /*
331 * Send next ll_data_req from queue.
332 */
333 T_LL_DATA_REQ* ll_data_req =
334 sndcp_data->sua->ll_data_q[sndcp_data->sua->ll_data_q_read];
335
336 UBYTE ll_data_sapi = ll_data_req->sapi;
337 UBYTE ll_data_seg_pos = ll_data_req->seg_pos;
338 UBYTE ll_data_nsapi = sua_get_nsapi(ll_data_req);
339
340 sndcp_data->sua->ll_data_q[sndcp_data->sua->ll_data_q_read] = NULL;
341 sndcp_data->sua->ll_data_q_read =
342 (sndcp_data->sua->ll_data_q_read + 1) % SNDCP_SEGMENT_NUMBERS_ACK;
343
344 PSEND (hCommLLC, ll_data_req);
345
346 if ((ll_data_seg_pos & SEG_POS_LAST) > 0) {
347 sig_sua_nu_ready_ind( ll_data_nsapi );
348 sua_next_sn_data_req( ll_data_sapi );
349 sndcp_data->sua->cia_state = CIA_IDLE;
350 }
351
352
353 } /* sndcp_data->sua.ll_data_q is not empty */
354 break;
355 case SUA_LLC_RECEPTIVE:
356 break;
357 default:
358 TRACE_ERROR( "LL_READY_IND unexpected" );
359 break;
360 }
361 if (ll_ready_ind != NULL) {
362 PFREE (ll_ready_ind);
363 }
364
365 } /* su_ll_ready_ind() */
366 #endif /* _SNDCP_DTI_2_ */