FreeCalypso > hg > fc-tourmaline
diff src/g23m-fad/ppp/ppp_onas.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/ppp/ppp_onas.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,1334 @@ +/* ++----------------------------------------------------------------------------- +| 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 (ONA-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef PPP_ONAS_C +#define PPP_ONAS_C +#endif /* !PPP_ONAS_C */ + +#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 */ +#include "cnf_ppp.h" /* to get cnf-definitions */ +#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_arbf.h" /* to get the arb function definitions */ +#include "ppp_ftxs.h" /* to get the ftx signal interface */ +#include "ppp_lcps.h" /* to get the lcp signal interface */ +#include "ppp_ncps.h" /* to get the ncp signal interface */ +#include "ppp_onaf.h" /* to get the ona function definitions */ +#include "ppp_rts.h" /* to get the rt signal interface */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_ruc_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RUC_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_ruc_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_ruc_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + case ONA_OPENED: + /* + * send code reject + */ + sig_any_ftx_packet_req(ptype, packet); /* scj */ + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RUC_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_ruc_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_open_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_OPEN_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_open_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_open_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_OPENED: + case ONA_CLOSED: + case ONA_CLOSING: + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * reset counters + */ + ppp_data->ona->restarts = ppp_data->mc; + ppp_data->ona->failures = ppp_data->mf; + ppp_data->ona->loops = ppp_data->mc + 1; + /* + * send configure request + */ + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_OPEN_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_open_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_down_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_DOWN_IND +| +| Parameters : ptype - type of packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_down_ind (USHORT ptype) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_down_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSED: + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + break; + case ONA_CLOSING: + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + /* + * stop timer + */ + sig_any_rt_srt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_DOWN_IND unexpected" ); + break; + } +} /* sig_any_ona_down_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_close_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_CLOSE_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_close_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_close_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSED: + arb_discard_packet(packet); + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + break; + case ONA_CLOSING: + arb_discard_packet(packet); + break; + case ONA_OPENED: + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * reset counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * send terminate request + */ + sig_any_ftx_packet_req(ptype, packet); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_CLOSE_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_close_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rtr_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RTR_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rtr_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + + TRACE_ISIG( "sig_any_ona_rtr_ind" ); + + TRACE_EVENT( "Peer requested Termination by PPP frame" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + /* + * send terminate acknowledge + */ + sig_any_ftx_packet_req(ptype, packet); /* sta */ + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * send This-Layer-Down signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + } + ppp_data->ona = & ppp_data->ona_base[index]; + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set counter to zero + */ + ppp_data->ona->restarts = 0; + /* + * send terminate acknowledge + */ + sig_any_ftx_packet_req(ptype, packet); /* sta */ + /* + * start timer + */ + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RTR_IND unexpected" ); + arb_discard_packet(packet); + break; + } + + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_OK_PEER; + +} /* sig_any_ona_rtr_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_to_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_TO_IND +| +| Parameters : ptype - type of packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_to_ind (USHORT ptype) +{ + UBYTE index; + T_desc2* packet = NULL; + TRACE_ISIG( "sig_any_ona_to_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + if (ppp_data->ona->restarts EQ 0) + { + /* + * negative timeout + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_NO_RESPONSE; + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + } + else + { + /* + * positive timeout + */ + /* + * request a new terminate request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_str_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_str_req(&packet); + } + /* + * set counter and send terminate request packet + */ + ppp_data->ona->restarts--; + sig_any_ftx_packet_req(ptype, packet); /* str */ + /* + * restart timer + */ + sig_any_rt_rrt_req(); + } + break; + case ONA_REQ_SENT: + case ONA_ACK_SENT: + if (ppp_data->ona->restarts EQ 0) + { + /* + * negative timeout + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_NO_RESPONSE; + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + } + else + { + /* + * positive timeout + */ + /* + * request a new configure request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_scr_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_scr_req(&packet); + } + /* + * set counter and send configure request packet + */ + ppp_data->ona->restarts--; + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * restart timer + */ + sig_any_rt_rrt_req(); + } + break; + case ONA_ACK_RCVD: + if (ppp_data->ona->restarts EQ 0) + { + /* + * negative timeout + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_NO_RESPONSE; + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + } + else + { + /* + * positive timeout + */ + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * request a new configure request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_scr_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_scr_req(&packet); + } + /* + * set counter and send configure request packet + */ + ppp_data->ona->restarts--; + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * restart timer + */ + sig_any_rt_rrt_req(); + } + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_TO_IND unexpected" ); + break; + } +} /* sig_any_ona_to_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rta_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RTA_IND +| +| Parameters : ptype - type of packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rta_ind (USHORT ptype) +{ + UBYTE index; + T_desc2* packet = NULL; + TRACE_ISIG( "sig_any_ona_rta_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + /* + * stop timer + */ + sig_any_rt_srt_req(); + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + break; + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * send This-Layer-Down signal and + * request a new configure request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + sig_ona_lcp_scr_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + sig_ona_ncp_scr_req(&packet); + } + ppp_data->ona = & ppp_data->ona_base[index]; + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RTA_IND unexpected" ); + break; + } +} /* sig_any_ona_rta_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rxjn_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RXJN_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rxjn_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_rxjn_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + { + switch(ptype) + { + case DTI_PID_LCP: + ppp_data->ppp_cause = PPP_TERM_LCP_NOT_CONVERGE; + break; + case DTI_PID_IPCP: + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_CONVERGE; + break; + } + } + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSED ); + arb_discard_packet(packet); + /* + * stop timer + */ + sig_any_rt_srt_req(); + /* + * send This-Layer-Finished signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlf_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlf_req(); + } + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * send This-Layer-Down signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + } + ppp_data->ona = & ppp_data->ona_base[index]; + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * send terminate request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RXJN_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_rxjn_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rcrn_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RCRN_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| newFlag - flag +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rcrn_ind (USHORT ptype, T_desc2* packet, UBYTE newFlag) +{ + UBYTE index; + T_desc2* req_packet = NULL; + + TRACE_ISIG( "sig_any_ona_rcrn_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + arb_discard_packet(packet); + break; + case ONA_REQ_SENT: + case ONA_ACK_SENT: + if (ppp_data->ona->failures EQ 0) + { + /* + * protocol not converge + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + { + switch(ptype) + { + case DTI_PID_LCP: + ppp_data->ppp_cause = PPP_TERM_LCP_NOT_CONVERGE; + break; + case DTI_PID_IPCP: + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_CONVERGE; + break; + } + } + arb_discard_packet(packet); + /* + * set counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * request terminate request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_str_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_str_req(&packet); + } + /* + * send terminate request + */ + sig_any_ftx_packet_req(ptype, packet); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + } + else + { + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * send configure nak packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scn */ + if (newFlag EQ TRUE) + { + ppp_data->ona->failures--; + } + } + break; + case ONA_ACK_RCVD: + if (ppp_data->ona->failures EQ 0) + { + /* + * protocol not converge + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + { + switch(ptype) + { + case DTI_PID_LCP: + ppp_data->ppp_cause = PPP_TERM_LCP_NOT_CONVERGE; + break; + case DTI_PID_IPCP: + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_CONVERGE; + break; + } + } + arb_discard_packet(packet); + /* + * set counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * request terminate request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_str_req(&packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_str_req(&packet); + } + /* + * send terminate request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + } + else + { + /* + * send configure nak packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scn */ + if (newFlag EQ TRUE) + { + ppp_data->ona->failures--; + sig_any_rt_rrt_req(); + } + } + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * send This_Layer_Down signal and + * request configure request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + sig_ona_lcp_scr_req(&req_packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + sig_ona_ncp_scr_req(&req_packet); + } + ppp_data->ona = & ppp_data->ona_base[index]; + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, req_packet); /* scr */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + if ((newFlag EQ TRUE) && (ppp_data->ona->failures > 0)) + { + ppp_data->ona->failures--; + } + /* + * send configure nak packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scn */ + /* + * start timer + */ + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RCRN_IND unexpected" ); + break; + } +} /* sig_any_ona_rcrn_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rcrp_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RCRP_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rcrp_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + T_desc2* req_packet = NULL; + TRACE_ISIG( "sig_any_ona_rcrp_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + arb_discard_packet(packet); + break; + case ONA_REQ_SENT: + case ONA_ACK_SENT: + SET_STATE( PPP_SERVICE_ONA, ONA_ACK_SENT ); + /* + * set counter + */ + ppp_data->ona->failures = ppp_data->mf; + /* + * send configure acknowledge packet + */ + sig_any_ftx_packet_req(ptype, packet); /* sca */ + break; + case ONA_ACK_RCVD: + SET_STATE( PPP_SERVICE_ONA, ONA_OPENED ); + /* + * stop timer + */ + sig_any_rt_srt_req(); + /* + * reset counter + */ + ppp_data->ona->failures = ppp_data->mf; + /* + * send configure acknowledge packet + */ + sig_any_ftx_packet_req(ptype, packet); /* sca */ + /* + * send This-Layer_Up signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlu_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlu_req(); + } + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_ACK_SENT ); + /* + * send This-Layer-Down signal and + * request configure request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + sig_ona_lcp_scr_req(&req_packet); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + sig_ona_ncp_scr_req(&req_packet); + } + ppp_data->ona = & ppp_data->ona_base[index]; + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, req_packet); /* scr */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + /* + * send configure acknowledge packet + */ + sig_any_ftx_packet_req(ptype, packet); /* sca */ + /* + * restart timer + */ + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RCRP_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_rcrp_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rcn_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RCN_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rcn_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_rcn_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + arb_discard_packet(packet); + break; + case ONA_REQ_SENT: + case ONA_ACK_SENT: + /* + * reset counter + */ + ppp_data->ona->restarts = ppp_data->mc; + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + case ONA_ACK_RCVD: + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * start timer + */ + sig_any_rt_rrt_req(); + break; + case ONA_OPENED: + SET_STATE( PPP_SERVICE_ONA, ONA_REQ_SENT ); + /* + * send This-Layer-Down signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tld_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tld_req(); + } + ppp_data->ona = & ppp_data->ona_base[index]; + /* + * send configure request packet + */ + sig_any_ftx_packet_req(ptype, packet); /* scr */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RCN_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_rcn_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rca_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RCA_IND +| +| Parameters : ptype - type of packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rca_ind (USHORT ptype) +{ + UBYTE index; + T_desc2* temp_desc = NULL; + + TRACE_ISIG( "sig_any_ona_rca_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + case ONA_ACK_RCVD: + case ONA_OPENED: + break; + case ONA_REQ_SENT: + if(ppp_data->ona->loops EQ 0) + { + /* + * protocol not converge + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + { + switch(ptype) + { + case DTI_PID_LCP: + ppp_data->ppp_cause = PPP_TERM_LCP_NOT_CONVERGE; + break; + case DTI_PID_IPCP: + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_CONVERGE; + break; + } + } + /* + * set counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * request terminate request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_str_req(&temp_desc); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_str_req(&temp_desc); + } + /* + * send terminate request + */ + sig_any_ftx_packet_req(ptype, temp_desc); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + } + else + { + SET_STATE( PPP_SERVICE_ONA, ONA_ACK_RCVD ); + /* + * reset counters + */ + ppp_data->ona->restarts = ppp_data->mc; + ppp_data->ona->loops--; + /* + * start timer + */ + sig_any_rt_rrt_req(); + } + break; + + case ONA_ACK_SENT: + if(ppp_data->ona->loops EQ 0) + { + /* + * protocol not converge + */ + SET_STATE( PPP_SERVICE_ONA, ONA_CLOSING ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + { + switch(ptype) + { + case DTI_PID_LCP: + ppp_data->ppp_cause = PPP_TERM_LCP_NOT_CONVERGE; + break; + case DTI_PID_IPCP: + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_CONVERGE; + break; + } + } + /* + * set counter + */ + ppp_data->ona->restarts = ppp_data->mt; + /* + * request terminate request packet + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_str_req(&temp_desc); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_str_req(&temp_desc); + } + /* + * send terminate request + */ + sig_any_ftx_packet_req(ptype, temp_desc); /* str */ + /* + * start timer + */ + if(ppp_data->ona->restarts > 0) + ppp_data->ona->restarts--; + sig_any_rt_rrt_req(); + } + else + { + SET_STATE( PPP_SERVICE_ONA, ONA_OPENED ); + /* + * stop timer + */ + sig_any_rt_srt_req(); + /* + * reset counter + */ + ppp_data->ona->restarts = ppp_data->mc; + ppp_data->ona->loops--; + /* + * send This_Layer_Up signal + */ + if (ptype EQ DTI_PID_LCP) + { + sig_ona_lcp_tlu_req(); + } + else if (ptype EQ DTI_PID_IPCP) + { + sig_ona_ncp_tlu_req(); + } + } + break; + + default: + TRACE_ERROR( "SIG_ANY_ONA_RCA_IND unexpected" ); + break; + } +} /* sig_any_ona_rca_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_ona_rxr_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ONA_RXR_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_ona_rxr_ind (USHORT ptype, T_desc2* packet) +{ + UBYTE index; + TRACE_ISIG( "sig_any_ona_rxr_ind" ); + + /* + * determine ONA-instance + */ + ona_get_inst_index(ptype, &index); + ppp_data->ona = & ppp_data->ona_base[index]; + + switch( GET_STATE( PPP_SERVICE_ONA ) ) + { + case ONA_CLOSING: + case ONA_REQ_SENT: + case ONA_ACK_RCVD: + case ONA_ACK_SENT: + arb_discard_packet(packet); + break; + case ONA_OPENED: + /* + * send echo reply packet + */ + sig_any_ftx_packet_req(ptype, packet); /* ser */ + break; + default: + TRACE_ERROR( "SIG_ANY_ONA_RXR_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_any_ona_rxr_ind() */