📄 pppconfg.c
字号:
/* pppconfg.c - configuration parameter processor *//* Copyright 2003 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01q,07aug03,rp updating include path for random.h01p,13may03,ijm fixed diab build warnings01o,25jun02,rp adding missed multilink patch 2 changes01n,28may02,rvr fixed build warnings01m,17may02,as added support for IPV6 address and NBO for header compression01l,26apr02,vk bug fix in get_value_string_type01k,26feb02,jr Setting the pointer to NULL after freeing01j,04feb02,ak modifications as part of memory reduction process01i,04feb02,vk added get_value_string_type() and get_value_string()01h,8july01,sd Clearing the value_string array in the parse_option_value()01g,20may01,sd added support for EID option processing01f,29sep00,sj merging with TOR2_0-WINDNET_PPP-CUM_PATCH_201e,07sep00,cn fixed malloc's size in generate_option_config_string () (SPR# 34219).01d,05sep00,cn zero-out local arrays in add_option_type () (SPR# 34219).01c,14feb00,sj read integer values(format D#) using atoi()01b,09nov99,sj allow for partialString with no value field01a,30,sj derived from Routerware source base*//**$Log:: /Rtrware/devdrvrs/ppp/pppconf $ * * 10 3/12/99 11:27a Nishit * Bunch of small changes - mostly in MP * related code * * 9 11/13/98 2:14p Nishit * get_ip_address_string modified to fix * problems with Big Endian * * 8 11/13/98 8:00a Nishit * removed pragma * * 7 10/01/98 11:43a Alex * Updated the PPP source code to conform * to a single build. * * 6 4/30/98 3:03p Alex * Ppp v4.2.0 check in * * 1 4/24/98 12:10a Release Engineer * code cleanup, code style changes, * linted, system level test * PPP v4.2.0*/#include "vxWorks.h"#include "stddef.h"#include "stdio.h"#include "ctype.h"#include "string.h"#include "stdlib.h"#include "ppp/kstart.h"#include "ppp/kppp.h"#include "private/ppp/vpppstr.h"#include "private/ppp/vlcpstr.h"#include "private/ppp/pppoptn.h"#include "wrn/util/random.h"#include "pfw/pfw.h"#include "pfw/pfwMemory.h"#include "inetLib.h"#include "net/inet.h" LOCAL TEST get_configuration_option_values (PFW_OBJ * pfw, char *cptr_option_string, char *cptr_return_ncp_name, char *cptr_return_option_name, BYTE *bptr_return_option_number, BYTE *bptr_return_data, BYTE *bptr_return_length, BOOLEAN *eptr_return_value_swapped, BOOLEAN *eptr_negotiation_required, BOOLEAN *eptr_negotiable, BOOLEAN *eptr_automatic_nak_processing);LOCAL char *parse_ppp_option_line (char *cptr_option_string, char *cptr_return_ncp_name, char *cptr_return_option_name, BYTE *bptr_return_option_number, char *cptr_automatic_nak_processing_string, char *cptr_negotiation_required_string, char *cptr_negotiable_string, BYTE *bptr_number_of_parameters_processed);LOCAL BOOLEAN get_option_value_type (char *value_type_string, char *value_string, BYTE *bptr_return_data, BYTE *bptr_return_length, BOOLEAN *eptr_return_value_swapped);LOCAL BYTE get_size_of_numeric_string (char *value_type_string);LOCAL char * generate_option_config_string ( PFW_OBJ *, char * partial_option_string, char * option_name, BYTE option_number, char * protocol_name, char * type_string );LOCAL void add_option_type (PFW_OBJ *,OPTION_LISTS *sptr_option_lists, char *cptr_port_number_and_option_string, char *cptr_option_string,BOOLEAN remote_configuration);LOCAL ULONG get_my_magic_number (void);LOCAL BOOLEAN get_value_string_type ( UNION_OPTION_DATA_TYPES *uptr_data, BYTE length, char *value_type_string, BYTE *value_string, UNION_OPTION_TYPES optionType, char *optionName );void get_value_type (char *cptr_value_type_string, char *cptr_value_type);void get_value_string ( UNION_OPTION_DATA_TYPES *data, BYTE length, char *value_type_string, char *value_string, UNION_OPTION_TYPES optionType, char *optionName );#if 0LOCAL void fill_in_value_type_array (PFW_OBJ *pfw,VALUE_TYPE *sptr_value_type, BYTE index, char *cptr_value_type_string, BOOLEAN value_swapped, BYTE option_length, BYTE length_of_all_options);#endif#if defined (PPP_CCP) static enum BOOLEAN is_ccp_option (char *option_string); static char *cptr_ccp_option = "CCP";#endif#if defined (PPP_ECP) static enum BOOLEAN is_ecp_option (char *option_string); static char *cptr_ecp_option = "ECP";#endifstatic char *cptr_hex_values[] ={"","%02x","%02x%02x","%02x%02x%02x", "%02x%02x%02x%02x","%02x%02x%02x%02x%02x", "%02x%02x%02x%02x%02x%02x"};/* * H is hex, D is decimal, # is size in bytes, S is little-endian swapped * "IP","IPS","H6","H4","D4","H2","D2""H4S","D4S","H2S","D2S","H1","D1","String" * ,"Netbios String","IPV6","NBO" * * eg.: * * PPP Port Option = 00,IPCP Address,3,Auto,Negotiation Not Required,Negotiable, * IP,128.1.60.1 * * PPP Port Option = 00,IPCP Address,3,Auto,Alternate,IP,128.1.60.2 * * PPP Port Option = 00,IPCP Address,3,Auto,Range,IP,128.1.60.2,128.1.60.3, * 0.0.0.1 */IMPORT BOOL freeRemoteListBeforeEid;IMPORT PFW_STACK_OBJ *gBundleId;/******************************************************************************* * generate_option_list_entry - */STATUS generate_option_list_entry ( PFW_OBJ * pfw, OPTION_LISTS *sptr_option_lists, char * partial_option_string, char * option_name, BYTE option_number, char * protocol_name, char * type_string ) { char * configString = NULL; char * remotePartialString = NULL; char * localPartialString = NULL; if (strstr(partial_option_string, "Remote") != NULL) { /* strip the Remote Key word */ strtok_r(partial_option_string,":",&remotePartialString); if (remotePartialString == NULL) return ERROR; } else if (strstr(partial_option_string, "Local") != NULL) { /* strip the Local Key word */ strtok_r(partial_option_string,":",&localPartialString); if (localPartialString == NULL) return ERROR; } else return ERROR; if (remotePartialString != NULL) { if ((configString = generate_option_config_string(pfw, remotePartialString, option_name,option_number, protocol_name,type_string)) == NULL) { return ERROR; } add_remote_ppp_option(pfw, configString,sptr_option_lists); } else if (localPartialString != NULL) { if ((configString = generate_option_config_string(pfw, localPartialString, option_name,option_number, protocol_name,type_string)) == NULL) { return ERROR; } add_ppp_option(pfw, configString,sptr_option_lists); } else return ERROR; if (configString != NULL) { pfwFree(configString); configString = NULL; } return OK; }/******************************************************************************* * generate_option_config_string - */LOCAL char * generate_option_config_string ( PFW_OBJ * pfw, char * partial_option_string, char * option_name, BYTE option_number, char * protocol_name, char * type_string ) { char * holder = NULL; char * value_string = NULL; char * attribute_string = NULL; char * adjustedTypeString = type_string; char option_number_string[4]; char * complete_option_string = NULL; BYTE complete_option_string_length = 0; char noValueSpecified[] = ""; char adjustedValueString[8]; volatile UINT16 chapProtocol; bzero(option_number_string,4); bzero(&adjustedValueString [0], sizeof (adjustedValueString)); sprintf(option_number_string,"%d",option_number); complete_option_string_length = strlen(protocol_name) + 1 + /* 1 for ',' */ strlen(option_name) + 1 + strlen(option_number_string) + 1 + strlen("Auto") + 1 + strlen(partial_option_string) + 2 + /* 05 */ strlen(type_string) + 2; /* ',' + '\0' */ if ((complete_option_string = pfwMalloc(pfw,complete_option_string_length)) ==NULL) return NULL; bzero (complete_option_string, complete_option_string_length); attribute_string = strtok_r (partial_option_string,":",&holder); /* replaced ':' with '"' to mark the end of value string */ value_string = strtok_r (NULL,"\"",&holder); if (value_string == NULL) { value_string = noValueSpecified; } /* HACK for CHAP protocol with MD5 algorithm */ if (strstr(protocol_name,"LCP") && option_number == LCP_AUTHENTICATION_PROTOCOL && value_string != noValueSpecified) { if ((chapProtocol = strtoul(value_string,NULL,16)) == CHAP_PROTOCOL) { adjustedTypeString = "H3"; bzero(adjustedValueString,sizeof(adjustedValueString)); sprintf (adjustedValueString,"%s%s",value_string,"05"); value_string = adjustedValueString; } else adjustedTypeString = type_string; } if ((strstr(attribute_string,"Alternate") != NULL) || (strstr(attribute_string,"Range") != NULL)) { sprintf(complete_option_string,"%s,%s,%s,%s,%s,%s",protocol_name, option_name, option_number_string, attribute_string, adjustedTypeString,value_string); } else { sprintf(complete_option_string,"%s,%s,%s,%s,%s,%s,%s",protocol_name, option_name, option_number_string,"Auto", attribute_string, adjustedTypeString,value_string); } return (complete_option_string); }/******************************************************************************** add_ppp_option -*/void add_ppp_option ( PFW_OBJ * pfw, char * option_string, OPTION_LISTS *sptr_option_lists ) { char cptr_value_portion[256]; bzero(cptr_value_portion,256); if (sptr_option_lists == NULL || option_string == NULL) return; strcpy (cptr_value_portion,option_string); add_option_type (pfw,sptr_option_lists,option_string, cptr_value_portion, FALSE); }/******************************************************************************** add_remote_ppp_option -*/void add_remote_ppp_option ( PFW_OBJ *pfw, char * option_string, OPTION_LISTS *sptr_option_lists ) { char cptr_value_portion[256]; bzero(cptr_value_portion,256); if (sptr_option_lists == NULL || option_string == NULL) return; strcpy (cptr_value_portion,option_string); add_option_type (pfw,sptr_option_lists,option_string, cptr_value_portion, TRUE); }/******************************************************************************* add_option_type -*/LOCAL void add_option_type ( PFW_OBJ *pfw, OPTION_LISTS *sptr_option_lists, char *option_string, char *cptr_option_string, BOOLEAN remote_configuration ) { BYTE option_data[128]; BYTE length = 0; char ncp_name[16]; char option_name[80]; BOOLEAN value_swapped; BYTE option_number = 0; BOOLEAN negotiation_required; BOOLEAN negotiable; BOOLEAN automatic_nak_processing; TEST return_value; OPTION_LIST *sptr_option_list = NULL; ULONG magic_number = 0; if (remote_configuration == TRUE) { sptr_option_list = &sptr_option_lists->remote_configured; } else { sptr_option_list = &sptr_option_lists->configured; } memset (&option_data[0], 0x00, 128); memset (&ncp_name[0], 0x00, 16); memset (&option_name[0], 0x00, 8); if (strstr (option_string,"Negotia") != NULL) { return_value = get_configuration_option_values (pfw,cptr_option_string, &ncp_name[0], &option_name[0], &option_number, &option_data[0], &length, &value_swapped, &negotiation_required, &negotiable, &automatic_nak_processing); if (return_value == FAIL) { return; } if (remote_configuration == FALSE) { if (strstr (option_string,"Magic Number") != NULL) { if ((option_data[0] + option_data[1] + option_data[2] + option_data[3]) == 0x00) { /* * Generate the magic number only if one is not already * specified */ magic_number = get_my_magic_number (); memcpy (&option_data[0],&magic_number,sizeof(magic_number)); } } } add_configuration_option (pfw,sptr_option_list, OPTION_DEFAULT_STATE, option_number,length, &option_data[0], &option_name[0],&ncp_name[0], value_swapped,negotiation_required, negotiable, automatic_nak_processing); } else if (strstr (option_string,"Alternate") != NULL) { return_value = get_alternate_option_values (cptr_option_string, &ncp_name[0], &option_name[0], &option_number, &option_data[0], &length,&value_swapped); if (return_value == FAIL) { return; } add_alternate_to_configuration_option (pfw,sptr_option_list, option_number, length, &option_data[0], &option_name[0], &ncp_name[0], value_swapped); } else if (strstr (option_string,"Range") != NULL) { return_value = get_range_option_values (cptr_option_string, &ncp_name[0],&option_name[0], &option_number, &option_data[0], &length,&value_swapped); if (return_value == FAIL) { return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -