FreeCalypso > hg > fc-selenite
diff src/g23m-fad/ppp/ppp_ftxs.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/ppp/ppp_ftxs.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,463 @@ +/* ++----------------------------------------------------------------------------- +| 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 (FTX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#define ENTITY_PPP + +/*==== 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 local DTI definitions */ +#include "ppp_ftxf.h" /* to get function interface from ftx */ +#include "ppp_arbf.h" /* to get function interface from arb */ +#include "ppp_prxs.h" /* to get signal interface from prx */ +#include "ppp_ptxs.h" /* to get signal interface from prx */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_arb_ftx_parameters_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ARB_FTX_PARAMETERS_REQ. It sets +| the parameter of FTX service. +| +| Parameters : accm - Async Control Character Map +| pfc - Protocol Field Compression +| acfc - Address and Control Field Compression +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_arb_ftx_parameters_req (ULONG accm, UBYTE pfc, UBYTE acfc) +{ + UBYTE i; + + TRACE_ISIG( "sig_arb_ftx_parameters_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_READY: + case FTX_BLOCKED_DTI_FULL: + case FTX_READY_DTI_FULL: + case FTX_BLOCKED: + case FTX_DEAD: + case FTX_DEAD_START_FLOW: + /* + * store accm in look up table + */ + for(i=0; i < 0x20; i++) + { + ppp_data->ftx.accmtab[i] = (accm & (1UL << i)) ? 0xFF : 0x00; + } + ppp_data->ftx.pfc = pfc; + ppp_data->ftx.acfc = acfc; + break; + + default: + TRACE_ERROR( "SIG_ARB_FTX_PARAMETERS_REQ unexpected" ); + break; + } +} /* sig_arb_ftx_parameters_req() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_arb_ftx_dead_mode_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ARB_FTX_DEAD_MODE_REQ. It stops +| any data tranfer and releases all still to send HDLC frames. +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_arb_ftx_dead_mode_req () +{ + + TRACE_ISIG( "sig_arb_ftx_dead_mode_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_READY: + case FTX_TRANSPARENT: + sig_ftx_prx_stop_flow_req(); + SET_STATE( PPP_SERVICE_FTX, FTX_DEAD ); + break; + + case FTX_BLOCKED_DTI_FULL: + case FTX_BLOCKED: + case FTX_READY_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_DEAD ); + break; + + default: + TRACE_ERROR( "SIG_ARB_FTX_DEAD_MODE_REQ unexpected" ); + break; + } + /* + * Free also any buffered packet (awaiting the TE to wake up) + * and reset PRX + */ + sig_ftx_prx_dead_mode_req(); +} /* sig_arb_ftx_dead_mode_req() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_arb_ftx_blocked_mode_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ARB_FTX_BLOCKED_MODE_REQ. That +| means PRX-FTX data transfer is not allowed, but ARB can still +| send packets. +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_arb_ftx_blocked_mode_req () +{ + TRACE_ISIG( "sig_arb_ftx_blocked_mode_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_DEAD: + /* + * Set FTX to blocked and do _not_ start data flow from prx + * since ARB wants to perform some action first. + * Mark FTX DTI queue as full until according tx_buffer_ready signal + * is received. This is necessary since FTX may be started without an + * open dti channel towards peer layer. + */ + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED_DTI_FULL); + sig_ftx_prx_ready_mode_req(); + break; + + case FTX_DEAD_START_FLOW: + /* + * Set FTX to blocked and do _not_ start data flow from prx + * since ARB wants to perform some action first. + * tx_buffer_ready was already received, so do not mark DTI as full + */ + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED); + sig_ftx_prx_ready_mode_req(); + break; + + case FTX_READY_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED_DTI_FULL ); + break; + + case FTX_READY: + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED ); + sig_ftx_prx_stop_flow_req(); + break; + + case FTX_TRANSPARENT: + SET_STATE( PPP_SERVICE_FTX, FTX_TRANSPARENT_DTI_FULL ); + sig_ftx_prx_stop_flow_req(); + break; + + default: + TRACE_ERROR( "SIG_ARB_FTX_BLOCKED_MODE_REQ unexpected" ); + break; + } +} /* sig_arb_ftx_blocked_mode_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_arb_ftx_ready_mode_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ARB_FTX_READY_MODE_REQ. It +| starts PRX-FTX data transfer. +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_arb_ftx_ready_mode_req () +{ + TRACE_ISIG( "sig_arb_ftx_ready_mode_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + /* + * Tranistion from FTX_DEAD means there is a newly opened dti connection + * with empty buffers so starting the data flow is the right thing to + * do here + */ + case FTX_DEAD_START_FLOW: + SET_STATE( PPP_SERVICE_FTX, FTX_READY ); + sig_ftx_prx_ready_mode_req(); + sig_ftx_prx_start_flow_req(); + sig_ftx_ptx_buffer_ready_ind(); + break; + + case FTX_DEAD: + SET_STATE( PPP_SERVICE_FTX, FTX_READY_DTI_FULL ); + sig_ftx_prx_ready_mode_req(); + break; + + case FTX_BLOCKED: + SET_STATE( PPP_SERVICE_FTX, FTX_READY ); + sig_ftx_prx_start_flow_req(); + break; + + case FTX_TRANSPARENT_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_TRANSPARENT ); + sig_ftx_prx_start_flow_req(); + break; + + case FTX_BLOCKED_DTI_FULL: + /* now waiting for dti */ + SET_STATE( PPP_SERVICE_FTX, FTX_READY_DTI_FULL); + break; + + case FTX_READY: + case FTX_TRANSPARENT: + /* already in the requested state */ + break; + + default: + TRACE_ERROR( "SIG_ARB_FTX_READY_MODE_REQ unexpected" ); + break; + } +} /* sig_arb_ftx_ready_mode_req() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_arb_ftx_transparent_mode_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ARB_FTX_TRANSPARENT_MODE_REQ. +| It starts PRX-FTX transparent data transfer. That means we +| expect PPP frames from PRX and check just for the start and end +| HDLC flag. +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_arb_ftx_transparent_mode_req () +{ + TRACE_ISIG( "sig_arb_ftx_transparent_mode_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_DEAD: + case FTX_DEAD_START_FLOW: + /* + * Set ftx 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_FTX, FTX_TRANSPARENT ); + sig_ftx_prx_ready_mode_req(); + sig_ftx_prx_start_flow_req(); + sig_ftx_ptx_buffer_ready_ind(); + break; + + default: + TRACE_ERROR( "SIG_ARB_FTX_TRANSPARENT_MODE_REQ unexpected" ); + break; + } +} /* sig_arb_ftx_transparent_mode_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ftx_packet_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_FTX_PACKET_REQ. It creates +| an HDLC frame and sends it if possible or stores it in the send +| queue. +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ftx_packet_req (USHORT ptype, T_desc2* packet) +{ + TRACE_ISIG( "sig_any_ftx_packet_req" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_READY: + case FTX_BLOCKED_DTI_FULL: + case FTX_BLOCKED: + case FTX_READY_DTI_FULL: + { + /* + * create frame and send it + */ + PALLOC_DESC2 (dti_data_ind, DTI2_DATA_IND); + + ftx_get_frame (ptype, packet, &dti_data_ind->desc_list2); + + sig_any_dti_data_ind(ppp_data->ppphDTI, + dti_data_ind, + PPP_INSTANCE, PEER_LAYER, + PEER_CHANNEL, DTI_PID_UOS); + break; + } + + case FTX_TRANSPARENT: + /* + * check frame and send it + */ + { + PALLOC_DESC2 (dti_data_ind, DTI2_DATA_IND); + dti_data_ind->desc_list2.first = (ULONG)packet; + ftx_check_frame (&dti_data_ind->desc_list2); + + sig_any_dti_data_ind(ppp_data->ppphDTI, + dti_data_ind, + PPP_INSTANCE, PEER_LAYER, + PEER_CHANNEL, DTI_PID_UOS); + } + break; + + default: + TRACE_ERROR( "SIG_ANY_FTX_PACKET_REQ unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ftx_packet_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_dti_ftx_tx_buffer_full_ind ++------------------------------------------------------------------------------ +| Description : This function handle the signal sig_dti_ftx_tx_buffer_full_ind +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_dti_ftx_tx_buffer_full_ind () +{ + TRACE_FUNCTION ("sig_dti_ftx_tx_buffer_full_ind()"); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_READY: + SET_STATE( PPP_SERVICE_FTX, FTX_READY_DTI_FULL ); + sig_ftx_prx_stop_flow_req(); + sig_ftx_ptx_buffer_full_ind(); + break; + + case FTX_TRANSPARENT: + SET_STATE( PPP_SERVICE_FTX, FTX_TRANSPARENT_DTI_FULL ); + sig_ftx_prx_stop_flow_req(); + sig_ftx_ptx_buffer_full_ind(); + break; + + case FTX_BLOCKED: + /* now both ARB and dtilib want FTX to block */ + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED_DTI_FULL ); + sig_ftx_ptx_buffer_full_ind(); + break; + + case FTX_BLOCKED_DTI_FULL: + case FTX_READY_DTI_FULL: + case FTX_TRANSPARENT_DTI_FULL: + /* prx has already been blocked, do nothing */ + break; + + case FTX_DEAD_START_FLOW: + SET_STATE( PPP_SERVICE_FTX, FTX_DEAD ); + break; + + default: + TRACE_ERROR("Wrong state"); + break; + } +} /* sig_dti_ftx_tx_buffer_full_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_dti_ftx_tx_buffer_ready_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal sig_dti_ftx_tx_buffer_ready_ind +| +| Parameters : no parameter +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_dti_ftx_tx_buffer_ready_ind () +{ + TRACE_FUNCTION( "sig_dti_ftx_tx_buffer_ready_ind" ); + + switch( GET_STATE( PPP_SERVICE_FTX ) ) + { + case FTX_BLOCKED_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_BLOCKED ); + sig_ftx_ptx_buffer_ready_ind(); + break; + + case FTX_READY_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_READY ); + sig_ftx_prx_start_flow_req(); + sig_ftx_ptx_buffer_ready_ind(); + break; + + case FTX_TRANSPARENT_DTI_FULL: + SET_STATE( PPP_SERVICE_FTX, FTX_TRANSPARENT ); + sig_ftx_prx_start_flow_req(); + sig_ftx_ptx_buffer_ready_ind(); + break; + + case FTX_DEAD: + SET_STATE( PPP_SERVICE_FTX, FTX_DEAD_START_FLOW ); + /* wait for sig_arb_ftx_blocked/ready/transparent_mode_req */ + break; + + case FTX_READY: + case FTX_TRANSPARENT: + /* already in the requested state */ + break; + + default: + TRACE_ERROR( "Signal unexpected" ); + break; + } +} /* sig_dti_ftx_tx_buffer_ready_ind() */