FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/ppp/ppp_arbs.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/ppp/ppp_arbs.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,1551 @@ +/* ++----------------------------------------------------------------------------- +| 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 (ARB-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef PPP_ARBS_C +#define PPP_ARBS_C +#endif /* !PPP_ARBS_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 function interface from arb */ +#include "ppp_lcpf.h" /* to get function interface from lcp */ +#include "ppp_ncpf.h" /* to get function interface from ncp */ +#include "ppp_rts.h" /* to get signal interface from rt */ +#include "ppp_ptxs.h" /* to get signal interface from ptx */ +#include "ppp_ftxs.h" /* to get signal interface from ftx */ +#include "ppp_lcps.h" /* to get signal interface from lcp */ +#include "ppp_ncps.h" /* to get signal interface from ncp */ +#include "ppp_paps.h" /* to get signal interface from pap */ +#include "ppp_caps.h" /* to get signal interface from chap */ +#include "ppp_ftxs.h" /* to get signal interface from ftx */ +#include "ppp_prxs.h" /* to get signal interface from prx */ +#include "ppp_frxs.h" /* to get signal interface from frx */ + +#ifdef _SIMULATION_ +#include <string.h> /* to get strcpy */ +#endif /* _SIMULATION_ */ +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ptx_arb_packet_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_PTX_ARB_PACKET_IND +| +| Parameters : ptype - type of packet +| packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ptx_arb_packet_ind (USHORT ptype, T_desc2* packet) +{ + TRACE_ISIG( "sig_ptx_arb_packet_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_LCP_ESTABLISH: + case ARB_LCP_PDP: + case ARB_LCP_NCP: + case ARB_LCP_RECONF: + case ARB_LCP_MOD: + /* + * any non-LCP packets received during this phase must be + * silently discarded + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + default: + arb_discard_packet(packet); + break; + } + break; + case ARB_PAP_ESTABLISH: + /* + * only LCP and Authentication packets + * are allowed during this phase + * all other packets are silently discarded + * if we are in client mode and an IPCP Configure Req packet is received, + * we stop authentication and and start ncp + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_PAP: + sig_arb_pap_packet_req(packet); + break; + case DTI_PID_IPCP: + if (ppp_data->mode EQ PPP_CLIENT) + { + UBYTE result; + UBYTE hc; + UBYTE msid; + + ncp_analyze_first_ipcp(packet, &result, &hc, &msid); + if(result EQ TRUE) + { + /* + * start IPCP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); + sig_arb_pap_stop_req(); + sig_arb_ncp_open_req(); + sig_arb_ncp_packet_req(packet); + break; + } + } + /* fall through */ + default: + arb_discard_packet(packet); + break; + } + break; + case ARB_PAP_RECONF: + /* + * only LCP and Authentication packets + * are allowed during this phase + * all other packets are silently discarded + * if we are in client mode and an IPCP Configure Req packet is received, + * we stop authentication and and start ncp + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_PAP: + sig_arb_pap_packet_req(packet); + break; + case DTI_PID_IPCP: + if (ppp_data->mode EQ PPP_CLIENT) + { + UBYTE result; + UBYTE hc; + UBYTE msid; + + ncp_analyze_first_ipcp(packet, &result, &hc, &msid); + if(result EQ TRUE) + { + /* + * start IPCP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_pap_stop_req(); + sig_arb_ncp_open_req(); + sig_arb_ncp_packet_req(packet); + break; + } + } + /* fall through */ + default: + arb_discard_packet(packet); + break; + } + break; + case ARB_CHAP_ESTABLISH: + /* + * only LCP and Authentication packets + * are allowed during this phase + * all other packets are silently discarded + * if we are in client mode and an IPCP Configure Req packet is received, + * we stop authentication and and start ncp + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_CHAP: + sig_arb_chap_packet_req(packet); + break; + case DTI_PID_IPCP: + if (ppp_data->mode EQ PPP_CLIENT) + { + UBYTE result; + UBYTE hc; + UBYTE msid; + + ncp_analyze_first_ipcp(packet, &result, &hc, &msid); + if(result EQ TRUE) + { + /* + * start IPCP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); + sig_arb_chap_stop_req(); + sig_arb_ncp_open_req(); + sig_arb_ncp_packet_req(packet); + break; + } + } + /* fall through */ + default: + arb_discard_packet(packet); + break; + } + break; + case ARB_CHAP_RECONF: + /* + * only LCP and Authentication packets + * are allowed during this phase + * all other packets are silently discarded + * if we are in client mode and an IPCP Configure Req packet is received, + * we stop authentication and and start ncp + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_CHAP: + sig_arb_chap_packet_req(packet); + break; + case DTI_PID_IPCP: + if (ppp_data->mode EQ PPP_CLIENT) + { + UBYTE result; + UBYTE hc; + UBYTE msid; + + ncp_analyze_first_ipcp(packet, &result, &hc, &msid); + if(result EQ TRUE) + { + /* + * start IPCP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_chap_stop_req(); + sig_arb_ncp_open_req(); + sig_arb_ncp_packet_req(packet); + break; + } + } + /* fall through */ + default: + arb_discard_packet(packet); + break; + } + break; + case ARB_PDP_WAIT: + /* + * any protocol which is unsupported by the implementation must be + * returned in a Protocol-Reject packet + * LCP and IPCP are allowed + * other supported protocols are silently discarded + * arbitration waits for an IPCP Configure-Request packet from + * the PPP peer to create the list of Protocol Configuration Options + * and fill in the PPP_PDP_ACTIVATE_IND primitive + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_IPCP: + { + UBYTE result; + UBYTE hc; + UBYTE msid; + + ncp_analyze_first_ipcp(packet, &result, &hc, &msid); + if(result EQ TRUE) + { + PALLOC_SDU(ppp_pdp_activate_ind, PPP_PDP_ACTIVATE_IND, (251UL << 3)); + SET_STATE( PPP_SERVICE_ARB, ARB_PDP_SENT ); + sig_any_rt_srt_req(); + TRACE_EVENT("activating PDP context"); + if(hc EQ PPP_HC_OFF) + { + TRACE_EVENT("client does not support header compression"); + } + else if(hc EQ PPP_HC_VJ) + { + TRACE_EVENT("client supports VJ header compression"); + } + ppp_pdp_activate_ind->ppp_hc=hc; + ppp_pdp_activate_ind->msid=msid; + arb_get_pco_list (&ppp_pdp_activate_ind->sdu); + PSEND (hCommMMI, ppp_pdp_activate_ind); + } + /* + * store the packet + */ + if(ppp_data->arb.last_ipcp) + { + MFREE_DESC2(ppp_data->arb.last_ipcp); + } + ppp_data->arb.last_ipcp = packet; + } + break; + case DTI_PID_IP: + case DTI_PID_CTCP: + case DTI_PID_UTCP: + case DTI_PID_PAP: + case DTI_PID_CHAP: + arb_discard_packet(packet); + break; + default: + { + T_desc2* temp_desc; + + arb_get_protocol_reject (ptype, packet, &temp_desc); + sig_any_ftx_packet_req(DTI_PID_LCP, temp_desc); + } + break; + } + break; + case ARB_PDP_SENT: + /* + * any protocol which is unsupported by the implementation must be + * returned in a Protocol-Reject packet + * only LCP and IPCP are allowed + * IPCP packets are stored until the context is activated + * other supported protocols are silently discarded + * arbitration waits for a response to the context activation + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + + case DTI_PID_IPCP: + if(ppp_data->arb.last_ipcp) + { + MFREE_DESC2(ppp_data->arb.last_ipcp); + } + ppp_data->arb.last_ipcp = packet; + break; + + case DTI_PID_IP: + case DTI_PID_CTCP: + case DTI_PID_UTCP: + case DTI_PID_PAP: + case DTI_PID_CHAP: + arb_discard_packet(packet); + break; + default: + { + T_desc2* temp_desc; + + arb_get_protocol_reject (ptype, packet, &temp_desc); + sig_any_ftx_packet_req(DTI_PID_LCP, temp_desc); + } + break; + } + break; + case ARB_NCP_ESTABLISH: + case ARB_NCP_RECONF: + case ARB_NCP_MOD: + /* + * any protocol which is unsupported by the implementation must be + * returned in a Protocol-Reject packet + * LCP and IPCP are allowed during this phases + * other supported protocols are silently discarded + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_IPCP: + sig_arb_ncp_packet_req(packet); + break; + case DTI_PID_IP: + case DTI_PID_CTCP: + case DTI_PID_UTCP: + case DTI_PID_PAP: + case DTI_PID_CHAP: + arb_discard_packet(packet); + break; + default: + { + T_desc2* temp_desc; + arb_get_protocol_reject (ptype, packet, &temp_desc); + sig_any_ftx_packet_req(DTI_PID_LCP, temp_desc); + } + break; + } + break; + case ARB_IP: + /* + * any protocol which is unsupported by the implementation must be + * returned in a Protocol-Reject packet. If Van Jacobson is not + * negotiated then such packets must also be returned in a + * Protocol-Reject packet. + * LCP and IPCP are allowed during this phases + * other supported protocols are silently discarded + */ + switch(ptype) + { + case DTI_PID_LCP: + sig_arb_lcp_packet_req(packet); + break; + case DTI_PID_IPCP: + sig_arb_ncp_packet_req(packet); + break; + case DTI_PID_CHAP: + if(ppp_data->mode EQ PPP_CLIENT) + { + sig_arb_chap_packet_req(packet); + break; + } + /* else fall trough */ + case DTI_PID_IP: + case DTI_PID_PAP: + arb_discard_packet(packet); + break; + case DTI_PID_CTCP: + case DTI_PID_UTCP: + if(ppp_data->n_hc EQ PPP_HC_VJ) + { + arb_discard_packet(packet); + break; + } + /* fall through */ + default: + { + T_desc2* temp_desc; + + arb_get_protocol_reject (ptype, packet, &temp_desc); + sig_any_ftx_packet_req(DTI_PID_LCP, temp_desc); + } + break; + } + break; + default: + TRACE_ERROR( "SIG_PTX_ARB_PACKET_IND unexpected" ); + arb_discard_packet(packet); + break; + } +} /* sig_ptx_arb_packet_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_lcp_arb_rpj_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LCP_ARB_RPJ_IND +| +| Parameters : ptype - type of rejected packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_lcp_arb_rpj_ind (USHORT ptype) +{ + TRACE_ISIG( "sig_lcp_arb_rpj_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_LCP_ESTABLISH: + case ARB_LCP_PDP: + case ARB_LCP_NCP: + case ARB_LCP_RECONF: + case ARB_LCP_MOD: + /* + * Protocol-Reject packets received in any other than the LCP Opened + * state should be silently discarded + */ + break; + case ARB_PAP_ESTABLISH: + case ARB_PAP_RECONF: + /* + * Close the connection if LCP or PAP is rejected. Otherwise the packet + * should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_PAP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED; + /* fall through */ + case DTI_PID_LCP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_pap_down_req(); + sig_arb_lcp_close_req(); + break; + } + break; + case ARB_CHAP_ESTABLISH: + case ARB_CHAP_RECONF: + /* + * Close the connection if LCP or CHAP is rejected. Otherwise the packet + * should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_CHAP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED; + /* fall through */ + case DTI_PID_LCP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_chap_down_req(); + sig_arb_lcp_close_req(); + break; + } + break; + case ARB_PDP_WAIT: + /* + * Close the connection if LCP is rejected. Otherwise the packet + * should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_LCP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_any_rt_srt_req(); + sig_arb_lcp_close_req(); + break; + } + break; + case ARB_PDP_SENT: + /* + * Close the connection if LCP is rejected. Otherwise the packet + * should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_LCP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + if(ppp_data->arb.last_ipcp) + { + MFREE_DESC2(ppp_data->arb.last_ipcp); + ppp_data->arb.last_ipcp = NULL; + } + sig_arb_lcp_close_req(); + break; + } + break; + case ARB_NCP_ESTABLISH: + case ARB_NCP_RECONF: + case ARB_NCP_MOD: + /* + * Close the connection if LCP or IPCP is rejected. Otherwise the packet + * should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_IPCP: + case DTI_PID_LCP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_ncp_down_req(); + sig_arb_lcp_close_req(); + break; + } + break; + case ARB_IP: + /* + * Close the connection if LCP, IPCP or IP is rejected. Also close the + * connection if (un)compressed TCP is rejected and header compression + * is switched on. Otherwise the packet should be silently discarded. + */ + switch(ptype) + { + case DTI_PID_CTCP: + case DTI_PID_UTCP: + { + UBYTE hc, msid; + ULONG ip, pdns, sdns; + /* + * determine whether header compression is switched on + */ + ncp_get_values (&hc, &msid, &ip, &pdns, &sdns); + if(hc NEQ PPP_HC_VJ) + break; + } + /* fall through */ + case DTI_PID_LCP: + case DTI_PID_IPCP: + case DTI_PID_IP: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_REJ_UNEXPECTED; + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_ftx_blocked_mode_req(); + sig_arb_ptx_blocked_mode_req(); + sig_arb_ncp_down_req(); + sig_arb_lcp_close_req(); + break; + } + break; + default: + TRACE_ERROR( "SIG_LCP_ARB_RPJ_IND unexpected" ); + break; + } +} /* sig_lcp_arb_rpj_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_rt_arb_to_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_RT_ARB_TO_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_rt_arb_to_ind () +{ + TRACE_ISIG( "sig_rt_arb_to_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_LCP_ESTABLISH: + case ARB_LCP_PDP: + case ARB_LCP_NCP: + case ARB_LCP_RECONF: + case ARB_LCP_MOD: + /* + * lcp time out + */ + sig_arb_lcp_to_req(); + break; + case ARB_PAP_ESTABLISH: + case ARB_PAP_RECONF: + sig_arb_pap_to_req(); + break; + case ARB_CHAP_ESTABLISH: + case ARB_CHAP_RECONF: + sig_arb_chap_to_req(); + break; + case ARB_PDP_WAIT: + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + TRACE_EVENT("waiting for IPCP Configure Request packet"); + /* + * determine authentication protocol + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + switch(ap) + { + case PPP_AP_PAP: + sig_arb_pap_to_req(); + break; + case PPP_AP_CHAP: + sig_arb_chap_to_req(); + break; + default: + if(ppp_data->arb.to_counter EQ 0) + { + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_STARTED; + sig_arb_lcp_close_req(); + } + else + { + ppp_data->arb.to_counter--; + sig_any_rt_rrt_req(); + } + break; + } + + } + break; + case ARB_NCP_ESTABLISH: + case ARB_NCP_RECONF: + case ARB_NCP_MOD: + /* + * ncp time out + */ + sig_arb_ncp_to_req(); + break; + case ARB_IP: + if(ppp_data->mode EQ PPP_CLIENT) + { + sig_arb_chap_to_req(); + break; + } + /* else fall trough */ + default: + TRACE_ERROR( "SIG_RT_ARB_TO_IND unexpected" ); + break; + } +} /* sig_rt_arb_to_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_arb_tlf_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ARB_TLF_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_arb_tlf_ind () +{ + TRACE_ISIG( "sig_any_arb_tlf_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_LCP_ESTABLISH: + case ARB_LCP_PDP: + case ARB_LCP_NCP: + case ARB_LCP_RECONF: + case ARB_LCP_MOD: + if(ppp_data->arb.last_ipcp) + { + MFREE_DESC2(ppp_data->arb.last_ipcp); + ppp_data->arb.last_ipcp = NULL; + } + /* + * send a PPP_TERMINATE_IND + */ + { + PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); + SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); + sig_arb_ncp_down_req(); + sig_arb_pap_down_req(); + sig_arb_chap_down_req(); + sig_arb_lcp_down_req(); + sig_arb_ptx_dead_mode_req(); + sig_arb_ftx_dead_mode_req(); + arb_dti_close_prot_ind(); + arb_dti_close_peer_ind(); + + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_PROT_ERROR_UNSPEC; + ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; + PSEND (hCommMMI, ppp_terminate_ind); + } + break; + case ARB_PDP_WAIT: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_IPCP_NOT_STARTED; + /* fall through */ + case ARB_PAP_ESTABLISH: + case ARB_PAP_RECONF: + case ARB_CHAP_ESTABLISH: + case ARB_CHAP_RECONF: + /* + * set error code + */ + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED; + /* fall through */ + case ARB_NCP_ESTABLISH: + case ARB_NCP_RECONF: + case ARB_NCP_MOD: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_lcp_close_req(); + break; + default: + TRACE_ERROR( "SIG_ANY_ARB_TLF_IND unexpected" ); + break; + } +} /* sig_any_arb_tlf_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_any_arb_tlu_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ANY_ARB_TLU_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_any_arb_tlu_ind () +{ + + TRACE_ISIG( "sig_any_arb_tlu_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_LCP_ESTABLISH: + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + /* + * get the LCP values and configure the frame transmission + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + sig_arb_ftx_parameters_req(accm, pfc, acfc); + + switch(ap) + { + case PPP_AP_PAP: + /* + * start PAP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_PAP_ESTABLISH ); + sig_arb_pap_open_req(); + break; + case PPP_AP_CHAP: + /* + * start CHAP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_CHAP_ESTABLISH ); + sig_arb_chap_open_req(); + break; + default: + if (ppp_data->mode EQ PPP_CLIENT) + { + /* + * start IPCP modification + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); + sig_arb_ncp_open_req(); + } + else + { + + /* + * wait for an IPCP Configure-Request + */ + SET_STATE( PPP_SERVICE_ARB, ARB_PDP_WAIT ); + /* + * ensure that authentication will not negotiated next time + */ + sig_arb_lcp_modify_ap_req(PPP_AP_NO); + ppp_data->arb.to_counter=ppp_data->mc; + if(ppp_data->arb.to_counter > 0) + ppp_data->arb.to_counter--; + sig_any_rt_rrt_req(); + } + break; + } + } + break; + case ARB_LCP_PDP: + /* + * this will happen only in server mode + */ + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + /* + * wait for the answer of context activation + */ + SET_STATE( PPP_SERVICE_ARB, ARB_PDP_SENT ); + + /* + * get the LCP values and configure the frame transmission + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + sig_arb_ftx_parameters_req(accm, pfc, acfc); + } + break; + case ARB_LCP_NCP: + /* + * this will happen only in server mode + */ + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + T_desc2* temp_desc; + + /* + * start IPCP establishment + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); + + /* + * get the LCP values and configure the frame transmission + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + sig_arb_ftx_parameters_req(accm, pfc, acfc); + + sig_arb_ncp_open_req(); + if(ppp_data->arb.last_ipcp) + { + temp_desc = ppp_data->arb.last_ipcp; + ppp_data->arb.last_ipcp = NULL; + sig_arb_ncp_packet_req(temp_desc); + } + } + break; + case ARB_LCP_RECONF: + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + /* + * get the LCP values and configure the frame transmission + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + sig_arb_ftx_parameters_req(accm, pfc, acfc); + + if(ppp_data->mode EQ PPP_CLIENT) + switch(ap) + { + case PPP_AP_PAP: + /* + * start PAP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_PAP_RECONF ); + sig_arb_pap_open_req(); + break; + case PPP_AP_CHAP: + /* + * start CHAP + */ + SET_STATE( PPP_SERVICE_ARB, ARB_CHAP_RECONF ); + sig_arb_chap_open_req(); + break; + default: + /* + * start IPCP modification + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_ncp_open_req(); + break; + } + else + { + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_ncp_open_req(); + } + } + break; + case ARB_LCP_MOD: + /* + * this will happen only in server mode + */ + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + /* + * start IPCP modification + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_MOD ); + + /* + * get the LCP values and configure the frame transmission + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + sig_arb_ftx_parameters_req(accm, pfc, acfc); + + sig_arb_ncp_open_req(); + } + break; + case ARB_PAP_ESTABLISH: + case ARB_CHAP_ESTABLISH: + if (ppp_data->mode EQ PPP_CLIENT) + { + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); + /* + * reset error code + */ + ppp_data->ppp_cause = 0; + /* + * start IPCP + */ + sig_arb_ncp_open_req(); + } + else + { + /* + * PPP_SERVER + * wait for an IPCP Configure-Request + */ + SET_STATE( PPP_SERVICE_ARB, ARB_PDP_WAIT ); + /* + * ensure that authentication will not negotiated next time + */ + sig_arb_lcp_modify_ap_req(PPP_AP_NO); + } + break; + case ARB_PAP_RECONF: + case ARB_CHAP_RECONF: + /* + * this will happen only in client mode + */ + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_ncp_open_req(); + break; + case ARB_NCP_ESTABLISH: + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + UBYTE ppp_hc; + UBYTE msid; + ULONG ip; + ULONG pdns; + ULONG sdns; + + PALLOC (ppp_establish_cnf, PPP_ESTABLISH_CNF); + SET_STATE( PPP_SERVICE_ARB, ARB_IP ); + /* + * get the LCP and IPCP values and store it + * into the PPP_ESTABLISH_CNF primitive + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + ncp_get_values(&ppp_hc, &msid, &ip, &pdns, &sdns); + + ppp_data->n_hc = ppp_hc; + + sig_arb_ftx_ready_mode_req(); + sig_arb_ptx_ready_mode_req(); + + ppp_establish_cnf->mru=mru; + ppp_establish_cnf->ppp_hc=ppp_hc; + ppp_establish_cnf->msid=msid; + ppp_establish_cnf->ip=ip; + ppp_establish_cnf->dns1=pdns; + ppp_establish_cnf->dns2=sdns; + + TRACE_EVENT( "PPP Established" ); + + PSEND (hCommMMI, ppp_establish_cnf); + } + break; + case ARB_NCP_RECONF: + { + UBYTE ppp_hc; + UBYTE msid; + ULONG ip; + ULONG pdns; + ULONG sdns; + + SET_STATE( PPP_SERVICE_ARB, ARB_IP ); + /* + * get IPCP values to set PTX value + */ + ncp_get_values(&ppp_hc, &msid, &ip, &pdns, &sdns); + + ppp_data->n_hc = ppp_hc; + + sig_arb_ftx_ready_mode_req(); + sig_arb_ptx_ready_mode_req(); + } + break; + case ARB_NCP_MOD: + /* + * this will happen only in server mode + */ + { + UBYTE ppp_hc; + UBYTE msid; + ULONG ip; + ULONG pdns; + ULONG sdns; + + PALLOC (ppp_modification_cnf, PPP_MODIFICATION_CNF); + SET_STATE( PPP_SERVICE_ARB, ARB_IP ); + /* + * get IPCP values and store it into + * the PPP_MODIFICATION_CNF primitive + */ + ncp_get_values(&ppp_hc, &msid, &ip, &pdns, &sdns); + + ppp_data->n_hc = ppp_hc; + + sig_arb_ftx_ready_mode_req(); + sig_arb_ptx_ready_mode_req(); + + ppp_modification_cnf->ppp_hc=ppp_hc; + ppp_modification_cnf->msid=msid; + PSEND (hCommMMI, ppp_modification_cnf); + } + break; + + case ARB_IP: + if (ppp_data->mode EQ PPP_CLIENT) + /* + * do nothing, funct. was called after CHAP re-authentication + */ + break; + /* else fall through */ + + default: + TRACE_ERROR( "SIG_ANY_ARB_TLU_IND unexpected" ); + break; + } +} /* sig_any_arb_tlu_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_lcp_arb_tld_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LCP_ARB_TLD_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_lcp_arb_tld_ind () +{ + TRACE_ISIG( "sig_lcp_arb_tld_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_PAP_ESTABLISH: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + if((ppp_data->ppp_cause EQ 0) && (ppp_data->mode EQ PPP_CLIENT)) + ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED; + sig_arb_pap_down_req(); + break; + case ARB_CHAP_ESTABLISH: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + if((ppp_data->ppp_cause EQ 0) && (ppp_data->mode EQ PPP_CLIENT)) + ppp_data->ppp_cause = PPP_TERM_USE_AUTHED_FAILED; + sig_arb_chap_down_req(); + break; + case ARB_PAP_RECONF: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_pap_down_req(); + break; + case ARB_CHAP_RECONF: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_chap_down_req(); + break; + case ARB_PDP_WAIT: + /* + * this will happen only in server mode + */ + { + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + /* + * determine authentication protocol + */ + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + switch(ap) + { + case PPP_AP_PAP: + sig_arb_pap_down_req(); + break; + case PPP_AP_CHAP: + sig_arb_chap_down_req(); + break; + default: + sig_any_rt_srt_req(); + break; + } + } + break; + case ARB_PDP_SENT: + /* + * this will happen only in server mode + */ + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_PDP ); + break; + case ARB_NCP_ESTABLISH: + if(ppp_data->mode EQ PPP_CLIENT) + { + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + } + else + { + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_NCP ); + } + /* + * get ncp down + */ + sig_arb_ncp_down_req(); + break; + case ARB_NCP_RECONF: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + /* + * get ncp down + */ + sig_arb_ncp_down_req(); + break; + case ARB_NCP_MOD: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_MOD ); + /* + * get ncp down + */ + sig_arb_ncp_down_req(); + break; + case ARB_IP: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_ftx_blocked_mode_req(); + sig_arb_ptx_blocked_mode_req(); + /* + * get ncp down + */ + sig_arb_ncp_down_req(); + break; + default: + TRACE_ERROR( "SIG_LCP_ARB_TLD_IND unexpected" ); + break; + } +} /* sig_lcp_arb_tld_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ncp_arb_tld_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_NCP_ARB_TLD_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ncp_arb_tld_ind () +{ + TRACE_ISIG( "sig_ncp_arb_tld_ind" ); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_IP: + SET_STATE( PPP_SERVICE_ARB, ARB_NCP_RECONF ); + sig_arb_ftx_blocked_mode_req(); + sig_arb_ptx_blocked_mode_req(); + break; + default: + TRACE_ERROR( "SIG_NCP_ARB_TLD_IND unexpected" ); + break; + } +} /* sig_ncp_arb_tld_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_frx_arb_escape_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_FRX_ARB_ESCAPE_IND +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_frx_arb_escape_ind () +{ + /* + * free all PPP resources and finish + */ + PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); + + TRACE_ISIG( "sig_frx_arb_escape_ind" ); + + TRACE_EVENT( "Peer requested Termination by DTR drop or +++" ); + + SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); + if(ppp_data->arb.last_ipcp) + { + MFREE_DESC2(ppp_data->arb.last_ipcp); + ppp_data->arb.last_ipcp = NULL; + } + sig_arb_ncp_down_req(); + sig_arb_pap_down_req(); + sig_arb_chap_down_req(); + sig_arb_lcp_down_req(); + sig_arb_ptx_dead_mode_req(); + sig_arb_ftx_dead_mode_req(); + arb_dti_close_prot_ind(); + arb_dti_close_peer_ind(); + + /* + * set error code + */ + + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_OK_PEER; + ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; + PSEND (hCommMMI, ppp_terminate_ind); +} /* sig_frx_arb_escape_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_dti_arb_connection_opened_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_DTI_ARB_CONNECTION_OPENED_IND +| +| Parameters : *hDTI - Handle for DTI Database +| instance - DTI Instance +| inter_face - DTI Interface +| channel - DTI Channel +| ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_dti_arb_connection_opened_ind(DTI_HANDLE hDTI, + U8 instance, + U8 inter_face, + U8 channel) +{ + TRACE_ISIG("sig_dti_arb_connection_opened_ind"); + + /* + * Ok - connected to a DTI Channel + */ + switch (inter_face) + { + case PROT_LAYER: + { + PALLOC(dti_connected_ind, PPP_DTI_CONNECTED_IND); + dti_connected_ind->connected_direction = PPP_DTI_CONN_PROT; + ppp_data->arb.dti_connect_state_prot = DTI_IDLE; + PSEND (hCommMMI, dti_connected_ind); + } + sig_arb_prx_dti_connected_req(); + break; + + case PEER_LAYER: + { + PALLOC(dti_connected_ind, PPP_DTI_CONNECTED_IND); + dti_connected_ind->connected_direction = PPP_DTI_CONN_PEER; + ppp_data->arb.dti_connect_state_peer = DTI_IDLE; + PSEND (hCommMMI, dti_connected_ind); + } + sig_arb_frx_dti_connected_req(); + + switch (GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_DEAD: + switch (ppp_data->mode) + { + case PPP_TRANSPARENT: + /* + * transparent is only ready after both dti connections + * have been acknowledged open + */ + break; + + case PPP_SERVER: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + TRACE_EVENT("DTI CONNECTED START ARB_LCP_ESTABLISH SERVER"); + sig_arb_lcp_open_req(); + break; + + case PPP_CLIENT: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); + TRACE_EVENT("DTI CONNECTED START ARB_LCP_ESTABLISH CLIENT"); + sig_arb_lcp_open_req(); + break; + + default: + TRACE_ERROR( "PPP_ESTABLISH_REQ with invalid parameter: mode" ); + break; + }/* switch (ppp_data->mode) */ + break; + + default: + TRACE_ERROR( "DTI signal unexpected" ); + break; + }/* switch( GET_STATE( PPP_SERVICE_ARB ) ) */ + break; + + default: + TRACE_ERROR( "DTI direction unknown" ); + break; + }/* switch (inter_face) */ + + /* + * Start transparent mode if both DTI channels are connected + */ + if( + (ppp_data->mode EQ PPP_TRANSPARENT) AND + (ppp_data->arb.dti_connect_state_prot EQ DTI_IDLE) AND + (ppp_data->arb.dti_connect_state_peer EQ DTI_IDLE) AND + (GET_STATE( PPP_SERVICE_ARB ) EQ ARB_DEAD) + ) + { + SET_STATE( PPP_SERVICE_ARB, ARB_TRANSPARENT ); + TRACE_EVENT("DTI CONNECTED TRANSPARENT"); + { + PALLOC (ppp_establish_cnf, PPP_ESTABLISH_CNF); +#ifdef _SIMULATION_ + ppp_establish_cnf->mru=PPP_MRU_DEFAULT; + ppp_establish_cnf->ppp_hc=PPP_HC_OFF; + ppp_establish_cnf->msid=0; + ppp_establish_cnf->ip=PPP_IP_DYNAMIC; + ppp_establish_cnf->dns1=PPP_DNS1_DYNAMIC; + ppp_establish_cnf->dns2=PPP_DNS2_DYNAMIC; +#endif /* _SIMULATION_ */ + PSEND (hCommMMI, ppp_establish_cnf); + } + sig_arb_ptx_transparent_mode_req(); + sig_arb_ftx_transparent_mode_req(); + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_dti_arb_connection_closed_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal +| SIG_DTI_FTX_ARB_CONNECTION_CLOSED_IND. +| +| Parameters : *hDTI - Handle for DTI Database +| instance - DTI Instance +| inter_face - DTI Interface +| channel - DTI Channel +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_dti_arb_connection_closed_ind (DTI_HANDLE hDTI, + U8 instance, + U8 inter_face, + U8 channel) +{ + TRACE_ISIG("sig_dti_arb_connection_closed_ind"); + + switch( GET_STATE( PPP_SERVICE_ARB ) ) + { + case ARB_PAP_ESTABLISH: + case ARB_PAP_RECONF: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_pap_down_req(); + break; + case ARB_CHAP_ESTABLISH: + case ARB_CHAP_RECONF: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_arb_chap_down_req(); + break; + case ARB_PDP_WAIT: + SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); + sig_any_rt_srt_req(); + break; + } + + /* + * free all PPP resources and finish + */ + { + PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); + + SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); + sig_arb_ncp_down_req(); + sig_arb_pap_down_req(); + sig_arb_chap_down_req(); + sig_arb_lcp_down_req(); + sig_arb_ptx_dead_mode_req(); + sig_arb_ftx_dead_mode_req(); + + if(ppp_data->ppp_cause EQ 0) + ppp_data->ppp_cause = PPP_TERM_NO_CHANNEL; + ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; + PSEND (hCommMMI, ppp_terminate_ind); + } + + /* + * Be shure all DTI channels are closed + */ + arb_dti_close_prot_ind(); + arb_dti_close_peer_ind(); +}