FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/ppp/ppp_arbf.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_arbf.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,397 @@ +/* ++----------------------------------------------------------------------------- +| 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 +| procedures and functions as described in the +| SDL-documentation (ARB-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef PPP_ARBF_C +#define PPP_ARBF_C +#endif /* !PPP_ARBF_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_lcpf.h" /* to get function interface from lcp */ +#include "ppp_papf.h" /* to get function interface from pap */ +#include "ppp_capf.h" /* to get function interface from chap */ +#include "ppp_ncpf.h" /* to get function interface from ncp */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : arb_init ++------------------------------------------------------------------------------ +| Description : The function arb_init() inizializes the arbitration (ARB) +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_init () +{ + TRACE_FUNCTION( "arb_init" ); + + /* + * initialize protocol-reject identifier + */ + ppp_data->arb.pri = 1; + /* + * initialize time out counter + */ + ppp_data->arb.to_counter = 1; + /* + * initialize pointer to last sent IPCP packet + */ + ppp_data->arb.last_ipcp = NULL; + + + INIT_STATE( PPP_SERVICE_ARB , ARB_DEAD ); + + /* + * DTI channels + */ + + ppp_data->arb.dti_connect_state_prot = DTI_CLOSED; + ppp_data->arb.dti_connect_state_peer = DTI_CLOSED; +} /* arb_init() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : arb_discard_packet ++------------------------------------------------------------------------------ +| Description : The function arb_discard_packet() frees the memory of +| the given packet +| +| Parameters : packet - pointer to a generic data descriptor +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_discard_packet (T_desc2* packet) +{ + T_desc2* temp_desc; + TRACE_FUNCTION( "arb_discard_packet" ); + + while(packet NEQ NULL) + { + temp_desc=(T_desc2*)packet->next; + MFREE(packet); + packet=temp_desc; + } +} /* arb_discard_packet() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : arb_get_protocol_reject ++------------------------------------------------------------------------------ +| Description : The function arb_get_protocol_reject() creates +| a LCP protocol reject +| +| Parameters : ptype - packet type +| packet - packet which have to be rejected +| ptr_packet - returns a LCP protocol reject packet +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_get_protocol_reject (USHORT ptype, + T_desc2* packet, + T_desc2** ptr_packet) +{ + USHORT temp_len; + T_desc2* temp_desc; + T_desc2* ret_desc; + + TRACE_FUNCTION( "arb_get_protocol_reject" ); + + /* + * 1 octet code field + * 1 octet identifier field + * 2 octets length field + * 2 octets rejected-protocol field + *---------- + * 6 octets + */ + MALLOC (ret_desc, (USHORT)(sizeof(T_desc2) - 1 + 6)); + ret_desc->next = (ULONG)packet; + ret_desc->len = 6; + + /* + * Code field for protocol reject + */ + ret_desc->buffer[0] = CODE_PROT_REJ; + + /* + * Identifier field + */ + ret_desc->buffer[1] = ppp_data->arb.pri;/*lint !e415 (Warning -- access of out-of-bounds pointer) */ + + ppp_data->arb.pri++; + + /* + * Length field + */ + temp_len = 0; + packet = ret_desc; + while(packet NEQ NULL) + { + temp_len+= packet->len; + packet = (T_desc2*)packet->next; + } + if(temp_len > PPP_MRU_MIN) + temp_len=ppp_data->mru; + ret_desc->buffer[2] = (UBYTE)(temp_len >> 8);/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer) */ + ret_desc->buffer[3] = (UBYTE)(temp_len & 0x00ff);/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer) */ + + /* + * Rejected-Protocol field + */ + ret_desc->buffer[4] = (UBYTE)(ptype >> 8);/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer) */ + ret_desc->buffer[5] = (UBYTE)(ptype & 0x00ff);/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer) */ + + /* + * cut the rejected packet if it is to long + */ + packet = ret_desc; + while(temp_len > packet->len) + { + temp_len-= packet->len; + packet = (T_desc2*)packet->next; + } + packet->len = temp_len; + temp_desc = (T_desc2*)packet->next; + packet->next = (ULONG)NULL; + while(temp_desc NEQ NULL) + { + packet = (T_desc2*)temp_desc->next; + MFREE(temp_desc); + temp_desc = packet; + } + /* + * return created protocol reject packet + */ + *ptr_packet = ret_desc; + + /*lint -e415 -e416 (Warning -- access/creation of out-of-bounds pointer) */ +} /* arb_get_protocol_reject() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : arb_get_pco_list ++------------------------------------------------------------------------------ +| Description : The function arb_get_pco_list() creates the list of +| protocol configuratrion options as shown in 10.5.6.3/GSM 04.08 +| +| Parameters : ptr_pco_list - returns list of protocol configuration options +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_get_pco_list (T_sdu* ptr_pco_list) +{ + UBYTE ap; + USHORT mru; + ULONG accm; + UBYTE pfc; + UBYTE acfc; + + TRACE_FUNCTION( "arb_get_pco_list" ); + + /* + * initialize sdu + */ + ptr_pco_list->o_buf=0; + ptr_pco_list->l_buf=0; + + /* + * declare Configuration Protocol PPP + */ + ptr_pco_list->buf[ptr_pco_list->l_buf]=0x80; + ptr_pco_list->l_buf++; + + /* + * first packets are LCP packets + */ + lcp_fill_out_packet(ptr_pco_list->buf, &ptr_pco_list->l_buf); + /* + * next packets may be authentication packets + */ + if(ppp_data->pco_mask & PPP_PCO_MASK_AUTH_PROT) + { + lcp_get_values(&ap, &mru, &accm, &pfc, &acfc); + switch(ap) + { + case PPP_AP_PAP: + /* + * insert PAP authentication packet + */ + pap_fill_out_packet(ptr_pco_list->buf, &ptr_pco_list->l_buf); + break; + case PPP_AP_CHAP: + /* + * insert CHAP authentication packets + */ + chap_fill_out_packet(ptr_pco_list->buf, &ptr_pco_list->l_buf); + break; + } + } + /* + * next packet is the IPCP packet received from PPP peer + */ + ncp_fill_out_packet(ptr_pco_list->buf, &ptr_pco_list->l_buf); + /* + * convert length in octet to length in bit + */ + ptr_pco_list->l_buf=ptr_pco_list->l_buf << 3; + +} /* arb_get_pco_list() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : arb_analyze_pco_list ++------------------------------------------------------------------------------ +| Description : The function arb_analyze_pco_list() analyzes the given list of +| protocol configuration options and returns values of interest +| +| Parameters : pco_list - list of protocol configuration options +| ptr_dns1 - returns Primary DNS Server Address +| ptr_dns2 - returns Secondary DNS Server Address +| ptr_gateway - returns Gateway Address +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_analyze_pco_list (T_sdu* pco_list, + ULONG* ptr_dns1, + ULONG* ptr_dns2, + ULONG* ptr_gateway) +{ + USHORT pos; + + TRACE_FUNCTION( "arb_analyze_pco_list" ); + + /* + * initialize return values + */ + *ptr_dns1 = PPP_PDNS_DEFAULT; + *ptr_dns2 = PPP_SDNS_DEFAULT; + *ptr_gateway = PPP_GATEWAY_DEFAULT; + + /* + * analyze pco list + */ + pco_list->l_buf = pco_list->l_buf >> 3; + pco_list->o_buf = pco_list->o_buf >> 3; + pos = pco_list->o_buf; + if((pco_list->l_buf > 0) && (pco_list->buf[pos] EQ 0x80)) + { + pos++; + while(pos < (pco_list->l_buf + pco_list->o_buf)) + { + if((pco_list->buf[pos] EQ PROTOCOL_IPCP_MSB) && + (pco_list->buf[pos + 1] EQ PROTOCOL_IPCP_LSB)) + { + /* + * determine DNS addresses and Gateway address + */ + ncp_analyze_pco (pco_list->buf, pos, ptr_dns1, ptr_dns2, ptr_gateway); + } + pos+= pco_list->buf[pos + 2] + 3; + } + } +} /* arb_analyze_pco_list() */ + +/* ++------------------------------------------------------------------------------ +| Function : arb_dti_close_prot_ind ++------------------------------------------------------------------------------ +| Description : Close the DTI Protocol Channel +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_dti_close_prot_ind () +{ + TRACE_FUNCTION("arb_dti_close_prot_ind"); + + switch (ppp_data->arb.dti_connect_state_prot) + { + case DTI_SETUP: + case DTI_IDLE: + dti_close(ppp_data->ppphDTI, PPP_INSTANCE, + PROT_LAYER, PROT_CHANNEL, FALSE); + ppp_data->arb.dti_connect_state_prot = DTI_CLOSED; + break; + default: + break; + } +} /* arb_dti_close_prot_ind */ + +/* ++------------------------------------------------------------------------------ +| Function : arb_dti_close_peer_ind ++------------------------------------------------------------------------------ +| Description : Close the DTI Peer Channel +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void arb_dti_close_peer_ind () +{ + TRACE_FUNCTION("arb_dti_close_peer_ind"); + + switch (ppp_data->arb.dti_connect_state_peer) + { + case DTI_SETUP: + case DTI_IDLE: + dti_close(ppp_data->ppphDTI, PPP_INSTANCE, + PEER_LAYER, PEER_CHANNEL, FALSE); + ppp_data->arb.dti_connect_state_peer = DTI_CLOSED; + break; + default: + break; + } +} /* arb_dti_close_peer_ind */