FreeCalypso > hg > fc-magnetite
view src/g23m-fad/ppp/ppp_ptxs.c @ 683:81394dcdf4d3
uartfax.c: OM-style wakeup interrupt implemented for Tango
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 26 Jun 2020 03:06:16 +0000 |
parents | 90eb61ecd093 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : | Modul : +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This modul is part of the entity PPP and implements all | functions to handles the incoming process internal signals as | described in the SDL-documentation (PTX-statemachine) +----------------------------------------------------------------------------- */ #define ENTITY_PPP /* * define for ptxs debug traces */ /* #define PTXS_DEBUG */ /*==== INCLUDES =============================================================*/ #include "typedefs.h" /* to get Condat data types */ #include "vsi.h" /* to get a lot of macros */ #include "macdef.h" /* to get a lot of macros */ #include "custom.h" /* to get a lot of macros */ #include "gsm.h" /* to get a lot of macros */ /*lint -efile(766,cnf_ppp.h) */ #include "cnf_ppp.h" /* to get cnf-definitions */ /*lint -efile(766,mon_ppp.h) */ #include "mon_ppp.h" /* to get mon-definitions */ #include "prim.h" /* to get the definitions of used SAP and directions */ #include "dti.h" /* to get the DTILIB definitions */ #include "ppp.h" /* to get the global entity definitions */ #include "ppp_dti.h" /* to get the local DTILIB definitions */ #include "ppp_frxs.h" /* to get signal interface from frx */ #include "ppp_arbs.h" /* to get signal interface from arb */ #include "ppp_arbf.h" /* to get arb functions */ /*==== CONST ================================================================*/ /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : sig_arb_ptx_dead_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_ARB_PTX_DEAD_MODE_REQ. It sets | the frame-reception-packet-transission direction to DEAD mode. | That means these two services will not receive or send any more | data. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_arb_ptx_dead_mode_req () { TRACE_ISIG( "sig_arb_ptx_dead_mode_req" ); ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_FULL; ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_FULL; switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_READY: case PTX_BLOCKED: SET_STATE( PPP_SERVICE_PTX, PTX_DEAD ); sig_ptx_frx_stop_flow_req(); break; default: TRACE_ERROR( "SIG_ARB_PTX_DEAD_MODE_REQ unexpected" ); break; } /* * set FRX to dead mode */ sig_ptx_frx_dead_mode_req(); } /* sig_arb_ptx_dead_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_arb_ptx_ready_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_ARB_PTX_READY_MODE_REQ. It sets | the frame-reception-packet-transission direction to READY mode. | That means these two services will receive and send data. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_arb_ptx_ready_mode_req () { TRACE_ISIG( "sig_arb_ptx_ready_mode_req" ); switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_BLOCKED: SET_STATE( PPP_SERVICE_PTX, PTX_READY ); /* * incoming data flow had not been stopped but redirected to * ARB, so normally don't need to start, but it is possible that the data flow * has been stopped bacause of ftx_buffer_full_ind */ if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY ) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(READY_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ /* * data is to be sent directly to the peer, and the dtilib buffer is * full, so stop incoming data flow. */ if(ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_FULL) { sig_ptx_frx_stop_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("INFO(READY_MODE_REQ): UL data flow wasn't stopped, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; case PTX_DEAD: /* * incoming data is to be redirected to ARB */ SET_STATE( PPP_SERVICE_PTX, PTX_READY); sig_ptx_frx_ready_mode_req(); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY ) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(READY_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; default: TRACE_ERROR( "SIG_ARB_PTX_READY_MODE_REQ unexpected" ); break; } } /* sig_arb_ptx_ready_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_arb_ptx_blocked_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_ARB_PTX_BLOCKED_MODE_REQ. It | sets the frame-reception-packet-transission direction to | BLOCKED mode. That means PPP receives frames, but it dos not | send packts. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_arb_ptx_blocked_mode_req () { TRACE_ISIG( "sig_arb_ptx_blocked_mode_req" ); switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_DEAD: /* * Start incoming data flow - data will be sent to ARB. */ SET_STATE( PPP_SERVICE_PTX, PTX_BLOCKED); sig_ptx_frx_ready_mode_req(); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(BLOCKED_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; case PTX_READY: /* * Do not stop incoming data flow, just redirect it to ARB * Restart incoming data flow if it should be now redirected to ARB */ SET_STATE( PPP_SERVICE_PTX, PTX_BLOCKED ); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_FULL ) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(BLOCKED_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; default: TRACE_ERROR( "SIG_ARB_PTX_BLOCKED_MODE_REQ unexpected" ); break; } } /* sig_arb_ptx_blocked_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_arb_ptx_transparent_mode_req +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_ARB_PTX_TRANSPARENT_MODE_REQ. | It sets the frame-reception-packet-transission direction to | TRANSPARENT mode. That means PPP receives frames and sends | these frame transparent to the upper layer. | | Parameters : no parameters | +------------------------------------------------------------------------------ */ GLOBAL void sig_arb_ptx_transparent_mode_req () { TRACE_ISIG( "sig_arb_ptx_transparent_mode_req" ); switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_DEAD: /* * Set ptx to transparent mode and enable incoming data flow. * The dti connection has been newly opened so that its buffers * are empty and data can be received */ SET_STATE( PPP_SERVICE_PTX, PTX_READY ); sig_ptx_frx_transparent_mode_req(); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY AND ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY ) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(TRANSP_MODE_REQ): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; default: TRACE_ERROR( "SIG_ARB_PTX_TRANSPARENT_MODE_REQ unexpected" ); break; } } /* sig_arb_ptx_transparent_mode_req() */ /* +------------------------------------------------------------------------------ | Function : sig_frx_ptx_packet_ind +------------------------------------------------------------------------------ | Description : Handles the internal signal SIG_FRX_PTX_PACKET_IND. The service | FRX received a complete frame and forwards the encapsulated | packet to PTX. | | Parameters : ptype - type of packet | packet_len - length of packet | packet - pointer to a generic data descriptor | +------------------------------------------------------------------------------ */ GLOBAL void sig_frx_ptx_packet_ind (USHORT ptype, USHORT packet_len, T_desc2* packet) { TRACE_ISIG( "sig_frx_ptx_packet_ind" ); switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_READY: switch(ptype) { case DTI_PID_CTCP: case DTI_PID_UTCP: /* * if Van Jacobson Header Compression is not negotiated such packets * will not be sent to upper layer */ if(ppp_data->n_hc NEQ PPP_HC_VJ) { sig_ptx_arb_packet_ind(ptype, packet); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL) { sig_ptx_frx_stop_flow_req(); #ifdef PTXS_DEBUG TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__); #endif /* PTXS_DEBUG */ } break; } /* fall through */ case DTI_PID_IP: case DTI_PID_UOS: /* * send packet to upper layer */ { PALLOC_DESC2 (dti_data_ind, DTI2_DATA_IND); dti_data_ind->desc_list2.list_len = packet_len; dti_data_ind->desc_list2.first = (ULONG)packet; /* * Send the DTI data primitive */ sig_any_dti_data_ind(ppp_data->ppphDTI, dti_data_ind, PPP_INSTANCE, PROT_LAYER, PROT_CHANNEL,(UBYTE)ptype); } break; default: /* * received packet is nether an IP packet nor * a PPP frame (transparent mode), so we forward it to ARB */ sig_ptx_arb_packet_ind(ptype, packet); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL) { sig_ptx_frx_stop_flow_req(); #ifdef PTXS_DEBUG TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__); #endif /* PTXS_DEBUG */ } break; } break; case PTX_BLOCKED: /* * In BLOCKED mode we forward each packet to ARB */ sig_ptx_arb_packet_ind(ptype, packet); if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_FULL) { sig_ptx_frx_stop_flow_req(); #ifdef PTXS_DEBUG TRACE_EVENT_P2("INFO(PTX_PACKET_IND): UL data flow was stopped, %s(%d)", __FILE__, __LINE__); #endif /* PTXS_DEBUG */ } break; default: TRACE_ERROR( "SIG_FRX_PTX_PACKET_IND unexpected" ); arb_discard_packet(packet); break; } } /* sig_frx_ptx_packet_ind() */ /* +------------------------------------------------------------------------------ | Function : sig_dti_ptx_tx_buffer_ready_ind +------------------------------------------------------------------------------ | Description : Handles the signal sig_dti_ptx_tx_buffer_ready_ind | | Parameters : no parameter | +------------------------------------------------------------------------------ */ GLOBAL void sig_dti_ptx_tx_buffer_ready_ind () { TRACE_FUNCTION( "sig_dti_ptx_tx_buffer_ready_ind" ); ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_READY; switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_READY: if(ppp_data->ptx.ftx_buffer_state EQ PTX_FTX_BUFFER_READY) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(BUFFER_READY_IND): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; case PTX_BLOCKED: case PTX_DEAD: /* wait for sig_arb_ptx_blocked/ready/transparent_mode_req */ break; default: TRACE_ERROR( "DTI signal unexpected" ); break; } } /* sig_dti_ptx_tx_buffer_ready_ind() */ /* +------------------------------------------------------------------------------ | Function : sig_dti_ptx_tx_buffer_full_ind +------------------------------------------------------------------------------ | Description : This function handle the signal sig_dti_ptx_tx_buffer_full_ind | | Parameters : no parameter | +------------------------------------------------------------------------------ */ GLOBAL void sig_dti_ptx_tx_buffer_full_ind () { TRACE_FUNCTION ("sig_dti_ptx_tx_buffer_full_ind()"); ppp_data->ptx.ptx_buffer_state = PTX_BUFFER_FULL; switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_READY: sig_ptx_frx_stop_flow_req(); break; case PTX_DEAD: break; case PTX_BLOCKED: /* * do not stop incoming data flow here since data is not sent * to the peer but to ARB, not having to be buffered in dtilib */ break; default: TRACE_ERROR("Wrong state"); break; } } /* sig_dti_ptx_tx_buffer_full_ind() */ /* +------------------------------------------------------------------------------ | Function : sig_ftx_ptx_tx_buffer_full_ind +------------------------------------------------------------------------------ | Description : This function handle the signal sig_ftx_ptx_tx_buffer_full_ind | | Parameters : no parameter | +------------------------------------------------------------------------------ */ GLOBAL void sig_ftx_ptx_buffer_full_ind () { TRACE_FUNCTION ("sig_ftx_ptx_tx_buffer_full_ind()"); ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_FULL; } /* sig_ftx_ptx_tx_buffer_full_ind() */ /* +------------------------------------------------------------------------------ | Function : sig_ftx_ptx_tx_buffer_ready_ind +------------------------------------------------------------------------------ | Description : This function handle the signal sig_ftx_ptx_tx_buffer_ready_ind | | Parameters : no parameter | +------------------------------------------------------------------------------ */ GLOBAL void sig_ftx_ptx_buffer_ready_ind () { TRACE_FUNCTION ("sig_ftx_ptx_tx_buffer_ready_ind()"); ppp_data->ptx.ftx_buffer_state = PTX_FTX_BUFFER_READY; switch( GET_STATE( PPP_SERVICE_PTX ) ) { case PTX_READY: if(ppp_data->ptx.ptx_buffer_state EQ PTX_BUFFER_READY) { sig_ptx_frx_start_flow_req(); } #ifdef PTXS_DEBUG else { TRACE_EVENT_P2("WARNING(FTX_BUFFER_READY_IND): UL data flow wasn't started, %s(%d)", __FILE__, __LINE__); } #endif /* PTXS_DEBUG */ break; case PTX_BLOCKED: /* * Start data flow also if PTX buffer is full, * because the data will be redirected to ARB. */ sig_ptx_frx_start_flow_req(); break; case PTX_DEAD: /* wait for sig_arb_ptx_blocked/ready/transparent_mode_req */ break; default: TRACE_ERROR( "DTI signal unexpected" ); break; } } /* sig_ftx_ptx_tx_buffer_ready_ind() */