FreeCalypso > hg > fc-tourmaline
view src/g23m-fad/ppp/ppp_arbs.c @ 78:c632896652ba
mfw/ti1_key.c: properly initialize notified_keys array
The code in this ti1_key.c layer needs to call kpd_subscribe() and
kpd_define_key_notification() functions in order to register with the
KPD driver. The original code passed KPD_NB_PHYSICAL_KEYS in
nb_notified_keys - this constant is defined to 24 in kpd_cfg.h on all
platforms of interest to us - but it only filled the first 23 slots
in the notified_keys array, resulting in stack garbage being passed
to KPD API functions. The fix consists of initializing the last
missed array slot to KPD_KEY_RECORD, the key ID for the right side
button on the D-Sample handset.
On our current hw targets this "Record" button exists as the EXTRA
button on our Luna keypad board and as the camera button on the
Pirelli DP-L10. There is no support whatsoever for this button
in current BMI+MFW, we have no plans of doing anything with Pirelli's
camera button even if we do get our UI fw running on that phone,
and the Mother's dream of building our own FreeCalypso handset with
the same button arrangement as D-Sample (including the right side
button) is currently very nebulous - but let us nonetheless handle
the full set of buttons on the KPD to MFW interface, and let upper
layers weed out unsupported buttons.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Oct 2020 23:41:01 +0000 |
parents | fa8dc04885d8 |
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 (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(); }