comparison src/g23m-fad/udp/udp_kerp.c @ 174:90eb61ecd093

src/g23m-fad: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 12 Oct 2016 05:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
173:bf64d785238a 174:90eb61ecd093
1 /*
2 +----------------------------------------------------------------------------
3 | Project :
4 | Modul :
5 +----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +----------------------------------------------------------------------------
17 | Purpose : This Modul defines the functions for processing
18 | of incomming primitives for the component
19 | Internet Protocol of the mobile station
20 +----------------------------------------------------------------------------
21 */
22
23 #define ENTITY_UDP
24
25 /*==== INCLUDES ===================================================*/
26
27 #include <string.h>
28 #include "typedefs.h"
29 #include "pcm.h"
30 #include "pconst.cdg"
31 #include "mconst.cdg"
32 #include "message.h"
33 #include "ccdapi.h"
34 #include "vsi.h"
35 #include "macdef.h" /* To get PFREE_DESC2 */
36 #include "custom.h"
37 #include "gsm.h"
38 #include "prim.h"
39 #include "cnf_udp.h"
40 #include "mon_udp.h"
41 #include "pei.h"
42 #include "tok.h"
43 #include "dti.h" /* To get DTI lib */
44 #include "udp.h"
45
46 /*==== CONST =======================================================*/
47
48 /*==== TYPES =======================================================*/
49
50 /*==== VAR EXPORT ==================================================*/
51
52 /*==== VAR LOCAL ===================================================*/
53
54 /*==== MACROS ======================================================*/
55
56 /*==== Prototypes ==================================================*/
57
58 /*==== FUNCTIONS ===================================================*/
59
60 /*
61 +--------------------------------------------------------------------+
62 | PROJECT : WAP MODULE : UDP_KERP |
63 | STATE : code ROUTINE : ker_udpa_dti_req |
64 +--------------------------------------------------------------------+
65
66 PURPOSE : Process UDPA_DTI_REQ primitive
67 */
68
69 void ker_udpa_dti_req (T_UDPA_DTI_REQ * udpa_dti_req)
70 {
71 BOOL confirm = TRUE;
72 UBYTE dti_conn = UDPA_DISCONNECT_DTI;
73 PACCESS (udpa_dti_req);
74
75 TRACE_FUNCTION ("ker_udpa_dti_req()");
76
77 switch (GET_STATE (KER))
78 {
79 case DEACTIVATED:
80 {
81 switch (udpa_dti_req->dti_conn)
82 {
83 case UDPA_CONNECT_DTI:
84 {
85 switch (udpa_dti_req->dti_direction)
86 {
87 case UDPA_DTI_TO_HIGHER_LAYER:
88 if (! * udp_data->hila.entity_name)
89 {
90 hCommHL = vsi_c_open (
91 VSI_CALLER (char *) udpa_dti_req->entity_name
92 );
93 if (hCommHL > VSI_OK)
94 {
95 udp_data->hila.link_id = udpa_dti_req->link_id;
96 strcpy (
97 udp_data->hila.entity_name,
98 (char *) udpa_dti_req->entity_name
99 );
100 SET_STATE (HILA, CONNECTING);
101 if (dti_open (
102 udp_hDTI,
103 UDP_DTI_DEF_INSTANCE,
104 UDP_DTI_HL_INTERFACE,
105 UDP_DTI_DEF_CHANNEL,
106 UDP_DTI_INIT_QUEUE_SIZE,
107 DTI_CHANNEL_TO_HIGHER_LAYER,
108 FLOW_CNTRL_ENABLED,
109 DTI_VERSION_10,
110 (U8 *) udpa_dti_req->entity_name,
111 udpa_dti_req->link_id
112 ) EQ TRUE)
113 {
114 confirm = FALSE;
115 }
116 else /* dti_open failed, close VSI handle: */
117 {
118 vsi_c_close (VSI_CALLER hCommHL);
119 hCommHL = VSI_ERROR;
120 }
121 }
122 }
123 else
124 {
125 TRACE_ERROR ("DTI link to higher layer already requested");
126 }
127 break;
128
129 case UDPA_DTI_TO_LOWER_LAYER:
130 if (! * udp_data->lola.entity_name)
131 {
132 udp_data->lola.link_id = udpa_dti_req->link_id;
133 strcpy (
134 udp_data->lola.entity_name,
135 (char *) udpa_dti_req->entity_name
136 );
137 SET_STATE (LOLA, CONNECTING);
138 if (dti_open (
139 udp_hDTI,
140 UDP_DTI_DEF_INSTANCE,
141 UDP_DTI_LL_INTERFACE,
142 UDP_DTI_DEF_CHANNEL,
143 UDP_DTI_INIT_QUEUE_SIZE,
144 DTI_CHANNEL_TO_LOWER_LAYER,
145 FLOW_CNTRL_ENABLED,
146 DTI_VERSION_10,
147 (U8 *) udpa_dti_req->entity_name,
148 udpa_dti_req->link_id
149 ) EQ TRUE)
150 {
151 confirm = FALSE;
152 }
153 }
154 else
155 {
156 TRACE_ERROR ("DTI link to lower layer already requested");
157 }
158 break;
159
160 default:
161 TRACE_ERROR("illegal parameter (udpa_dti_req->dti_direction)");
162 } /* End switch (udpa_dti_req->dti_direction) */
163 dti_conn = UDPA_DISCONNECT_DTI;
164 break;
165 }
166
167 case UDPA_DISCONNECT_DTI:
168 {
169 if (udp_data->hila.link_id EQ udpa_dti_req->link_id)
170 {
171 dti_close (
172 udp_hDTI,
173 UDP_DTI_DEF_INSTANCE,
174 UDP_DTI_HL_INTERFACE,
175 UDP_DTI_DEF_CHANNEL,
176 FALSE
177 );
178 *udp_data->hila.entity_name = 0;
179 SET_STATE (HILA, DOWN);
180 dti_conn = UDPA_DISCONNECT_DTI;
181
182 vsi_c_close (VSI_CALLER hCommHL);
183 hCommHL = VSI_ERROR;
184 /*XXX check for remaining UP/DOWN-LINK DTI connections, XXX*/
185 /*XXX terminate_ip() if noting left open XXX*/
186 }
187 else if (udp_data->lola.link_id EQ udpa_dti_req->link_id)
188 {
189 dti_close (
190 udp_hDTI,
191 UDP_DTI_DEF_INSTANCE,
192 UDP_DTI_LL_INTERFACE,
193 UDP_DTI_DEF_CHANNEL,
194 FALSE
195 );
196 *udp_data->lola.entity_name = 0;
197 SET_STATE (LOLA, DOWN);
198 dti_conn = UDPA_DISCONNECT_DTI;
199
200 /*XXX check for remaining UP/DOWN-LINK DTI connections, XXX*/
201 /*XXX terminate_ip() if noting left open XXX*/
202 }
203 else
204 {
205 TRACE_ERROR ("illegal parameter (udpa_dti_req->dti_conn)");
206 dti_conn = UDPA_CONNECT_DTI;
207 }
208 }
209 break;
210 } /* End switch (udpa_dti_req->dti_conn) */
211 break;
212 }
213
214 case ACTIVE_NC:
215 switch (udpa_dti_req->dti_conn)
216 {
217 case UDPA_DISCONNECT_DTI:
218 if (udp_data->hila.link_id EQ udpa_dti_req->link_id)
219 {
220 dti_close (
221 udp_hDTI,
222 UDP_DTI_DEF_INSTANCE,
223 UDP_DTI_HL_INTERFACE,
224 UDP_DTI_DEF_CHANNEL,
225 FALSE
226 );
227 *udp_data->hila.entity_name = 0;
228 SET_STATE (HILA, DOWN);
229 dti_conn = UDPA_DISCONNECT_DTI;
230 SET_STATE (KER, DEACTIVATED);
231
232 vsi_c_close (VSI_CALLER hCommHL);
233 hCommHL = VSI_ERROR;
234 }
235 else if (udp_data->lola.link_id EQ udpa_dti_req->link_id)
236 {
237 dti_close (
238 udp_hDTI,
239 UDP_DTI_DEF_INSTANCE,
240 UDP_DTI_LL_INTERFACE,
241 UDP_DTI_DEF_CHANNEL,
242 FALSE
243 );
244 *udp_data->lola.entity_name = 0;
245 SET_STATE (LOLA, DOWN);
246 dti_conn = UDPA_DISCONNECT_DTI;
247 SET_STATE (KER, DEACTIVATED);
248 }
249 break;
250 default:
251 TRACE_ERROR ("unexpected parameter (udpa_dti_req->dti_conn)");
252 dti_conn = UDPA_DISCONNECT_DTI;
253 break;
254 } /* End switch (udpa_dti_req->dti_conn) */
255 break;
256
257 case CONNECTED:
258 default:
259 TRACE_ERROR ("unexpected UDPA_DTI_REQ");
260 if (udpa_dti_req->dti_conn EQ UDPA_CONNECT_DTI)
261 dti_conn = UDPA_DISCONNECT_DTI;
262 else
263 dti_conn = UDPA_CONNECT_DTI;
264 break;
265 } /* End switch (GET_STATE (KER)) */
266
267 if (confirm)
268 {
269 PALLOC (udpa_dti_cnf, UDPA_DTI_CNF);
270 udpa_dti_cnf->dti_conn = dti_conn;
271 udpa_dti_cnf->link_id = udpa_dti_req->link_id;
272 PSENDX (ACI, udpa_dti_cnf);
273 }
274 PFREE (udpa_dti_req);
275 }
276
277 /*
278 +--------------------------------------------------------------------+
279 | PROJECT : WAP MODULE : UDP_KERP |
280 | STATE : code ROUTINE : sig_dti_ker_tx_buffer_ready_ll_ind |
281 +--------------------------------------------------------------------+
282
283 PURPOSE : Process signal SIG_DTI_KER_TX_BUFFER_READY_DN_IND
284 */
285
286 void sig_dti_ker_tx_buffer_ready_ll_ind ()
287 {
288 TRACE_FUNCTION ("sig_dti_ker_tx_buffer_ready_ll_ind()");
289
290 switch (GET_STATE (KER))
291 {
292 case ACTIVE_NC: /* DTI_READY_IND not received yet */
293 SET_STATE (HILA, WAIT);
294 break;
295
296 case CONNECTED:
297 {
298 T_KER * p_ker = & udp_data->ker;
299 T_HILA * p_ul = & udp_data->hila;
300
301 /* Check if an ICMP message shall be sent */
302
303 if (p_ker->send_icmp)
304 {
305 T_DTI2_DATA_REQ * dti_data_req;
306
307 p_ker->send_icmp = FALSE;
308
309 if(p_ker->dti_data_req_icmp)
310 {
311 dti_data_req = p_ker->dti_data_req_icmp;
312 p_ker->dti_data_req_icmp = NULL;
313 }
314 else
315 {
316 TRACE_ERROR("no ICMP message ready!");
317 return;
318 }
319
320 dti_data_req->parameters.p_id = DTI_PID_IP;
321 dti_data_req->parameters.st_lines.st_flow = DTI_FLOW_ON;
322 dti_data_req->parameters.st_lines.st_line_sa = DTI_SA_ON;
323 dti_data_req->parameters.st_lines.st_line_sb = DTI_SB_ON;
324 dti_data_req->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
325
326 PACCESS (dti_data_req);
327 {
328 PPASS (dti_data_req, dti_data_ind, DTI2_DATA_IND);
329 dti_send_data (
330 udp_hDTI,
331 UDP_DTI_DEF_INSTANCE,
332 UDP_DTI_LL_INTERFACE,
333 UDP_DTI_DEF_CHANNEL,
334 dti_data_ind
335 );
336 }
337
338 /* Call dti_start to indicate ready */
339
340 dti_start (
341 udp_hDTI,
342 UDP_DTI_DEF_INSTANCE,
343 UDP_DTI_HL_INTERFACE,
344 UDP_DTI_DEF_CHANNEL
345 );
346 }
347 /* If we have got a ready indication from LL - send dti_data_req */
348 else if (GET_STATE (HILA) EQ SEND AND p_ul->dti_data_req)
349 {
350 p_ul->dti_data_req->parameters.p_id = DTI_PID_IP;
351 p_ul->dti_data_req->parameters.st_lines.st_flow = DTI_FLOW_ON;
352 p_ul->dti_data_req->parameters.st_lines.st_line_sa = DTI_SA_ON;
353 p_ul->dti_data_req->parameters.st_lines.st_line_sb = DTI_SB_ON;
354 p_ul->dti_data_req->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
355
356 PACCESS (p_ul->dti_data_req);
357 {
358 PPASS (p_ul->dti_data_req, dti_data_ind, DTI2_DATA_IND);
359 dti_send_data (
360 udp_hDTI,
361 UDP_DTI_DEF_INSTANCE,
362 UDP_DTI_LL_INTERFACE,
363 UDP_DTI_DEF_CHANNEL,
364 dti_data_ind
365 );
366 }
367 p_ul->dti_data_req = NULL;
368 dti_start (
369 udp_hDTI,
370 UDP_DTI_DEF_INSTANCE,
371 UDP_DTI_HL_INTERFACE,
372 UDP_DTI_DEF_CHANNEL
373 );
374 }
375 else
376 {
377 SET_STATE (HILA, WAIT);
378 }
379 }
380 break;
381
382 default:
383 break;
384 }
385 }
386
387 /*
388 +--------------------------------------------------------------------+
389 | PROJECT : WAP MODULE : UDP_KERP |
390 | STATE : code ROUTINE : sig_dti_ker_data_received_hl_ind |
391 +--------------------------------------------------------------------+
392
393 PURPOSE : Process signal SIG_DTI_KER_DATA_RECEIVED_UP_IND
394 */
395
396 void sig_dti_ker_data_received_hl_ind (T_DTI2_DATA_REQ * dti_data_req)
397 {
398 PACCESS (dti_data_req);
399
400 TRACE_FUNCTION ("sig_dti_ker_data_received_hl_ind()");
401
402 switch (GET_STATE (KER))
403 {
404 case CONNECTED:
405 {
406 T_HILA * p_ul = & udp_data->hila;
407 T_KER * p_ker = & udp_data->ker;
408
409 dti_stop (
410 udp_hDTI,
411 UDP_DTI_DEF_INSTANCE,
412 UDP_DTI_HL_INTERFACE,
413 UDP_DTI_DEF_CHANNEL
414 );
415
416 #ifdef _SIMULATION_
417 /* Get the T_SRC_DES out of the first and only descriptor
418 * created by DTILIB and put it in a descriptor of its own */
419
420 if (dti_data_req->desc_list2.first &&
421 dti_data_req->desc_list2.list_len >= sizeof(T_SRC_DES))
422 {
423 // The following is mostly taken from UDPa_sendRequest() from module
424 // wap_udpc.c to achieve the same behaviour. (Issue UDP-FIX-21925)
425 // The desc from the desc_list2 is splitted into a linked desc list
426 // to simulate large data chunks (such large data chunks are spread over
427 // in several decs in the list).
428 T_desc2 *desc, *first_desc;
429 ULONG *pLast;
430 USHORT len, dataSize, data_length;
431 const char *data_p;
432 USHORT BLOCK_SIZE = 50;
433
434 first_desc = (T_desc2 *) dti_data_req->desc_list2.first;
435 data_length = dti_data_req->desc_list2.list_len;
436
437 /* Build the T_desc2 for IP addresses and ports */
438 desc = M_ALLOC (offsetof (T_desc2, buffer) + sizeof (T_SRC_DES));
439
440 // update the desc list
441 dti_data_req->desc_list2.first = (ULONG) desc;
442 desc->offset = 0;
443 desc->len = sizeof (T_SRC_DES);
444 desc->size = sizeof (T_SRC_DES);
445
446 // copy IP addresses and ports
447 memcpy(desc->buffer, &first_desc->buffer[first_desc->offset],desc->len);
448
449 /* Build the desc for the UDP data */
450 pLast = &desc->next;
451 len = data_length - desc->len;
452 data_p = &first_desc->buffer [first_desc->offset + desc->len];;
453 while (len >0)
454 {
455 if (len > BLOCK_SIZE)
456 {
457 dataSize = BLOCK_SIZE;
458 }
459 else
460 {
461 dataSize = len;
462 }
463 MALLOC (desc, (USHORT)(sizeof(T_desc2) - 1 + dataSize));
464 memcpy( desc->buffer, data_p, dataSize);
465 desc->offset = 0;
466 desc->len = dataSize;
467 desc->size = dataSize;
468 len -= dataSize;
469 data_p += dataSize;
470 *pLast = (ULONG) desc;
471 pLast = &desc->next;
472 }
473
474 MFREE (first_desc);
475 }
476 #endif /* _SIMULATION_ */
477
478 p_ul->dti_data_req = dti_data_req;
479
480 if (p_ul->drop_packet)
481 {
482 p_ul->drop_packet = FALSE;
483 PFREE_DESC2 (p_ul->dti_data_req);
484 p_ul->dti_data_req = NULL;
485 dti_start (
486 udp_hDTI,
487 UDP_DTI_DEF_INSTANCE,
488 UDP_DTI_LL_INTERFACE,
489 UDP_DTI_DEF_CHANNEL
490 );
491 }
492 else
493 {
494 /* Get the IP addresses and the ports from HL */
495
496 T_desc2 * desc = (T_desc2 *) p_ul->dti_data_req->desc_list2.first;
497 T_SRC_DES * p_SrcDes;
498 USHORT old_len;
499
500 if (desc == NULL) {
501 TRACE_ERROR (
502 "Hila's T_desc2 is NULL in "
503 "sig_dti_ker_data_received_hl_ind()."
504 );
505 return;
506 }
507
508 p_SrcDes = (T_SRC_DES *) (desc->buffer + desc->offset);
509
510 memcpy (& p_ker->src_addr, p_SrcDes->src_ip, 4);
511 memcpy (& p_ker->dst_addr, p_SrcDes->des_ip, 4);
512 memcpy (& p_ker->src_port, p_SrcDes->src_port, 2);
513 memcpy (& p_ker->dst_port, p_SrcDes->des_port, 2);
514
515 old_len = p_ul->dti_data_req->desc_list2.list_len;
516 p_ul->dti_data_req->desc_list2.first = desc->next;
517 p_ul->dti_data_req->desc_list2.list_len =
518 (USHORT) (old_len - sizeof (T_SRC_DES));
519 p_ul = & udp_data->hila;
520 MFREE (desc);
521 }
522
523 /* Send IP_ADDR_REQ to LL */
524 {
525 PALLOC (ip_addr_req, IP_ADDR_REQ);
526 ip_addr_req->dst_addr = p_ker->dst_addr;
527 ip_addr_req->trans_prot = UDP_PROTOCOL;
528 PSENDX (LL, ip_addr_req);
529 }
530 }
531 break;
532
533 default:
534 PFREE_DESC2 (dti_data_req);
535 break;
536 }
537 }
538
539 /*
540 +--------------------------------------------------------------------+
541 | PROJECT : WAP MODULE : udp_kerp.c |
542 | STATE : code ROUTINE : ker_ip_addr_cnf |
543 +--------------------------------------------------------------------+
544
545 PURPOSE : Process primitive T_IP_ADDR_CNF
546 */
547
548 void ker_ip_addr_cnf (T_IP_ADDR_CNF * ip_addr_cnf)
549 {
550 TRACE_FUNCTION ("ker_ip_addr_cnf()");
551 PACCESS (ip_addr_cnf);
552
553 switch (GET_STATE (KER))
554 {
555 case CONNECTED:
556 {
557 T_KER * p_ker = & udp_data->ker;
558 T_HILA * p_ul = & udp_data->hila;
559 BOOL send_ready_ind = FALSE;
560
561 /* No error ? */
562 if (ip_addr_cnf->err NEQ IP_ADDR_NOERROR)
563 {
564 PALLOC (udp_error_ind, UDP_ERROR_IND);
565 udp_error_ind->dst_port = p_ker->dst_port;
566 udp_error_ind->src_port = p_ker->src_port;
567 udp_error_ind->err_msg = ip_addr_cnf->err;
568 udp_error_ind->src_addr = ip_addr_cnf->src_addr;
569 udp_error_ind->dst_addr = p_ker->dst_addr;
570 PSENDX (HL, udp_error_ind);
571 p_ul->drop_packet = TRUE; /* Packet error - drop it */
572 }
573 /* Is the address correct ? */
574 else if (ip_addr_cnf->src_addr NEQ p_ker->src_addr)
575 {
576 PALLOC (udp_error_ind, UDP_ERROR_IND);
577 udp_error_ind->dst_port = p_ker->dst_port;
578 udp_error_ind->src_port = p_ker->src_port;
579 udp_error_ind->err_msg = IP_ADDR_NOROUTE;
580 udp_error_ind->src_addr = ip_addr_cnf->src_addr;
581 udp_error_ind->dst_addr = p_ker->dst_addr;
582 PSENDX (HL, udp_error_ind);
583 p_ul->drop_packet = TRUE; /* Packet error - drop it */
584 }
585 else /* Build the "standard" packet for higher layer */
586 {
587 udp_build_packet (TRUE, B_NORMAL_PACKET);
588 }
589
590 /* ICMP sent at first */
591 if (p_ker->send_icmp && GET_STATE (HILA) EQ WAIT)
592 {
593 T_DTI2_DATA_REQ * dti_data_req;
594 dti_data_req = p_ker->dti_data_req_icmp;
595 dti_data_req->parameters.p_id = DTI_PID_IP;
596 dti_data_req->parameters.st_lines.st_flow = DTI_FLOW_ON;
597 dti_data_req->parameters.st_lines.st_line_sa = DTI_SA_ON;
598 dti_data_req->parameters.st_lines.st_line_sb = DTI_SB_ON;
599 dti_data_req->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
600
601 PACCESS (dti_data_req);
602 {
603 PPASS (dti_data_req, dti_data_ind, DTI2_DATA_IND);
604 dti_send_data (
605 udp_hDTI,
606 UDP_DTI_DEF_INSTANCE,
607 UDP_DTI_LL_INTERFACE,
608 UDP_DTI_DEF_CHANNEL,
609 dti_data_ind
610 );
611 }
612 p_ker->dti_data_req_icmp = NULL;
613 SET_STATE (HILA, SEND);
614
615 /* Call dti_start to indicate ready for new packet */
616 dti_start (
617 udp_hDTI,
618 UDP_DTI_DEF_INSTANCE,
619 UDP_DTI_LL_INTERFACE,
620 UDP_DTI_DEF_CHANNEL
621 );
622 }
623
624 /* Packet not correct - drop it */
625 if (p_ul->drop_packet)
626 {
627 p_ul->drop_packet = FALSE;
628 PFREE_DESC2 (p_ul->dti_data_req);
629 p_ul->dti_data_req = NULL;
630 send_ready_ind = TRUE;
631 }
632 else
633 {
634 /* We have got a ready indication from LL -> send */
635
636 if (GET_STATE (HILA) EQ WAIT) /* Send dti_data_req packet */
637 {
638 p_ul->dti_data_req->parameters.p_id = DTI_PID_IP;
639 p_ul->dti_data_req->parameters.st_lines.st_flow = DTI_FLOW_ON;
640 p_ul->dti_data_req->parameters.st_lines.st_line_sa = DTI_SA_ON;
641 p_ul->dti_data_req->parameters.st_lines.st_line_sb = DTI_SB_ON;
642 p_ul->dti_data_req->parameters.st_lines.st_break_len=DTI_BREAK_OFF;
643
644 PACCESS (p_ul->dti_data_req);
645 {
646 PPASS (p_ul->dti_data_req, dti_data_ind, DTI2_DATA_IND);
647 dti_send_data (
648 udp_hDTI,
649 UDP_DTI_DEF_INSTANCE,
650 UDP_DTI_LL_INTERFACE,
651 UDP_DTI_DEF_CHANNEL,
652 dti_data_ind
653 );
654 }
655 SET_STATE (HILA, IDLE);
656 send_ready_ind = TRUE;
657 p_ul->dti_data_req = NULL;
658 }
659 else
660 {
661 SET_STATE (HILA, SEND);
662 send_ready_ind = FALSE;
663 }
664 }
665
666 /* Send dti_ready indication */
667 if (send_ready_ind)
668 {
669 dti_start (
670 udp_hDTI,
671 UDP_DTI_DEF_INSTANCE,
672 UDP_DTI_HL_INTERFACE,
673 UDP_DTI_DEF_CHANNEL
674 );
675 }
676 PFREE (ip_addr_cnf);
677 }
678 break;
679
680 default:
681 PFREE (ip_addr_cnf);
682 break;
683 }
684 }
685
686 /*
687 +--------------------------------------------------------------------+
688 | PROJECT : WAP MODULE : udp_kerp.c |
689 | STATE : code ROUTINE : sig_dti_ker_data_received_ll_ind |
690 +--------------------------------------------------------------------+
691
692 PURPOSE : Process signal SIG_DTI_KER_DATA_RECEIVED_DN_IND
693 */
694
695 void sig_dti_ker_data_received_ll_ind (T_DTI2_DATA_IND * dti_data_ind)
696 {
697 TRACE_FUNCTION ("sig_dti_ker_data_received_ll_ind()");
698 PACCESS (dti_data_ind);
699
700 switch (GET_STATE (KER))
701 {
702 case CONNECTED:
703 {
704 USHORT calc_chksum, header_chksum, start_udp, udp_len;
705 UBYTE prot;
706 BOOL send_getdata_req = FALSE;
707 UBYTE * ip_header;
708 T_desc_list2 * desc_list;
709 T_desc2 * desc;
710
711 T_KER * p_ker = & udp_data->ker;
712 T_LOLA * p_dl = & udp_data->lola;
713
714 dti_stop (
715 udp_hDTI,
716 UDP_DTI_DEF_INSTANCE,
717 UDP_DTI_LL_INTERFACE,
718 UDP_DTI_DEF_CHANNEL
719 );
720
721 /* Build necessary variable */
722
723 p_dl->dti_data_ind = dti_data_ind;
724 p_dl->state_err = STATE_DL_NO_ERROR;
725
726 desc_list = & p_dl->dti_data_ind->desc_list2;
727 desc = (T_desc2 *) desc_list->first;
728
729 if (
730 desc == NULL ||
731 desc->len < LEN_IP_HEADER_B ||
732 GET_IP_HEADER_LEN_B (desc->buffer + desc->offset) < LEN_IP_HEADER_B ||
733 desc->len < GET_IP_HEADER_LEN_B (desc->buffer + desc->offset) +
734 LEN_UDP_HEADER_B
735 ) {
736 TRACE_ERROR (
737 "Lola's UDP packet is too short in "
738 "sig_dti_ker_data_received_ll_ind()."
739 );
740 return;
741 }
742
743 ip_header = desc->buffer + desc->offset;
744 start_udp = (USHORT) GET_IP_HEADER_LEN_B (ip_header);
745
746 /* Fill in port numbers and IP addresses */
747
748 p_dl->src_addr = GET_IP_SOURCE_ADDR (ip_header);
749 p_dl->dst_addr = GET_IP_DEST_ADDR (ip_header);
750 p_dl->src_port = (USHORT) GET_UDP_SRC_PORT (ip_header, start_udp);
751 p_dl->dst_port = (USHORT) GET_UDP_DST_PORT (ip_header, start_udp);
752
753 udp_len = (USHORT) GET_UDP_LEN (ip_header, start_udp);
754 prot = GET_IP_PROT (ip_header);
755
756 /* Check if ICMP Message, if yes - send UDP_ERROR_IND */
757
758 if (GET_IP_PROT (ip_header) EQ ICMP_PROT)
759 {
760 USHORT pos_icmp = (USHORT) GET_IP_HEADER_LEN_B (ip_header);
761
762 p_dl->drop_packet = TRUE;
763 p_dl->state_err = STATE_DL_ERROR;
764 {
765 PALLOC (udp_error_ind, UDP_ERROR_IND);
766 udp_error_ind->dst_port = p_dl->dst_port;
767 udp_error_ind->src_port = p_dl->src_port;
768 udp_error_ind->err_msg = GET_ICMP_TYPE (ip_header, pos_icmp);
769 udp_error_ind->src_addr = GET_IP_SOURCE_ADDR (ip_header);
770 udp_error_ind->dst_addr = GET_IP_DEST_ADDR (ip_header);
771 PSENDX (HL, udp_error_ind);
772 }
773 }
774 else /* No ICMP_PROT */
775 {
776 {
777 ULONG overlay;
778 UBYTE pseudo_header [LEN_PSEUDO_HEADER_B];
779
780 /* Build the pseudoheader for the calculation of the checksum */
781
782 SET_UDP_PSEUDO_H_SRC_ADDR (pseudo_header, p_dl->src_addr);
783 SET_UDP_PSEUDO_H_DEST_ADDR (pseudo_header, p_dl->dst_addr);
784 SET_UDP_PSEUDO_H_ZERO (pseudo_header, 0);
785 SET_UDP_PSEUDO_H_PROT (pseudo_header, prot);
786 SET_UDP_PSEUDO_H_LEN (pseudo_header, udp_len);
787
788 /* Calculate a part of the checksum for the pseudoheader */
789 overlay = partial_checksum (pseudo_header, LEN_PSEUDO_HEADER_B);
790
791 /* Calculate for the UDP header and the data */
792 header_chksum = (USHORT) GET_UDP_CHK_SUM (ip_header, start_udp);
793 RESET_UDP_CHKSUM (ip_header, start_udp);
794 calc_chksum = desc_checksum (desc_list, start_udp, overlay);
795 SET_UDP_CHKSUM (ip_header, start_udp, header_chksum);
796 }
797
798 /* Packet checksum error ? */
799 if (header_chksum NEQ calc_chksum)
800 {
801 p_dl->drop_packet = TRUE;
802 }
803 else
804 {
805
806 #define POS_UDP_DEST_PORT 1
807
808
809 /* Is it the correct port ? */
810 if (p_ker->src_port EQ p_dl->dst_port)
811 {
812 udp_build_packet (FALSE, B_NORMAL_PACKET);
813 }
814 else
815 {
816 /* Build ICMP packet for no dest port.
817 * If LL is ready to collect then send */
818 udp_build_packet (FALSE, B_NO_DEST_PORT);
819 p_ker->send_icmp = TRUE;
820 }
821 }
822 } /* No ICMP_PROT */
823
824 /* Packet is not correct -> drop it and free the primitive */
825 if (p_dl->drop_packet)
826 {
827 p_dl->drop_packet = FALSE;
828 PFREE_DESC2 (p_dl->dti_data_ind);
829 p_dl->dti_data_ind = NULL;
830 send_getdata_req = TRUE;
831 }
832 else
833 {
834 /* An ICMP message - send it */
835 if (p_ker->send_icmp)
836 {
837 UBYTE state = GET_STATE (LOLA);
838 if (state EQ IDLE OR state EQ WAIT)
839 {
840 T_DTI2_DATA_REQ * dti_data_req;
841
842 udp_data->ker.send_icmp = FALSE;
843
844 dti_data_req = p_ker->dti_data_req_icmp;
845 dti_data_req->parameters.p_id = DTI_PID_IP;
846 dti_data_req->parameters.st_lines.st_flow = DTI_FLOW_ON;
847 dti_data_req->parameters.st_lines.st_line_sa = DTI_SA_ON;
848 dti_data_req->parameters.st_lines.st_line_sb = DTI_SB_ON;
849 dti_data_req->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
850
851 PACCESS (dti_data_req);
852 {
853 PPASS (dti_data_req, dti_data_indication, DTI2_DATA_IND);
854 dti_send_data (
855 udp_hDTI,
856 UDP_DTI_DEF_INSTANCE,
857 UDP_DTI_LL_INTERFACE,
858 UDP_DTI_DEF_CHANNEL,
859 dti_data_indication
860 );
861 }
862 SET_STATE (LOLA, IDLE);
863 p_ker->dti_data_req_icmp = NULL;
864 send_getdata_req = TRUE;
865 }
866 }
867 else
868 {
869 /* We have got a DTI2_GETDATA_REQ from LL. Send the packet. */
870
871 if (GET_STATE (LOLA) EQ WAIT)
872 {
873 SET_STATE (LOLA, IDLE);
874
875 p_dl->dti_data_ind->parameters.p_id = DTI_PID_IP;
876 p_dl->dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_ON;
877 p_dl->dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON;
878 p_dl->dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON;
879 p_dl->dti_data_ind->parameters.st_lines.st_break_len =
880 DTI_BREAK_OFF;
881
882 dti_send_data (
883 udp_hDTI,
884 UDP_DTI_DEF_INSTANCE,
885 UDP_DTI_HL_INTERFACE,
886 UDP_DTI_DEF_CHANNEL,
887 p_dl->dti_data_ind
888 );
889 send_getdata_req = TRUE;
890 p_dl->dti_data_ind = NULL;
891 }
892 else
893 {
894 SET_STATE (LOLA, SEND);
895 }
896 }
897 }
898
899 if (send_getdata_req) /* Send DTI2_GETDATA_REQ to LL */
900 {
901 dti_start (
902 udp_hDTI,
903 UDP_DTI_DEF_INSTANCE,
904 UDP_DTI_LL_INTERFACE,
905 UDP_DTI_DEF_CHANNEL
906 );
907 }
908 }
909 break;
910
911 default:
912 PFREE_DESC2 (dti_data_ind);
913 break;
914 }
915 }
916
917 /*
918 +--------------------------------------------------------------------+
919 | PROJECT : WAP MODULE : udp_kerp.c |
920 | STATE : code ROUTINE : sig_dti_ker_tx_buffer_ready_hl_ind |
921 +--------------------------------------------------------------------+
922
923 PURPOSE : Process signal SIG_DTI_KER_TX_BUFFER_READY_UP_IND
924 */
925
926 void sig_dti_ker_tx_buffer_ready_hl_ind ()
927 {
928 TRACE_FUNCTION ("sig_dti_ker_tx_buffer_ready_hl_ind()");
929
930 switch (GET_STATE (KER))
931 {
932 case CONNECTED:
933 {
934 T_KER * p_ker = & udp_data->ker;
935 T_LOLA * p_dl = & udp_data->lola;
936
937 /* We have bound a port and got a DTI_GETDATA_REQ */
938
939 if (p_ker->port_state EQ PORT_BOUND)
940 {
941 p_ker->port_state = PORT_ACTIVE;
942 dti_start (
943 udp_hDTI,
944 UDP_DTI_DEF_INSTANCE,
945 UDP_DTI_HL_INTERFACE,
946 UDP_DTI_DEF_CHANNEL
947 );
948 }
949
950 /* Send dti_data_ind packet if we have one */
951
952 if (GET_STATE (LOLA) EQ SEND)
953 {
954 p_dl->dti_data_ind->parameters.p_id = DTI_PID_IP;
955 p_dl->dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_ON;
956 p_dl->dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON;
957 p_dl->dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON;
958 p_dl->dti_data_ind->parameters.st_lines.st_break_len = DTI_BREAK_OFF;
959
960 dti_send_data (
961 udp_hDTI,
962 UDP_DTI_DEF_INSTANCE,
963 UDP_DTI_HL_INTERFACE,
964 UDP_DTI_DEF_CHANNEL,
965 p_dl->dti_data_ind
966 );
967 p_dl->dti_data_ind = NULL;
968 SET_STATE (LOLA, IDLE);
969
970 /* Send DTI2_GETDATA_REQ and indicate ready for new packet */
971
972 dti_start (
973 udp_hDTI,
974 UDP_DTI_DEF_INSTANCE,
975 UDP_DTI_LL_INTERFACE,
976 UDP_DTI_DEF_CHANNEL
977 );
978 }
979 else
980 {
981 /* No data packet to be sent - change state */
982 SET_STATE (LOLA, WAIT);
983 }
984 }
985 break;
986 default:
987 break;
988 }
989 }
990
991 /*
992 +--------------------------------------------------------------------+
993 | PROJECT : WAP MODULE : udp_kerp.c |
994 | STATE : code ROUTINE : ker_udp_bind_cnf |
995 +--------------------------------------------------------------------+
996
997 PURPOSE : Process primitive T_UDP_BIND_CNF
998 */
999
1000 static void ker_udp_bind_cnf (U16 port, U8 err)
1001 {
1002 PALLOC (udp_bind_cnf, UDP_BIND_CNF);
1003
1004 TRACE_FUNCTION ("ker_udp_bind_cnf()");
1005
1006 udp_bind_cnf->port = port;
1007 udp_bind_cnf->err = err;
1008 PSENDX (HL, udp_bind_cnf);
1009 }
1010
1011 /*
1012 +--------------------------------------------------------------------+
1013 | PROJECT : WAP MODULE : udp_kerp.c |
1014 | STATE : code ROUTINE : ker_udp_bind_req |
1015 +--------------------------------------------------------------------+
1016
1017 PURPOSE : Process primitive T_UDP_BIND_REQ
1018 */
1019
1020 void ker_udp_bind_req (T_UDP_BIND_REQ * udp_bind_req)
1021 {
1022 TRACE_FUNCTION ("ker_udp_bind_req()");
1023 PACCESS (udp_bind_req);
1024
1025 switch (GET_STATE (KER))
1026 {
1027 case ACTIVE_NC:
1028 ker_udp_bind_cnf (udp_bind_req->port, UDP_BIND_UDPDOWN);
1029 break;
1030
1031 case CONNECTED:
1032 {
1033 T_KER * p_ker = & udp_data->ker;
1034
1035 if (p_ker->port_state EQ PORT_DOWN)
1036 {
1037 if (udp_bind_req->port EQ NO_PORT)
1038 {
1039 p_ker->src_port = 1025;
1040 }
1041 else
1042 {
1043 p_ker->src_port = udp_bind_req->port;
1044 }
1045 p_ker->port_state = PORT_BOUND;
1046 ker_udp_bind_cnf (p_ker->src_port, UDP_BIND_NOERROR);
1047 }
1048 else /* Port in use */
1049 {
1050 ker_udp_bind_cnf (udp_bind_req->port, UDP_BIND_PORTINUSE);
1051 }
1052 }
1053 break;
1054
1055 case DEACTIVATED:
1056 TRACE_ERROR ("unexpected UDP_BIND_REQ");
1057 break;
1058
1059 default:
1060 break;
1061 }
1062 PFREE (udp_bind_req);
1063 }
1064
1065 /*
1066 +--------------------------------------------------------------------+
1067 | PROJECT : WAP MODULE : udp_kerp.c |
1068 | STATE : code ROUTINE : ker_udp_closeport_req |
1069 +--------------------------------------------------------------------+
1070
1071 PURPOSE : Process primitive T_UDP_CLOSEPORT_REQ
1072 */
1073
1074 void ker_udp_closeport_req (T_UDP_CLOSEPORT_REQ * udp_closeport_req)
1075 {
1076 T_KER * p_ker;
1077
1078 TRACE_FUNCTION ("ker_udp_closeport_req()");
1079 PACCESS (udp_closeport_req);
1080
1081 p_ker = & udp_data->ker;
1082
1083 switch (GET_STATE (KER))
1084 {
1085 case ACTIVE_NC:
1086 case CONNECTED:
1087 /* Close port */
1088 p_ker->src_port = NO_PORT;
1089 p_ker->port_state = PORT_DOWN;
1090 {
1091 PALLOC (udp_closeport_cnf, UDP_CLOSEPORT_CNF);
1092 PSENDX (HL, udp_closeport_cnf);
1093 }
1094 break;
1095
1096 case DEACTIVATED:
1097 TRACE_ERROR ("unexpected UDP_CLOSEPORT_REQ");
1098 break;
1099
1100 default:
1101 break;
1102 }
1103 PFREE (udp_closeport_req);
1104 }
1105
1106 /*
1107 +--------------------------------------------------------------------+
1108 | PROJECT : WAP MODULE : udp_kerp.c |
1109 | STATE : code ROUTINE : ker_udp_error_res |
1110 +--------------------------------------------------------------------+
1111
1112 PURPOSE : Process primitive T_UDP_ERROR_RES
1113 */
1114
1115 void ker_udp_error_res (T_UDP_ERROR_RES * udp_error_res)
1116 {
1117 TRACE_FUNCTION ("ker_udp_error_res()");
1118 PACCESS (udp_error_res);
1119
1120 /* Confirm the error message from ACI */
1121
1122 switch (GET_STATE (KER))
1123 {
1124 case CONNECTED:
1125 {
1126 T_LOLA * p_dl = & udp_data->lola;
1127
1128 if (p_dl->state_err EQ STATE_DL_ERROR)
1129 p_dl->state_err = STATE_DL_NO_ERROR;
1130 else
1131 dti_start (
1132 udp_hDTI,
1133 UDP_DTI_DEF_INSTANCE,
1134 UDP_DTI_LL_INTERFACE,
1135 UDP_DTI_DEF_CHANNEL
1136 );
1137 }
1138 break;
1139 default:
1140 break;
1141 }
1142 PFREE (udp_error_res);
1143 }
1144
1145 /*
1146 +--------------------------------------------------------------------+
1147 | PROJECT : WAP MODULE : UDP_KERP |
1148 | STATE : code ROUTINE : sig_dti_ker_connection_opened_hl_ind |
1149 +--------------------------------------------------------------------+
1150
1151 PURPOSE : Process signal sig_dti_ker_connection_opened_hl_ind
1152 */
1153
1154 void sig_dti_ker_connection_opened_hl_ind ()
1155 {
1156 TRACE_FUNCTION ("sig_dti_ker_connection_opened_hl_ind()");
1157
1158 if (GET_STATE (HILA) EQ CONNECTING)
1159 {
1160 UBYTE state = GET_STATE (LOLA);
1161 SET_STATE (HILA, IDLE);
1162 if (state NEQ CONNECTING AND state NEQ DOWN)
1163 {
1164 SET_STATE (KER, ACTIVE_NC);
1165 }
1166 {
1167 PALLOC (udpa_dti_cnf, UDPA_DTI_CNF);
1168 udpa_dti_cnf->link_id = udp_data->hila.link_id;
1169 udpa_dti_cnf->dti_conn = UDPA_CONNECT_DTI;
1170 PSENDX (ACI, udpa_dti_cnf);
1171 }
1172 }
1173 else
1174 {
1175 TRACE_ERROR ("unexpected dti_connect_ind (from higher layer)");
1176 }
1177 }
1178
1179 /*
1180 +--------------------------------------------------------------------+
1181 | PROJECT : WAP MODULE : UDP_KERP |
1182 | STATE : code ROUTINE : sig_dti_ker_connection_opened_ll_ind |
1183 +--------------------------------------------------------------------+
1184
1185 PURPOSE : Process signal sig_dti_ker_connection_opened_ll_ind
1186 */
1187
1188 void sig_dti_ker_connection_opened_ll_ind ()
1189 {
1190 TRACE_FUNCTION ("sig_dti_ker_connection_opened_ll_ind()");
1191
1192 if (GET_STATE (LOLA) EQ CONNECTING)
1193 {
1194 UBYTE state = GET_STATE (HILA);
1195 SET_STATE (LOLA, IDLE);
1196 if (state NEQ CONNECTING AND state NEQ DOWN)
1197 {
1198 SET_STATE (KER, ACTIVE_NC);
1199 }
1200 {
1201 PALLOC (udpa_dti_cnf, UDPA_DTI_CNF);
1202 udpa_dti_cnf->link_id = udp_data->lola.link_id;
1203 udpa_dti_cnf->dti_conn = UDPA_CONNECT_DTI;
1204 PSENDX (ACI, udpa_dti_cnf);
1205 }
1206 }
1207 else
1208 {
1209 TRACE_ERROR ("unexpected dti_connect_ind (from lower layer)");
1210 }
1211 }
1212
1213 /*
1214 +--------------------------------------------------------------------+
1215 | PROJECT : WAP MODULE : udp_kerp.c |
1216 | STATE : code ROUTINE : ker_udp_shutdown_ind |
1217 +--------------------------------------------------------------------+
1218
1219 PURPOSE :
1220 */
1221
1222 static void ker_udpa_dti_ind (ULONG link_id)
1223 {
1224 PALLOC (udpa_dti_ind, UDPA_DTI_IND);
1225 udpa_dti_ind->link_id = link_id;
1226 PSENDX (ACI, udpa_dti_ind);
1227 }
1228
1229 /*
1230 +--------------------------------------------------------------------+
1231 | PROJECT : WAP MODULE : udp_kerp.c |
1232 | STATE : code ROUTINE : ker_udp_shutdown_ind |
1233 +--------------------------------------------------------------------+
1234
1235 PURPOSE :
1236 */
1237
1238 static void ker_udp_shutdown_ind (void)
1239 {
1240 PALLOC (udp_shutdown_ind, UDP_SHUTDOWN_IND);
1241 PSENDX (HL, udp_shutdown_ind);
1242 }
1243
1244 /*
1245 +--------------------------------------------------------------------+
1246 | PROJECT : WAP MODULE : udp_kerp.c |
1247 | STATE : code ROUTINE : check_port_shutdown_ind |
1248 +--------------------------------------------------------------------+
1249
1250 PURPOSE :
1251 */
1252
1253 static void check_port_shutdown_ind (void)
1254 {
1255 T_KER * p_ker = & udp_data->ker;
1256
1257 TRACE_FUNCTION ("check_port_shutdown_ind()");
1258
1259 if (p_ker->port_state EQ PORT_ACTIVE)
1260 {
1261 p_ker->src_port = NO_PORT;
1262 p_ker->port_state = PORT_DOWN;
1263 ker_udp_shutdown_ind ();
1264 }
1265 }
1266
1267 /*
1268 +--------------------------------------------------------------------+
1269 | PROJECT : WAP MODULE : UDP_KERP |
1270 | STATE : code ROUTINE : sig_dti_ker_connection_closed_hl_ind |
1271 +--------------------------------------------------------------------+
1272
1273 PURPOSE : Process signal sig_dti_ker_connection_closed_hl_ind
1274 */
1275
1276 void sig_dti_ker_connection_closed_hl_ind ()
1277 {
1278 TRACE_FUNCTION ("sig_dti_ker_connection_closed_hl_ind()");
1279
1280 switch (GET_STATE (KER))
1281 {
1282 case CONNECTED:
1283 /*XXX bad case, switch to DEACTIVATED, prune buffers... XXX*/
1284 TRACE_ERROR ("unexpected DTI connection close from higher layer");
1285 check_port_shutdown_ind ();
1286 SET_STATE (KER, DEACTIVATED);
1287 break;
1288 case ACTIVE_NC:
1289 SET_STATE (KER, DEACTIVATED);
1290 break;
1291 default:
1292 break;
1293 }
1294 vsi_c_close (VSI_CALLER hCommHL);
1295 hCommHL = VSI_ERROR;
1296
1297 SET_STATE (HILA, DOWN);
1298 *udp_data->hila.entity_name = 0;
1299 ker_udpa_dti_ind (udp_data->hila.link_id);
1300 }
1301
1302 /*
1303 +--------------------------------------------------------------------+
1304 | PROJECT : WAP MODULE : UDP_KERP |
1305 | STATE : code ROUTINE : sig_dti_ker_connection_closed_ll_ind |
1306 +--------------------------------------------------------------------+
1307
1308 PURPOSE : Process signal sig_dti_ker_connection_closed_ll_ind
1309 */
1310
1311 void sig_dti_ker_connection_closed_ll_ind ()
1312 {
1313 TRACE_FUNCTION ("sig_dti_ker_connection_closed_ll_ind()");
1314
1315 switch (GET_STATE (KER))
1316 {
1317 case CONNECTED:
1318 /*XXX bad case, switch to DEACTIVATED, prune buffers... XXX*/
1319 TRACE_ERROR ("unexpected DTI connection close from lower layer");
1320 check_port_shutdown_ind ();
1321 SET_STATE (KER, DEACTIVATED);
1322 break;
1323 case ACTIVE_NC:
1324 SET_STATE (KER, DEACTIVATED);
1325 break;
1326 default:
1327 break;
1328 }
1329 SET_STATE (LOLA, DOWN);
1330 *udp_data->lola.entity_name = 0;
1331 ker_udpa_dti_ind (udp_data->lola.link_id);
1332 }
1333
1334 /*
1335 +--------------------------------------------------------------------+
1336 | PROJECT : WAP MODULE : udp_kerp.c |
1337 | STATE : code ROUTINE : ker_udpa_config_req |
1338 +--------------------------------------------------------------------+
1339
1340 PURPOSE : Process primitive T_UDPA_CONFIG_REQ
1341 */
1342
1343 void ker_udpa_config_req (T_UDPA_CONFIG_REQ * udpa_config_req)
1344 {
1345 TRACE_FUNCTION ("ker_udpa_config_req()");
1346 PACCESS (udpa_config_req);
1347
1348 /* Configuration of lower layer -> change to state CONNECTED */
1349
1350 switch (GET_STATE (KER))
1351 {
1352 case CONNECTED:
1353 switch (udpa_config_req->cmd)
1354 {
1355 case UDPA_CONFIG_DOWN:
1356 check_port_shutdown_ind ();
1357 SET_STATE (KER, ACTIVE_NC);
1358 {
1359 PALLOC (udpa_config_cnf, UDPA_CONFIG_CNF);
1360 PSENDX (ACI, udpa_config_cnf);
1361 }
1362 break;
1363 default:
1364 break;
1365 }
1366 break;
1367
1368 case ACTIVE_NC:
1369 switch (udpa_config_req->cmd)
1370 {
1371 case UDPA_CONFIG_UP:
1372 dti_start (
1373 udp_hDTI,
1374 UDP_DTI_DEF_INSTANCE,
1375 UDP_DTI_LL_INTERFACE,
1376 UDP_DTI_DEF_CHANNEL
1377 );
1378 SET_STATE (KER, CONNECTED);
1379 TRACE_EVENT ("KER -> CONNECTED");
1380 {
1381 PALLOC (udpa_config_cnf, UDPA_CONFIG_CNF);
1382 PSENDX (ACI, udpa_config_cnf);
1383 }
1384 break;
1385 case UDPA_CONFIG_DOWN:
1386 {
1387 PALLOC (udpa_config_cnf, UDPA_CONFIG_CNF);
1388 PSENDX (ACI, udpa_config_cnf);
1389 }
1390 break;
1391 default:
1392 break;
1393 }
1394 break;
1395 default:
1396 break;
1397 }
1398 PFREE (udpa_config_req);
1399 }
1400
1401 /*
1402 +--------------------------------------------------------------------+
1403 | PROJECT : WAP MODULE : udp_kerp.c |
1404 | STATE : code ROUTINE : ker_udp_shutdown_res |
1405 +--------------------------------------------------------------------+
1406
1407 PURPOSE : Process primitive T_UDP_SHUTDOWN_RES
1408 */
1409
1410 void ker_udp_shutdown_res (T_UDP_SHUTDOWN_RES * udp_shutdown_res)
1411 {
1412 TRACE_FUNCTION ("DUMMY ker_udp_shutdown_res()");
1413 PACCESS (udp_shutdown_res);
1414 PFREE (udp_shutdown_res);
1415 }
1416
1417 /*
1418 +--------------------------------------------------------------------+
1419 | PROJECT : WAP MODULE : udp_kerp.c |
1420 | STATE : code ROUTINE : sig_dti_ker_tx_buffer_full_hl_ind |
1421 +--------------------------------------------------------------------+
1422
1423 PURPOSE : Process signal SIG_DTI_KER_TX_BUFFER_FULL_UP_IND
1424 */
1425
1426 void sig_dti_ker_tx_buffer_full_hl_ind ()
1427 {
1428 TRACE_FUNCTION ("DUMMY sig_dti_ker_tx_buffer_full_hl_ind()");
1429 }
1430
1431 /*
1432 +--------------------------------------------------------------------+
1433 | PROJECT : WAP MODULE : UDP_KERP |
1434 | STATE : code ROUTINE : sig_dti_ker_tx_buffer_full_ll_ind |
1435 +--------------------------------------------------------------------+
1436
1437 PURPOSE : Process signal SIG_DTI_KER_TX_BUFFER_FULL_DN_IND
1438 */
1439
1440 void sig_dti_ker_tx_buffer_full_ll_ind ()
1441 {
1442 TRACE_FUNCTION ("DUMMY sig_dti_ker_tx_buffer_full_ll_ind()");
1443 }
1444
1445 /*-------------------------------------------------------------------------*/
1446