comparison src/g23m-gprs/sndcp/sndcp_f.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : sndcp_f.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 : Contains global functions of SNDCP
18 +-----------------------------------------------------------------------------
19 */
20
21 #define ENTITY_SNDCP
22
23 /*==== INCLUDES =============================================================*/
24
25 #include "typedefs.h" /* to get Condat data types */
26 #include "vsi.h" /* to get a lot of macros */
27 #include "gsm.h" /* to get a lot of macros */
28 #include "prim.h" /* to get the definitions of used SAP and directions */
29 #include "macdef.h"
30
31 #include "dti.h"
32 #include "sndcp.h" /* to get the global entity definitions */
33 #include "sndcp_f.h" /* to get the functions to access the global arrays*/
34
35 #include "sndcp_nup.h" /* to get nu functions that will be called from
36 sndcp_sig_callback() */
37 #include "sndcp_ndp.h" /* to get nu functions that will be called from
38 sndcp_sig_callback() */
39
40
41 #include <string.h> /* to get memcpy() */
42
43
44 /*==== CONST ================================================================*/
45
46 #ifdef SNDCP_TRACE_IP_DATAGRAM
47 #ifndef CF_FAST_EXEC
48 static U8 bin_trace_ip_buf[1500];
49 #endif /* CF_FAST_EXEC */
50 #endif
51 /*==== LOCAL VARS ===========================================================*/
52
53
54
55
56 #ifdef TI_PS_OP_ICUT_SNDCP
57
58 /* PDP_TBR add SNDCP terminal loopback capability */
59 extern U8 SNDCP_LOOPBACK;
60 extern BOOL bufFull[SNDCP_NUMBER_OF_NSAPIS];
61 extern T_DTI2_DATA_IND *saveDti2_data_ind[SNDCP_NUMBER_OF_NSAPIS] ;
62
63 #endif /* TI_PS_OP_ICUT_SNDCP */
64
65
66
67
68
69 /*==== PRIVATE FUNCTIONS ====================================================*/
70
71 /*==== PUBLIC FUNCTIONS =====================================================*/
72
73
74 /*
75 +------------------------------------------------------------------------------
76 | Function : sndcp_get_nsapi_ack
77 +------------------------------------------------------------------------------
78 | Description : gets nsapi_ack_ra[nsapi]
79 |
80 | Parameters : UBYTE nsapi, BOOL* ack
81 |
82 +------------------------------------------------------------------------------
83 */
84 #ifndef CF_FAST_EXEC
85
86 GLOBAL void sndcp_get_nsapi_ack(UBYTE nsapi,
87 BOOL* ack)
88 {
89 TRACE_FUNCTION("sndcp_get_nsapi_ack");
90 {
91 *ack = sndcp_data->nsapi_ack_ra[nsapi];
92 }
93 }
94
95 #endif /* CF_FAST_EXEC */
96
97 #ifdef _SNDCP_DTI_2_
98 /*
99 +------------------------------------------------------------------------------
100 | Function : sndcp_get_nsapi_direction
101 +------------------------------------------------------------------------------
102 | Description : gets nsapi_ack_direction[nsapi]
103 | Values: HOME or NEIGHBOR from dti.h.
104 |
105 | Parameters : UBYTE nsapi, BOOL* direction
106 |
107 +------------------------------------------------------------------------------
108 */
109 #ifndef CF_FAST_EXEC
110
111 GLOBAL void sndcp_get_nsapi_direction(UBYTE nsapi,
112 U8* direction)
113 {
114 TRACE_FUNCTION("sndcp_get_nsapi_direction");
115 {
116 *direction = (U8)sndcp_data->nsapi_direction_ra[nsapi];
117 }
118 }
119
120 #endif /* CF_FAST_EXEC */
121
122 /*
123 +------------------------------------------------------------------------------
124 | Function : sndcp_get_nsapi_interface
125 +------------------------------------------------------------------------------
126 | Description : gets nsapi_interface_ra[nsapi]
127 |
128 | Parameters : UBYTE nsapi, U8 interface
129 |
130 +------------------------------------------------------------------------------
131 */
132 #ifndef CF_FAST_EXEC
133
134 GLOBAL void sndcp_get_nsapi_interface(UBYTE nsapi,
135 U8* interfac)
136 {
137 TRACE_FUNCTION("sndcp_get_nsapi_interface");
138 {
139 *interfac = sndcp_data->nsapi_interface_ra[nsapi];
140 }
141 }
142
143 #endif /* CF_FAST_EXEC */
144
145 /*
146 +------------------------------------------------------------------------------
147 | Function : sndcp_get_nsapi_linkid
148 +------------------------------------------------------------------------------
149 | Description : gets nsapi_linkid_ra[nsapi]
150 |
151 | Parameters : UBYTE nsapi, ULONG* linkid
152 |
153 +------------------------------------------------------------------------------
154 */
155 #ifndef CF_FAST_EXEC
156
157 GLOBAL void sndcp_get_nsapi_linkid(UBYTE nsapi,
158 ULONG* linkid)
159 {
160 TRACE_FUNCTION("sndcp_get_nsapi_linkid");
161 {
162 *linkid = sndcp_data->nsapi_linkid_ra[nsapi];
163 }
164 }
165
166 #endif /* CF_FAST_EXEC */
167
168 /*
169 +------------------------------------------------------------------------------
170 | Function : sndcp_get_nsapi_neighbor
171 +------------------------------------------------------------------------------
172 | Description : gets nsapi_neighbor_ra[nsapi]
173 |
174 | Parameters : UBYTE nsapi, UBYTE** neighbor
175 |
176 +------------------------------------------------------------------------------
177 */
178 #ifndef CF_FAST_EXEC
179
180 GLOBAL void sndcp_get_nsapi_neighbor(UBYTE nsapi,
181 UBYTE** neighbor)
182 {
183 TRACE_FUNCTION("sndcp_get_nsapi_neighbor");
184 {
185 *neighbor = sndcp_data->nsapi_neighbor_ra[nsapi];
186 }
187 }
188 #endif /* CF_FAST_EXEC */
189
190 #else /*_SNDCP_DTI_2_*/
191 /*
192 +------------------------------------------------------------------------------
193 | Function : sndcp_get_nsapi_direction
194 +------------------------------------------------------------------------------
195 | Description : gets nsapi_ack_direction[nsapi]
196 | Values: HOME or NEIGHBOR from dti.h.
197 |
198 | Parameters : UBYTE nsapi, BOOL* direction
199 |
200 +------------------------------------------------------------------------------
201 */
202 #ifndef CF_FAST_EXEC
203
204 GLOBAL void sndcp_get_nsapi_direction(UBYTE nsapi,
205 BOOL* direction)
206 {
207 TRACE_FUNCTION("sndcp_get_nsapi_direction");
208 {
209 *direction = sndcp_data->nsapi_direction_ra[nsapi];
210 }
211 }
212
213 #endif /* CF_FAST_EXEC */
214
215 /*
216 +------------------------------------------------------------------------------
217 | Function : sndcp_get_nsapi_interface
218 +------------------------------------------------------------------------------
219 | Description : gets nsapi_interface_ra[nsapi]
220 |
221 | Parameters : UBYTE nsapi, U8 interface
222 |
223 +------------------------------------------------------------------------------
224 */
225 #ifndef CF_FAST_EXEC
226
227 GLOBAL void sndcp_get_nsapi_interface(UBYTE nsapi,
228 U8* interfac)
229 {
230 TRACE_FUNCTION("sndcp_get_nsapi_interface");
231 {
232 *interfac = sndcp_data->nsapi_interface_ra[nsapi];
233 }
234 }
235
236 #endif /* CF_FAST_EXEC */
237
238 /*
239 +------------------------------------------------------------------------------
240 | Function : sndcp_get_nsapi_linkid
241 +------------------------------------------------------------------------------
242 | Description : gets nsapi_linkid_ra[nsapi]
243 |
244 | Parameters : UBYTE nsapi, ULONG* linkid
245 |
246 +------------------------------------------------------------------------------
247 */
248 #ifndef CF_FAST_EXEC
249
250 GLOBAL void sndcp_get_nsapi_linkid(UBYTE nsapi,
251 ULONG* linkid)
252 {
253 TRACE_FUNCTION("sndcp_get_nsapi_linkid");
254 {
255 *linkid = sndcp_data->nsapi_linkid_ra[nsapi];
256 }
257 }
258
259 #endif /* CF_FAST_EXEC */
260
261 /*
262 +------------------------------------------------------------------------------
263 | Function : sndcp_get_nsapi_neighbor
264 +------------------------------------------------------------------------------
265 | Description : gets nsapi_neighbor_ra[nsapi]
266 |
267 | Parameters : UBYTE nsapi, UBYTE** neighbor
268 |
269 +------------------------------------------------------------------------------
270 */
271 #ifndef CF_FAST_EXEC
272
273 GLOBAL void sndcp_get_nsapi_neighbor(UBYTE nsapi,
274 UBYTE** neighbor)
275 {
276 TRACE_FUNCTION("sndcp_get_nsapi_neighbor");
277 {
278 *neighbor = sndcp_data->nsapi_neighbor_ra[nsapi];
279 }
280 }
281
282 #endif /* CF_FAST_EXEC */
283
284 #endif /*_SNDCP_DTI_2_*/
285
286 /*
287 +------------------------------------------------------------------------------
288 | Function : sndcp_get_sapi_ack
289 +------------------------------------------------------------------------------
290 | Description : gets sapi_ack_ra["index of sapi"]
291 |
292 | Parameters : UBYTE sapi, BOOL* ack
293 |
294 +------------------------------------------------------------------------------
295 */
296 #ifndef CF_FAST_EXEC
297
298 GLOBAL void sndcp_get_sapi_ack(UBYTE sapi,
299 BOOL* ack)
300 {
301 TRACE_FUNCTION("sndcp_get_sapi_ack");
302 {
303 UBYTE sapi_index = 0;
304
305 sndcp_get_sapi_index(sapi, &sapi_index);
306 *ack = sndcp_data->sapi_ack_ra[sapi_index];
307 }
308 }
309
310 #endif /* CF_FAST_EXEC */
311
312 /*
313 +------------------------------------------------------------------------------
314 | Function : sndcp_get_sapi_stat
315 +------------------------------------------------------------------------------
316 | Description : gets sapi_state_ra[sapi]
317 |
318 | Parameters : UBYTE sapi, UBYTE* stat
319 |
320 +------------------------------------------------------------------------------
321 */
322 #ifndef CF_FAST_EXEC
323
324 GLOBAL void sndcp_get_sapi_state(UBYTE sapi,
325 USHORT* stat)
326 {
327 TRACE_FUNCTION("sndcp_get_sapi_state");
328 {
329 UBYTE sapi_index = 0;
330
331 sndcp_get_sapi_index(sapi, &sapi_index);
332 *stat = sndcp_data->sapi_state_ra[sapi_index];
333 }
334 }
335
336 #endif /* CF_FAST_EXEC */
337
338 /*
339 +------------------------------------------------------------------------------
340 | Function : sndcp_get_sapi_index
341 +------------------------------------------------------------------------------
342 | Description : gets the index (0, 1, 2, 3) for the given sapi (3, 5, 9, 11).
343 | This function is used when a sapi number serves as a key for one of the 4
344 | possible instances of services su and sd.
345 |
346 | Parameters : UBYTE sapi, UBYTE* index
347 |
348 +------------------------------------------------------------------------------
349 */
350 /*#if defined(CF_FAST_EXEC) || defined(_SIMULATION_) || \
351 defined(SNDCP_2to1) */
352
353 GLOBAL void sndcp_get_sapi_index(UBYTE sapi,
354 UBYTE* index)
355 {
356 TRACE_FUNCTION("sndcp_get_sapi_index");
357 {
358 if (sapi == 3) {
359 *index = 0;
360 } else if (sapi == 5) {
361 *index = 1;
362 } else if (sapi == 9) {
363 *index = 2;
364 } else if (sapi == 11) {
365 *index = 3;
366 }
367 }
368 }
369
370 /*#endif */ /* CF_FAST_EXEC || _SIMULATION_ || !REL99 || SNDCP_2to1 */
371
372 /*
373 +------------------------------------------------------------------------------
374 | Function : sndcp_get_nsapi_prio
375 +------------------------------------------------------------------------------
376 | Description : sets prio to nsapi_prio_ra[nsapi]
377 |
378 | Parameters : UBYTE nsapi, UBYTE* prio
379 |
380 +------------------------------------------------------------------------------
381 */
382 #ifndef CF_FAST_EXEC
383
384 GLOBAL void sndcp_get_nsapi_prio(UBYTE nsapi,
385 UBYTE* prio)
386 {
387 TRACE_FUNCTION("sndcp_get_nsapi_prio");
388 {
389 *prio = sndcp_data->nsapi_prio_ra[nsapi];
390 }
391 }
392
393 #endif /* CF_FAST_EXEC */
394
395 #ifdef REL99
396 /*
397 +------------------------------------------------------------------------------
398 | Function : sndcp_get_nsapi_pktflowid
399 +------------------------------------------------------------------------------
400 | Description : gets packet flow id form nsapi_pktflowid_ra[nsapi]
401 |
402 | Parameters : UBYTE nsapi, UBYTE* pkt_flow_id
403 |
404 +------------------------------------------------------------------------------
405 */
406 #ifndef CF_FAST_EXEC
407
408 GLOBAL void sndcp_get_nsapi_pktflowid(U8 nsapi, U16* pkt_flow_id)
409
410 {
411 TRACE_FUNCTION("sndcp_get_nsapi_pktflowid");
412 {
413 *pkt_flow_id = sndcp_data->nsapi_pktflowid_ra[nsapi];
414 }
415 }
416
417 #endif /* CF_FAST_EXEC */
418
419 #endif /*REL99*/
420
421 /*
422 +------------------------------------------------------------------------------
423 | Function : sndcp_get_nsapi_qos
424 +------------------------------------------------------------------------------
425 | Description : gets nsapi_qos_ra[nsapi]
426 |
427 | Parameters : UBYTE nsapi, T_snsm_qos* qos
428 |
429 +------------------------------------------------------------------------------
430 */
431 #ifndef CF_FAST_EXEC
432
433 GLOBAL void sndcp_get_nsapi_qos(UBYTE nsapi,
434 T_snsm_qos* qos)
435 {
436 TRACE_FUNCTION("sndcp_get_nsapi_qos");
437 {
438 qos->delay = sndcp_data->nsapi_qos_ra[nsapi].delay;
439 qos->relclass = sndcp_data->nsapi_qos_ra[nsapi].relclass;
440 qos->peak = sndcp_data->nsapi_qos_ra[nsapi].peak;
441 qos->preced = sndcp_data->nsapi_qos_ra[nsapi].preced;
442 qos->mean = sndcp_data->nsapi_qos_ra[nsapi].mean;
443 }
444 }
445
446 #endif /* CF_FAST_EXEC */
447
448 /*
449 +------------------------------------------------------------------------------
450 | Function : sndcp_get_nsapi_sapi
451 +------------------------------------------------------------------------------
452 | Description : gets nsapi_sapi_ra[nsapi]
453 |
454 | Parameters : UBYTE nsapi, UBYTE* sapi
455 |
456 +------------------------------------------------------------------------------
457 */
458 #ifndef CF_FAST_EXEC
459
460 GLOBAL void sndcp_get_nsapi_sapi(UBYTE nsapi,
461 UBYTE* sapi)
462 {
463 TRACE_FUNCTION("sndcp_get_nsapi_sapi");
464 {
465 *sapi = sndcp_data->nsapi_sapi_ra[nsapi];
466 }
467 }
468
469 #endif /* CF_FAST_EXEC */
470
471 /*
472 +------------------------------------------------------------------------------
473 | Function : sndcp_get_nsapi_state
474 +------------------------------------------------------------------------------
475 | Description : gets nsapi_state_ra[nsapi]
476 |
477 | Parameters : UBYTE nsapi, USHORT* state
478 |
479 +------------------------------------------------------------------------------
480 */
481 #ifndef CF_FAST_EXEC
482
483 GLOBAL void sndcp_get_nsapi_state(UBYTE nsapi,
484 USHORT* state)
485 {
486 TRACE_FUNCTION("sndcp_get_nsapi_state");
487 {
488 *state = sndcp_data->nsapi_state_ra[nsapi];
489 }
490 }
491
492 #endif /* CF_FAST_EXEC */
493
494 /*
495 +------------------------------------------------------------------------------
496 | Function : sndcp_is_nsapi_data_compressed
497 +------------------------------------------------------------------------------
498 | Description : If nsapi uses data compression then compressed is set to TRUE,
499 | else to FALSE.
500 |
501 | Parameters : UBYTE nsapi, BOOL* compressed
502 |
503 +------------------------------------------------------------------------------
504 */
505 #ifndef CF_FAST_EXEC
506
507 GLOBAL void sndcp_is_nsapi_data_compressed(UBYTE nsapi,
508 BOOL* compressed)
509 {
510 USHORT nsapis = sndcp_data->cia.cur_xid_block.v42.nsapis;
511
512 TRACE_FUNCTION("sndcp_is_nsapi_data_compressed");
513
514 *compressed = (nsapis & (1 << nsapi)) > 0;
515
516 }
517
518 #endif /* CF_FAST_EXEC */
519
520 /*
521 +------------------------------------------------------------------------------
522 | Function : sndcp_is_nsapi_used
523 +------------------------------------------------------------------------------
524 | Description : sets b to TRUE if the nsapi is already in use, otherwise to
525 | FALSE
526 |
527 | Parameters : UBYTE nsapi, BOOL* b
528 |
529 +------------------------------------------------------------------------------
530 */
531 /*#if defined(CF_FAST_EXEC) || defined(_SIMULATION_) || \
532 defined (SNDCP_2to1) */
533
534 GLOBAL void sndcp_is_nsapi_used(UBYTE nsapi,
535 BOOL* b)
536 {
537 TRACE_FUNCTION("sndcp_is_nsapi_used");
538 {
539 *b = sndcp_data->nsapi_used_ra[nsapi];
540 }
541 }
542
543 /*#endif */ /* CF_FAST_EXEC || _SIMULATION_ || !REL99 || SNDCP_2to1 */
544
545 /*
546 +------------------------------------------------------------------------------
547 | Function : sndcp_is_nsapi_header_compressed
548 +------------------------------------------------------------------------------
549 | Description : If nsapi uses header compression then compressed is set to TRUE,
550 | else to FALSE.
551 |
552 | Parameters : UBYTE nsapi, BOOL* compressed
553 |
554 +------------------------------------------------------------------------------
555 */
556 #ifndef CF_FAST_EXEC
557
558 GLOBAL void sndcp_is_nsapi_header_compressed(UBYTE nsapi,
559 BOOL* compressed)
560 {
561 USHORT nsapis = sndcp_data->cia.cur_xid_block.vj.nsapis;
562
563 TRACE_FUNCTION("sndcp_is_nsapi_header_compressed");
564
565 *compressed = ((nsapis & (1 << nsapi)) > 0) &&
566 sndcp_data->cia.cur_xid_block.vj.is_set;
567
568 }
569
570 #endif /* CF_FAST_EXEC */
571
572 /*
573 +------------------------------------------------------------------------------
574 | Function : sndcp_mean_trace
575 +------------------------------------------------------------------------------
576 | Description : traces the mean thruput for given
577 |
578 | Parameters : nsapi, direction, ack_mode
579 |
580 +------------------------------------------------------------------------------
581 */
582 #ifndef CF_FAST_EXEC
583
584 GLOBAL void sndcp_mean_trace(UBYTE nsapi,
585 UBYTE direction,
586 UBYTE ack_mode,
587 USHORT len)
588 {
589 T_TIME* start_time_ra = NULL;
590 T_TIME* cur_time_ra = NULL;
591 ULONG* cur_num_ra = NULL;
592 ULONG* cur_pac_ra = NULL;
593
594 TRACE_FUNCTION("sndcp_mean_trace");
595
596 if (direction == SNDCP_MEAN_UP) {
597 if (ack_mode == SNDCP_MEAN_ACK) {
598 start_time_ra = sndcp_data->start_time_uplink_ack;
599 cur_time_ra = sndcp_data->cur_time_uplink_ack;
600 cur_num_ra = sndcp_data->cur_num_uplink_ack;
601 cur_pac_ra = sndcp_data->cur_pac_uplink_ack;
602 } else {
603 start_time_ra = sndcp_data->start_time_uplink_unack;
604 cur_time_ra = sndcp_data->cur_time_uplink_unack;
605 cur_num_ra = sndcp_data->cur_num_uplink_unack;
606 cur_pac_ra = sndcp_data->cur_pac_uplink_unack;
607 }
608 } else {
609 if (ack_mode == SNDCP_MEAN_ACK) {
610 start_time_ra = sndcp_data->start_time_downlink_ack;
611 cur_time_ra = sndcp_data->cur_time_downlink_ack;
612 cur_num_ra = sndcp_data->cur_num_downlink_ack;
613 cur_pac_ra = sndcp_data->cur_pac_downlink_ack;
614 } else {
615 start_time_ra = sndcp_data->start_time_downlink_ack;
616 cur_time_ra = sndcp_data->cur_time_downlink_ack;
617 cur_num_ra = sndcp_data->cur_num_downlink_unack;
618 cur_pac_ra = sndcp_data->cur_pac_downlink_unack;
619 }
620 }
621
622 /*
623 * Increment number of packets.
624 */
625 cur_pac_ra[nsapi] ++;
626
627
628 if (start_time_ra[nsapi] == 0) {
629 vsi_t_time(VSI_CALLER &start_time_ra[nsapi]);
630 cur_num_ra[nsapi] += len;
631 } else {
632
633 ULONG mean = 0;
634 ULONG delta_millis = 0;
635
636 vsi_t_time(VSI_CALLER &cur_time_ra[nsapi]);
637 cur_num_ra[nsapi] += len;
638
639 delta_millis = cur_time_ra[nsapi] -
640 start_time_ra[nsapi];
641 if (direction == SNDCP_MEAN_UP) {
642 if (delta_millis > 0) {
643 mean = (cur_num_ra[nsapi] * 1000) / delta_millis;
644 TRACE_EVENT_P4(
645 "nsapi %d up. %d octets in %d ms. %d octets per sec.",
646 nsapi,
647 cur_num_ra[nsapi],
648 delta_millis,
649 mean
650 );
651 } else {
652 TRACE_EVENT_P3(
653 "nsapi %d up. %d octets in %d ms.",
654 nsapi,
655 cur_num_ra[nsapi],
656 delta_millis
657 );
658 }
659
660 } else { /* not (direction == SNDCP_MEAN_UP) */
661 if (delta_millis > 0) {
662 mean = (cur_num_ra[nsapi] * 1000) / delta_millis;
663 TRACE_EVENT_P4(
664 "nsapi %d down. %d octets in %d ms. %d octets per sec.",
665 nsapi,
666 cur_num_ra[nsapi],
667 delta_millis,
668 mean
669 );
670 } else {
671 TRACE_EVENT_P3(
672 "nsapi %d down. %d octets in %d ms.",
673 nsapi,
674 cur_num_ra[nsapi],
675 delta_millis
676 );
677 }
678 } /* not (direction == SNDCP_MEAN_UP) */
679
680 }
681
682 }
683
684 #endif /* CF_FAST_EXEC */
685
686
687 /*
688 +------------------------------------------------------------------------------
689 | Function : sndcp_reset_xid_block
690 +------------------------------------------------------------------------------
691 | Description : Resets the given T_XID_BLOCK to default values.
692 |
693 | Parameters : T_XID_BLOCK* xid_block
694 |
695 +------------------------------------------------------------------------------
696 */
697 #ifndef CF_FAST_EXEC
698
699 GLOBAL void sndcp_reset_xid_block (T_XID_BLOCK* xid_block)
700 {
701 TRACE_FUNCTION( "sndcp_reset_xid_block" );
702
703 /*
704 * Reset all flags for optional compression field parameters.
705 */
706 xid_block->version_set = FALSE;
707 xid_block->v42.is_set = FALSE;
708 xid_block->vj.is_set = FALSE;
709
710 xid_block->v42.nsapis_set = FALSE;
711 xid_block->v42.p0_set = FALSE;
712 xid_block->v42.p1_set = FALSE;
713 xid_block->v42.p2_set = FALSE;
714 xid_block->vj.nsapis_set = FALSE;
715 xid_block->vj.s0_m_1_set = FALSE;
716 /*
717 * Set fields to default values.
718 */
719 xid_block->v42.nsapis = SNDCP_NSAPIS_DEFAULT;
720 xid_block->v42.p0 = SNDCP_V42_DEFAULT_DIRECTION;
721 xid_block->v42.p1 = SNDCP_V42_DEFAULT_P1;
722 xid_block->v42.p2 = SNDCP_V42_DEFAULT_P2;
723
724 xid_block->vj.nsapis = SNDCP_NSAPIS_DEFAULT;
725 xid_block->vj.s0_m_1 = SNDCP_VJ_DEFAULT_S0_M_1;
726
727
728 } /* sndcp_reset_xid_block() */
729
730 #endif /* CF_FAST_EXEC */
731
732 #ifdef _SIMULATION_
733 /*
734 +------------------------------------------------------------------------------
735 | Function : sndcp_sdu_to_desc_list
736 +------------------------------------------------------------------------------
737 | Description : copies the given sdu to the given desc_list
738 |
739 | Parameters : T_sdu* sdu,
740 | T_desc_list* desc_list
741 |
742 +------------------------------------------------------------------------------
743 */
744 #ifdef _SNDCP_DTI_2_
745 GLOBAL void sndcp_sdu_to_desc_list(T_sdu* sdu, T_desc_list2* desc_list) {
746 T_desc2 *desc = NULL;
747 T_desc2 *last_desc = NULL;
748 #else /*_SNDCP_DTI_2_*/
749 GLOBAL void sndcp_sdu_to_desc_list(T_sdu* sdu, T_desc_list* desc_list) {
750 T_desc *desc = NULL;
751 T_desc *last_desc = NULL;
752 #endif /*_SNDCP_DTI_2_*/
753 USHORT sdu_index;
754 USHORT length;
755
756
757 /*
758 * Begin at the first relevant octet.
759 */
760 sdu_index = sdu->o_buf/8;
761
762 /*
763 * Initialise descriptor list length.
764 */
765 desc_list->list_len = 0;
766
767
768 /*
769 * Copy complete SDU to descriptor list using descriptors of max. 10 bytes.
770 */
771 while (sdu_index < sdu->l_buf / 8)
772 {
773 /*
774 * Calculate length of descriptor data (= length of remaining sdu buffer
775 * with a maximum of 10)
776 */
777 length = (sdu_index + 10 < sdu->l_buf / 8) ?
778 10 : (sdu->l_buf / 8 - sdu_index);
779
780 /*
781 * Allocate the necessary size for the data descriptor. The size is
782 * calculated as follows:
783 * - take the size of a descriptor structure
784 * - subtract one because of the array buffer[1] to get the size of
785 * descriptor control information
786 * - add number of octets of descriptor data
787 */
788 #ifdef _SNDCP_DTI_2_
789 MALLOC (desc, (USHORT)(sizeof(T_desc2) - 1 + length));
790 #else /*_SNDCP_DTI_2_*/
791 MALLOC (desc, (USHORT)(sizeof(T_desc) - 1 + length));
792 #endif /*_SNDCP_DTI_2_*/
793 /*
794 * Fill descriptor control information.
795 */
796 desc->next = (ULONG)NULL;
797 desc->len = length;
798 #ifdef _SNDCP_DTI_2_
799 desc->offset = 0;
800 desc->size = desc->len;
801 #endif
802 /*
803 * Add length of descriptor data to list length.
804 */
805 desc_list->list_len += length;
806
807 /*
808 * Copy user data from SDU to descriptor.
809 */
810 if (length>0)
811 {
812 memcpy (desc->buffer, &sdu->buf[sdu_index], length);
813 }
814 sdu_index += length;
815
816 if (last_desc)
817 {
818 /*
819 * Add this descriptor (not the first) to the descriptor list.
820 */
821 last_desc->next = (ULONG)desc;
822 }
823 else
824 {
825 /*
826 * Insert first descriptor in descriptor list.
827 */
828 desc_list->first = (ULONG)desc;
829 }
830
831 /*
832 * Store this descriptor for later use.
833 */
834 last_desc = desc;
835 }
836
837 }
838 #endif /* _SIMULATION_ */
839
840
841
842 /*
843 +------------------------------------------------------------------------------
844 | Function : sndcp_set_nsapi_ack
845 +------------------------------------------------------------------------------
846 | Description : sets nsapi_ack_ra[nsapi] to ack
847 |
848 | Parameters : UBYTE nsapi, BOOL ack
849 |
850 +------------------------------------------------------------------------------
851 */
852 #ifndef CF_FAST_EXEC
853
854 GLOBAL void sndcp_set_nsapi_ack(UBYTE nsapi,
855 BOOL ack)
856 {
857 TRACE_FUNCTION(" sndcp_set_nsapi_ack ");
858 {
859 sndcp_data->nsapi_ack_ra[nsapi] = ack;
860 }
861 }
862
863 #endif /* CF_FAST_EXEC */
864
865 /*
866 +------------------------------------------------------------------------------
867 | Function : sndcp_set_nsapi_direction
868 +------------------------------------------------------------------------------
869 | Description : sets nsapi_direction_ra[nsapi] to direction
870 |
871 | Parameters : UBYTE nsapi, BOOL direction
872 |
873 +------------------------------------------------------------------------------
874 */
875 #ifndef CF_FAST_EXEC
876
877 GLOBAL void sndcp_set_nsapi_direction(UBYTE nsapi,
878 BOOL direction)
879 {
880 TRACE_FUNCTION(" sndcp_set_nsapi_direction ");
881 #ifdef _SNDCP_DTI_2_
882 if (direction == DTI_CHANNEL_TO_LOWER_LAYER) {
883 sndcp_data->nsapi_direction_ra[nsapi] = DTI_CHANNEL_TO_LOWER_LAYER;
884 } else {
885 sndcp_data->nsapi_direction_ra[nsapi] = DTI_CHANNEL_TO_HIGHER_LAYER;
886 #else /*_SNDCP_DTI_2_*/
887 if (direction == SN_HOME) {
888 sndcp_data->nsapi_direction_ra[nsapi] = HOME;
889 } else {
890 sndcp_data->nsapi_direction_ra[nsapi] = NEIGHBOR;
891 #endif /*_SNDCP_DTI_2_*/
892 }
893 }
894
895 #endif /* CF_FAST_EXEC */
896
897 /*
898 +------------------------------------------------------------------------------
899 | Function : sndcp_set_nsapi_interface
900 +------------------------------------------------------------------------------
901 | Description : sets nsapi_interface_ra[nsapi] to interfac
902 |
903 | Parameters : UBYTE nsapi, U8 interfac
904 |
905 +------------------------------------------------------------------------------
906 */
907 #ifndef CF_FAST_EXEC
908
909 GLOBAL void sndcp_set_nsapi_interface(UBYTE nsapi,
910 U8 interfac)
911 {
912 TRACE_FUNCTION(" sndcp_set_nsapi_interface ");
913 {
914 sndcp_data->nsapi_interface_ra[nsapi] = interfac;
915 }
916 }
917
918 #endif /* CF_FAST_EXEC */
919
920 /*
921 +------------------------------------------------------------------------------
922 | Function : sndcp_set_nsapi_linkid
923 +------------------------------------------------------------------------------
924 | Description : sets nsapi_linkid_ra[nsapi] to linkid
925 |
926 | Parameters : UBYTE nsapi, U32 linkid
927 |
928 +------------------------------------------------------------------------------
929 */
930 #ifndef CF_FAST_EXEC
931
932 GLOBAL void sndcp_set_nsapi_linkid(UBYTE nsapi,
933 U32 linkid)
934 {
935 TRACE_FUNCTION(" sndcp_set_nsapi_linkid ");
936 {
937 sndcp_data->nsapi_linkid_ra[nsapi] = linkid;
938 }
939 }
940
941 #endif /* CF_FAST_EXEC */
942
943 /*
944 +------------------------------------------------------------------------------
945 | Function : sndcp_set_nsapi_neighbor
946 +------------------------------------------------------------------------------
947 | Description : sets nsapi_neighbor_ra[nsapi] to neighbor
948 |
949 | Parameters : UBYTE nsapi, U8* neighbor
950 |
951 +------------------------------------------------------------------------------
952 */
953 #ifndef CF_FAST_EXEC
954
955 GLOBAL void sndcp_set_nsapi_neighbor(UBYTE nsapi,
956 U8* neighbor)
957 {
958 TRACE_FUNCTION(" sndcp_set_nsapi_neighbor ");
959 {
960 sndcp_data->nsapi_neighbor_ra[nsapi] = neighbor;
961 }
962 }
963
964 #endif /* CF_FAST_EXEC */
965
966 /*
967 +------------------------------------------------------------------------------
968 | Function : sndcp_no_xid
969 +------------------------------------------------------------------------------
970 | Description : XID negotiation during each context (default in our
971 | implementation) is switched off.
972 |
973 | Parameters :
974 |
975 +------------------------------------------------------------------------------
976 */
977 #ifndef CF_FAST_EXEC
978
979 GLOBAL void sndcp_no_xid(void)
980 {
981 TRACE_FUNCTION("sndcp_no_xid");
982 {
983 sndcp_data->always_xid = FALSE;
984 }
985 }
986
987 #endif /* CF_FAST_EXEC */
988
989 /*
990 +------------------------------------------------------------------------------
991 | Function : sndcp_set_nsapi_prio
992 +------------------------------------------------------------------------------
993 | Description : sets nsapi_prio_ra[nsapi] to prio - 1:
994 | SNSM prio val is mapped to LL prio val, which is the internal
995 | representation.
996 |
997 | Parameters : UBYTE nsapi, UBYTE prio
998 |
999 +------------------------------------------------------------------------------
1000 */
1001 #ifndef CF_FAST_EXEC
1002
1003 GLOBAL void sndcp_set_nsapi_prio(UBYTE nsapi,
1004 UBYTE prio)
1005 {
1006 TRACE_FUNCTION("sndcp_set_nsapi_prio");
1007 {
1008 sndcp_data->nsapi_prio_ra[nsapi] = prio - 1;
1009 }
1010 }
1011
1012 #endif /* CF_FAST_EXEC */
1013
1014 #ifdef REL99
1015 /*
1016 +------------------------------------------------------------------------------
1017 | Function : sndcp_set_nsapi_pktflowid
1018 +------------------------------------------------------------------------------
1019 | Description : sets pktflowid_ra[nsapi] to packet_flow_identifier:
1020 | SNSM packet flow identifier is mapped to LL pkt_flow_id, which is the internal
1021 | representation.
1022 |
1023 | Parameters : UBYTE nsapi, UBYTE packet_flow_identifier
1024 |
1025 +------------------------------------------------------------------------------
1026 */
1027 #ifndef CF_FAST_EXEC
1028
1029 GLOBAL void sndcp_set_nsapi_pktflowid(UBYTE nsapi,
1030 U16 packet_flow_identifier)
1031 {
1032 TRACE_FUNCTION("sndcp_set_nsapi_pktflowid");
1033 {
1034 sndcp_data->nsapi_pktflowid_ra[nsapi] = packet_flow_identifier;
1035 }
1036 }
1037 #endif /* CF_FAST_EXEC */
1038
1039 #endif /*REL99*/
1040
1041 /*
1042 +------------------------------------------------------------------------------
1043 | Function : sndcp_set_nsapi_qos
1044 +------------------------------------------------------------------------------
1045 | Description : sets nsapi_qos_ra[nsapi] to qos
1046 |
1047 | Parameters : UBYTE nsapi, T_snsm_qos qos
1048 |
1049 +------------------------------------------------------------------------------
1050 */
1051 #ifndef CF_FAST_EXEC
1052
1053 GLOBAL void sndcp_set_nsapi_qos(UBYTE nsapi,
1054 T_snsm_qos qos)
1055 {
1056 TRACE_FUNCTION("sndcp_set_nsapi_qos");
1057 {
1058 sndcp_data->nsapi_qos_ra[nsapi].delay = qos.delay;
1059 sndcp_data->nsapi_qos_ra[nsapi].relclass = qos.relclass;
1060 sndcp_data->nsapi_qos_ra[nsapi].peak = qos.peak;
1061 sndcp_data->nsapi_qos_ra[nsapi].preced = qos.preced;
1062 sndcp_data->nsapi_qos_ra[nsapi].mean = qos.mean;
1063 }
1064 }
1065
1066 #endif /* CF_FAST_EXEC */
1067
1068 /*
1069 +------------------------------------------------------------------------------
1070 | Function : sndcp_set_nsapi_sapi
1071 +------------------------------------------------------------------------------
1072 | Description : sets nsapi_sapi_ra[nsapi] to sapi
1073 |
1074 | Parameters : UBYTE nsapi, UBYTE sapi
1075 |
1076 +------------------------------------------------------------------------------
1077 */
1078 #ifndef CF_FAST_EXEC
1079
1080 GLOBAL void sndcp_set_nsapi_sapi(UBYTE nsapi,
1081 UBYTE sapi)
1082 {
1083 TRACE_FUNCTION("sndcp_set_nsapi_sapi");
1084 {
1085 sndcp_data->nsapi_sapi_ra[nsapi] = sapi;
1086 }
1087 }
1088
1089 #endif /* CF_FAST_EXEC */
1090
1091 /*
1092 +------------------------------------------------------------------------------
1093 | Function : sndcp_set_nsapi_state
1094 +------------------------------------------------------------------------------
1095 | Description : adds stat to nsapi_state_ra[nsapi]
1096 |
1097 | Parameters : UBYTE nsapi, UBYTE stat
1098 |
1099 +------------------------------------------------------------------------------
1100 */
1101 #ifndef CF_FAST_EXEC
1102 GLOBAL void sndcp_set_nsapi_state(UBYTE nsapi,
1103 USHORT stat)
1104 {
1105 TRACE_FUNCTION("sndcp_set_nsapi_state");
1106 {
1107 sndcp_data->nsapi_state_ra[nsapi] |= stat;
1108 }
1109 }
1110
1111 #endif /* CF_FAST_EXEC */
1112
1113
1114 /*
1115 +------------------------------------------------------------------------------
1116 | Function : sndcp_ip_packet_filter
1117 +------------------------------------------------------------------------------
1118 | Description : The function filters TCP and UDP packets on certain ports
1119 |
1120 | Parameters : T_desc_list2 *desc_list, BOOL *discard
1121 |
1122 +------------------------------------------------------------------------------
1123 */
1124 #ifdef _SNDCP_DTI_2_
1125 LOCAL void sndcp_ip_packet_filter(T_desc_list2 *desc_list, BOOL *discard)
1126 {
1127 T_desc2 *desc = (T_desc2 *)desc_list->first;
1128 UBYTE *pack_hdr = &desc->buffer[desc->offset];
1129 UBYTE *tcp_hdr = NULL,
1130 *udp_hdr = NULL;
1131 USHORT offset = 0;
1132 USHORT src_port = 0;
1133 USHORT dest_port = 0;
1134
1135 TRACE_FUNCTION("sndcp_ip_packet_filter");
1136
1137 if(desc_list == NULL || desc_list->first == NULL || desc_list->list_len == 0){
1138 *discard = TRUE; /* discard packet */
1139 return;
1140 }
1141
1142 offset = (pack_hdr[0] & 0x0f) * 4; /* IP header length in bytes*/
1143 /* Verify, that the desc has a proper length */
1144 if(desc->len < (offset + 4)){
1145 return;
1146 }
1147
1148 switch(pack_hdr[9]){
1149 /* ICMP Protocol */
1150 case 1:
1151 *discard = FALSE; /* don't discard ICMP packets */
1152 /* TRACE_EVENT("INFO IP FILTER: ICMP packet is sent"); */
1153 return;
1154 /* TCP Protocol */
1155 case 6:
1156 tcp_hdr = &pack_hdr[offset];
1157 src_port |= tcp_hdr[0] << 8;
1158 src_port |= tcp_hdr[1];
1159 dest_port |= tcp_hdr[2] << 8;
1160 dest_port |= tcp_hdr[3];
1161 if(src_port == 42 || /* Host Name Server */
1162 dest_port == 42 ||
1163 src_port == 111 || /* Remote Procedure Call */
1164 dest_port == 111 ||
1165 ((src_port > 134) && (src_port < 140)) || /* NetBIOS */
1166 ((dest_port > 134) && (dest_port < 140)) || /* NetBIOS */
1167 src_port == 445 || /* Microsoft-DS */
1168 dest_port == 445 ||
1169 src_port == 1025 || /* network blackjack */
1170 dest_port == 1025 ||
1171 src_port == 1196 || /* listener RFS */
1172 dest_port == 1196 ||
1173 src_port == 1433 || /* Microsoft-SQL-Server */
1174 dest_port == 1433 ||
1175 src_port == 1434 || /* Microsoft-SQL-Monitor */
1176 dest_port == 1434
1177 ){
1178 *discard = TRUE; /* discard this TCP packet */
1179 /*TRACE_EVENT_P2("INFO IP FILTER: TCP packet on dest_port %d, src_port %d is discarded",
1180 dest_port, src_port);*/
1181 } else {
1182 *discard = FALSE; /* dont't discard this TCP packet */
1183 /*TRACE_EVENT_P2("INFO IP FILTER: TCP packet on dest_port %d, src_port %d is sent",
1184 dest_port, src_port);*/
1185 }
1186 return;
1187 /* UDP Protocol */
1188 case 17:
1189 udp_hdr = &pack_hdr[offset];
1190 src_port |= udp_hdr[0] << 8;
1191 src_port |= udp_hdr[1];
1192 dest_port |= udp_hdr[2] << 8;
1193 dest_port |= udp_hdr[3];
1194 if(src_port == 42 || /* Host Name Server */
1195 dest_port == 42 ||
1196 src_port == 67 || /* DHCP BOOTP Protocol Server */
1197 dest_port == 67 ||
1198 src_port == 68 || /* DHCP BOOTP Protocol Client */
1199 dest_port == 68 ||
1200 src_port == 69 || /* Trivial FTP */
1201 dest_port == 69 ||
1202 src_port == 111 || /* Remote Procedure Call */
1203 dest_port == 111 ||
1204 src_port == 135 || /* NetBIOS & co */
1205 dest_port == 135 ||
1206 src_port == 137 || /* NetBIOS & co*/
1207 dest_port == 137 ||
1208 src_port == 138 || /* NetBIOS & co*/
1209 dest_port == 138 ||
1210 src_port == 139 || /* NetBIOS & co*/
1211 dest_port == 139 ||
1212 src_port == 389 || /* LDAP */
1213 dest_port == 389 ||
1214 src_port == 445 || /* Microsoft-DS */
1215 dest_port == 445 ||
1216 src_port == 1023 || /* network blackjack & co */
1217 dest_port == 1023 ||
1218 src_port == 1026 || /* network blackjack & co */
1219 dest_port == 1026 ||
1220 src_port == 1027 || /* network blackjack & co */
1221 dest_port == 1027 ||
1222 src_port == 1028 || /* network blackjack & co */
1223 dest_port == 1028 ||
1224 src_port == 1029 || /* network blackjack & co */
1225 dest_port == 1029
1226 ){
1227 *discard = TRUE; /* discard this UDP packet */
1228 /*TRACE_EVENT_P2("INFO IP FILTER: UDP packet on dest_port %d, src_port %d is discarded",
1229 dest_port, src_port);*/
1230 } else {
1231 *discard = FALSE; /* dont't discard this UDP packet */
1232 /*TRACE_EVENT_P2("INFO IP FILTER: UDP packet on dest_port %d, src_port %d is sent",
1233 dest_port, src_port);*/
1234 }
1235 return;
1236 default:
1237 *discard = TRUE; /* discard all other packets */
1238 TRACE_EVENT_P1("INFO IP FILTER: protocol type %d is discarded", pack_hdr[9]);
1239 return;
1240 }
1241 }
1242 #endif /* _SNDCP_DTI_2_ */
1243
1244 /*
1245 +------------------------------------------------------------------------------
1246 | Function : sndcp_sig_callback
1247 +------------------------------------------------------------------------------
1248 | Description : callback function for dti lib.
1249 |
1250 | Parameters :
1251 |
1252 +------------------------------------------------------------------------------
1253 */
1254 #ifdef _SNDCP_DTI_2_
1255 #ifndef CF_FAST_EXEC
1256
1257 GLOBAL void sndcp_sig_callback(U8 instance,
1258 U8 interfac,
1259 U8 channel,
1260 U8 reason,
1261 T_DTI2_DATA_IND *dti2_data_ind)
1262 {
1263 T_SN_DATA_REQ* sn_data_req = NULL;
1264 T_SN_UNITDATA_REQ* sn_unitdata_req = NULL;
1265 BOOL ack = FALSE;
1266
1267 TRACE_FUNCTION("sndcp_sig_callback");
1268
1269
1270 switch(reason)
1271 {
1272 case DTI_REASON_CONNECTION_OPENED:
1273 /*
1274 * set rx and tx state machine of the given interface to idle state
1275 */
1276 /*
1277 * The nsapi is given here with the parameter 'channel'.
1278 */
1279 nu_connection_state(channel, TRUE);
1280 break;
1281 case DTI_REASON_CONNECTION_CLOSED:
1282 /*
1283 * set the given interface to closed state
1284 */
1285 break;
1286 case DTI_REASON_DATA_RECEIVED:
1287 /*
1288 * process received data
1289 */
1290 /*
1291 * Trace p_id.
1292 */
1293
1294
1295
1296 #ifdef TI_PS_OP_ICUT_SNDCP
1297
1298 /* PDP_TBR added SNDCP terminal loopback */
1299 if ( SNDCP_LOOPBACK == 1)
1300 {
1301 if (bufFull[channel] == FALSE)
1302 {
1303 TRACE_EVENT_P1("LOOPBACK len=%d", dti2_data_ind->desc_list2.list_len);
1304
1305 dti_send_data(sndcp_data->hDTI,
1306 instance, // U8 instance,
1307 SNDCP_INTERFACE_UNACK, // U8 interface,
1308 channel,// U8 channel,
1309 dti2_data_ind // T_DTI2_DATA_IND *dti_data_ind)
1310 );
1311 }
1312 else
1313 {
1314 saveDti2_data_ind[channel] = dti2_data_ind;
1315 }
1316 return;
1317 }
1318
1319
1320
1321 #endif /* TI_PS_OP_ICUT_SNDCP */
1322
1323
1324
1325
1326
1327 #ifdef SNDCP_TRACE_ALL
1328 switch (dti2_data_ind->parameters.p_id) {
1329 case DTI_PID_IP:
1330 TRACE_EVENT_P2("dti2_data_ind->parameters.p_id: %02x (%s)",
1331 dti2_data_ind->parameters.p_id,
1332 "DTI_PID_IP");
1333 break;
1334 case DTI_PID_CTCP:
1335 TRACE_EVENT_P2("dti2_data_ind->parameters.p_id: %02x (%s)",
1336 dti2_data_ind->parameters.p_id,
1337 "DTI_PID_CTCP");
1338 break;
1339 case DTI_PID_UTCP:
1340 TRACE_EVENT_P2("dti2_data_ind->parameters.p_id: %02x (%s)",
1341 dti2_data_ind->parameters.p_id,
1342 "DTI_PID_UTCP");
1343 break;
1344 case DTI_PID_UOS:
1345 TRACE_EVENT_P2("dti2_data_ind->parameters.p_id: %02x (%s)",
1346 dti2_data_ind->parameters.p_id,
1347 "DTI_PID_UOS");
1348 break;
1349 default:
1350 TRACE_EVENT_P2("dti2_data_ind->parameters.p_id: %02x (%s)",
1351 dti2_data_ind->parameters.p_id,
1352 "unknown");
1353
1354
1355 }
1356 #endif /* SNDCP_TRACE_ALL */
1357 /*
1358 * Discard DTI primitive if the config prim "DISCARD" was received
1359 */
1360 sndcp_data->nu = &sndcp_data->nu_base[channel];
1361 if(sndcp_data->nu->discard){
1362 TRACE_EVENT_P1("INFO DISCARD: UL packet with length %d is discarded",
1363 dti2_data_ind->desc_list2.list_len );
1364 sndcp_data->nu->discarded_data += dti2_data_ind->desc_list2.list_len;
1365 PFREE_DESC2(dti2_data_ind);
1366 dti2_data_ind = NULL;
1367 break;
1368 }
1369 /*
1370 * If the IP filter is enabled (config prim "IP_FILTER_ON" was received),
1371 * filter the packets.
1372 */
1373 if(sndcp_data->ip_filter){
1374 BOOL discard;
1375 /* Statistics Trace */
1376 TRACE_EVENT_P3("INFO NSAPI[%d]: sent bytes: %d, discarded bytes: %d",
1377 channel, sndcp_data->nu->sent_data, sndcp_data->nu->discarded_data);
1378 sndcp_ip_packet_filter(&dti2_data_ind->desc_list2, &discard);
1379 if(discard){
1380 sndcp_data->nu->discarded_data += dti2_data_ind->desc_list2.list_len;
1381 PFREE_DESC2(dti2_data_ind);
1382 dti2_data_ind = NULL;
1383 break;
1384 } else {
1385 sndcp_data->nu->sent_data += dti2_data_ind->desc_list2.list_len;
1386 }
1387 }
1388 /*
1389 * Copy dti_data_ind to sn_[unit]data_ind and enter nu service the
1390 * old way.
1391 */
1392 sndcp_get_nsapi_ack(channel, &ack);
1393 if (ack) {
1394 /*
1395 * Allocate a "normal" SN_DATA_REQ primitive and copy the data
1396 * of the test primitive to that one
1397 */
1398 MALLOC(sn_data_req, sizeof(T_SN_DATA_REQ));
1399 sn_data_req->nsapi = channel;
1400 sn_data_req->p_id = dti2_data_ind->parameters.p_id;
1401 sn_data_req->desc_list2 = dti2_data_ind->desc_list2;
1402
1403 /*
1404 * Free the received dti primitive.
1405 */
1406 PFREE (dti2_data_ind);
1407 dti2_data_ind = NULL;
1408
1409 nu_sn_data_req(sn_data_req);
1410
1411 } else {
1412 /*
1413 * Allocate a "normal" SN_UNITDATA_REQ primitive and copy the data
1414 * of the test primitive to that one
1415 */
1416 MALLOC(sn_unitdata_req, sizeof(T_SN_UNITDATA_REQ));
1417
1418 sn_unitdata_req->nsapi = channel;
1419 sn_unitdata_req->p_id = dti2_data_ind->parameters.p_id;
1420 sn_unitdata_req->desc_list2 = dti2_data_ind->desc_list2;
1421
1422 /*
1423 * Free the received dti 2 primitive.
1424 */
1425 PFREE (dti2_data_ind);
1426 dti2_data_ind = NULL;
1427
1428 nu_sn_unitdata_req(sn_unitdata_req);
1429
1430 }
1431
1432 break;
1433 case DTI_REASON_TX_BUFFER_FULL:
1434 /*
1435 * set tx state machine of the given interface to TX_IDLE state
1436 */
1437
1438
1439
1440 #ifdef TI_PS_OP_ICUT_SNDCP
1441
1442 /* PDP_TBR added SNDCP terminal loopback */
1443 if (SNDCP_LOOPBACK == 1)
1444 {
1445 dti_stop(sndcp_data->hDTI,
1446 instance,
1447 interfac,
1448 channel);
1449 bufFull[channel] = TRUE;
1450 TRACE_EVENT("SNDCP BUFFER IS FULL");
1451 }
1452
1453 #endif /* TI_PS_OP_ICUT_SNDCP */
1454
1455
1456
1457 /*
1458 * Will be ignored.
1459 */
1460 break;
1461 case DTI_REASON_TX_BUFFER_READY:
1462 /*
1463 * set tx state machine of the given interface to TX_READY state
1464 */
1465
1466
1467
1468
1469 #ifdef TI_PS_OP_ICUT_SNDCP
1470 /* PDP_TBR added SNDCP terminal loopback */
1471 if ( SNDCP_LOOPBACK == 1)
1472 {
1473 dti_start(sndcp_data->hDTI,
1474 instance,
1475 interfac,
1476 channel);
1477 bufFull[channel] = FALSE;
1478 TRACE_ERROR("SNDCP BUFFER IS READY");
1479 if (saveDti2_data_ind[channel] != NULL)
1480 {
1481 TRACE_EVENT_P1("LOOPBACK len=%d", dti2_data_ind->desc_list2.list_len);
1482
1483 dti_send_data(sndcp_data->hDTI,
1484 instance, // U8 instance,
1485 SNDCP_INTERFACE_UNACK, // U8 interface,
1486 channel,// U8 channel,
1487 saveDti2_data_ind[channel] // T_DTI2_DATA_IND *dti_data_ind)
1488 );
1489 saveDti2_data_ind[channel] = NULL;
1490
1491 }
1492 break;
1493 }
1494 #endif /* TI_PS_OP_ICUT_SNDCP */
1495
1496
1497
1498
1499 /*
1500 * Reaction will be like reaction to SN_GET[UNIT]DATA_REQ.
1501 */
1502 nd_dti_buffer_ready(channel);
1503 break;
1504 default:
1505 TRACE_ERROR("sndcp_sig_callback called with undefined reason");
1506 }
1507 }
1508
1509 #endif /* CF_FAST_EXEC */
1510
1511
1512 #else /*_SNDCP_DTI_2_*/
1513
1514 #ifndef CF_FAST_EXEC
1515
1516 GLOBAL void sndcp_sig_callback(U8 instance,
1517 U8 interfac,
1518 U8 channel,
1519 U8 reason,
1520 T_DTI_DATA_IND *dti_data_ind)
1521 {
1522 TRACE_FUNCTION("sndcp_sig_callback");
1523
1524 switch(reason)
1525 {
1526 case DTI_REASON_CONNECTION_OPENED:
1527 /*
1528 * set rx and tx state machine of the given interface to idle state
1529 */
1530 /*
1531 * The nsapi is given here with the parameter 'channel'.
1532 */
1533 nu_connection_state(channel, TRUE);
1534 break;
1535 case DTI_REASON_CONNECTION_CLOSED:
1536 /*
1537 * set the given interface to closed state
1538 */
1539 break;
1540 case DTI_REASON_DATA_RECEIVED:
1541 /*
1542 * process received data
1543 */
1544 /*
1545 * Trace p_id.
1546 */
1547 #ifdef SNDCP_TRACE_ALL
1548 switch (dti_data_ind->p_id) {
1549 case DTI_PID_IP:
1550 TRACE_EVENT_P2("dti_data_ind->p_id: %02x (%s)",
1551 dti_data_ind->p_id,
1552 "DTI_PID_IP");
1553 break;
1554 case DTI_PID_CTCP:
1555 TRACE_EVENT_P2("dti_data_ind->p_id: %02x (%s)",
1556 dti_data_ind->p_id,
1557 "DTI_PID_CTCP");
1558 break;
1559 case DTI_PID_UTCP:
1560 TRACE_EVENT_P2("dti_data_ind->p_id: %02x (%s)",
1561 dti_data_ind->p_id,
1562 "DTI_PID_UTCP");
1563 break;
1564 case DTI_PID_FRAME:
1565 TRACE_EVENT_P2("dti_data_ind->p_id: %02x (%s)",
1566 dti_data_ind->p_id,
1567 "DTI_PID_FRAME");
1568 break;
1569 default:
1570 TRACE_EVENT_P2("dti_data_ind->p_id: %02x (%s)",
1571 dti_data_ind->p_id,
1572 "unknown");
1573
1574
1575 }
1576 #endif /* SNDCP_TRACE_ALL */
1577 /*
1578 * Copy dti_data_ind to sn_[unit]data_ind and enter nu service the
1579 * old way.
1580 */
1581 if (interfac == SNDCP_INTERFACE_ACK) {
1582 /*
1583 * Allocate a "normal" SN_DATA_REQ primitive and copy the data
1584 * of the test primitive to that one
1585 */
1586 PALLOC_DESC (sn_data_req, SN_DATA_REQ);
1587
1588 sn_data_req->nsapi = channel;
1589 sn_data_req->p_id = dti_data_ind->p_id;
1590 sn_data_req->desc_list = dti_data_ind->desc_list;
1591
1592 /*
1593 * Free the received dti primitive.
1594 */
1595 PFREE (dti_data_ind);
1596 dti_data_ind = NULL;
1597
1598 nu_sn_data_req(sn_data_req);
1599
1600 } else {
1601 /*
1602 * Allocate a "normal" SN_UNITDATA_REQ primitive and copy the data
1603 * of the test primitive to that one
1604 */
1605 PALLOC_DESC (sn_unitdata_req, SN_UNITDATA_REQ);
1606
1607 sn_unitdata_req->nsapi = channel;
1608 sn_unitdata_req->p_id = dti_data_ind->p_id;
1609 sn_unitdata_req->desc_list = dti_data_ind->desc_list;
1610
1611 /*
1612 * Free the received test primitive.
1613 */
1614 PFREE (dti_data_ind);
1615 dti_data_ind = NULL;
1616
1617 nu_sn_unitdata_req(sn_unitdata_req);
1618
1619 }
1620
1621 break;
1622 case DTI_REASON_TX_BUFFER_FULL:
1623 /*
1624 * set tx state machine of the given interface to TX_IDLE state
1625 */
1626 /*
1627 * Will be ignored.
1628 */
1629 break;
1630 case DTI_REASON_TX_BUFFER_READY:
1631 /*
1632 * set tx state machine of the given interface to TX_READY state
1633 */
1634 /*
1635 * Reaction will be like reaction to SN_GET[UNIT]DATA_REQ.
1636 */
1637 nd_dti_buffer_ready(channel);
1638 break;
1639 default:
1640 TRACE_ERROR("sndcp_sig_callback called with undefined reason");
1641 }
1642 }
1643 #endif /* CF_FAST_EXEC */
1644
1645 #endif /*_SNDCP_DTI_2_*/
1646
1647 /*
1648 +------------------------------------------------------------------------------
1649 | Function : sndcp_unset_nsapi_state
1650 +------------------------------------------------------------------------------
1651 | Description : subtracts stat from nsapi_state_ra[nsapi]
1652 |
1653 | Parameters : UBYTE nsapi, UBYTE stat
1654 |
1655 +------------------------------------------------------------------------------
1656 */
1657 #ifndef CF_FAST_EXEC
1658
1659 GLOBAL void sndcp_unset_nsapi_state(UBYTE nsapi,
1660 USHORT stat)
1661 {
1662 TRACE_FUNCTION("sndcp_unset_nsapi_state");
1663 {
1664 sndcp_data->nsapi_state_ra[nsapi] &= ~ stat;
1665 }
1666 }
1667
1668 #endif /* CF_FAST_EXEC */
1669
1670 /*
1671 +------------------------------------------------------------------------------
1672 | Function : sndcp_set_nsapi_used
1673 +------------------------------------------------------------------------------
1674 | Description : sets nsapi_used_ra[nsapi] to b
1675 |
1676 | Parameters : UBYTE nsapi, BOOL b
1677 |
1678 +------------------------------------------------------------------------------
1679 */
1680 #ifndef CF_FAST_EXEC
1681
1682 GLOBAL void sndcp_set_nsapi_used(UBYTE nsapi,
1683 BOOL b)
1684 {
1685 TRACE_FUNCTION("sndcp_set_nsapi_used");
1686 {
1687 sndcp_data->nsapi_used_ra[nsapi] = b;
1688 }
1689 }
1690
1691 #endif /* CF_FAST_EXEC */
1692
1693 /*
1694 +------------------------------------------------------------------------------
1695 | Function : sndcp_set_sapi_ack
1696 +------------------------------------------------------------------------------
1697 | Description : sets sapi_ack_ra[sapi] to ack
1698 |
1699 | Parameters : UBYTE sapi, BOOL ack
1700 |
1701 +------------------------------------------------------------------------------
1702 */
1703 #ifndef CF_FAST_EXEC
1704
1705 GLOBAL void sndcp_set_sapi_ack(UBYTE sapi,
1706 BOOL ack)
1707 {
1708 TRACE_FUNCTION(" sndcp_set_sapi_ack ");
1709 {
1710 UBYTE sapi_index = 0;
1711
1712 sndcp_get_sapi_index(sapi, &sapi_index);
1713 sndcp_data->sapi_ack_ra[sapi_index] = ack;
1714 }
1715 }
1716
1717 #endif /* CF_FAST_EXEC */
1718
1719 /*
1720 +------------------------------------------------------------------------------
1721 | Function : sndcp_snsm_qos_to_ll_qos
1722 +------------------------------------------------------------------------------
1723 | Description : transfers an snsm_qos to an ll_qos
1724 |
1725 | Parameters : T_snsm_qos, T_ll_qos*
1726 |
1727 +------------------------------------------------------------------------------
1728 */
1729 #ifndef CF_FAST_EXEC
1730
1731 GLOBAL void sndcp_snsm_qos_to_ll_qos(T_snsm_qos snsm_qos,
1732 T_ll_qos* ll_qos)
1733 {
1734 TRACE_FUNCTION("sndcp_snsm_qos_to_ll_qos");
1735 {
1736 ll_qos->delay = snsm_qos.delay;
1737 ll_qos->relclass = snsm_qos.relclass;
1738 ll_qos->peak = snsm_qos.peak;
1739 ll_qos->preced = snsm_qos.preced;
1740 ll_qos->mean = snsm_qos.mean;
1741 }
1742 }
1743
1744 #endif /* CF_FAST_EXEC */
1745
1746 /*
1747 +------------------------------------------------------------------------------
1748 | Function : sndcp_set_sapi_state
1749 +------------------------------------------------------------------------------
1750 | Description : adds stat to sapi_state_ra[sapi] bitwise
1751 |
1752 | Parameters : UBYTE sapi, UBYTE stat
1753 |
1754 +------------------------------------------------------------------------------
1755 */
1756 #ifndef CF_FAST_EXEC
1757
1758 GLOBAL void sndcp_set_sapi_state(UBYTE sapi,
1759 USHORT stat)
1760 {
1761 TRACE_FUNCTION(" sndcp_set_sapi_state ");
1762 {
1763 UBYTE sapi_index = 0;
1764 sndcp_get_sapi_index(sapi, &sapi_index);
1765 sndcp_data->sapi_state_ra[sapi_index] |= stat;
1766 }
1767 }
1768
1769 #endif /* CF_FAST_EXEC */
1770
1771 /*
1772 +------------------------------------------------------------------------------
1773 | Function : sndcp_unset_sapi_state
1774 +------------------------------------------------------------------------------
1775 | Description : subtracts stat from sapi_state_ra[sapi] bitwise
1776 |
1777 | Parameters : UBYTE sapi, UBYTE stat
1778 |
1779 +------------------------------------------------------------------------------
1780 */
1781 #ifndef CF_FAST_EXEC
1782
1783 GLOBAL void sndcp_unset_sapi_state(UBYTE sapi,
1784 USHORT stat)
1785 {
1786 TRACE_FUNCTION(" sndcp_unset_sapi_state ");
1787 {
1788 UBYTE sapi_index = 0;
1789 sndcp_get_sapi_index(sapi, &sapi_index);
1790 sndcp_data->sapi_state_ra[sapi_index] &= ~ stat;
1791 }
1792 }
1793
1794 #endif /* CF_FAST_EXEC */
1795
1796 #ifdef FLOW_TRACE
1797 /*
1798 +------------------------------------------------------------------------------
1799 | Function : sndcp_trace_flow_control
1800 +------------------------------------------------------------------------------
1801 | Description : traces flow control
1802 |
1803 | Parameters : UBYTE entity, UBYTE uplink, UBYTE sent, BOOL close
1804 |
1805 +------------------------------------------------------------------------------
1806 */
1807 /*
1808 * 0 GRR
1809 * 1 LLC
1810 * 2 SNDCP
1811 * 3 PPP
1812 * 4 UART
1813 */
1814
1815 /*
1816 #define FLOW_TRACE_GRR 0
1817 #define FLOW_TRACE_LLC 1
1818 #define FLOW_TRACE_SNDCP 2
1819 #define FLOW_TRACE_PPP 3
1820 #define FLOW_TRACE_UART 4
1821
1822 direction of data transfer
1823
1824 #define FLOW_TRACE_UP 0
1825 #define FLOW_TRACE_DOWN 1
1826
1827 is sap sitting on top of entity or is lower entity sap used?
1828
1829 #define FLOW_TRACE_TOP 0
1830 #define FLOW_TRACE_BOTTOM 1
1831 */
1832
1833
1834 #ifndef CF_FAST_EXEC
1835
1836 GLOBAL void sndcp_trace_flow_control(UBYTE entity, UBYTE transfer, UBYTE position, BOOL opened)
1837 {
1838 TRACE_FUNCTION(" sndcp_trace_flow_control ");
1839 #ifdef SNDCP_TRACE_ALL
1840 TRACE_EVENT_P4("sndcp_trace_flow_control[%d][%d][%d] = %d",
1841 entity,
1842 transfer,
1843 position,
1844 opened);
1845 #endif
1846 {
1847 sndcp_data->flow_control_ra[entity][transfer][position] = opened;
1848 }
1849 }
1850
1851 #endif /* CF_FAST_EXEC */
1852
1853 #endif /* FLOW_TRACE */
1854
1855
1856 #ifdef _SNDCP_DTI_2_
1857
1858 #ifdef SNDCP_TRACE_ALL
1859
1860 /*
1861 +------------------------------------------------------------------------------
1862 | Function : sndcp_trace_desc_list3_content
1863 +------------------------------------------------------------------------------
1864 | Description : traces content of a desc3 descriptor list
1865 |
1866 | Parameters : desc_list3 descriptor list
1867 |
1868 +------------------------------------------------------------------------------
1869 */
1870 #ifndef CF_FAST_EXEC
1871
1872 GLOBAL void sndcp_trace_desc_list3_content(T_desc_list3 desc_list3)
1873 {
1874 U16 current_pos = 0; /* */
1875 U16 data_len = 0; /* The length of the data to be traced including data offset */
1876 U8* p_data = NULL; /* Pointer to byte data element */
1877 T_desc3* p_desc3 = (T_desc3*)desc_list3.first; /* Pointer to the actual desc3 descriptor element */
1878
1879 while(p_desc3 != NULL)
1880 {
1881 current_pos = p_desc3->offset; /* In case it is the sndcp header allocation, ENCODE_OFFSET has been considered*/
1882 p_data = (U8*)p_desc3->buffer;
1883 data_len = current_pos + p_desc3->len; /* p_desc3->len is the total allocation length for sndcp header description */
1884 while(current_pos <= data_len)
1885 {
1886 TRACE_EVENT_P1
1887 ("%02x",
1888 p_data[current_pos]
1889 );
1890 current_pos ++;
1891 }
1892
1893 p_desc3 = (T_desc3*)p_desc3->next;
1894 }
1895 }
1896
1897 #endif /* CF_FAST_EXEC */
1898
1899 #endif /* SNDCP_TRACE_ALL */
1900
1901 /*
1902 +------------------------------------------------------------------------------
1903 | Function : sndcp_cl_desc2_attach
1904 +------------------------------------------------------------------------------
1905 | Description : This function attaches a decriptor list to already allocated
1906 | memory. There is no return value. In case an attempt is made
1907 | to attach to freed or invalid memory, then the FRAME generates
1908 | a trace SYSTEM ERROR. This function does not allocate any new
1909 | memory.
1910 |
1911 | Parameters : T_desc2* pointer to desc2 descriptor.
1912 |
1913 +------------------------------------------------------------------------------
1914 */
1915 #ifndef CF_FAST_EXEC
1916
1917 void sndcp_cl_desc2_attach(T_desc2* p_desc2)
1918 {
1919
1920 MATTACH(p_desc2);
1921
1922 }
1923
1924 #endif /* CF_FAST_EXEC */
1925 /*
1926 +------------------------------------------------------------------------------
1927 | Function : sndcp_cl_desc3_free
1928 +------------------------------------------------------------------------------
1929 | Description : Frees the descriptor connected to the desc3 descriptor. This
1930 | free will when applicable cause the frame to decrease a
1931 | connected counter attached to the allocation or really free
1932 | the memory in case the counter is zero.
1933 |
1934 | Parameters : T_desc3* pointer to desc3 descriptor.
1935 |
1936 +------------------------------------------------------------------------------
1937 */
1938 #ifndef CF_FAST_EXEC
1939
1940 void sndcp_cl_desc3_free(T_desc3* p_desc3)
1941 {
1942
1943 MFREE(p_desc3->buffer);
1944 p_desc3->buffer = NULL;
1945 }
1946
1947 #endif /* CF_FAST_EXEC */
1948
1949 #endif /* _SNDCP_DTI_2_ */
1950
1951
1952 #ifdef SNDCP_TRACE_ALL
1953
1954 /*
1955 +------------------------------------------------------------------------------
1956 | Function : sndcp_trace_sdu
1957 +------------------------------------------------------------------------------
1958 | Description : traces content of one sdu
1959 |
1960 | Parameters : pointer to sdu
1961 |
1962 +------------------------------------------------------------------------------
1963 */
1964 #ifndef CF_FAST_EXEC
1965
1966 GLOBAL void sndcp_trace_sdu(T_sdu* sdu)
1967 {
1968
1969 USHORT pos = sdu->o_buf >> 3;
1970 USHORT frame_len = (sdu->l_buf + 7) / 8;
1971
1972
1973 TRACE_FUNCTION("sndcp_trace_sdu");
1974
1975 while(pos < (frame_len + (sdu->o_buf >> 3)))
1976 {
1977 if (pos + 8 <= (frame_len + (sdu->o_buf >> 3))) {
1978 TRACE_EVENT_P8
1979 ("%02x %02x %02x %02x %02x %02x %02x %02x",
1980 sdu->buf[pos],
1981 sdu->buf[pos + 1],
1982 sdu->buf[pos + 2],
1983 sdu->buf[pos + 3],
1984 sdu->buf[pos + 4],
1985 sdu->buf[pos + 5],
1986 sdu->buf[pos + 6],
1987 sdu->buf[pos + 7]
1988 );
1989 pos += 8;
1990 } else if (pos + 7 <= (frame_len + (sdu->o_buf >> 3))){
1991 TRACE_EVENT_P7
1992 ("%02x %02x %02x %02x %02x %02x %02x",
1993 sdu->buf[pos],
1994 sdu->buf[pos + 1],
1995 sdu->buf[pos + 2],
1996 sdu->buf[pos + 3],
1997 sdu->buf[pos + 4],
1998 sdu->buf[pos + 5],
1999 sdu->buf[pos + 6]
2000 );
2001 pos += 7;
2002 } else if (pos + 6 <= (frame_len + (sdu->o_buf >> 3))){
2003 TRACE_EVENT_P6
2004 ("%02x %02x %02x %02x %02x %02x",
2005 sdu->buf[pos],
2006 sdu->buf[pos + 1],
2007 sdu->buf[pos + 2],
2008 sdu->buf[pos + 3],
2009 sdu->buf[pos + 4],
2010 sdu->buf[pos + 5]
2011 );
2012 pos += 6;
2013 } else if (pos + 5 <= (frame_len + (sdu->o_buf >> 3))){
2014 TRACE_EVENT_P5
2015 ("%02x %02x %02x %02x %02x",
2016 sdu->buf[pos],
2017 sdu->buf[pos + 1],
2018 sdu->buf[pos + 2],
2019 sdu->buf[pos + 3],
2020 sdu->buf[pos + 4]
2021 );
2022 pos += 5;
2023 } else if (pos + 4 <= (frame_len + (sdu->o_buf >> 3))){
2024 TRACE_EVENT_P4
2025 ("%02x %02x %02x %02x",
2026 sdu->buf[pos],
2027 sdu->buf[pos + 1],
2028 sdu->buf[pos + 2],
2029 sdu->buf[pos + 3]
2030 );
2031 pos += 4;
2032 } else if (pos + 3 <= (frame_len + (sdu->o_buf >> 3))){
2033 TRACE_EVENT_P3
2034 ("%02x %02x %02x",
2035 sdu->buf[pos],
2036 sdu->buf[pos + 1],
2037 sdu->buf[pos + 2]
2038 );
2039 pos += 3;
2040 } else if (pos + 2 <= (frame_len + (sdu->o_buf >> 3))){
2041 TRACE_EVENT_P2
2042 ("%02x %02x",
2043 sdu->buf[pos],
2044 sdu->buf[pos + 1]
2045 );
2046 pos += 2;
2047 } else if (pos + 1 <= (frame_len + (sdu->o_buf >> 3))){
2048 TRACE_EVENT_P1
2049 ("%02x",
2050 sdu->buf[pos]
2051 );
2052 pos++;
2053 }
2054
2055 }
2056 }
2057
2058 #endif /* CF_FAST_EXEC */
2059
2060
2061 #endif /* SNDCP_TRACE_ALL */
2062
2063 #ifdef SNDCP_TRACE_BUFFER
2064
2065 /*
2066 +------------------------------------------------------------------------------
2067 | Function : sndcp_trace_desc_list
2068 +------------------------------------------------------------------------------
2069 | Description : traces content of one desc_list
2070 |
2071 | Parameters : pointer to desc_list
2072 |
2073 +------------------------------------------------------------------------------
2074 */
2075 #ifndef CF_FAST_EXEC
2076
2077 #ifdef _SNDCP_DTI_2_
2078 GLOBAL void sndcp_trace_desc_list(T_desc_list2* desc_list)
2079 {
2080 #else /*_SNDCP_DTI_2_*/
2081 GLOBAL void sndcp_trace_desc_list(T_desc_list* desc_list)
2082 {
2083 #endif /*_SNDCP_DTI_2_*/
2084 USHORT frame_len = desc_list->list_len;
2085 #ifdef _SNDCP_DTI_2_
2086 T_desc2* desc = (T_desc2*)desc_list->first;
2087 USHORT desc_pos = desc->offset;
2088 USHORT desc_end = desc->len + desc->offset;
2089 #else /*_SNDCP_DTI_2_*/
2090 T_desc* desc = (T_desc*)desc_list->first;
2091 USHORT desc_pos = 0;
2092 USHORT desc_end = desc->len;
2093 #endif /*_SNDCP_DTI_2_*/
2094 USHORT list_pos = 0;
2095
2096 TRACE_FUNCTION("sndcp_trace_desc_list");
2097
2098 while(list_pos < frame_len)
2099 {
2100 if (desc != NULL) {
2101 if (desc_pos >= desc_end) {
2102 #ifdef _SNDCP_DTI_2_
2103 desc = (T_desc2*)desc->next;
2104 desc_pos = desc->offset;
2105 desc_end = desc->len + desc->offset;
2106 #else /*_SNDCP_DTI_2_*/
2107 desc = (T_desc*)desc->next;
2108 desc_pos = 0;
2109 desc_end = desc->len;
2110 #endif /*_SNDCP_DTI_2_*/
2111 }
2112 }
2113 if (desc == NULL) {
2114 return;
2115 }
2116 if (desc_pos + 8 <= desc_end) {
2117 TRACE_EVENT_P8 ("%02x %02x %02x %02x %02x %02x %02x %02x ",
2118 desc->buffer[desc_pos],
2119 desc->buffer[desc_pos + 1],
2120 desc->buffer[desc_pos + 2],
2121 desc->buffer[desc_pos + 3],
2122 desc->buffer[desc_pos + 4],
2123 desc->buffer[desc_pos + 5],
2124 desc->buffer[desc_pos + 6],
2125 desc->buffer[desc_pos + 7]
2126 );
2127 list_pos+= 8;
2128 desc_pos+= 8;
2129 } else if (desc_pos + 7 <= desc_end) {
2130 TRACE_EVENT_P7 ("%02x %02x %02x %02x %02x %02x %02x ",
2131 desc->buffer[desc_pos],
2132 desc->buffer[desc_pos + 1],
2133 desc->buffer[desc_pos + 2],
2134 desc->buffer[desc_pos + 3],
2135 desc->buffer[desc_pos + 4],
2136 desc->buffer[desc_pos + 5],
2137 desc->buffer[desc_pos + 6]
2138 );
2139 list_pos+= 7;
2140 desc_pos+= 7;
2141 } else if (desc_pos + 6 <= desc_end) {
2142 TRACE_EVENT_P6 ("%02x %02x %02x %02x %02x %02x ",
2143 desc->buffer[desc_pos],
2144 desc->buffer[desc_pos + 1],
2145 desc->buffer[desc_pos + 2],
2146 desc->buffer[desc_pos + 3],
2147 desc->buffer[desc_pos + 4],
2148 desc->buffer[desc_pos + 5]
2149 );
2150 list_pos+= 6;
2151 desc_pos+= 6;
2152 } else if (desc_pos + 5 <= desc_end) {
2153 TRACE_EVENT_P5 ("%02x %02x %02x %02x %02x ",
2154 desc->buffer[desc_pos],
2155 desc->buffer[desc_pos + 1],
2156 desc->buffer[desc_pos + 2],
2157 desc->buffer[desc_pos + 3],
2158 desc->buffer[desc_pos + 4]
2159 );
2160 list_pos+= 5;
2161 desc_pos+= 5;
2162 } else if (desc_pos + 4 <= desc_end) {
2163 TRACE_EVENT_P4 ("%02x %02x %02x %02x ",
2164 desc->buffer[desc_pos],
2165 desc->buffer[desc_pos + 1],
2166 desc->buffer[desc_pos + 2],
2167 desc->buffer[desc_pos + 3]
2168 );
2169 list_pos+= 4;
2170 desc_pos+= 4;
2171 } else if (desc_pos + 3 <= desc_end) {
2172 TRACE_EVENT_P3 ("%02x %02x %02x ",
2173 desc->buffer[desc_pos],
2174 desc->buffer[desc_pos + 1],
2175 desc->buffer[desc_pos + 2]
2176 );
2177 list_pos+= 3;
2178 desc_pos+= 3;
2179 } else if (desc_pos + 2 <= desc_end) {
2180 TRACE_EVENT_P2 ("%02x %02x ",
2181 desc->buffer[desc_pos],
2182 desc->buffer[desc_pos + 1]
2183 );
2184 list_pos+= 2;
2185 desc_pos+= 2;
2186 } else if (desc_pos + 1 <= desc_end) {
2187 TRACE_EVENT_P1 ("%02x ",
2188 desc->buffer[desc_pos]
2189 );
2190 list_pos++;
2191 desc_pos++;
2192 }
2193
2194 /* break tracing if payload shall not be traced*/
2195 if(!sndcp_data->trace_ip_datagram && (list_pos >= 40))
2196 break;
2197
2198 } /* while(list_pos < frame_len) */
2199
2200 }
2201
2202 #endif /* CF_FAST_EXEC */
2203
2204 #endif /* SNDCP_TRACE_BUFFER */
2205
2206
2207
2208 #ifdef _SNDCP_MEAN_TRACE_
2209 /*
2210 +------------------------------------------------------------------------------
2211 | Function : sndcp_sn_count_req
2212 +------------------------------------------------------------------------------
2213 | Description : reaction to prim SN_COUNT_REQ
2214 |
2215 | Parameters : primitive payload
2216 |
2217 +------------------------------------------------------------------------------
2218 */
2219 #ifndef CF_FAST_EXEC
2220
2221 GLOBAL void sndcp_sn_count_req(T_SN_COUNT_REQ* sn_count_req)
2222 {
2223 TRACE_FUNCTION("sndcp_sn_count_req");
2224
2225 {
2226 BOOL ack = FALSE;
2227 PALLOC(sn_count_cnf, SN_COUNT_CNF);
2228
2229 sn_count_cnf->nsapi = sn_count_req->nsapi;
2230
2231 sndcp_get_nsapi_ack(sn_count_req->nsapi, &ack);
2232 if (ack) {
2233 sn_count_cnf->octets_uplink =
2234 sndcp_data->cur_num_uplink_ack[sn_count_req->nsapi];
2235 sn_count_cnf->octets_downlink =
2236 sndcp_data->cur_num_downlink_ack[sn_count_req->nsapi];
2237
2238 sn_count_cnf->packets_uplink =
2239 sndcp_data->cur_pac_uplink_ack[sn_count_req->nsapi];
2240 sn_count_cnf->packets_downlink =
2241 sndcp_data->cur_pac_downlink_ack[sn_count_req->nsapi];
2242
2243 #ifdef SNDCP_UPM_INCLUDED
2244 if (sn_count_req->reset == NAS_RESET_YES) {
2245 #else
2246 if (sn_count_req->reset == SN_RESET_YES) {
2247 #endif /*SNDCP_UPM_INCLUDED*/
2248 sndcp_data->cur_num_uplink_ack[sn_count_req->nsapi] = 0;
2249 sndcp_data->cur_num_downlink_ack[sn_count_req->nsapi] = 0;
2250 sndcp_data->cur_pac_uplink_ack[sn_count_req->nsapi] = 0;
2251 sndcp_data->cur_pac_downlink_ack[sn_count_req->nsapi] = 0;
2252 }
2253
2254 } else {
2255
2256 sn_count_cnf->octets_uplink =
2257 sndcp_data->cur_num_uplink_unack[sn_count_req->nsapi];
2258 sn_count_cnf->octets_downlink =
2259 sndcp_data->cur_num_downlink_unack[sn_count_req->nsapi];
2260
2261 sn_count_cnf->packets_uplink =
2262 sndcp_data->cur_pac_uplink_unack[sn_count_req->nsapi];
2263 sn_count_cnf->packets_downlink =
2264 sndcp_data->cur_pac_downlink_unack[sn_count_req->nsapi];
2265
2266 #ifdef SNDCP_UPM_INCLUDED
2267 if (sn_count_req->reset == NAS_RESET_YES) {
2268 #else
2269 if (sn_count_req->reset == SN_RESET_YES) {
2270 #endif /*SNDCP_UPM_INCLUDED*/
2271 sndcp_data->cur_num_uplink_unack[sn_count_req->nsapi] = 0;
2272 sndcp_data->cur_num_downlink_unack[sn_count_req->nsapi] = 0;
2273 sndcp_data->cur_pac_uplink_unack[sn_count_req->nsapi] = 0;
2274 sndcp_data->cur_pac_downlink_unack[sn_count_req->nsapi] = 0;
2275 }
2276 }
2277
2278 #ifdef SNDCP_UPM_INCLUDED
2279 PSEND(hCommUPM, sn_count_cnf); /*count_cnf goes via UPM*/
2280 #else
2281 PSEND(hCommMMI, sn_count_cnf);
2282 #endif /*SNDCP_UPM_INCLUDED*/
2283
2284 }
2285
2286 PFREE(sn_count_req);
2287 }
2288
2289 #endif /* CF_FAST_EXEC */
2290
2291 #endif /*_SNDCP_MEAN_TRACE */
2292
2293 #ifdef SNDCP_TRACE_IP_DATAGRAM
2294
2295 /*
2296 +------------------------------------------------------------------------------
2297 | Function : sndcp_trace_ip_datagram
2298 +------------------------------------------------------------------------------
2299 | Description : traces content of one desc_list
2300 |
2301 | Parameters : pointer to desc_list
2302 |
2303 +------------------------------------------------------------------------------
2304 */
2305 #ifndef CF_FAST_EXEC
2306
2307 #ifdef _SNDCP_DTI_2_
2308 GLOBAL void sndcp_trace_ip_datagram(T_desc_list2* desc_list)
2309 {
2310 #else /*_SNDCP_DTI_2_*/
2311 GLOBAL void sndcp_trace_ip_datagram(T_desc_list* desc_list)
2312 {
2313 #endif /*_SNDCP_DTI_2_*/
2314 USHORT frame_len = desc_list->list_len;
2315 #ifdef _SNDCP_DTI_2_
2316 T_desc2* desc = (T_desc2*)desc_list->first;
2317 USHORT desc_pos = desc->offset;
2318 USHORT desc_end = desc->len + desc->offset;
2319 #else /*_SNDCP_DTI_2_*/
2320 T_desc* desc = (T_desc*)desc_list->first;
2321 USHORT desc_pos = 0;
2322 USHORT desc_end = desc->len;
2323 #endif /*_SNDCP_DTI_2_*/
2324 USHORT list_pos = 0;
2325 UBYTE *pack_hdr, *ip_hdr;
2326 USHORT t_length = 0;
2327 USHORT length = 0;
2328 USHORT pid = 0;
2329 USHORT f_offset = 0;
2330 USHORT h_checksum = 0;
2331 USHORT src_port = 0;
2332 USHORT dest_port = 0;
2333 ULONG seq_num = 0;
2334 ULONG ack_num = 0;
2335 USHORT window = 0;
2336 USHORT checksum = 0;
2337 USHORT urg_ptr = 0;
2338 USHORT ip_hlen = 0; /* IP header length */
2339 USHORT tcp_hlen = 0; /* TCP header length */
2340 UBYTE tmp_flag = 0;
2341 UBYTE type = 0;
2342 UBYTE code = 0;
2343 /*TRACE_FUNCTION("sndcp_trace_ip_datagram");*/
2344
2345 if(!sndcp_data->trace_ip_datagram && !sndcp_data->trace_ip_header){
2346 return;
2347 }
2348
2349 while(list_pos < frame_len)
2350 {
2351 if (desc != NULL) {
2352 if (desc_pos >= desc_end) {
2353 #ifdef _SNDCP_DTI_2_
2354 desc = (T_desc2*)desc->next;
2355 desc_pos = desc->offset;
2356 desc_end = desc->len + desc->offset;
2357 #else /*_SNDCP_DTI_2_*/
2358 desc = (T_desc*)desc->next;
2359 desc_pos = 0;
2360 desc_end = desc->len;
2361 #endif /*_SNDCP_DTI_2_*/
2362 if (desc == NULL) {
2363 break;
2364 }
2365 }
2366 } else {
2367 return;
2368 }
2369 if((list_pos == 0) || (list_pos >= t_length))
2370 {
2371 ip_hdr = &desc->buffer[desc_pos];
2372 if((ip_hdr[9] != 1) && (ip_hdr[9] != 6) && (ip_hdr[9] != 17)) {
2373 TRACE_EVENT_P1("INFO TRACE: Tracing of protocol type %d not supported",
2374 ip_hdr[9]);
2375 return;
2376 }
2377
2378 /* Trace IP Header */
2379 ip_hlen = (ip_hdr[0] & 0x0F) << 2;
2380 if ((desc_pos + ip_hlen) <= desc_end){
2381 TRACE_EVENT("IP Header");
2382 TRACE_EVENT_P1(" Protocol Version: %d",
2383 ((ip_hdr[0] & 0xF0) >> 4));
2384 TRACE_EVENT_P1(" Header Length: %d", (ip_hlen >> 2));
2385 TRACE_EVENT_P1(" Type Of Service: %d", ip_hdr[1]);
2386 t_length |= ip_hdr[2] << 8;
2387 t_length |= ip_hdr[3];
2388 TRACE_EVENT_P1(" Total Length: %d", t_length);
2389 pid |= ip_hdr[4] << 8;
2390 pid |= ip_hdr[5];
2391 TRACE_EVENT_P1(" Packet ID: %d", pid);
2392 TRACE_EVENT_P2(" MF|DF: %d|%d",
2393 (ip_hdr[6] & 0x20) >> 5,
2394 (ip_hdr[6] & 0x40) >> 6);
2395 f_offset |= (ip_hdr[6] & 0x1F) << 8;
2396 f_offset |= ip_hdr[7];
2397 TRACE_EVENT_P1(" Fragment offset: %d", f_offset);
2398 TRACE_EVENT_P1(" Time To Live: %d", ip_hdr[8]);
2399 if(ip_hdr[9] == 17) {
2400 TRACE_EVENT_P1(" Protocol: UDP(%d)",
2401 ip_hdr[9]);
2402 } else if (ip_hdr[9] == 6) {
2403 TRACE_EVENT_P1(" Protocol: TCP(%d)",
2404 ip_hdr[9]);
2405 } else {
2406 TRACE_EVENT_P1(" Protocol: %d",
2407 ip_hdr[9]);
2408 }
2409 h_checksum |= ip_hdr[10] << 8;
2410 h_checksum |= ip_hdr[11];
2411 TRACE_EVENT_P1(" Header Checksum: %d", h_checksum);
2412 TRACE_EVENT_P4(" Source Address: %d.%d.%d.%d",
2413 ip_hdr[12], ip_hdr[13],
2414 ip_hdr[14], ip_hdr[15]);
2415 TRACE_EVENT_P4(" Destination Address: %d.%d.%d.%d",
2416 ip_hdr[16], ip_hdr[17],
2417 ip_hdr[18], ip_hdr[19]);
2418 list_pos+= ip_hlen;
2419 desc_pos+= ip_hlen;
2420 }
2421 /* Trace TCP Header */
2422 if((ip_hdr[9] == 6) && ((desc_pos + 20) <= desc_end))
2423 {
2424 TRACE_EVENT("TCP Header");
2425 pack_hdr = &ip_hdr[ip_hlen];
2426 tcp_hlen = (pack_hdr[12] & 0xF0) >> 2; /* the same as (x>>4)*4 */
2427 src_port |= pack_hdr[0] << 8;
2428 src_port |= pack_hdr[1];
2429 TRACE_EVENT_P1(" Source Port: %d", src_port);
2430 dest_port |= pack_hdr[2] << 8;
2431 dest_port |= pack_hdr[3];
2432 TRACE_EVENT_P1(" Destination Port: %d", dest_port);
2433 seq_num |= pack_hdr[4] << 24;
2434 seq_num |= pack_hdr[5] << 16;
2435 seq_num |= pack_hdr[6] << 8;
2436 seq_num |= pack_hdr[7];
2437 TRACE_EVENT_P1(" Sequence Number: %u", seq_num);
2438 ack_num |= pack_hdr[8] << 24;
2439 ack_num |= pack_hdr[9] << 16;
2440 ack_num |= pack_hdr[10] << 8;
2441 ack_num |= pack_hdr[11];
2442 TRACE_EVENT_P1(" Acknowledgment Number: %u", ack_num);
2443 TRACE_EVENT_P1(" Data Offset: %d", (tcp_hlen >> 2));
2444 TRACE_EVENT_P6(" URG|ACK|PSH|RST|SYN|FIN: %d|%d|%d|%d|%d|%d",
2445 (pack_hdr[13] & 0x20) >> 5,
2446 (pack_hdr[13] & 0x10) >> 4,
2447 (pack_hdr[13] & 0x08) >> 3,
2448 (pack_hdr[13] & 0x04) >> 2,
2449 (pack_hdr[13] & 0x02) >> 1,
2450 (pack_hdr[13] & 0x01) );
2451 window |= pack_hdr[14] << 8;
2452 window |= pack_hdr[15];
2453 TRACE_EVENT_P1(" Window Size: %d", window);
2454 checksum |= pack_hdr[16] << 8;
2455 checksum |= pack_hdr[17];
2456 TRACE_EVENT_P1(" Checksum: %d", checksum);
2457 urg_ptr |= pack_hdr[18] << 8;
2458 urg_ptr |= pack_hdr[19];
2459 TRACE_EVENT_P1(" Ungent Pointer: 0x%04x", urg_ptr);
2460 list_pos+= tcp_hlen;
2461 desc_pos+= tcp_hlen;
2462 }
2463 /* Trace UDP Header */
2464 else if((ip_hdr[9] == 17) && ((desc_pos + 8) <= desc_end))
2465 {
2466 TRACE_EVENT("UDP Header");
2467 pack_hdr = &ip_hdr[ip_hlen];
2468 src_port |= pack_hdr[0] << 8;
2469 src_port |= pack_hdr[1];
2470 TRACE_EVENT_P1(" Source Port: %d", src_port);
2471 dest_port |= pack_hdr[2] << 8;
2472 dest_port |= pack_hdr[3];
2473 TRACE_EVENT_P1(" Destination Port: %d", dest_port);
2474 length |= pack_hdr[4] << 8;
2475 length |= pack_hdr[5];
2476 TRACE_EVENT_P1(" Length: %d", length);
2477 checksum |= pack_hdr[6] << 8;
2478 checksum |= pack_hdr[7];
2479 TRACE_EVENT_P1(" Checksum: %d", checksum);
2480 list_pos+= 8;
2481 desc_pos+= 8;
2482 }
2483 /* Trace ICMP Header */
2484 else if((ip_hdr[9] == 1) && ((desc_pos + 8) <= desc_end))
2485 {
2486 TRACE_EVENT("ICMP Header");
2487 pack_hdr = &ip_hdr[ip_hlen];
2488 type = pack_hdr[0];
2489 TRACE_EVENT_P1(" Message Type: %d", type);
2490 code = pack_hdr[1];
2491 TRACE_EVENT_P1(" Message Code: %d", code);
2492 checksum |= pack_hdr[2] << 8;
2493 checksum |= pack_hdr[3];
2494 TRACE_EVENT_P1(" Checksum: %d", checksum);
2495 list_pos+= 8;
2496 desc_pos+= 8;
2497 }
2498 }/* if((list_pos == 0) || (list_pos >= t_length)) */
2499 /* Shall payload be traced? */
2500 if(!sndcp_data->trace_ip_datagram){
2501 break;
2502 }
2503 /* Trace Payload */
2504 if(!tmp_flag && (desc_pos < frame_len)){
2505 TRACE_EVENT("Payload");
2506 tmp_flag = 1;
2507 }
2508 /*lint -e661 -e662 possible access/creation of out-of-bounds pointer*/
2509 if (desc_pos + 16 <= desc_end) {
2510 TRACE_EVENT_P16 (" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ",
2511 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2512 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2513 desc->buffer[desc_pos+6], desc->buffer[desc_pos+7], desc->buffer[desc_pos+8],
2514 desc->buffer[desc_pos+9], desc->buffer[desc_pos+10], desc->buffer[desc_pos+11],
2515 desc->buffer[desc_pos+12], desc->buffer[desc_pos+13], desc->buffer[desc_pos+14],
2516 desc->buffer[desc_pos+15]);
2517 list_pos+= 16;
2518 desc_pos+= 16;
2519 } else if (desc_pos + 14 <= desc_end) {
2520 TRACE_EVENT_P14 (" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
2521 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2522 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2523 desc->buffer[desc_pos+6], desc->buffer[desc_pos+7], desc->buffer[desc_pos+8],
2524 desc->buffer[desc_pos+9], desc->buffer[desc_pos+10], desc->buffer[desc_pos+11],
2525 desc->buffer[desc_pos+12], desc->buffer[desc_pos+13]);
2526 list_pos+= 14;
2527 desc_pos+= 14;
2528 } else if (desc_pos + 12 <= desc_end) {
2529 TRACE_EVENT_P12(" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ",
2530 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2531 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2532 desc->buffer[desc_pos+6], desc->buffer[desc_pos+7], desc->buffer[desc_pos+8],
2533 desc->buffer[desc_pos+9], desc->buffer[desc_pos+10], desc->buffer[desc_pos+11]);
2534 list_pos+= 12;
2535 desc_pos+= 12;
2536 } else if (desc_pos + 10 <= desc_end) {
2537 TRACE_EVENT_P10(" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
2538 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2539 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2540 desc->buffer[desc_pos+6], desc->buffer[desc_pos+7], desc->buffer[desc_pos+8],
2541 desc->buffer[desc_pos+9]);
2542 list_pos+= 10;
2543 desc_pos+= 10;
2544 } else if (desc_pos + 8 <= desc_end) {
2545 TRACE_EVENT_P8 (" %02x %02x %02x %02x %02x %02x %02x %02x ",
2546 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2547 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2548 desc->buffer[desc_pos+6], desc->buffer[desc_pos+7]);
2549 list_pos+= 8;
2550 desc_pos+= 8;
2551 } else if (desc_pos + 7 <= desc_end) {
2552 TRACE_EVENT_P7 (" %02x %02x %02x %02x %02x %02x %02x ",
2553 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2554 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5],
2555 desc->buffer[desc_pos+6]);
2556 list_pos+= 7;
2557 desc_pos+= 7;
2558 } else if (desc_pos + 6 <= desc_end) {
2559 TRACE_EVENT_P6 (" %02x %02x %02x %02x %02x %02x ",
2560 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2561 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4], desc->buffer[desc_pos+5]);
2562 list_pos+= 6;
2563 desc_pos+= 6;
2564 } else if (desc_pos + 5 <= desc_end) {
2565 TRACE_EVENT_P5 (" %02x %02x %02x %02x %02x ",
2566 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1], desc->buffer[desc_pos+2],
2567 desc->buffer[desc_pos+3], desc->buffer[desc_pos+4]);
2568 list_pos+= 5;
2569 desc_pos+= 5;
2570 } else if (desc_pos + 4 <= desc_end) {
2571 TRACE_EVENT_P4 (" %02x %02x %02x %02x ",
2572 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1],
2573 desc->buffer[desc_pos+2], desc->buffer[desc_pos+3]);
2574 list_pos+= 4;
2575 desc_pos+= 4;
2576 } else if (desc_pos + 3 <= desc_end) {
2577 TRACE_EVENT_P3 (" %02x %02x %02x ",
2578 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1],
2579 desc->buffer[desc_pos+2]);
2580 list_pos+= 3;
2581 desc_pos+= 3;
2582 } else if (desc_pos + 2 <= desc_end) {
2583 TRACE_EVENT_P2 (" %02x %02x ",
2584 desc->buffer[desc_pos+0], desc->buffer[desc_pos+1]);
2585 list_pos+= 2;
2586 desc_pos+= 2;
2587 } else if (desc_pos + 1 <= desc_end) {
2588 TRACE_EVENT_P1 (" %02x ", desc->buffer[desc_pos+0]);
2589 list_pos++;
2590 desc_pos++;
2591 }
2592 } /* while(list_pos < frame_len) */
2593 /*lint -e661 -e662 possible access/creation of out-of-bounds pointer*/
2594 }
2595 /*
2596 +------------------------------------------------------------------------------
2597 | Function : sndcp_bin_trace_ip
2598 +------------------------------------------------------------------------------
2599 | Description : traces content of one desc_list using TRACE_IP macro
2600 |
2601 | Parameters : pointer to desc_list
2602 | direction: SNDCP_UL_PACKET (0x1)
2603 | SNDCP_DL_PACKET (0x2)
2604 |
2605 +------------------------------------------------------------------------------
2606 */
2607 #ifdef _SNDCP_DTI_2_
2608 GLOBAL void sndcp_bin_trace_ip(T_desc_list2* desc_list, U8 direction)
2609 {
2610 #else /*_SNDCP_DTI_2_*/
2611 GLOBAL void sndcp_bin_trace_ip(T_desc_list* desc_list, U8 direction)
2612 {
2613 #endif /*_SNDCP_DTI_2_*/
2614 USHORT frame_len = desc_list->list_len;
2615 #ifdef _SNDCP_DTI_2_
2616 T_desc2* desc = (T_desc2*)desc_list->first;
2617 #else /*_SNDCP_DTI_2_*/
2618 T_desc* desc = (T_desc*)desc_list->first;
2619 #endif /*_SNDCP_DTI_2_*/
2620
2621 U16 pid = 0;
2622 U16 pos = 0;
2623
2624 TRACE_FUNCTION("sndcp_bin_trace_ip");
2625
2626 if(frame_len > 1500){
2627 TRACE_EVENT("TRACE IP ERROR: IP packet too long.");
2628 return;
2629 }
2630
2631 while(desc != NULL)
2632 {
2633 #ifdef _SNDCP_DTI_2_
2634 memcpy(&bin_trace_ip_buf[pos], (U8*)&desc->buffer[desc->offset], desc->len );
2635 pos += desc->len;
2636 desc = (T_desc2*)desc->next;
2637 #else /*_SNDCP_DTI_2_*/
2638 memcpy(&bin_trace_ip_buf[pos], (U8*)&desc->buffer[0], desc->len );
2639 pos += desc->len;
2640 desc = (T_desc*)desc->next;
2641 #endif /*_SNDCP_DTI_2_*/
2642 }
2643
2644 #ifdef TRACE_IP
2645 if(direction == SNDCP_DL_PACKET){
2646 TRACE_IP(SNDCP_handle, SNDCP_handle, DOWNLINK_OPC, \
2647 (U8*)&bin_trace_ip_buf[0], frame_len);
2648 pid = bin_trace_ip_buf[5] | (bin_trace_ip_buf[4] << 8);
2649 TRACE_EVENT_P1("TRACE IP INFO: Downlink IP Packet, ID: %d", pid);
2650 } else if (direction == SNDCP_UL_PACKET){
2651 TRACE_IP(SNDCP_handle, SNDCP_handle, UPLINK_OPC, \
2652 (U8*)&bin_trace_ip_buf[0], frame_len);
2653 pid = bin_trace_ip_buf[5] | (bin_trace_ip_buf[4] << 8);
2654 TRACE_EVENT_P1("TRACE IP INFO: Uplink IP Packet, ID: %d", pid);
2655 } else {
2656 TRACE_EVENT("TRACE IP ERROR: unknown transfer direction.");
2657 }
2658 #else /*TRACE_IP*/
2659 TRACE_EVENT("SNDCP WARNING: TRACE_IP macro not defined");
2660 #endif /*TRACE_IP*/
2661 }
2662
2663
2664 /*
2665 +------------------------------------------------------------------------------
2666 | Function : sndcp_default_ip_trace
2667 +------------------------------------------------------------------------------
2668 | Description : traces TCP, UDP or ICMP header
2669 |
2670 | Parameters : pointer to desc_list
2671 | direction: SNDCP_UL_PACKET (0x1)
2672 | SNDCP_DL_PACKET (0x2)
2673 |
2674 +------------------------------------------------------------------------------
2675 */
2676 #ifdef _SNDCP_DTI_2_
2677 GLOBAL void sndcp_default_ip_trace(T_desc_list2 *desc_list, U8 direction)
2678 #else
2679 GLOBAL void sndcp_default_ip_trace(T_desc_list *desc_list, U8 direction)
2680 #endif
2681 {
2682 #ifdef _SNDCP_DTI_2_
2683 T_desc2 *desc = (T_desc2 *)desc_list->first;
2684 U8 *ip_hdr = &desc->buffer[desc->offset];
2685 #else
2686 T_desc *desc = (T_desc *)desc_list->first;
2687 U8 *ip_hdr = &desc->buffer[0];
2688 #endif
2689 U8 *pk_hdr = NULL;
2690 U16 ip_len = 0;
2691 U16 icmp_seq = 0;
2692 U32 seq_num = 0,
2693 ack_num = 0;
2694 U16 t_length = 0;
2695 U16 pid = 0;
2696 U8 type, code;
2697 U16 win_size = 0;
2698
2699 TRACE_FUNCTION("sndcp_default_ip_trace");
2700
2701 if(desc_list == NULL || desc_list->first == NULL || desc_list->list_len == 0){
2702 return;
2703 }
2704
2705 ip_len = (ip_hdr[0] & 0x0f) * 4; /* IP header length in bytes*/
2706 if(desc->len < ip_len){
2707 TRACE_EVENT("IP TRACE: can not trace ip header, desc too small");
2708 return;
2709 }
2710
2711 pk_hdr = &ip_hdr[ip_len]; /* Pointer to the header on top of IP hdr */
2712 t_length |= ip_hdr[2] << 8; /* Total packet length */
2713 t_length |= ip_hdr[3];
2714 pid |= ip_hdr[4] << 8; /* Unequal packet ID */
2715 pid |= ip_hdr[5];
2716
2717 switch(ip_hdr[9]){
2718 /* ICMP Protocol */
2719 case 1:
2720 if(desc->len < (ip_len + 8)){
2721 TRACE_EVENT("IP TRACE: can not trace icmp header, desc to small");
2722 return;
2723 }
2724 /* Trace ICMP Header */
2725 type = pk_hdr[0];
2726 if(type == 8 || type == 0){
2727 icmp_seq |= pk_hdr[6];
2728 icmp_seq |= pk_hdr[7] << 8;
2729 TRACE_EVENT_P4("ICMP Echo: type %d, len %d, pid %d, icmp_seq %d",
2730 type, t_length, pid, icmp_seq);
2731 } else {
2732 code = pk_hdr[1];
2733 TRACE_EVENT_P5("ICMP Packet: dir %d, len %d, pid %d, type: %d, code: %d",
2734 direction, t_length, pid, type, code);
2735 }
2736 break;
2737 /* TCP Protocol */
2738 case 6:
2739 if(desc->len < (ip_len + 20)){
2740 TRACE_EVENT("IP TRACE: can not trace tcp header, desc to small");
2741 return;
2742 }
2743 seq_num |= pk_hdr[4] << 24;
2744 seq_num |= pk_hdr[5] << 16;
2745 seq_num |= pk_hdr[6] << 8;
2746 seq_num |= pk_hdr[7];
2747 ack_num |= pk_hdr[8] << 24;
2748 ack_num |= pk_hdr[9] << 16;
2749 ack_num |= pk_hdr[10] << 8;
2750 ack_num |= pk_hdr[11];
2751 win_size |= pk_hdr[14] << 8;
2752 win_size |= pk_hdr[15];
2753
2754 TRACE_EVENT_P14("TCP Packet: dir %d, len %d, pid %d, seq_num %u, ack_num %u, src_ip %d.%d.%d.%d, dst_ip %d.%d.%d.%d, win_size %d",
2755 direction, t_length, pid, seq_num, ack_num,
2756 ip_hdr[12], ip_hdr[13], ip_hdr[14], ip_hdr[15],
2757 ip_hdr[16], ip_hdr[17], ip_hdr[18], ip_hdr[19], win_size);
2758 break;
2759 /* UDP Protocol */
2760 case 17:
2761 if(desc->len < (ip_len + 8)){
2762 TRACE_EVENT("IP TRACE: can not trace udp header, desc to small");
2763 return;
2764 }
2765 TRACE_EVENT_P3("UDP Packet: dir %d, len %d, pid %d",
2766 direction, t_length, pid);
2767 break;
2768 default:
2769 TRACE_EVENT_P1("INFO TRACE: Tracing of protocol type %d not supported",
2770 ip_hdr[9]);
2771 break;
2772 }
2773
2774 return;
2775 }
2776
2777 #endif /* CF_FAST_EXEC */
2778 #endif /* SNDCP_TRACE_IP_DATAGRAM */
2779
2780 /*
2781 +------------------------------------------------------------------------------
2782 | Function : sndcp_swap2
2783 +------------------------------------------------------------------------------
2784 | Description : This routine converts (2 byte) short n from network byte order
2785 | to host byte order.
2786 |
2787 | Parameters : USHORT n
2788 |
2789 +------------------------------------------------------------------------------
2790 */
2791 #ifndef CF_FAST_EXEC
2792
2793 GLOBAL USHORT sndcp_swap2(USHORT n)
2794 {
2795 USHORT tmp = n;
2796 return n = (((tmp & 0xff00) >> 8) | ((tmp & 0x00ff) << 8) );
2797 }
2798
2799 #endif /* CF_FAST_EXEC */
2800
2801 /*
2802 +------------------------------------------------------------------------------
2803 | Function : sndcp_swap4
2804 +------------------------------------------------------------------------------
2805 | Description : This routine converts (4 byte) long n from network byte order
2806 | to host byte order.
2807 |
2808 | Parameters : ULONG n
2809 |
2810 +------------------------------------------------------------------------------
2811 */
2812
2813 #ifndef CF_FAST_EXEC
2814
2815 GLOBAL ULONG sndcp_swap4(ULONG n) {
2816 ULONG tmp = n;
2817 return n = ((tmp & 0xff000000) >> 24) | ((tmp & 0x00ff0000) >> 8 ) |
2818 ((tmp & 0x0000ff00) << 8 ) | ((tmp & 0x000000ff) << 24);
2819 }
2820
2821 #endif /* CF_FAST_EXEC */
2822 /*
2823 +------------------------------------------------------------------------------
2824 | Function : sndcp_get_nsapi_rec_state
2825 +------------------------------------------------------------------------------
2826 | Description : The function returns the receiving state for given NSAPI
2827 |
2828 | Parameters : IN : nsapi
2829 | OUT : state
2830 |
2831 +------------------------------------------------------------------------------
2832 */
2833 #ifndef CF_FAST_EXEC
2834 GLOBAL U8 sndcp_get_nsapi_rec_state (U8 nsapi)
2835 {
2836 TRACE_FUNCTION( "sndcp_get_nsapi_rec_state" );
2837
2838 return sndcp_data->rec_states[nsapi];
2839
2840 } /* sndcp_get_nsapi_rec_state() */
2841 #endif /* CF_FAST_EXEC */
2842
2843 /*
2844 +------------------------------------------------------------------------------
2845 | Function : sndcp_set_nsapi_rec_state
2846 +------------------------------------------------------------------------------
2847 | Description : The function sets the receiving state for given NSAPI
2848 |
2849 | Parameters : IN : nsapi
2850 | IN : state
2851 |
2852 +------------------------------------------------------------------------------
2853 */
2854 #ifndef CF_FAST_EXEC
2855 GLOBAL void sndcp_set_nsapi_rec_state (U8 nsapi, U8 state)
2856 {
2857 TRACE_FUNCTION( "sndcp_set_nsapi_rec_state" );
2858
2859 sndcp_data->rec_states[nsapi] = state;
2860
2861 } /* sndcp_set_nsapi_rec_state() */
2862 #endif /* CF_FAST_EXEC */
2863
2864 /*
2865 +------------------------------------------------------------------------------
2866 | Function : sndcp_get_npdu_num
2867 +------------------------------------------------------------------------------
2868 | Description : E X T R A convenience function, not in SDL.
2869 | Gets the N-PDU number from the segment header.
2870 |
2871 | Parameters : ll_unitdata_ind T_LL_UNITDATA_IND*, npdu_num*
2872 |
2873 +------------------------------------------------------------------------------
2874 */
2875 #ifndef CF_FAST_EXEC
2876 LOCAL void sndcp_get_npdu_num (T_LL_UNITDATA_IND* ll_unitdata_ind, USHORT* npdu_num)
2877 {
2878 USHORT msn_off = 1;
2879 USHORT lsb_off = 2;
2880 UBYTE msn = 0;
2881 UBYTE lsb = 0;
2882
2883 if ((ll_unitdata_ind->sdu.buf[ll_unitdata_ind->sdu.o_buf / 8]) & 0x40) {
2884 msn_off = 2;
2885 lsb_off = 3;
2886 }
2887
2888 msn =
2889 ll_unitdata_ind->sdu.buf[(ll_unitdata_ind->sdu.o_buf / 8) + msn_off];
2890 lsb =
2891 ll_unitdata_ind->sdu.buf[(ll_unitdata_ind->sdu.o_buf / 8) + lsb_off];
2892
2893 *npdu_num = ((msn & 0xf) << 8) + lsb;
2894 } /* sndcp_get_npdu_num() */
2895 #endif /* CF_FAST_EXEC */
2896
2897 /*
2898 +------------------------------------------------------------------------------
2899 | Function : sndcp_get_seg_num
2900 +------------------------------------------------------------------------------
2901 | Description : E X T R A convenience function, not in SDL.
2902 | Gets the NSAPI from the segment header.
2903 |
2904 | Parameters : ll_unitdata_ind T_LL_UNITDATA_IND*, seg_num*
2905 |
2906 +------------------------------------------------------------------------------
2907 */
2908 #ifndef CF_FAST_EXEC
2909 LOCAL void sndcp_get_seg_num (T_LL_UNITDATA_IND* ll_unitdata_ind, UBYTE* seg_num)
2910 {
2911 *seg_num = (ll_unitdata_ind->sdu.buf[(ll_unitdata_ind->sdu.o_buf / 8) + 2] >> 4);
2912 } /* sd_get_seg_num() */
2913 #endif /* CF_FAST_EXEC */
2914
2915 /*
2916 +------------------------------------------------------------------------------
2917 | Function : sndcp_set_unack_transfer_params
2918 +------------------------------------------------------------------------------
2919 | Description : There is one N-PDU, whose segments are sent to CIA one by one,
2920 | and that is expected reassembled and decompressed back from CIA. Some
2921 | informations are only given in the first segment.
2922 | This procedure stores the needed elements in service variables that can
2923 | be read before sending a SIG_SD_CIA_TRANSFER_REQ.
2924 |
2925 | Parameters : ll_unitdata_req*
2926 | Pre : Correct instance of sd service must be activated.
2927 |
2928 +------------------------------------------------------------------------------
2929 */
2930 #ifndef CF_FAST_EXEC
2931 GLOBAL void sndcp_set_unack_transfer_params (T_LL_UNITDATA_IND* ll_unitdata_ind)
2932 {
2933
2934 UBYTE nsapi =
2935 (ll_unitdata_ind->sdu.buf[(ll_unitdata_ind->sdu.o_buf / 8)]) & 0xf;
2936
2937 /*
2938 * The dcomp value in the first segment of the currently reassembled N-PDU.
2939 */
2940 sndcp_data->cur_dcomp[nsapi] =
2941 (ll_unitdata_ind->sdu.buf[ll_unitdata_ind->sdu.o_buf / 8 + 1] & 0xf0) >> 4 ;
2942 /*
2943 * The pcomp value in the first segment of the currently reassembled N-PDU.
2944 */
2945 sndcp_data->cur_pcomp[nsapi] =
2946 (ll_unitdata_ind->sdu.buf[ll_unitdata_ind->sdu.o_buf / 8 + 1]) & 0xf;
2947 /*
2948 * Reference to N-PDU.
2949 */
2950 sndcp_data->cur_pdu_ref[nsapi].ref_nsapi = nsapi;
2951 sndcp_get_npdu_num(ll_unitdata_ind, &sndcp_data->cur_pdu_ref[nsapi].ref_npdu_num);
2952 sndcp_get_seg_num(ll_unitdata_ind, &sndcp_data->cur_pdu_ref[nsapi].ref_seg_num);
2953 /*
2954 * First and/or last segment?
2955 */
2956 sndcp_data->cur_seg_pos[nsapi] = 0;
2957 /*
2958 * if f bit is set
2959 */
2960 if ((ll_unitdata_ind->sdu.buf[ll_unitdata_ind->sdu.o_buf / 8] & 0x40)) {
2961 sndcp_data->cur_seg_pos[nsapi] += SEG_POS_FIRST;
2962 }
2963 /*
2964 * if m bit is not set
2965 */
2966 if (!(ll_unitdata_ind->sdu.buf[ll_unitdata_ind->sdu.o_buf / 8] & 0x10)) {
2967 sndcp_data->cur_seg_pos[nsapi] += SEG_POS_LAST;
2968 }
2969 } /* sndcp_set_unack_transfer_params() */
2970 #endif /* CF_FAST_EXEC */
2971
2972 /*
2973 +------------------------------------------------------------------------------
2974 | Function : sndcp_set_ack_transfer_params
2975 +------------------------------------------------------------------------------
2976 | Description : There is one N-PDU, whose segments are sent to CIA one by one,
2977 | and that is expected reassembled and decompressed back from CIA. Some
2978 | informations are only given in the first segment.
2979 | This procedure stores the needed elements in service variables that can
2980 | be read before sending a SIG_SDA_CIA_TRANSFER_REQ.
2981 |
2982 | Parameters : ll_data_ind*
2983 | Pre : Correct instance of sda service must be activated.
2984 |
2985 +------------------------------------------------------------------------------
2986 */
2987 #ifndef CF_FAST_EXEC
2988 GLOBAL void sndcp_set_ack_transfer_params (T_LL_DATA_IND* ll_data_ind)
2989 {
2990 UBYTE nsapi = (ll_data_ind->sdu.buf[(ll_data_ind->sdu.o_buf / 8)]) & 0xf;
2991
2992 /*
2993 * The dcomp value in the first segment of the currently reassembled N-PDU.
2994 */
2995 sndcp_data->cur_dcomp[nsapi] =
2996 (ll_data_ind->sdu.buf[ll_data_ind->sdu.o_buf / 8 + 1] & 0xf0) >> 4 ;
2997 /*
2998 * The pcomp value in the first segment of the currently reassembled N-PDU.
2999 */
3000 sndcp_data->cur_pcomp[nsapi] =
3001 ll_data_ind->sdu.buf[ll_data_ind->sdu.o_buf / 8 + 1] & 0xf;
3002 /*
3003 * Reference to N-PDU.
3004 */
3005 sndcp_data->cur_pdu_ref[nsapi].ref_nsapi = nsapi;
3006 sndcp_data->cur_pdu_ref[nsapi].ref_npdu_num =
3007 ll_data_ind->sdu.buf[(ll_data_ind->sdu.o_buf >> 3) + 2];
3008
3009
3010 /*
3011 * First and/or last segment?
3012 */
3013 sndcp_data->cur_seg_pos[nsapi] = 0;
3014 /*
3015 * if f bit is set
3016 */
3017 if ((ll_data_ind->sdu.buf[ll_data_ind->sdu.o_buf / 8]) & 0x40) {
3018 sndcp_data->cur_seg_pos[nsapi] += SEG_POS_FIRST;
3019 }
3020 /*
3021 * if m bit is not set
3022 */
3023 if (!((ll_data_ind->sdu.buf[ll_data_ind->sdu.o_buf / 8]) & 0x10)) {
3024 sndcp_data->cur_seg_pos[nsapi] += SEG_POS_LAST;
3025 }
3026 } /* sndcp_set_ack_transfer_params() */
3027 #endif /* CF_FAST_EXEC */