FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/ppp/ppp_papf.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_papf.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,526 @@ +/* ++----------------------------------------------------------------------------- +| 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 (PAP-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef PPP_PAPF_C +#define PPP_PAPF_C +#endif /* !PPP_PAPF_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 <string.h> /* to get memcpy */ + +/*==== CONST ================================================================*/ + +#define PAP_AUTH_ACK_LENGTH 5 + +/* + * the authentication request packet must be passable to the ISP in protocol + * configuration options (pco). The maximum length of pco is + * 251 octets (253 - 2 (identification overhead) = 251). There must also be + * space for other protocol packet, like LCP and IPCP. + * LCP needs + * 15 octets (3 (overhead pco) + 4 (overhead packet) + 4 (mru) + 4 + * (authentication protocol PAP) = 15) for server packet and + * 11 octets (3 (overhead pco) + 4 (overhead packet) + 4 (mru) = 11) for + * client packet. + * IPCP needs + * 31 octets (3 (overhead pco) + 4 (overhead packet) + 6 (IP address) + 6 + * (VJ header compression) + 6 (primary DNS) + 6 (secondary DNS) = 31) for + * client packet and + * 13 octets (3 (overhead pco) + 4 (overhead packet) + 6 + * (Gateway address) = 13) for gateway address packet. + * PAP needs + * 3 octets for pco overhead. + */ +#define PAP_AUTH_REQ_LENGTH_MAX (251 - 15 - 11 - 31 - 13 - 3) + +#define PAP_AUTH_NAK_TEXT "authentication packet to long" +#define PAP_AUTH_NAK_TEXT_LENGTH sizeof(PAP_AUTH_NAK_TEXT) +#define PAP_AUTH_NAK_LENGTH (5 + PAP_AUTH_NAK_TEXT_LENGTH) + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_init ++------------------------------------------------------------------------------ +| Description : The function pap_init() initializes Password Authentication +| Protocol +| +| Parameters : no parameters +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_init () +{ + TRACE_FUNCTION( "pap_init" ); + + /* + * initialize values + */ + ppp_data->pap.counter = 0; + ppp_data->pap.nari = 0; + ppp_data->pap.ar_packet = NULL; + + INIT_STATE( PPP_SERVICE_PAP , PAP_DOWN ); +} /* pap_init() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_fill_out_packet ++------------------------------------------------------------------------------ +| Description : The function pap_fill_out_packet() puts a PAP packet into +| the protocol configuration list +| +| Parameters : pco_buf - pco list buffer +| ptr_pos - position where to write the PAP packet, this value +| must get back to the calling funtion +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_fill_out_packet (UBYTE pco_buf[], USHORT* ptr_pos) +{ + USHORT pos; + + TRACE_FUNCTION( "pap_fill_out_packet" ); + + pos = *ptr_pos; + + /* + * copy stored authentication request packet + */ + /* + * Protocol ID + */ + pco_buf[pos] = PROTOCOL_PAP_MSB; + pos++; + pco_buf[pos] = PROTOCOL_PAP_LSB; + pos++; + /* + * Length of Protocol contents + */ + pco_buf[pos] = (UBYTE)ppp_data->pap.ar_packet->len; + pos++; + /* + * copy packet + */ + memcpy(&pco_buf[pos], + ppp_data->pap.ar_packet->buffer, + ppp_data->pap.ar_packet->len); + pos+= ppp_data->pap.ar_packet->len; + /* + * return new position + */ + *ptr_pos = pos; +} /* pap_fill_out_packet() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_get_sar ++------------------------------------------------------------------------------ +| Description : The function pap_get_sar() returns a PAP Authenticate Request +| packet. +| +| Parameters : ptr_packet - returns the Authenticate Request packet +| THE MEMORY FOR THE PACKET WILL BE ALLOCATED BY +| THIS FUNCTION +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_get_sar (T_desc2** ptr_packet) +{ + T_desc2* ret_desc; + USHORT len_pos; + USHORT pos; + UBYTE i; + + TRACE_FUNCTION( "pap_get_sar" ); + + /* + * Allocate the necessary size for the data descriptor. The size is + * calculated as follows: + * - take the size of a descriptor structure + * - subtract one because of the array buffer[1] to get the size of + * descriptor control information + * - add number of octets of descriptor data + */ + MALLOC (ret_desc, (USHORT)(sizeof(T_desc2) - 1 + + 5 + /* + * 1 octet code field + * 1 octet identifier field + * 2 octets packet length field + * 1 octet peer id length field + */ + ppp_data->login.name_len + + 1 + /* size of password length field */ + ppp_data->login.password_len)); + /* + * fill the packet + */ + ret_desc->next = (ULONG)NULL; + pos = 0; + /* + * Code field + */ + ret_desc->buffer[pos] = CODE_AUTH_REQ; + pos++; + /* + * Identifier field + */ + ret_desc->buffer[pos] = ppp_data->pap.nari;/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ + pos++; + /* + * Length field (store the position) + */ + len_pos = pos; + pos++; + pos++; + /* + * authentication: peer-id and passwort + */ + ret_desc->buffer[pos] = ppp_data->login.name_len;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + pos++; + for (i = 0; i < ppp_data->login.name_len; i++) + { + ret_desc->buffer[pos] = ppp_data->login.name[i];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + pos++; + } + ret_desc->buffer[pos] = ppp_data->login.password_len;/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + pos++; + for (i = 0; i < ppp_data->login.password_len; i++) + { + ret_desc->buffer[pos] = ppp_data->login.password[i];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + pos++; + } + /* + * insert packet length + */ + ret_desc->len = pos; + ret_desc->buffer[len_pos] = (UBYTE)(pos >> 8);/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + len_pos++; + ret_desc->buffer[len_pos] = (UBYTE)(pos & 0x00ff);/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ + + /* + * return the created packet + */ + *ptr_packet = ret_desc; +} /* pap_get_sar() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_get_saa ++------------------------------------------------------------------------------ +| Description : The function pap_get_saa() returns a PAP Authenticate Ack +| packet. +| +| Parameters : ptr_packet - returns the Authenticate Ack packet +| THE MEMORY FOR THE PACKET WILL BE ALLOCATED BY +| THIS FUNCTION +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_get_saa (T_desc2** ptr_packet) +{ + T_desc2* packet; + USHORT pos; + + TRACE_FUNCTION( "pap_get_saa" ); + + /* + * Allocate the necessary size for the data descriptor. The size is + * calculated as follows: + * - take the size of a descriptor structure + * - subtract one because of the array buffer[1] to get the size of + * descriptor control information + * - add number of octets of descriptor data + */ + MALLOC (packet, (USHORT)(sizeof(T_desc2) - 1 + PAP_AUTH_ACK_LENGTH)); + packet->len = PAP_AUTH_ACK_LENGTH; + packet->next = (ULONG)NULL; + pos = 0; + /* + * code field + */ + packet->buffer[pos] = CODE_AUTH_ACK; + pos++; + /* + * identifier field + */ + packet->buffer[pos] = ppp_data->pap.nari;/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ + pos++; + /* + * length field + */ + packet->buffer[pos] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + pos++; + packet->buffer[pos] = PAP_AUTH_ACK_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + pos++; + /* + * set Msg-Length field + */ + packet->buffer[pos] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + /* + * return the created packet + */ + *ptr_packet = packet; +} /* pap_get_saa() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_rar ++------------------------------------------------------------------------------ +| Description : The function pap_rar() checks whether the given +| Authenticate Request packet is valid and if so it returns +| FORWARD_RARP and an Authentication Ack packet. +| +| Parameters : ptr_packet - Authenticate Request packet +| forward - returns result of analysis +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_rar (T_desc2** ptr_packet, UBYTE* forward) +{ + T_desc2* packet; + USHORT packet_len; + USHORT pos; + + TRACE_FUNCTION( "pap_rar" ); + + /* + * this packet can only reveiced in server mode + */ + if(ppp_data->mode NEQ PPP_SERVER) + { + *forward = FORWARD_DISCARD; + return; + } + /* + * check correct length + */ + packet = *ptr_packet; + packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + packet_len = packet_len << 8; + packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + if((packet_len < 6) || (packet_len > packet->len)) + { + *forward = FORWARD_DISCARD; + return; + } + + /* + * check consistence of length of packet and length of log on information + */ + pos = 4; + pos+= packet->buffer[pos];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + pos++; + pos+= packet->buffer[pos]; + pos++; + if(pos > packet_len) + { + *forward = FORWARD_DISCARD; + return; + } + + /* + * store authentication packet + */ + if(packet_len > PAP_AUTH_REQ_LENGTH_MAX) + { + /* + * create Authentication Nak + */ + /* + * change code field + */ + packet->buffer[0] = CODE_AUTH_NAK; + /* + * change length field + */ + packet->buffer[2] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + packet->buffer[3] = PAP_AUTH_NAK_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + packet->len = PAP_AUTH_NAK_LENGTH; + /* + * set Msg-Length field + */ + packet->buffer[4] = PAP_AUTH_NAK_TEXT_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + /* + * fill out Message + */ + memcpy(&packet->buffer[5], PAP_AUTH_NAK_TEXT, PAP_AUTH_NAK_TEXT_LENGTH);/*lint !e419 !e416 (Warning -- creation of out-of-bounds pointer, Apparent data overrun)*/ + /* + * set return values + */ + *forward = FORWARD_RARN; + *ptr_packet = packet; + return; + } + arb_discard_packet(ppp_data->pap.ar_packet); + ppp_data->pap.ar_packet = packet; + ppp_data->pap.nari = packet->buffer[1];/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ + /* + * create Authenticate Ack packet and + * set return values + */ + pap_get_saa(ptr_packet); + *forward = FORWARD_RARP; +} /* pap_rar */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_raa ++------------------------------------------------------------------------------ +| Description : The function pap_raa() checks whether the given +| Authenticate Ack packet is valid and if so it returns +| FORWARD_RAA. +| +| Parameters : packet - Authenticate Ack packet +| forward - returns result of analysis +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_raa (T_desc2* packet, UBYTE* forward) +{ + USHORT packet_len; + + TRACE_FUNCTION( "pap_raa" ); + + /* + * this packet can only reveiced in client mode + */ + if(ppp_data->mode NEQ PPP_CLIENT) + { + *forward = FORWARD_DISCARD; + return; + } + /* + * check correct length + */ + packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + packet_len = packet_len << 8; + packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + if((packet_len < 5) || (packet_len > packet->len)) + { + *forward = FORWARD_DISCARD; + return; + } + + if(packet->buffer[1] NEQ ppp_data->pap.nari)/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ + { + /* + * invalid packet + */ + *forward = FORWARD_DISCARD; + return; + } + /* + * acceptable packet + */ + arb_discard_packet(packet); + ppp_data->pap.nari++; + *forward = FORWARD_RAA; +} /* pap_raa */ + + + +/* ++------------------------------------------------------------------------------ +| Function : pap_ran ++------------------------------------------------------------------------------ +| Description : The function pap_ran() checks whether the given +| Authenticate Nak packet is valid and if so it returns +| FORWARD_RAN. +| +| Parameters : packet - Authenticate Nak packet +| forward - returns result of analysis +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void pap_ran (T_desc2* packet, UBYTE* forward) +{ + USHORT packet_len; + + TRACE_FUNCTION( "pap_ran" ); + + /* + * this packet can only reveiced in client mode + */ + if(ppp_data->mode NEQ PPP_CLIENT) + { + *forward = FORWARD_DISCARD; + return; + } + /* + * check correct length + */ + packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + packet_len = packet_len << 8; + packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ + if((packet_len < 5) || (packet_len > packet->len)) + { + *forward = FORWARD_DISCARD; + return; + } + + if(packet->buffer[1] NEQ ppp_data->pap.nari)/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ + { + /* + * invalid packet + */ + *forward = FORWARD_DISCARD; + return; + } + /* + * acceptable packet + */ + arb_discard_packet(packet); + *forward = FORWARD_RAN; +} /* pap_ran */