This commit is contained in:
Meco Man 2021-03-08 21:53:02 +08:00
parent 3c05a4e719
commit ab04030f8f
331 changed files with 20846 additions and 20847 deletions

View File

@ -1,5 +1,5 @@
/* /*
* COPYRIGHT (C) 2018, Real-Thread Information Technology Ltd * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
* *

View File

@ -42,8 +42,8 @@
/* /*
void perf_print(unsigned long c1l, unsigned long c1h, void perf_print(unsigned long c1l, unsigned long c1h,
unsigned long c2l, unsigned long c2h, unsigned long c2l, unsigned long c2h,
char *key); char *key);
void perf_print_times(struct tms *start, struct tms *end, char *key); void perf_print_times(struct tms *start, struct tms *end, char *key);

View File

@ -1251,7 +1251,7 @@ tcp_rexmit_rto(struct tcp_pcb *pcb)
#if TCP_OVERSIZE && TCP_OVERSIZE_DBGCHECK #if TCP_OVERSIZE && TCP_OVERSIZE_DBGCHECK
/* if last unsent changed, we need to update unsent_oversize */ /* if last unsent changed, we need to update unsent_oversize */
if (pcb->unsent == NULL) { if (pcb->unsent == NULL) {
pcb->unsent_oversize = seg->oversize_left; pcb->unsent_oversize = seg->oversize_left;
} }
#endif /* TCP_OVERSIZE && TCP_OVERSIZE_DBGCHECK*/ #endif /* TCP_OVERSIZE && TCP_OVERSIZE_DBGCHECK*/
/* unsent queue is the concatenated queue (of unacked, unsent) */ /* unsent queue is the concatenated queue (of unacked, unsent) */

View File

@ -4,16 +4,16 @@
#include "lwip/netif.h" #include "lwip/netif.h"
#include <rtthread.h> #include <rtthread.h>
#define NIOCTL_GADDR 0x01 #define NIOCTL_GADDR 0x01
#ifndef RT_LWIP_ETH_MTU #ifndef RT_LWIP_ETH_MTU
#define ETHERNET_MTU 1500 #define ETHERNET_MTU 1500
#else #else
#define ETHERNET_MTU RT_LWIP_ETH_MTU #define ETHERNET_MTU RT_LWIP_ETH_MTU
#endif #endif
/* eth flag with auto_linkup or phy_linkup */ /* eth flag with auto_linkup or phy_linkup */
#define ETHIF_LINK_AUTOUP 0x0000 #define ETHIF_LINK_AUTOUP 0x0000
#define ETHIF_LINK_PHYUP 0x0100 #define ETHIF_LINK_PHYUP 0x0100
struct eth_device struct eth_device
{ {

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2001-2004 Swedish Institute of Computer Science. * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
* COPYRIGHT (C) 2006-2021, RT-Thread Development Team * COPYRIGHT (C) 2006-2010, RT-Thread Development Team
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, * Redistribution and use in source and binary forms, with or without modification,
@ -59,9 +59,9 @@
#define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL) #define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL)
#ifndef RT_LWIP_ETHTHREAD_PRIORITY #ifndef RT_LWIP_ETHTHREAD_PRIORITY
#define RT_ETHERNETIF_THREAD_PREORITY 0x90 #define RT_ETHERNETIF_THREAD_PREORITY 0x90
#else #else
#define RT_ETHERNETIF_THREAD_PREORITY RT_LWIP_ETHTHREAD_PRIORITY #define RT_ETHERNETIF_THREAD_PREORITY RT_LWIP_ETHTHREAD_PRIORITY
#endif #endif
#ifndef LWIP_NO_TX_THREAD #ifndef LWIP_NO_TX_THREAD
@ -70,8 +70,8 @@
*/ */
struct eth_tx_msg struct eth_tx_msg
{ {
struct netif *netif; struct netif *netif;
struct pbuf *buf; struct pbuf *buf;
}; };
static struct rt_mailbox eth_tx_thread_mb; static struct rt_mailbox eth_tx_thread_mb;
@ -368,7 +368,7 @@ static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
struct eth_tx_msg msg; struct eth_tx_msg msg;
struct eth_device* enetif; struct eth_device* enetif;
RT_ASSERT(netif != RT_NULL); RT_ASSERT(netif != RT_NULL);
enetif = (struct eth_device*)netif->state; enetif = (struct eth_device*)netif->state;
/* send a message to eth tx thread */ /* send a message to eth tx thread */
@ -382,13 +382,13 @@ static err_t ethernetif_linkoutput(struct netif *netif, struct pbuf *p)
#else #else
struct eth_device* enetif; struct eth_device* enetif;
RT_ASSERT(netif != RT_NULL); RT_ASSERT(netif != RT_NULL);
enetif = (struct eth_device*)netif->state; enetif = (struct eth_device*)netif->state;
if (enetif->eth_tx(&(enetif->parent), p) != RT_EOK) if (enetif->eth_tx(&(enetif->parent), p) != RT_EOK)
{ {
return ERR_IF; return ERR_IF;
} }
#endif #endif
return ERR_OK; return ERR_OK;
} }
@ -479,16 +479,16 @@ rt_err_t eth_device_init_with_flag(struct eth_device *dev, const char *name, rt_
netif->name[1] = name[1]; netif->name[1] = name[1];
/* set hw address to 6 */ /* set hw address to 6 */
netif->hwaddr_len = 6; netif->hwaddr_len = 6;
/* maximum transfer unit */ /* maximum transfer unit */
netif->mtu = ETHERNET_MTU; netif->mtu = ETHERNET_MTU;
/* get hardware MAC address */ /* get hardware MAC address */
rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr); rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr);
/* set output */ /* set output */
netif->output = etharp_output; netif->output = etharp_output;
netif->linkoutput = ethernetif_linkoutput; netif->linkoutput = ethernetif_linkoutput;
#if LWIP_NETIF_HOSTNAME #if LWIP_NETIF_HOSTNAME
/* Initialize interface hostname */ /* Initialize interface hostname */
@ -577,12 +577,12 @@ rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up)
/* NOTE: please not use it in interrupt when no RxThread exist */ /* NOTE: please not use it in interrupt when no RxThread exist */
rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up) rt_err_t eth_device_linkchange(struct eth_device* dev, rt_bool_t up)
{ {
if (up == RT_TRUE) if (up == RT_TRUE)
netifapi_netif_set_link_up(dev->netif); netifapi_netif_set_link_up(dev->netif);
else else
netifapi_netif_set_link_down(dev->netif); netifapi_netif_set_link_down(dev->netif);
return RT_EOK; return RT_EOK;
} }
#endif #endif
@ -650,7 +650,7 @@ static void eth_rx_thread_entry(void* parameter)
/* receive all of buffer */ /* receive all of buffer */
while (1) while (1)
{ {
if(device->eth_rx == RT_NULL) break; if(device->eth_rx == RT_NULL) break;
p = device->eth_rx(&(device->parent)); p = device->eth_rx(&(device->parent));
if (p != RT_NULL) if (p != RT_NULL)

View File

@ -1,4 +1,4 @@
/** /**
* @defgroup lwip lwIP * @defgroup lwip lwIP
* *
* @defgroup infrastructure Infrastructure * @defgroup infrastructure Infrastructure
@ -130,4 +130,3 @@
* @page raw_api lwIP API * @page raw_api lwIP API
* @verbinclude "rawapi.txt" * @verbinclude "rawapi.txt"
*/ */
/

View File

@ -407,7 +407,7 @@ tryget_socket(int s)
struct lwip_sock * struct lwip_sock *
lwip_tryget_socket(int s) lwip_tryget_socket(int s)
{ {
return tryget_socket(s); return tryget_socket(s);
} }
/** /**

View File

@ -42,8 +42,8 @@
/* /*
void perf_print(unsigned long c1l, unsigned long c1h, void perf_print(unsigned long c1l, unsigned long c1h,
unsigned long c2l, unsigned long c2h, unsigned long c2l, unsigned long c2h,
char *key); char *key);
void perf_print_times(struct tms *start, struct tms *end, char *key); void perf_print_times(struct tms *start, struct tms *end, char *key);

View File

@ -39,7 +39,7 @@
#include "lwip/opt.h" #include "lwip/opt.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@ -4,16 +4,16 @@
#include "lwip/netif.h" #include "lwip/netif.h"
#include <rtthread.h> #include <rtthread.h>
#define NIOCTL_GADDR 0x01 #define NIOCTL_GADDR 0x01
#ifndef RT_LWIP_ETH_MTU #ifndef RT_LWIP_ETH_MTU
#define ETHERNET_MTU 1500 #define ETHERNET_MTU 1500
#else #else
#define ETHERNET_MTU RT_LWIP_ETH_MTU #define ETHERNET_MTU RT_LWIP_ETH_MTU
#endif #endif
/* eth flag with auto_linkup or phy_linkup */ /* eth flag with auto_linkup or phy_linkup */
#define ETHIF_LINK_AUTOUP 0x0000 #define ETHIF_LINK_AUTOUP 0x0000
#define ETHIF_LINK_PHYUP 0x0100 #define ETHIF_LINK_PHYUP 0x0100
struct eth_device struct eth_device
{ {

View File

@ -40,48 +40,48 @@
* CCP codes. * CCP codes.
*/ */
#define CCP_CONFREQ 1 #define CCP_CONFREQ 1
#define CCP_CONFACK 2 #define CCP_CONFACK 2
#define CCP_TERMREQ 5 #define CCP_TERMREQ 5
#define CCP_TERMACK 6 #define CCP_TERMACK 6
#define CCP_RESETREQ 14 #define CCP_RESETREQ 14
#define CCP_RESETACK 15 #define CCP_RESETACK 15
/* /*
* Max # bytes for a CCP option * Max # bytes for a CCP option
*/ */
#define CCP_MAX_OPTION_LENGTH 32 #define CCP_MAX_OPTION_LENGTH 32
/* /*
* Parts of a CCP packet. * Parts of a CCP packet.
*/ */
#define CCP_CODE(dp) ((dp)[0]) #define CCP_CODE(dp) ((dp)[0])
#define CCP_ID(dp) ((dp)[1]) #define CCP_ID(dp) ((dp)[1])
#define CCP_LENGTH(dp) (((dp)[2] << 8) + (dp)[3]) #define CCP_LENGTH(dp) (((dp)[2] << 8) + (dp)[3])
#define CCP_HDRLEN 4 #define CCP_HDRLEN 4
#define CCP_OPT_CODE(dp) ((dp)[0]) #define CCP_OPT_CODE(dp) ((dp)[0])
#define CCP_OPT_LENGTH(dp) ((dp)[1]) #define CCP_OPT_LENGTH(dp) ((dp)[1])
#define CCP_OPT_MINLEN 2 #define CCP_OPT_MINLEN 2
#if BSDCOMPRESS_SUPPORT #if BSDCOMPRESS_SUPPORT
/* /*
* Definitions for BSD-Compress. * Definitions for BSD-Compress.
*/ */
#define CI_BSD_COMPRESS 21 /* config. option for BSD-Compress */ #define CI_BSD_COMPRESS 21 /* config. option for BSD-Compress */
#define CILEN_BSD_COMPRESS 3 /* length of config. option */ #define CILEN_BSD_COMPRESS 3 /* length of config. option */
/* Macros for handling the 3rd byte of the BSD-Compress config option. */ /* Macros for handling the 3rd byte of the BSD-Compress config option. */
#define BSD_NBITS(x) ((x) & 0x1F) /* number of bits requested */ #define BSD_NBITS(x) ((x) & 0x1F) /* number of bits requested */
#define BSD_VERSION(x) ((x) >> 5) /* version of option format */ #define BSD_VERSION(x) ((x) >> 5) /* version of option format */
#define BSD_CURRENT_VERSION 1 /* current version number */ #define BSD_CURRENT_VERSION 1 /* current version number */
#define BSD_MAKE_OPT(v, n) (((v) << 5) | (n)) #define BSD_MAKE_OPT(v, n) (((v) << 5) | (n))
#define BSD_MIN_BITS 9 /* smallest code size supported */ #define BSD_MIN_BITS 9 /* smallest code size supported */
#define BSD_MAX_BITS 15 /* largest code size supported */ #define BSD_MAX_BITS 15 /* largest code size supported */
#endif /* BSDCOMPRESS_SUPPORT */ #endif /* BSDCOMPRESS_SUPPORT */
#if DEFLATE_SUPPORT #if DEFLATE_SUPPORT
@ -89,17 +89,17 @@
* Definitions for Deflate. * Definitions for Deflate.
*/ */
#define CI_DEFLATE 26 /* config option for Deflate */ #define CI_DEFLATE 26 /* config option for Deflate */
#define CI_DEFLATE_DRAFT 24 /* value used in original draft RFC */ #define CI_DEFLATE_DRAFT 24 /* value used in original draft RFC */
#define CILEN_DEFLATE 4 /* length of its config option */ #define CILEN_DEFLATE 4 /* length of its config option */
#define DEFLATE_MIN_SIZE 9 #define DEFLATE_MIN_SIZE 9
#define DEFLATE_MAX_SIZE 15 #define DEFLATE_MAX_SIZE 15
#define DEFLATE_METHOD_VAL 8 #define DEFLATE_METHOD_VAL 8
#define DEFLATE_SIZE(x) (((x) >> 4) + 8) #define DEFLATE_SIZE(x) (((x) >> 4) + 8)
#define DEFLATE_METHOD(x) ((x) & 0x0F) #define DEFLATE_METHOD(x) ((x) & 0x0F)
#define DEFLATE_MAKE_OPT(w) ((((w) - 8) << 4) + DEFLATE_METHOD_VAL) #define DEFLATE_MAKE_OPT(w) ((((w) - 8) << 4) + DEFLATE_METHOD_VAL)
#define DEFLATE_CHK_SEQUENCE 0 #define DEFLATE_CHK_SEQUENCE 0
#endif /* DEFLATE_SUPPORT */ #endif /* DEFLATE_SUPPORT */
#if MPPE_SUPPORT #if MPPE_SUPPORT
@ -116,10 +116,10 @@
* Definitions for other, as yet unsupported, compression methods. * Definitions for other, as yet unsupported, compression methods.
*/ */
#define CI_PREDICTOR_1 1 /* config option for Predictor-1 */ #define CI_PREDICTOR_1 1 /* config option for Predictor-1 */
#define CILEN_PREDICTOR_1 2 /* length of its config option */ #define CILEN_PREDICTOR_1 2 /* length of its config option */
#define CI_PREDICTOR_2 2 /* config option for Predictor-2 */ #define CI_PREDICTOR_2 2 /* config option for Predictor-2 */
#define CILEN_PREDICTOR_2 2 /* length of its config option */ #define CILEN_PREDICTOR_2 2 /* length of its config option */
#endif /* PREDICTOR_SUPPORT */ #endif /* PREDICTOR_SUPPORT */
typedef struct ccp_options { typedef struct ccp_options {
@ -137,15 +137,15 @@ typedef struct ccp_options {
#endif /* PREDICTOR_SUPPORT */ #endif /* PREDICTOR_SUPPORT */
#if MPPE_SUPPORT #if MPPE_SUPPORT
u8_t mppe; /* MPPE bitfield */ u8_t mppe; /* MPPE bitfield */
#endif /* MPPE_SUPPORT */ #endif /* MPPE_SUPPORT */
#if BSDCOMPRESS_SUPPORT #if BSDCOMPRESS_SUPPORT
u_short bsd_bits; /* # bits/code for BSD Compress */ u_short bsd_bits; /* # bits/code for BSD Compress */
#endif /* BSDCOMPRESS_SUPPORT */ #endif /* BSDCOMPRESS_SUPPORT */
#if DEFLATE_SUPPORT #if DEFLATE_SUPPORT
u_short deflate_size; /* lg(window size) for Deflate */ u_short deflate_size; /* lg(window size) for Deflate */
#endif /* DEFLATE_SUPPORT */ #endif /* DEFLATE_SUPPORT */
u8_t method; /* code for chosen compression method */ u8_t method; /* code for chosen compression method */
} ccp_options; } ccp_options;
extern const struct protent ccp_protent; extern const struct protent ccp_protent;

View File

@ -39,45 +39,45 @@
/* /*
* CHAP packets begin with a standard header with code, id, len (2 bytes). * CHAP packets begin with a standard header with code, id, len (2 bytes).
*/ */
#define CHAP_HDRLEN 4 #define CHAP_HDRLEN 4
/* /*
* Values for the code field. * Values for the code field.
*/ */
#define CHAP_CHALLENGE 1 #define CHAP_CHALLENGE 1
#define CHAP_RESPONSE 2 #define CHAP_RESPONSE 2
#define CHAP_SUCCESS 3 #define CHAP_SUCCESS 3
#define CHAP_FAILURE 4 #define CHAP_FAILURE 4
/* /*
* CHAP digest codes. * CHAP digest codes.
*/ */
#define CHAP_MD5 5 #define CHAP_MD5 5
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define CHAP_MICROSOFT 0x80 #define CHAP_MICROSOFT 0x80
#define CHAP_MICROSOFT_V2 0x81 #define CHAP_MICROSOFT_V2 0x81
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
/* /*
* Semi-arbitrary limits on challenge and response fields. * Semi-arbitrary limits on challenge and response fields.
*/ */
#define MAX_CHALLENGE_LEN 64 #define MAX_CHALLENGE_LEN 64
#define MAX_RESPONSE_LEN 64 #define MAX_RESPONSE_LEN 64
/* /*
* These limits apply to challenge and response packets we send. * These limits apply to challenge and response packets we send.
* The +4 is the +1 that we actually need rounded up. * The +4 is the +1 that we actually need rounded up.
*/ */
#define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN) #define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN)
#define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN) #define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN)
/* bitmask of supported algorithms */ /* bitmask of supported algorithms */
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define MDTYPE_MICROSOFT_V2 0x1 #define MDTYPE_MICROSOFT_V2 0x1
#define MDTYPE_MICROSOFT 0x2 #define MDTYPE_MICROSOFT 0x2
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
#define MDTYPE_MD5 0x4 #define MDTYPE_MD5 0x4
#define MDTYPE_NONE 0 #define MDTYPE_NONE 0
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
/* Return the digest alg. ID for the most preferred digest type. */ /* Return the digest alg. ID for the most preferred digest type. */
@ -125,24 +125,24 @@
* The code for each digest type has to supply one of these. * The code for each digest type has to supply one of these.
*/ */
struct chap_digest_type { struct chap_digest_type {
int code; int code;
#if PPP_SERVER #if PPP_SERVER
/* /*
* Note: challenge and response arguments below are formatted as * Note: challenge and response arguments below are formatted as
* a length byte followed by the actual challenge/response data. * a length byte followed by the actual challenge/response data.
*/ */
void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge); void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge);
int (*verify_response)(ppp_pcb *pcb, int id, const char *name, int (*verify_response)(ppp_pcb *pcb, int id, const char *name,
const unsigned char *secret, int secret_len, const unsigned char *secret, int secret_len,
const unsigned char *challenge, const unsigned char *response, const unsigned char *challenge, const unsigned char *response,
char *message, int message_space); char *message, int message_space);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name, void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
const unsigned char *challenge, const char *secret, int secret_len, const unsigned char *challenge, const char *secret, int secret_len,
unsigned char *priv); unsigned char *priv);
int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv); int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv);
void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len); void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len);
}; };
/* /*
@ -150,21 +150,21 @@ struct chap_digest_type {
*/ */
#if CHAP_SUPPORT #if CHAP_SUPPORT
typedef struct chap_client_state { typedef struct chap_client_state {
u8_t flags; u8_t flags;
const char *name; const char *name;
const struct chap_digest_type *digest; const struct chap_digest_type *digest;
unsigned char priv[64]; /* private area for digest's use */ unsigned char priv[64]; /* private area for digest's use */
} chap_client_state; } chap_client_state;
#if PPP_SERVER #if PPP_SERVER
typedef struct chap_server_state { typedef struct chap_server_state {
u8_t flags; u8_t flags;
u8_t id; u8_t id;
const char *name; const char *name;
const struct chap_digest_type *digest; const struct chap_digest_type *digest;
int challenge_xmits; int challenge_xmits;
int challenge_pktlen; int challenge_pktlen;
unsigned char challenge[CHAL_MAX_PKTLEN]; unsigned char challenge[CHAL_MAX_PKTLEN];
} chap_server_state; } chap_server_state;
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
@ -172,9 +172,9 @@ typedef struct chap_server_state {
#if 0 /* UNUSED */ #if 0 /* UNUSED */
/* Hook for a plugin to validate CHAP challenge */ /* Hook for a plugin to validate CHAP challenge */
extern int (*chap_verify_hook)(char *name, char *ourname, int id, extern int (*chap_verify_hook)(char *name, char *ourname, int id,
const struct chap_digest_type *digest, const struct chap_digest_type *digest,
unsigned char *challenge, unsigned char *response, unsigned char *challenge, unsigned char *response,
char *message, int message_space); char *message, int message_space);
#endif /* UNUSED */ #endif /* UNUSED */
#if PPP_SERVER #if PPP_SERVER

View File

@ -24,135 +24,135 @@
#if PPP_SUPPORT && EAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && EAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef PPP_EAP_H #ifndef PPP_EAP_H
#define PPP_EAP_H #define PPP_EAP_H
#include "ppp.h" #include "ppp.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define EAP_HEADERLEN 4 #define EAP_HEADERLEN 4
/* EAP message codes. */ /* EAP message codes. */
#define EAP_REQUEST 1 #define EAP_REQUEST 1
#define EAP_RESPONSE 2 #define EAP_RESPONSE 2
#define EAP_SUCCESS 3 #define EAP_SUCCESS 3
#define EAP_FAILURE 4 #define EAP_FAILURE 4
/* EAP types */ /* EAP types */
#define EAPT_IDENTITY 1 #define EAPT_IDENTITY 1
#define EAPT_NOTIFICATION 2 #define EAPT_NOTIFICATION 2
#define EAPT_NAK 3 /* (response only) */ #define EAPT_NAK 3 /* (response only) */
#define EAPT_MD5CHAP 4 #define EAPT_MD5CHAP 4
#define EAPT_OTP 5 /* One-Time Password; RFC 1938 */ #define EAPT_OTP 5 /* One-Time Password; RFC 1938 */
#define EAPT_TOKEN 6 /* Generic Token Card */ #define EAPT_TOKEN 6 /* Generic Token Card */
/* 7 and 8 are unassigned. */ /* 7 and 8 are unassigned. */
#define EAPT_RSA 9 /* RSA Public Key Authentication */ #define EAPT_RSA 9 /* RSA Public Key Authentication */
#define EAPT_DSS 10 /* DSS Unilateral */ #define EAPT_DSS 10 /* DSS Unilateral */
#define EAPT_KEA 11 /* KEA */ #define EAPT_KEA 11 /* KEA */
#define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */ #define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */
#define EAPT_TLS 13 /* EAP-TLS */ #define EAPT_TLS 13 /* EAP-TLS */
#define EAPT_DEFENDER 14 /* Defender Token (AXENT) */ #define EAPT_DEFENDER 14 /* Defender Token (AXENT) */
#define EAPT_W2K 15 /* Windows 2000 EAP */ #define EAPT_W2K 15 /* Windows 2000 EAP */
#define EAPT_ARCOT 16 /* Arcot Systems */ #define EAPT_ARCOT 16 /* Arcot Systems */
#define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */ #define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */
#define EAPT_NOKIACARD 18 /* Nokia IP smart card */ #define EAPT_NOKIACARD 18 /* Nokia IP smart card */
#define EAPT_SRP 19 /* Secure Remote Password */ #define EAPT_SRP 19 /* Secure Remote Password */
/* 20 is deprecated */ /* 20 is deprecated */
/* EAP SRP-SHA1 Subtypes */ /* EAP SRP-SHA1 Subtypes */
#define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */ #define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */
#define EAPSRP_CKEY 1 /* Response 1 - Client Key */ #define EAPSRP_CKEY 1 /* Response 1 - Client Key */
#define EAPSRP_SKEY 2 /* Request 2 - Server Key */ #define EAPSRP_SKEY 2 /* Request 2 - Server Key */
#define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */ #define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */
#define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */ #define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */
#define EAPSRP_ACK 3 /* Response 3 - final ack */ #define EAPSRP_ACK 3 /* Response 3 - final ack */
#define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */ #define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */
#define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */ #define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */
#define SRP_PSEUDO_ID "pseudo_" #define SRP_PSEUDO_ID "pseudo_"
#define SRP_PSEUDO_LEN 7 #define SRP_PSEUDO_LEN 7
#define MD5_SIGNATURE_SIZE 16 #define MD5_SIGNATURE_SIZE 16
#define EAP_MIN_CHALLENGE_LENGTH 17 #define EAP_MIN_CHALLENGE_LENGTH 17
#define EAP_MAX_CHALLENGE_LENGTH 24 #define EAP_MAX_CHALLENGE_LENGTH 24
#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3 /* 2^3-1 = 7, 17+7 = 24 */ #define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3 /* 2^3-1 = 7, 17+7 = 24 */
#define EAP_STATES \ #define EAP_STATES \
"Initial", "Pending", "Closed", "Listen", "Identify", \ "Initial", "Pending", "Closed", "Listen", "Identify", \
"SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth" "SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth"
#define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen) #define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen)
#if PPP_SERVER #if PPP_SERVER
#define eap_server_active(pcb) \ #define eap_server_active(pcb) \
((pcb)->eap.es_server.ea_state >= eapIdentify && \ ((pcb)->eap.es_server.ea_state >= eapIdentify && \
(pcb)->eap.es_server.ea_state <= eapMD5Chall) (pcb)->eap.es_server.ea_state <= eapMD5Chall)
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
/* /*
* Complete EAP state for one PPP session. * Complete EAP state for one PPP session.
*/ */
enum eap_state_code { enum eap_state_code {
eapInitial = 0, /* No EAP authentication yet requested */ eapInitial = 0, /* No EAP authentication yet requested */
eapPending, /* Waiting for LCP (no timer) */ eapPending, /* Waiting for LCP (no timer) */
eapClosed, /* Authentication not in use */ eapClosed, /* Authentication not in use */
eapListen, /* Client ready (and timer running) */ eapListen, /* Client ready (and timer running) */
eapIdentify, /* EAP Identify sent */ eapIdentify, /* EAP Identify sent */
eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */ eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */
eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */ eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */
eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */ eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */
eapMD5Chall, /* Sent MD5-Challenge */ eapMD5Chall, /* Sent MD5-Challenge */
eapOpen, /* Completed authentication */ eapOpen, /* Completed authentication */
eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */ eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */
eapBadAuth /* Failed authentication */ eapBadAuth /* Failed authentication */
}; };
struct eap_auth { struct eap_auth {
const char *ea_name; /* Our name */ const char *ea_name; /* Our name */
char ea_peer[MAXNAMELEN +1]; /* Peer's name */ char ea_peer[MAXNAMELEN +1]; /* Peer's name */
void *ea_session; /* Authentication library linkage */ void *ea_session; /* Authentication library linkage */
u_char *ea_skey; /* Shared encryption key */ u_char *ea_skey; /* Shared encryption key */
u_short ea_namelen; /* Length of our name */ u_short ea_namelen; /* Length of our name */
u_short ea_peerlen; /* Length of peer's name */ u_short ea_peerlen; /* Length of peer's name */
enum eap_state_code ea_state; enum eap_state_code ea_state;
u_char ea_id; /* Current id */ u_char ea_id; /* Current id */
u_char ea_requests; /* Number of Requests sent/received */ u_char ea_requests; /* Number of Requests sent/received */
u_char ea_responses; /* Number of Responses */ u_char ea_responses; /* Number of Responses */
u_char ea_type; /* One of EAPT_* */ u_char ea_type; /* One of EAPT_* */
u32_t ea_keyflags; /* SRP shared key usage flags */ u32_t ea_keyflags; /* SRP shared key usage flags */
}; };
#ifndef EAP_MAX_CHALLENGE_LENGTH #ifndef EAP_MAX_CHALLENGE_LENGTH
#define EAP_MAX_CHALLENGE_LENGTH 24 #define EAP_MAX_CHALLENGE_LENGTH 24
#endif #endif
typedef struct eap_state { typedef struct eap_state {
struct eap_auth es_client; /* Client (authenticatee) data */ struct eap_auth es_client; /* Client (authenticatee) data */
#if PPP_SERVER #if PPP_SERVER
struct eap_auth es_server; /* Server (authenticator) data */ struct eap_auth es_server; /* Server (authenticator) data */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
int es_savedtime; /* Saved timeout */ int es_savedtime; /* Saved timeout */
int es_rechallenge; /* EAP rechallenge interval */ int es_rechallenge; /* EAP rechallenge interval */
int es_lwrechallenge; /* SRP lightweight rechallenge inter */ int es_lwrechallenge; /* SRP lightweight rechallenge inter */
u8_t es_usepseudo; /* Use SRP Pseudonym if offered one */ u8_t es_usepseudo; /* Use SRP Pseudonym if offered one */
int es_usedpseudo; /* Set if we already sent PN */ int es_usedpseudo; /* Set if we already sent PN */
int es_challen; /* Length of challenge string */ int es_challen; /* Length of challenge string */
u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH]; u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH];
} eap_state; } eap_state;
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define EAP_DEFTIMEOUT 3 /* Timeout (seconds) for rexmit */ #define EAP_DEFTIMEOUT 3 /* Timeout (seconds) for rexmit */
#define EAP_DEFTRANSMITS 10 /* max # times to transmit */ #define EAP_DEFTRANSMITS 10 /* max # times to transmit */
#define EAP_DEFREQTIME 20 /* Time to wait for peer request */ #define EAP_DEFREQTIME 20 /* Time to wait for peer request */
#define EAP_DEFALLOWREQ 20 /* max # times to accept requests */ #define EAP_DEFALLOWREQ 20 /* max # times to accept requests */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
void eap_authwithpeer(ppp_pcb *pcb, const char *localname); void eap_authwithpeer(ppp_pcb *pcb, const char *localname);
@ -160,7 +160,7 @@ void eap_authpeer(ppp_pcb *pcb, const char *localname);
extern const struct protent eap_protent; extern const struct protent eap_protent;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -35,8 +35,8 @@
#if PPP_SUPPORT && ECP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && ECP_SUPPORT /* don't build if not configured for use in lwipopts.h */
typedef struct ecp_options { typedef struct ecp_options {
bool required; /* Is ECP required? */ bool required; /* Is ECP required? */
unsigned enctype; /* Encryption type */ unsigned enctype; /* Encryption type */
} ecp_options; } ecp_options;
extern fsm ecp_fsm[]; extern fsm ecp_fsm[];

View File

@ -53,42 +53,42 @@ typedef union
u32_t e32[2]; u32_t e32[2];
} eui64_t; } eui64_t;
#define eui64_iszero(e) (((e).e32[0] | (e).e32[1]) == 0) #define eui64_iszero(e) (((e).e32[0] | (e).e32[1]) == 0)
#define eui64_equals(e, o) (((e).e32[0] == (o).e32[0]) && \ #define eui64_equals(e, o) (((e).e32[0] == (o).e32[0]) && \
((e).e32[1] == (o).e32[1])) ((e).e32[1] == (o).e32[1]))
#define eui64_zero(e) (e).e32[0] = (e).e32[1] = 0; #define eui64_zero(e) (e).e32[0] = (e).e32[1] = 0;
#define eui64_copy(s, d) memcpy(&(d), &(s), sizeof(eui64_t)) #define eui64_copy(s, d) memcpy(&(d), &(s), sizeof(eui64_t))
#define eui64_magic(e) do { \ #define eui64_magic(e) do { \
(e).e32[0] = magic(); \ (e).e32[0] = magic(); \
(e).e32[1] = magic(); \ (e).e32[1] = magic(); \
(e).e8[0] &= ~2; \ (e).e8[0] &= ~2; \
} while (0) } while (0)
#define eui64_magic_nz(x) do { \ #define eui64_magic_nz(x) do { \
eui64_magic(x); \ eui64_magic(x); \
} while (eui64_iszero(x)) } while (eui64_iszero(x))
#define eui64_magic_ne(x, y) do { \ #define eui64_magic_ne(x, y) do { \
eui64_magic(x); \ eui64_magic(x); \
} while (eui64_equals(x, y)) } while (eui64_equals(x, y))
#define eui64_get(ll, cp) do { \ #define eui64_get(ll, cp) do { \
eui64_copy((*cp), (ll)); \ eui64_copy((*cp), (ll)); \
(cp) += sizeof(eui64_t); \ (cp) += sizeof(eui64_t); \
} while (0) } while (0)
#define eui64_put(ll, cp) do { \ #define eui64_put(ll, cp) do { \
eui64_copy((ll), (*cp)); \ eui64_copy((ll), (*cp)); \
(cp) += sizeof(eui64_t); \ (cp) += sizeof(eui64_t); \
} while (0) } while (0)
#define eui64_set32(e, l) do { \ #define eui64_set32(e, l) do { \
(e).e32[0] = 0; \ (e).e32[0] = 0; \
(e).e32[1] = lwip_htonl(l); \ (e).e32[1] = lwip_htonl(l); \
} while (0) } while (0)
#define eui64_setlo32(e, l) eui64_set32(e, l) #define eui64_setlo32(e, l) eui64_set32(e, l)
char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */ char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */
#endif /* EUI64_H */ #endif /* EUI64_H */
#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */ #endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */

View File

@ -46,115 +46,115 @@
#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef FSM_H #ifndef FSM_H
#define FSM_H #define FSM_H
#include "ppp.h" #include "ppp.h"
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define HEADERLEN 4 #define HEADERLEN 4
/* /*
* CP (LCP, IPCP, etc.) codes. * CP (LCP, IPCP, etc.) codes.
*/ */
#define CONFREQ 1 /* Configuration Request */ #define CONFREQ 1 /* Configuration Request */
#define CONFACK 2 /* Configuration Ack */ #define CONFACK 2 /* Configuration Ack */
#define CONFNAK 3 /* Configuration Nak */ #define CONFNAK 3 /* Configuration Nak */
#define CONFREJ 4 /* Configuration Reject */ #define CONFREJ 4 /* Configuration Reject */
#define TERMREQ 5 /* Termination Request */ #define TERMREQ 5 /* Termination Request */
#define TERMACK 6 /* Termination Ack */ #define TERMACK 6 /* Termination Ack */
#define CODEREJ 7 /* Code Reject */ #define CODEREJ 7 /* Code Reject */
/* /*
* Each FSM is described by an fsm structure and fsm callbacks. * Each FSM is described by an fsm structure and fsm callbacks.
*/ */
typedef struct fsm { typedef struct fsm {
ppp_pcb *pcb; /* PPP Interface */ ppp_pcb *pcb; /* PPP Interface */
const struct fsm_callbacks *callbacks; /* Callback routines */ const struct fsm_callbacks *callbacks; /* Callback routines */
const char *term_reason; /* Reason for closing protocol */ const char *term_reason; /* Reason for closing protocol */
u8_t seen_ack; /* Have received valid Ack/Nak/Rej to Req */ u8_t seen_ack; /* Have received valid Ack/Nak/Rej to Req */
/* -- This is our only flag, we might use u_int :1 if we have more flags */ /* -- This is our only flag, we might use u_int :1 if we have more flags */
u16_t protocol; /* Data Link Layer Protocol field value */ u16_t protocol; /* Data Link Layer Protocol field value */
u8_t state; /* State */ u8_t state; /* State */
u8_t flags; /* Contains option bits */ u8_t flags; /* Contains option bits */
u8_t id; /* Current id */ u8_t id; /* Current id */
u8_t reqid; /* Current request id */ u8_t reqid; /* Current request id */
u8_t retransmits; /* Number of retransmissions left */ u8_t retransmits; /* Number of retransmissions left */
u8_t nakloops; /* Number of nak loops since last ack */ u8_t nakloops; /* Number of nak loops since last ack */
u8_t rnakloops; /* Number of naks received */ u8_t rnakloops; /* Number of naks received */
u8_t maxnakloops; /* Maximum number of nak loops tolerated u8_t maxnakloops; /* Maximum number of nak loops tolerated
(necessary because IPCP require a custom large max nak loops value) */ (necessary because IPCP require a custom large max nak loops value) */
u8_t term_reason_len; /* Length of term_reason */ u8_t term_reason_len; /* Length of term_reason */
} fsm; } fsm;
typedef struct fsm_callbacks { typedef struct fsm_callbacks {
void (*resetci) /* Reset our Configuration Information */ void (*resetci) /* Reset our Configuration Information */
(fsm *); (fsm *);
int (*cilen) /* Length of our Configuration Information */ int (*cilen) /* Length of our Configuration Information */
(fsm *); (fsm *);
void (*addci) /* Add our Configuration Information */ void (*addci) /* Add our Configuration Information */
(fsm *, u_char *, int *); (fsm *, u_char *, int *);
int (*ackci) /* ACK our Configuration Information */ int (*ackci) /* ACK our Configuration Information */
(fsm *, u_char *, int); (fsm *, u_char *, int);
int (*nakci) /* NAK our Configuration Information */ int (*nakci) /* NAK our Configuration Information */
(fsm *, u_char *, int, int); (fsm *, u_char *, int, int);
int (*rejci) /* Reject our Configuration Information */ int (*rejci) /* Reject our Configuration Information */
(fsm *, u_char *, int); (fsm *, u_char *, int);
int (*reqci) /* Request peer's Configuration Information */ int (*reqci) /* Request peer's Configuration Information */
(fsm *, u_char *, int *, int); (fsm *, u_char *, int *, int);
void (*up) /* Called when fsm reaches PPP_FSM_OPENED state */ void (*up) /* Called when fsm reaches PPP_FSM_OPENED state */
(fsm *); (fsm *);
void (*down) /* Called when fsm leaves PPP_FSM_OPENED state */ void (*down) /* Called when fsm leaves PPP_FSM_OPENED state */
(fsm *); (fsm *);
void (*starting) /* Called when we want the lower layer */ void (*starting) /* Called when we want the lower layer */
(fsm *); (fsm *);
void (*finished) /* Called when we don't want the lower layer */ void (*finished) /* Called when we don't want the lower layer */
(fsm *); (fsm *);
void (*protreject) /* Called when Protocol-Reject received */ void (*protreject) /* Called when Protocol-Reject received */
(int); (int);
void (*retransmit) /* Retransmission is necessary */ void (*retransmit) /* Retransmission is necessary */
(fsm *); (fsm *);
int (*extcode) /* Called when unknown code received */ int (*extcode) /* Called when unknown code received */
(fsm *, int, int, u_char *, int); (fsm *, int, int, u_char *, int);
const char *proto_name; /* String name for protocol (for messages) */ const char *proto_name; /* String name for protocol (for messages) */
} fsm_callbacks; } fsm_callbacks;
/* /*
* Link states. * Link states.
*/ */
#define PPP_FSM_INITIAL 0 /* Down, hasn't been opened */ #define PPP_FSM_INITIAL 0 /* Down, hasn't been opened */
#define PPP_FSM_STARTING 1 /* Down, been opened */ #define PPP_FSM_STARTING 1 /* Down, been opened */
#define PPP_FSM_CLOSED 2 /* Up, hasn't been opened */ #define PPP_FSM_CLOSED 2 /* Up, hasn't been opened */
#define PPP_FSM_STOPPED 3 /* Open, waiting for down event */ #define PPP_FSM_STOPPED 3 /* Open, waiting for down event */
#define PPP_FSM_CLOSING 4 /* Terminating the connection, not open */ #define PPP_FSM_CLOSING 4 /* Terminating the connection, not open */
#define PPP_FSM_STOPPING 5 /* Terminating, but open */ #define PPP_FSM_STOPPING 5 /* Terminating, but open */
#define PPP_FSM_REQSENT 6 /* We've sent a Config Request */ #define PPP_FSM_REQSENT 6 /* We've sent a Config Request */
#define PPP_FSM_ACKRCVD 7 /* We've received a Config Ack */ #define PPP_FSM_ACKRCVD 7 /* We've received a Config Ack */
#define PPP_FSM_ACKSENT 8 /* We've sent a Config Ack */ #define PPP_FSM_ACKSENT 8 /* We've sent a Config Ack */
#define PPP_FSM_OPENED 9 /* Connection available */ #define PPP_FSM_OPENED 9 /* Connection available */
/* /*
* Flags - indicate options controlling FSM operation * Flags - indicate options controlling FSM operation
*/ */
#define OPT_PASSIVE 1 /* Don't die if we don't get a response */ #define OPT_PASSIVE 1 /* Don't die if we don't get a response */
#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ #define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */
#define OPT_SILENT 4 /* Wait for peer to speak first */ #define OPT_SILENT 4 /* Wait for peer to speak first */
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define DEFTIMEOUT 3 /* Timeout time in seconds */ #define DEFTIMEOUT 3 /* Timeout time in seconds */
#define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ #define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */
#define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ #define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */
#define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ #define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */

View File

@ -46,37 +46,37 @@
#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef IPCP_H #ifndef IPCP_H
#define IPCP_H #define IPCP_H
/* /*
* Options. * Options.
*/ */
#define CI_ADDRS 1 /* IP Addresses */ #define CI_ADDRS 1 /* IP Addresses */
#if VJ_SUPPORT #if VJ_SUPPORT
#define CI_COMPRESSTYPE 2 /* Compression Type */ #define CI_COMPRESSTYPE 2 /* Compression Type */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
#define CI_ADDR 3 #define CI_ADDR 3
#if LWIP_DNS #if LWIP_DNS
#define CI_MS_DNS1 129 /* Primary DNS value */ #define CI_MS_DNS1 129 /* Primary DNS value */
#define CI_MS_DNS2 131 /* Secondary DNS value */ #define CI_MS_DNS2 131 /* Secondary DNS value */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
#if 0 /* UNUSED - WINS */ #if 0 /* UNUSED - WINS */
#define CI_MS_WINS1 130 /* Primary WINS value */ #define CI_MS_WINS1 130 /* Primary WINS value */
#define CI_MS_WINS2 132 /* Secondary WINS value */ #define CI_MS_WINS2 132 /* Secondary WINS value */
#endif /* UNUSED - WINS */ #endif /* UNUSED - WINS */
#if VJ_SUPPORT #if VJ_SUPPORT
#define MAX_STATES 16 /* from slcompress.h */ #define MAX_STATES 16 /* from slcompress.h */
#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */ #define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */
#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */ #define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */
#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */ #define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */
/* maxslot and slot number compression) */ /* maxslot and slot number compression) */
#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/ #define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/
#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */ #define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */
/* compression option*/ /* compression option*/
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
typedef struct ipcp_options { typedef struct ipcp_options {
@ -102,17 +102,17 @@ typedef struct ipcp_options {
unsigned int req_dns2 :1; /* Ask peer to send secondary DNS address? */ unsigned int req_dns2 :1; /* Ask peer to send secondary DNS address? */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */ u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */
#if LWIP_DNS #if LWIP_DNS
u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */ u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
#if 0 /* UNUSED - WINS */ #if 0 /* UNUSED - WINS */
u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */ u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */
#endif /* UNUSED - WINS */ #endif /* UNUSED - WINS */
#if VJ_SUPPORT #if VJ_SUPPORT
u16_t vj_protocol; /* protocol value to use in VJ option */ u16_t vj_protocol; /* protocol value to use in VJ option */
u8_t maxslotindex; /* values for RFC1332 VJ compression neg. */ u8_t maxslotindex; /* values for RFC1332 VJ compression neg. */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
} ipcp_options; } ipcp_options;

View File

@ -142,20 +142,20 @@
#if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef IPV6CP_H #ifndef IPV6CP_H
#define IPV6CP_H #define IPV6CP_H
#include "eui64.h" #include "eui64.h"
/* /*
* Options. * Options.
*/ */
#define CI_IFACEID 1 /* Interface Identifier */ #define CI_IFACEID 1 /* Interface Identifier */
#ifdef IPV6CP_COMP #ifdef IPV6CP_COMP
#define CI_COMPRESSTYPE 2 /* Compression Type */ #define CI_COMPRESSTYPE 2 /* Compression Type */
#endif /* IPV6CP_COMP */ #endif /* IPV6CP_COMP */
/* No compression types yet defined. /* No compression types yet defined.
*#define IPV6CP_COMP 0x004f *#define IPV6CP_COMP 0x004f
*/ */
typedef struct ipv6cp_options { typedef struct ipv6cp_options {
unsigned int neg_ifaceid :1; /* Negotiate interface identifier? */ unsigned int neg_ifaceid :1; /* Negotiate interface identifier? */

View File

@ -46,62 +46,62 @@
#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef LCP_H #ifndef LCP_H
#define LCP_H #define LCP_H
#include "ppp.h" #include "ppp.h"
/* /*
* Options. * Options.
*/ */
#define CI_VENDOR 0 /* Vendor Specific */ #define CI_VENDOR 0 /* Vendor Specific */
#define CI_MRU 1 /* Maximum Receive Unit */ #define CI_MRU 1 /* Maximum Receive Unit */
#define CI_ASYNCMAP 2 /* Async Control Character Map */ #define CI_ASYNCMAP 2 /* Async Control Character Map */
#define CI_AUTHTYPE 3 /* Authentication Type */ #define CI_AUTHTYPE 3 /* Authentication Type */
#define CI_QUALITY 4 /* Quality Protocol */ #define CI_QUALITY 4 /* Quality Protocol */
#define CI_MAGICNUMBER 5 /* Magic Number */ #define CI_MAGICNUMBER 5 /* Magic Number */
#define CI_PCOMPRESSION 7 /* Protocol Field Compression */ #define CI_PCOMPRESSION 7 /* Protocol Field Compression */
#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ #define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */
#define CI_FCSALTERN 9 /* FCS-Alternatives */ #define CI_FCSALTERN 9 /* FCS-Alternatives */
#define CI_SDP 10 /* Self-Describing-Pad */ #define CI_SDP 10 /* Self-Describing-Pad */
#define CI_NUMBERED 11 /* Numbered-Mode */ #define CI_NUMBERED 11 /* Numbered-Mode */
#define CI_CALLBACK 13 /* callback */ #define CI_CALLBACK 13 /* callback */
#define CI_MRRU 17 /* max reconstructed receive unit; multilink */ #define CI_MRRU 17 /* max reconstructed receive unit; multilink */
#define CI_SSNHF 18 /* short sequence numbers for multilink */ #define CI_SSNHF 18 /* short sequence numbers for multilink */
#define CI_EPDISC 19 /* endpoint discriminator */ #define CI_EPDISC 19 /* endpoint discriminator */
#define CI_MPPLUS 22 /* Multi-Link-Plus-Procedure */ #define CI_MPPLUS 22 /* Multi-Link-Plus-Procedure */
#define CI_LDISC 23 /* Link-Discriminator */ #define CI_LDISC 23 /* Link-Discriminator */
#define CI_LCPAUTH 24 /* LCP Authentication */ #define CI_LCPAUTH 24 /* LCP Authentication */
#define CI_COBS 25 /* Consistent Overhead Byte Stuffing */ #define CI_COBS 25 /* Consistent Overhead Byte Stuffing */
#define CI_PREFELIS 26 /* Prefix Elision */ #define CI_PREFELIS 26 /* Prefix Elision */
#define CI_MPHDRFMT 27 /* MP Header Format */ #define CI_MPHDRFMT 27 /* MP Header Format */
#define CI_I18N 28 /* Internationalization */ #define CI_I18N 28 /* Internationalization */
#define CI_SDL 29 /* Simple Data Link */ #define CI_SDL 29 /* Simple Data Link */
/* /*
* LCP-specific packet types (code numbers). * LCP-specific packet types (code numbers).
*/ */
#define PROTREJ 8 /* Protocol Reject */ #define PROTREJ 8 /* Protocol Reject */
#define ECHOREQ 9 /* Echo Request */ #define ECHOREQ 9 /* Echo Request */
#define ECHOREP 10 /* Echo Reply */ #define ECHOREP 10 /* Echo Reply */
#define DISCREQ 11 /* Discard Request */ #define DISCREQ 11 /* Discard Request */
#define IDENTIF 12 /* Identification */ #define IDENTIF 12 /* Identification */
#define TIMEREM 13 /* Time Remaining */ #define TIMEREM 13 /* Time Remaining */
/* Value used as data for CI_CALLBACK option */ /* Value used as data for CI_CALLBACK option */
#define CBCP_OPT 6 /* Use callback control protocol */ #define CBCP_OPT 6 /* Use callback control protocol */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define DEFMRU 1500 /* Try for this */ #define DEFMRU 1500 /* Try for this */
#define MINMRU 128 /* No MRUs below this */ #define MINMRU 128 /* No MRUs below this */
#define MAXMRU 16384 /* Normally limit MRU to this */ #define MAXMRU 16384 /* Normally limit MRU to this */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
/* An endpoint discriminator, used with multilink. */ /* An endpoint discriminator, used with multilink. */
#define MAX_ENDP_LEN 20 /* maximum length of discriminator value */ #define MAX_ENDP_LEN 20 /* maximum length of discriminator value */
struct epdisc { struct epdisc {
unsigned char class_; /* -- The word "class" is reserved in C++. */ unsigned char class_; /* -- The word "class" is reserved in C++. */
unsigned char length; unsigned char length;
unsigned char value[MAX_ENDP_LEN]; unsigned char value[MAX_ENDP_LEN];
}; };
/* /*
@ -137,20 +137,20 @@ typedef struct lcp_options {
unsigned int neg_ssnhf :1; /* negotiate short sequence numbers */ unsigned int neg_ssnhf :1; /* negotiate short sequence numbers */
unsigned int neg_endpoint :1; /* negotiate endpoint discriminator */ unsigned int neg_endpoint :1; /* negotiate endpoint discriminator */
u16_t mru; /* Value of MRU */ u16_t mru; /* Value of MRU */
#ifdef HAVE_MULTILINK #ifdef HAVE_MULTILINK
u16_t mrru; /* Value of MRRU, and multilink enable */ u16_t mrru; /* Value of MRRU, and multilink enable */
#endif /* MULTILINK */ #endif /* MULTILINK */
#if CHAP_SUPPORT #if CHAP_SUPPORT
u8_t chap_mdtype; /* which MD types (hashing algorithm) */ u8_t chap_mdtype; /* which MD types (hashing algorithm) */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
u32_t asyncmap; /* Value of async map */ u32_t asyncmap; /* Value of async map */
u32_t magicnumber; u32_t magicnumber;
u8_t numloops; /* Number of loops during magic number neg. */ u8_t numloops; /* Number of loops during magic number neg. */
#if LQR_SUPPORT #if LQR_SUPPORT
u32_t lqr_period; /* Reporting period for LQR 1/100ths second */ u32_t lqr_period; /* Reporting period for LQR 1/100ths second */
#endif /* LQR_SUPPORT */ #endif /* LQR_SUPPORT */
struct epdisc endpoint; /* endpoint discriminator */ struct epdisc endpoint; /* endpoint discriminator */
} lcp_options; } lcp_options;
void lcp_open(ppp_pcb *pcb); void lcp_open(ppp_pcb *pcb);
@ -164,7 +164,7 @@ extern const struct protent lcp_protent;
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
/* Default number of times we receive our magic number from the peer /* Default number of times we receive our magic number from the peer
before deciding the link is looped-back. */ before deciding the link is looped-back. */
#define DEFLOOPBACKFAIL 10 #define DEFLOOPBACKFAIL 10
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
#endif /* LCP_H */ #endif /* LCP_H */

View File

@ -98,7 +98,7 @@ void magic_randomize(void);
/* /*
* Return a new random number. * Return a new random number.
*/ */
u32_t magic(void); /* Returns the next magic number */ u32_t magic(void); /* Returns the next magic number */
/* /*
* Fill buffer with random bytes * Fill buffer with random bytes

View File

@ -41,19 +41,19 @@
#include "netif/ppp/pppcrypt.h" #include "netif/ppp/pppcrypt.h"
#define MPPE_PAD 4 /* MPPE growth per frame */ #define MPPE_PAD 4 /* MPPE growth per frame */
#define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */ #define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */
/* option bits for ccp_options.mppe */ /* option bits for ccp_options.mppe */
#define MPPE_OPT_40 0x01 /* 40 bit */ #define MPPE_OPT_40 0x01 /* 40 bit */
#define MPPE_OPT_128 0x02 /* 128 bit */ #define MPPE_OPT_128 0x02 /* 128 bit */
#define MPPE_OPT_STATEFUL 0x04 /* stateful mode */ #define MPPE_OPT_STATEFUL 0x04 /* stateful mode */
/* unsupported opts */ /* unsupported opts */
#define MPPE_OPT_56 0x08 /* 56 bit */ #define MPPE_OPT_56 0x08 /* 56 bit */
#define MPPE_OPT_MPPC 0x10 /* MPPC compression */ #define MPPE_OPT_MPPC 0x10 /* MPPC compression */
#define MPPE_OPT_D 0x20 /* Unknown */ #define MPPE_OPT_D 0x20 /* Unknown */
#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D) #define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
#define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */ #define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */
/* /*
* This is not nice ... the alternative is a bitfield struct though. * This is not nice ... the alternative is a bitfield struct though.
@ -62,70 +62,70 @@
* but then we have to do a lwip_htonl() all the time and/or we still need * but then we have to do a lwip_htonl() all the time and/or we still need
* to know which octet is which. * to know which octet is which.
*/ */
#define MPPE_C_BIT 0x01 /* MPPC */ #define MPPE_C_BIT 0x01 /* MPPC */
#define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */ #define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */
#define MPPE_L_BIT 0x20 /* 40-bit */ #define MPPE_L_BIT 0x20 /* 40-bit */
#define MPPE_S_BIT 0x40 /* 128-bit */ #define MPPE_S_BIT 0x40 /* 128-bit */
#define MPPE_M_BIT 0x80 /* 56-bit, not supported */ #define MPPE_M_BIT 0x80 /* 56-bit, not supported */
#define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */ #define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */
/* Does not include H bit; used for least significant octet only. */ /* Does not include H bit; used for least significant octet only. */
#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT) #define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
/* Build a CI from mppe opts (see RFC 3078) */ /* Build a CI from mppe opts (see RFC 3078) */
#define MPPE_OPTS_TO_CI(opts, ci) \ #define MPPE_OPTS_TO_CI(opts, ci) \
do { \ do { \
u_char *ptr = ci; /* u_char[4] */ \ u_char *ptr = ci; /* u_char[4] */ \
\ \
/* H bit */ \ /* H bit */ \
if (opts & MPPE_OPT_STATEFUL) \ if (opts & MPPE_OPT_STATEFUL) \
*ptr++ = 0x0; \ *ptr++ = 0x0; \
else \ else \
*ptr++ = MPPE_H_BIT; \ *ptr++ = MPPE_H_BIT; \
*ptr++ = 0; \ *ptr++ = 0; \
*ptr++ = 0; \ *ptr++ = 0; \
\ \
/* S,L bits */ \ /* S,L bits */ \
*ptr = 0; \ *ptr = 0; \
if (opts & MPPE_OPT_128) \ if (opts & MPPE_OPT_128) \
*ptr |= MPPE_S_BIT; \ *ptr |= MPPE_S_BIT; \
if (opts & MPPE_OPT_40) \ if (opts & MPPE_OPT_40) \
*ptr |= MPPE_L_BIT; \ *ptr |= MPPE_L_BIT; \
/* M,D,C bits not supported */ \ /* M,D,C bits not supported */ \
} while (/* CONSTCOND */ 0) } while (/* CONSTCOND */ 0)
/* The reverse of the above */ /* The reverse of the above */
#define MPPE_CI_TO_OPTS(ci, opts) \ #define MPPE_CI_TO_OPTS(ci, opts) \
do { \ do { \
const u_char *ptr = ci; /* u_char[4] */ \ const u_char *ptr = ci; /* u_char[4] */ \
\ \
opts = 0; \ opts = 0; \
\ \
/* H bit */ \ /* H bit */ \
if (!(ptr[0] & MPPE_H_BIT)) \ if (!(ptr[0] & MPPE_H_BIT)) \
opts |= MPPE_OPT_STATEFUL; \ opts |= MPPE_OPT_STATEFUL; \
\ \
/* S,L bits */ \ /* S,L bits */ \
if (ptr[3] & MPPE_S_BIT) \ if (ptr[3] & MPPE_S_BIT) \
opts |= MPPE_OPT_128; \ opts |= MPPE_OPT_128; \
if (ptr[3] & MPPE_L_BIT) \ if (ptr[3] & MPPE_L_BIT) \
opts |= MPPE_OPT_40; \ opts |= MPPE_OPT_40; \
\ \
/* M,D,C bits */ \ /* M,D,C bits */ \
if (ptr[3] & MPPE_M_BIT) \ if (ptr[3] & MPPE_M_BIT) \
opts |= MPPE_OPT_56; \ opts |= MPPE_OPT_56; \
if (ptr[3] & MPPE_D_BIT) \ if (ptr[3] & MPPE_D_BIT) \
opts |= MPPE_OPT_D; \ opts |= MPPE_OPT_D; \
if (ptr[3] & MPPE_C_BIT) \ if (ptr[3] & MPPE_C_BIT) \
opts |= MPPE_OPT_MPPC; \ opts |= MPPE_OPT_MPPC; \
\ \
/* Other bits */ \ /* Other bits */ \
if (ptr[0] & ~MPPE_H_BIT) \ if (ptr[0] & ~MPPE_H_BIT) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
if (ptr[1] || ptr[2]) \ if (ptr[1] || ptr[2]) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
if (ptr[3] & ~MPPE_ALL_BITS) \ if (ptr[3] & ~MPPE_ALL_BITS) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
} while (/* CONSTCOND */ 0) } while (/* CONSTCOND */ 0)
/* Shared MPPE padding between MSCHAP and MPPE */ /* Shared MPPE padding between MSCHAP and MPPE */
@ -148,18 +148,18 @@ static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {
* State for an MPPE (de)compressor. * State for an MPPE (de)compressor.
*/ */
typedef struct ppp_mppe_state { typedef struct ppp_mppe_state {
lwip_arc4_context arc4; lwip_arc4_context arc4;
u8_t master_key[MPPE_MAX_KEY_LEN]; u8_t master_key[MPPE_MAX_KEY_LEN];
u8_t session_key[MPPE_MAX_KEY_LEN]; u8_t session_key[MPPE_MAX_KEY_LEN];
u8_t keylen; /* key length in bytes */ u8_t keylen; /* key length in bytes */
/* NB: 128-bit == 16, 40-bit == 8! /* NB: 128-bit == 16, 40-bit == 8!
* If we want to support 56-bit, the unit has to change to bits * If we want to support 56-bit, the unit has to change to bits
*/ */
u8_t bits; /* MPPE control bits */ u8_t bits; /* MPPE control bits */
u16_t ccount; /* 12-bit coherency count (seqno) */ u16_t ccount; /* 12-bit coherency count (seqno) */
u16_t sanity_errors; /* take down LCP if too many */ u16_t sanity_errors; /* take down LCP if too many */
unsigned int stateful :1; /* stateful mode flag */ unsigned int stateful :1; /* stateful mode flag */
unsigned int discard :1; /* stateful mode packet loss flag */ unsigned int discard :1; /* stateful mode packet loss flag */
} ppp_mppe_state; } ppp_mppe_state;
void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key); void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);

View File

@ -103,8 +103,8 @@
/* /*
* The basic PPP frame. * The basic PPP frame.
*/ */
#define PPP_HDRLEN 4 /* octets for standard ppp header */ #define PPP_HDRLEN 4 /* octets for standard ppp header */
#define PPP_FCSLEN 2 /* octets for FCS */ #define PPP_FCSLEN 2 /* octets for FCS */
/* /*
* Values for phase. * Values for phase.

View File

@ -70,66 +70,66 @@
/* /*
* The basic PPP frame. * The basic PPP frame.
*/ */
#define PPP_ADDRESS(p) (((u_char *)(p))[0]) #define PPP_ADDRESS(p) (((u_char *)(p))[0])
#define PPP_CONTROL(p) (((u_char *)(p))[1]) #define PPP_CONTROL(p) (((u_char *)(p))[1])
#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3]) #define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
/* /*
* Significant octet values. * Significant octet values.
*/ */
#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ #define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */
#define PPP_UI 0x03 /* Unnumbered Information */ #define PPP_UI 0x03 /* Unnumbered Information */
#define PPP_FLAG 0x7e /* Flag Sequence */ #define PPP_FLAG 0x7e /* Flag Sequence */
#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */ #define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */
#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */ #define PPP_TRANS 0x20 /* Asynchronous transparency modifier */
/* /*
* Protocol field values. * Protocol field values.
*/ */
#define PPP_IP 0x21 /* Internet Protocol */ #define PPP_IP 0x21 /* Internet Protocol */
#if 0 /* UNUSED */ #if 0 /* UNUSED */
#define PPP_AT 0x29 /* AppleTalk Protocol */ #define PPP_AT 0x29 /* AppleTalk Protocol */
#define PPP_IPX 0x2b /* IPX protocol */ #define PPP_IPX 0x2b /* IPX protocol */
#endif /* UNUSED */ #endif /* UNUSED */
#if VJ_SUPPORT #if VJ_SUPPORT
#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */ #define PPP_VJC_COMP 0x2d /* VJ compressed TCP */
#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */ #define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
#if PPP_IPV6_SUPPORT #if PPP_IPV6_SUPPORT
#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */ #define PPP_IPV6 0x57 /* Internet Protocol Version 6 */
#endif /* PPP_IPV6_SUPPORT */ #endif /* PPP_IPV6_SUPPORT */
#if CCP_SUPPORT #if CCP_SUPPORT
#define PPP_COMP 0xfd /* compressed packet */ #define PPP_COMP 0xfd /* compressed packet */
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
#define PPP_IPCP 0x8021 /* IP Control Protocol */ #define PPP_IPCP 0x8021 /* IP Control Protocol */
#if 0 /* UNUSED */ #if 0 /* UNUSED */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */ #define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */ #define PPP_IPXCP 0x802b /* IPX Control Protocol */
#endif /* UNUSED */ #endif /* UNUSED */
#if PPP_IPV6_SUPPORT #if PPP_IPV6_SUPPORT
#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */ #define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#endif /* PPP_IPV6_SUPPORT */ #endif /* PPP_IPV6_SUPPORT */
#if CCP_SUPPORT #if CCP_SUPPORT
#define PPP_CCP 0x80fd /* Compression Control Protocol */ #define PPP_CCP 0x80fd /* Compression Control Protocol */
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
#if ECP_SUPPORT #if ECP_SUPPORT
#define PPP_ECP 0x8053 /* Encryption Control Protocol */ #define PPP_ECP 0x8053 /* Encryption Control Protocol */
#endif /* ECP_SUPPORT */ #endif /* ECP_SUPPORT */
#define PPP_LCP 0xc021 /* Link Control Protocol */ #define PPP_LCP 0xc021 /* Link Control Protocol */
#if PAP_SUPPORT #if PAP_SUPPORT
#define PPP_PAP 0xc023 /* Password Authentication Protocol */ #define PPP_PAP 0xc023 /* Password Authentication Protocol */
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */
#if LQR_SUPPORT #if LQR_SUPPORT
#define PPP_LQR 0xc025 /* Link Quality Report protocol */ #define PPP_LQR 0xc025 /* Link Quality Report protocol */
#endif /* LQR_SUPPORT */ #endif /* LQR_SUPPORT */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */ #define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
#if CBCP_SUPPORT #if CBCP_SUPPORT
#define PPP_CBCP 0xc029 /* Callback Control Protocol */ #define PPP_CBCP 0xc029 /* Callback Control Protocol */
#endif /* CBCP_SUPPORT */ #endif /* CBCP_SUPPORT */
#if EAP_SUPPORT #if EAP_SUPPORT
#define PPP_EAP 0xc227 /* Extensible Authentication Protocol */ #define PPP_EAP 0xc227 /* Extensible Authentication Protocol */
#endif /* EAP_SUPPORT */ #endif /* EAP_SUPPORT */
/* /*
@ -161,59 +161,59 @@ struct link_callbacks {
* What to do with network protocol (NP) packets. * What to do with network protocol (NP) packets.
*/ */
enum NPmode { enum NPmode {
NPMODE_PASS, /* pass the packet through */ NPMODE_PASS, /* pass the packet through */
NPMODE_DROP, /* silently drop the packet */ NPMODE_DROP, /* silently drop the packet */
NPMODE_ERROR, /* return an error */ NPMODE_ERROR, /* return an error */
NPMODE_QUEUE /* save it up for later. */ NPMODE_QUEUE /* save it up for later. */
}; };
/* /*
* Statistics. * Statistics.
*/ */
#if PPP_STATS_SUPPORT #if PPP_STATS_SUPPORT
struct pppstat { struct pppstat {
unsigned int ppp_ibytes; /* bytes received */ unsigned int ppp_ibytes; /* bytes received */
unsigned int ppp_ipackets; /* packets received */ unsigned int ppp_ipackets; /* packets received */
unsigned int ppp_ierrors; /* receive errors */ unsigned int ppp_ierrors; /* receive errors */
unsigned int ppp_obytes; /* bytes sent */ unsigned int ppp_obytes; /* bytes sent */
unsigned int ppp_opackets; /* packets sent */ unsigned int ppp_opackets; /* packets sent */
unsigned int ppp_oerrors; /* transmit errors */ unsigned int ppp_oerrors; /* transmit errors */
}; };
#if VJ_SUPPORT #if VJ_SUPPORT
struct vjstat { struct vjstat {
unsigned int vjs_packets; /* outbound packets */ unsigned int vjs_packets; /* outbound packets */
unsigned int vjs_compressed; /* outbound compressed packets */ unsigned int vjs_compressed; /* outbound compressed packets */
unsigned int vjs_searches; /* searches for connection state */ unsigned int vjs_searches; /* searches for connection state */
unsigned int vjs_misses; /* times couldn't find conn. state */ unsigned int vjs_misses; /* times couldn't find conn. state */
unsigned int vjs_uncompressedin; /* inbound uncompressed packets */ unsigned int vjs_uncompressedin; /* inbound uncompressed packets */
unsigned int vjs_compressedin; /* inbound compressed packets */ unsigned int vjs_compressedin; /* inbound compressed packets */
unsigned int vjs_errorin; /* inbound unknown type packets */ unsigned int vjs_errorin; /* inbound unknown type packets */
unsigned int vjs_tossed; /* inbound packets tossed because of error */ unsigned int vjs_tossed; /* inbound packets tossed because of error */
}; };
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
struct ppp_stats { struct ppp_stats {
struct pppstat p; /* basic PPP statistics */ struct pppstat p; /* basic PPP statistics */
#if VJ_SUPPORT #if VJ_SUPPORT
struct vjstat vj; /* VJ header compression statistics */ struct vjstat vj; /* VJ header compression statistics */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
}; };
#if CCP_SUPPORT #if CCP_SUPPORT
struct compstat { struct compstat {
unsigned int unc_bytes; /* total uncompressed bytes */ unsigned int unc_bytes; /* total uncompressed bytes */
unsigned int unc_packets; /* total uncompressed packets */ unsigned int unc_packets; /* total uncompressed packets */
unsigned int comp_bytes; /* compressed bytes */ unsigned int comp_bytes; /* compressed bytes */
unsigned int comp_packets; /* compressed packets */ unsigned int comp_packets; /* compressed packets */
unsigned int inc_bytes; /* incompressible bytes */ unsigned int inc_bytes; /* incompressible bytes */
unsigned int inc_packets; /* incompressible packets */ unsigned int inc_packets; /* incompressible packets */
unsigned int ratio; /* recent compression ratio << 8 */ unsigned int ratio; /* recent compression ratio << 8 */
}; };
struct ppp_comp_stats { struct ppp_comp_stats {
struct compstat c; /* packet compression statistics */ struct compstat c; /* packet compression statistics */
struct compstat d; /* packet decompression statistics */ struct compstat d; /* packet decompression statistics */
}; };
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
@ -225,37 +225,37 @@ struct ppp_comp_stats {
* the last NP packet was sent or received. * the last NP packet was sent or received.
*/ */
struct ppp_idle { struct ppp_idle {
time_t xmit_idle; /* time since last NP packet sent */ time_t xmit_idle; /* time since last NP packet sent */
time_t recv_idle; /* time since last NP packet received */ time_t recv_idle; /* time since last NP packet received */
}; };
#endif /* PPP_IDLETIMELIMIT */ #endif /* PPP_IDLETIMELIMIT */
/* values for epdisc.class */ /* values for epdisc.class */
#define EPD_NULL 0 /* null discriminator, no data */ #define EPD_NULL 0 /* null discriminator, no data */
#define EPD_LOCAL 1 #define EPD_LOCAL 1
#define EPD_IP 2 #define EPD_IP 2
#define EPD_MAC 3 #define EPD_MAC 3
#define EPD_MAGIC 4 #define EPD_MAGIC 4
#define EPD_PHONENUM 5 #define EPD_PHONENUM 5
/* /*
* Global variables. * Global variables.
*/ */
#ifdef HAVE_MULTILINK #ifdef HAVE_MULTILINK
extern u8_t multilink; /* enable multilink operation */ extern u8_t multilink; /* enable multilink operation */
extern u8_t doing_multilink; extern u8_t doing_multilink;
extern u8_t multilink_master; extern u8_t multilink_master;
extern u8_t bundle_eof; extern u8_t bundle_eof;
extern u8_t bundle_terminating; extern u8_t bundle_terminating;
#endif #endif
#ifdef MAXOCTETS #ifdef MAXOCTETS
extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */ extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */
extern int maxoctets_dir; /* Direction : extern int maxoctets_dir; /* Direction :
0 - in+out (default) 0 - in+out (default)
1 - in 1 - in
2 - out 2 - out
3 - max(in,out) */ 3 - max(in,out) */
extern int maxoctets_timeout; /* Timeout for check of octets limit */ extern int maxoctets_timeout; /* Timeout for check of octets limit */
#define PPP_OCTETS_DIRECTION_SUM 0 #define PPP_OCTETS_DIRECTION_SUM 0
#define PPP_OCTETS_DIRECTION_IN 1 #define PPP_OCTETS_DIRECTION_IN 1
@ -275,7 +275,7 @@ extern int maxoctets_timeout; /* Timeout for check of octets limit */
* for a particular protocol. * for a particular protocol.
*/ */
struct protent { struct protent {
u_short protocol; /* PPP protocol number */ u_short protocol; /* PPP protocol number */
/* Initialization procedure */ /* Initialization procedure */
void (*init) (ppp_pcb *pcb); void (*init) (ppp_pcb *pcb);
/* Process a received packet */ /* Process a received packet */
@ -293,19 +293,19 @@ struct protent {
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
/* Print a packet in readable form */ /* Print a packet in readable form */
int (*printpkt) (const u_char *pkt, int len, int (*printpkt) (const u_char *pkt, int len,
void (*printer) (void *, const char *, ...), void (*printer) (void *, const char *, ...),
void *arg); void *arg);
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
#if PPP_DATAINPUT #if PPP_DATAINPUT
/* Process a received data packet */ /* Process a received data packet */
void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len); void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len);
#endif /* PPP_DATAINPUT */ #endif /* PPP_DATAINPUT */
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
const char *name; /* Text name of protocol */ const char *name; /* Text name of protocol */
const char *data_name; /* Text name of corresponding data protocol */ const char *data_name; /* Text name of corresponding data protocol */
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
#if PPP_OPTIONS #if PPP_OPTIONS
option_t *options; /* List of command-line options */ option_t *options; /* List of command-line options */
/* Check requested options, assign defaults */ /* Check requested options, assign defaults */
void (*check_options) (void); void (*check_options) (void);
#endif /* PPP_OPTIONS */ #endif /* PPP_OPTIONS */
@ -323,28 +323,28 @@ extern const struct protent* const protocols[];
/* Values for auth_pending, auth_done */ /* Values for auth_pending, auth_done */
#if PAP_SUPPORT #if PAP_SUPPORT
#define PAP_WITHPEER 0x1 #define PAP_WITHPEER 0x1
#define PAP_PEER 0x2 #define PAP_PEER 0x2
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define CHAP_WITHPEER 0x4 #define CHAP_WITHPEER 0x4
#define CHAP_PEER 0x8 #define CHAP_PEER 0x8
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
#if EAP_SUPPORT #if EAP_SUPPORT
#define EAP_WITHPEER 0x10 #define EAP_WITHPEER 0x10
#define EAP_PEER 0x20 #define EAP_PEER 0x20
#endif /* EAP_SUPPORT */ #endif /* EAP_SUPPORT */
/* Values for auth_done only */ /* Values for auth_done only */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define CHAP_MD5_WITHPEER 0x40 #define CHAP_MD5_WITHPEER 0x40
#define CHAP_MD5_PEER 0x80 #define CHAP_MD5_PEER 0x80
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define CHAP_MS_SHIFT 8 /* LSB position for MS auths */ #define CHAP_MS_SHIFT 8 /* LSB position for MS auths */
#define CHAP_MS_WITHPEER 0x100 #define CHAP_MS_WITHPEER 0x100
#define CHAP_MS_PEER 0x200 #define CHAP_MS_PEER 0x200
#define CHAP_MS2_WITHPEER 0x400 #define CHAP_MS2_WITHPEER 0x400
#define CHAP_MS2_PEER 0x800 #define CHAP_MS2_PEER 0x800
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
@ -366,10 +366,10 @@ extern const struct protent* const protocols[];
* PPP statistics structure * PPP statistics structure
*/ */
struct pppd_stats { struct pppd_stats {
unsigned int bytes_in; unsigned int bytes_in;
unsigned int bytes_out; unsigned int bytes_out;
unsigned int pkts_in; unsigned int pkts_in;
unsigned int pkts_out; unsigned int pkts_out;
}; };
#endif /* PPP_STATS_SUPPORT */ #endif /* PPP_STATS_SUPPORT */
@ -499,34 +499,34 @@ void update_link_stats(int u); /* Get stats at link termination */
* cp MUST be u_char *. * cp MUST be u_char *.
*/ */
#define GETCHAR(c, cp) { \ #define GETCHAR(c, cp) { \
(c) = *(cp)++; \ (c) = *(cp)++; \
} }
#define PUTCHAR(c, cp) { \ #define PUTCHAR(c, cp) { \
*(cp)++ = (u_char) (c); \ *(cp)++ = (u_char) (c); \
} }
#define GETSHORT(s, cp) { \ #define GETSHORT(s, cp) { \
(s) = *(cp)++ << 8; \ (s) = *(cp)++ << 8; \
(s) |= *(cp)++; \ (s) |= *(cp)++; \
} }
#define PUTSHORT(s, cp) { \ #define PUTSHORT(s, cp) { \
*(cp)++ = (u_char) ((s) >> 8); \ *(cp)++ = (u_char) ((s) >> 8); \
*(cp)++ = (u_char) (s); \ *(cp)++ = (u_char) (s); \
} }
#define GETLONG(l, cp) { \ #define GETLONG(l, cp) { \
(l) = *(cp)++ << 8; \ (l) = *(cp)++ << 8; \
(l) |= *(cp)++; (l) <<= 8; \ (l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; (l) <<= 8; \ (l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; \ (l) |= *(cp)++; \
} }
#define PUTLONG(l, cp) { \ #define PUTLONG(l, cp) { \
*(cp)++ = (u_char) ((l) >> 24); \ *(cp)++ = (u_char) ((l) >> 24); \
*(cp)++ = (u_char) ((l) >> 16); \ *(cp)++ = (u_char) ((l) >> 16); \
*(cp)++ = (u_char) ((l) >> 8); \ *(cp)++ = (u_char) ((l) >> 8); \
*(cp)++ = (u_char) (l); \ *(cp)++ = (u_char) (l); \
} }
#define INCPTR(n, cp) ((cp) += (n)) #define INCPTR(n, cp) ((cp) += (n))
#define DECPTR(n, cp) ((cp) -= (n)) #define DECPTR(n, cp) ((cp) -= (n))
/* /*
* System dependent definitions for user-level 4.3BSD UNIX implementation. * System dependent definitions for user-level 4.3BSD UNIX implementation.
@ -535,10 +535,10 @@ void update_link_stats(int u); /* Get stats at link termination */
#define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0) #define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0)
#define UNTIMEOUT(f, a) sys_untimeout((f), (a)) #define UNTIMEOUT(f, a) sys_untimeout((f), (a))
#define BZERO(s, n) memset(s, 0, n) #define BZERO(s, n) memset(s, 0, n)
#define BCMP(s1, s2, l) memcmp(s1, s2, l) #define BCMP(s1, s2, l) memcmp(s1, s2, l)
#define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); } #define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); }
/* /*
* MAKEHEADER - Add Header fields to a packet. * MAKEHEADER - Add Header fields to a packet.
@ -551,7 +551,7 @@ void update_link_stats(int u); /* Get stats at link termination */
/* Procedures exported from auth.c */ /* Procedures exported from auth.c */
void link_required(ppp_pcb *pcb); /* we are starting to use the link */ void link_required(ppp_pcb *pcb); /* we are starting to use the link */
void link_terminated(ppp_pcb *pcb); /* we are finished with the link */ void link_terminated(ppp_pcb *pcb); /* we are finished with the link */
void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */ void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */
void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */ void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */
void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */ void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */
void start_networks(ppp_pcb *pcb); /* start all the network control protos */ void start_networks(ppp_pcb *pcb); /* start all the network control protos */
@ -561,21 +561,21 @@ void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos
int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen); int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen);
/* check the user name and passwd against configuration */ /* check the user name and passwd against configuration */
void auth_peer_fail(ppp_pcb *pcb, int protocol); void auth_peer_fail(ppp_pcb *pcb, int protocol);
/* peer failed to authenticate itself */ /* peer failed to authenticate itself */
void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen); void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen);
/* peer successfully authenticated itself */ /* peer successfully authenticated itself */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
void auth_withpeer_fail(ppp_pcb *pcb, int protocol); void auth_withpeer_fail(ppp_pcb *pcb, int protocol);
/* we failed to authenticate ourselves */ /* we failed to authenticate ourselves */
void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor); void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor);
/* we successfully authenticated ourselves */ /* we successfully authenticated ourselves */
#endif /* PPP_AUTH_SUPPORT */ #endif /* PPP_AUTH_SUPPORT */
void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */ void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */
void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */ void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */
void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */ void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */
#if PPP_AUTH_SUPPORT #if PPP_AUTH_SUPPORT
int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server); int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server);
/* get "secret" for chap */ /* get "secret" for chap */
#endif /* PPP_AUTH_SUPPORT */ #endif /* PPP_AUTH_SUPPORT */
/* Procedures exported from ipcp.c */ /* Procedures exported from ipcp.c */
@ -583,8 +583,8 @@ int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secre
/* Procedures exported from demand.c */ /* Procedures exported from demand.c */
#if DEMAND_SUPPORT #if DEMAND_SUPPORT
void demand_conf (void); /* config interface(s) for demand-dial */ void demand_conf (void); /* config interface(s) for demand-dial */
void demand_block (void); /* set all NPs to queue up packets */ void demand_block (void); /* set all NPs to queue up packets */
void demand_unblock (void); /* set all NPs to pass packets */ void demand_unblock (void); /* set all NPs to pass packets */
void demand_discard (void); /* set all NPs to discard packets */ void demand_discard (void); /* set all NPs to discard packets */
void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/ void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/
@ -601,10 +601,10 @@ void mp_bundle_terminated (void);
char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */ char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */
int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */ int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */
#else #else
#define mp_bundle_terminated() /* nothing */ #define mp_bundle_terminated() /* nothing */
#define mp_exit_bundle() /* nothing */ #define mp_exit_bundle() /* nothing */
#define doing_multilink 0 #define doing_multilink 0
#define multilink_master 0 #define multilink_master 0
#endif #endif
/* Procedures exported from utils.c. */ /* Procedures exported from utils.c. */

View File

@ -36,7 +36,7 @@
/* This header file is included in all PPP modules needing hashes and/or ciphers */ /* This header file is included in all PPP modules needing hashes and/or ciphers */
#ifndef PPPCRYPT_H #ifndef PPPCRYPT_H
#define PPPCRYPT_H #define PPPCRYPT_H
/* /*
* If included PolarSSL copy is not used, user is expected to include * If included PolarSSL copy is not used, user is expected to include

View File

@ -53,44 +53,44 @@
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define UPAP_HEADERLEN 4 #define UPAP_HEADERLEN 4
/* /*
* UPAP codes. * UPAP codes.
*/ */
#define UPAP_AUTHREQ 1 /* Authenticate-Request */ #define UPAP_AUTHREQ 1 /* Authenticate-Request */
#define UPAP_AUTHACK 2 /* Authenticate-Ack */ #define UPAP_AUTHACK 2 /* Authenticate-Ack */
#define UPAP_AUTHNAK 3 /* Authenticate-Nak */ #define UPAP_AUTHNAK 3 /* Authenticate-Nak */
/* /*
* Client states. * Client states.
*/ */
#define UPAPCS_INITIAL 0 /* Connection down */ #define UPAPCS_INITIAL 0 /* Connection down */
#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */ #define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */
#define UPAPCS_PENDING 2 /* Connection down, have requested auth */ #define UPAPCS_PENDING 2 /* Connection down, have requested auth */
#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */ #define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */
#define UPAPCS_OPEN 4 /* We've received an Ack */ #define UPAPCS_OPEN 4 /* We've received an Ack */
#define UPAPCS_BADAUTH 5 /* We've received a Nak */ #define UPAPCS_BADAUTH 5 /* We've received a Nak */
/* /*
* Server states. * Server states.
*/ */
#define UPAPSS_INITIAL 0 /* Connection down */ #define UPAPSS_INITIAL 0 /* Connection down */
#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */ #define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */
#define UPAPSS_PENDING 2 /* Connection down, have requested auth */ #define UPAPSS_PENDING 2 /* Connection down, have requested auth */
#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */ #define UPAPSS_LISTEN 3 /* Listening for an Authenticate */
#define UPAPSS_OPEN 4 /* We've sent an Ack */ #define UPAPSS_OPEN 4 /* We've sent an Ack */
#define UPAPSS_BADAUTH 5 /* We've sent a Nak */ #define UPAPSS_BADAUTH 5 /* We've sent a Nak */
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define UPAP_DEFTIMEOUT 3 /* Timeout (seconds) for retransmitting req */ #define UPAP_DEFTIMEOUT 3 /* Timeout (seconds) for retransmitting req */
#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ #define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
/* /*
@ -98,16 +98,16 @@
*/ */
#if PAP_SUPPORT #if PAP_SUPPORT
typedef struct upap_state { typedef struct upap_state {
const char *us_user; /* User */ const char *us_user; /* User */
u8_t us_userlen; /* User length */ u8_t us_userlen; /* User length */
const char *us_passwd; /* Password */ const char *us_passwd; /* Password */
u8_t us_passwdlen; /* Password length */ u8_t us_passwdlen; /* Password length */
u8_t us_clientstate; /* Client state */ u8_t us_clientstate; /* Client state */
#if PPP_SERVER #if PPP_SERVER
u8_t us_serverstate; /* Server state */ u8_t us_serverstate; /* Server state */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
u8_t us_id; /* Current id */ u8_t us_id; /* Current id */
u8_t us_transmits; /* Number of auth-reqs sent */ u8_t us_transmits; /* Number of auth-reqs sent */
} upap_state; } upap_state;
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2001-2004 Swedish Institute of Computer Science. * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
* COPYRIGHT (C) 2006-2021, RT-Thread Development Team * COPYRIGHT (C) 2006-2018, RT-Thread Development Team
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, * Redistribution and use in source and binary forms, with or without modification,
@ -868,27 +868,27 @@ void list_if(void)
rt_kprintf("gw address: %s\n", ipaddr_ntoa(&(netif->gw))); rt_kprintf("gw address: %s\n", ipaddr_ntoa(&(netif->gw)));
rt_kprintf("net mask : %s\n", ipaddr_ntoa(&(netif->netmask))); rt_kprintf("net mask : %s\n", ipaddr_ntoa(&(netif->netmask)));
#if LWIP_IPV6 #if LWIP_IPV6
{ {
ip6_addr_t *addr; ip6_addr_t *addr;
int addr_state; int addr_state;
int i; int i;
addr = (ip6_addr_t *)&netif->ip6_addr[0]; addr = (ip6_addr_t *)&netif->ip6_addr[0];
addr_state = netif->ip6_addr_state[0]; addr_state = netif->ip6_addr_state[0];
rt_kprintf("\nipv6 link-local: %s state:%02X %s\n", ip6addr_ntoa(addr), rt_kprintf("\nipv6 link-local: %s state:%02X %s\n", ip6addr_ntoa(addr),
addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID"); addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID");
for(i=1; i<LWIP_IPV6_NUM_ADDRESSES; i++) for(i=1; i<LWIP_IPV6_NUM_ADDRESSES; i++)
{ {
addr = (ip6_addr_t *)&netif->ip6_addr[i]; addr = (ip6_addr_t *)&netif->ip6_addr[i];
addr_state = netif->ip6_addr_state[i]; addr_state = netif->ip6_addr_state[i];
rt_kprintf("ipv6[%d] address: %s state:%02X %s\n", i, ip6addr_ntoa(addr), rt_kprintf("ipv6[%d] address: %s state:%02X %s\n", i, ip6addr_ntoa(addr),
addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID"); addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID");
} }
} }
rt_kprintf("\r\n"); rt_kprintf("\r\n");
#endif /* LWIP_IPV6 */ #endif /* LWIP_IPV6 */
netif = netif->next; netif = netif->next;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -43,84 +43,84 @@
#include "netif/ppp/magic.h" #include "netif/ppp/magic.h"
#include "netif/ppp/pppcrypt.h" #include "netif/ppp/pppcrypt.h"
#define MD5_HASH_SIZE 16 #define MD5_HASH_SIZE 16
#define MD5_MIN_CHALLENGE 17 #define MD5_MIN_CHALLENGE 17
#define MD5_MAX_CHALLENGE 24 #define MD5_MAX_CHALLENGE 24
#define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE 3 /* 2^3-1 = 7, 17+7 = 24 */ #define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE 3 /* 2^3-1 = 7, 17+7 = 24 */
#if PPP_SERVER #if PPP_SERVER
static void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) { static void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) {
int clen; int clen;
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE); clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE);
*cp++ = clen; *cp++ = clen;
magic_random_bytes(cp, clen); magic_random_bytes(cp, clen);
} }
static int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name, static int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name,
const unsigned char *secret, int secret_len, const unsigned char *secret, int secret_len,
const unsigned char *challenge, const unsigned char *response, const unsigned char *challenge, const unsigned char *response,
char *message, int message_space) { char *message, int message_space) {
lwip_md5_context ctx; lwip_md5_context ctx;
unsigned char idbyte = id; unsigned char idbyte = id;
unsigned char hash[MD5_HASH_SIZE]; unsigned char hash[MD5_HASH_SIZE];
int challenge_len, response_len; int challenge_len, response_len;
LWIP_UNUSED_ARG(name); LWIP_UNUSED_ARG(name);
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
challenge_len = *challenge++; challenge_len = *challenge++;
response_len = *response++; response_len = *response++;
if (response_len == MD5_HASH_SIZE) { if (response_len == MD5_HASH_SIZE) {
/* Generate hash of ID, secret, challenge */ /* Generate hash of ID, secret, challenge */
lwip_md5_init(&ctx); lwip_md5_init(&ctx);
lwip_md5_starts(&ctx); lwip_md5_starts(&ctx);
lwip_md5_update(&ctx, &idbyte, 1); lwip_md5_update(&ctx, &idbyte, 1);
lwip_md5_update(&ctx, secret, secret_len); lwip_md5_update(&ctx, secret, secret_len);
lwip_md5_update(&ctx, challenge, challenge_len); lwip_md5_update(&ctx, challenge, challenge_len);
lwip_md5_finish(&ctx, hash); lwip_md5_finish(&ctx, hash);
lwip_md5_free(&ctx); lwip_md5_free(&ctx);
/* Test if our hash matches the peer's response */ /* Test if our hash matches the peer's response */
if (memcmp(hash, response, MD5_HASH_SIZE) == 0) { if (memcmp(hash, response, MD5_HASH_SIZE) == 0) {
ppp_slprintf(message, message_space, "Access granted"); ppp_slprintf(message, message_space, "Access granted");
return 1; return 1;
} }
} }
ppp_slprintf(message, message_space, "Access denied"); ppp_slprintf(message, message_space, "Access denied");
return 0; return 0;
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
static void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name, static void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
const unsigned char *challenge, const char *secret, int secret_len, const unsigned char *challenge, const char *secret, int secret_len,
unsigned char *private_) { unsigned char *private_) {
lwip_md5_context ctx; lwip_md5_context ctx;
unsigned char idbyte = id; unsigned char idbyte = id;
int challenge_len = *challenge++; int challenge_len = *challenge++;
LWIP_UNUSED_ARG(our_name); LWIP_UNUSED_ARG(our_name);
LWIP_UNUSED_ARG(private_); LWIP_UNUSED_ARG(private_);
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
lwip_md5_init(&ctx); lwip_md5_init(&ctx);
lwip_md5_starts(&ctx); lwip_md5_starts(&ctx);
lwip_md5_update(&ctx, &idbyte, 1); lwip_md5_update(&ctx, &idbyte, 1);
lwip_md5_update(&ctx, (const u_char *)secret, secret_len); lwip_md5_update(&ctx, (const u_char *)secret, secret_len);
lwip_md5_update(&ctx, challenge, challenge_len); lwip_md5_update(&ctx, challenge, challenge_len);
lwip_md5_finish(&ctx, &response[1]); lwip_md5_finish(&ctx, &response[1]);
lwip_md5_free(&ctx); lwip_md5_free(&ctx);
response[0] = MD5_HASH_SIZE; response[0] = MD5_HASH_SIZE;
} }
const struct chap_digest_type md5_digest = { const struct chap_digest_type md5_digest = {
CHAP_MD5, /* code */ CHAP_MD5, /* code */
#if PPP_SERVER #if PPP_SERVER
chap_md5_generate_challenge, chap_md5_generate_challenge,
chap_md5_verify_response, chap_md5_verify_response,
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
chap_md5_make_response, chap_md5_make_response,
NULL, /* check_success */ NULL, /* check_success */
NULL, /* handle_failure */ NULL, /* handle_failure */
}; };
#endif /* PPP_SUPPORT && CHAP_SUPPORT */ #endif /* PPP_SUPPORT && CHAP_SUPPORT */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -87,11 +87,11 @@ demand_conf()
/* framemax = lcp_allowoptions[0].mru; /* framemax = lcp_allowoptions[0].mru;
if (framemax < PPP_MRU) */ if (framemax < PPP_MRU) */
framemax = PPP_MRU; framemax = PPP_MRU;
framemax += PPP_HDRLEN + PPP_FCSLEN; framemax += PPP_HDRLEN + PPP_FCSLEN;
frame = malloc(framemax); frame = malloc(framemax);
if (frame == NULL) if (frame == NULL)
novm("demand frame"); novm("demand frame");
framelen = 0; framelen = 0;
pend_q = NULL; pend_q = NULL;
escape_flag = 0; escape_flag = 0;
@ -100,8 +100,8 @@ demand_conf()
netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU)); netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));
if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0 if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0
|| ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0) || ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)
fatal("Couldn't set up demand-dialled PPP interface: %m"); fatal("Couldn't set up demand-dialled PPP interface: %m");
#ifdef PPP_FILTER #ifdef PPP_FILTER
set_filters(&pass_filter, &active_filter); set_filters(&pass_filter, &active_filter);
@ -111,12 +111,12 @@ demand_conf()
* Call the demand_conf procedure for each protocol that's got one. * Call the demand_conf procedure for each protocol that's got one.
*/ */
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
((*protp->demand_conf)(pcb)); ((*protp->demand_conf)(pcb));
/* FIXME: find a way to die() here */ /* FIXME: find a way to die() here */
#if 0 #if 0
if (!((*protp->demand_conf)(pcb))) if (!((*protp->demand_conf)(pcb)))
die(1); die(1);
#endif #endif
} }
@ -131,8 +131,8 @@ demand_block()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE);
get_loop_output(); get_loop_output();
} }
@ -148,14 +148,14 @@ demand_discard()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR);
get_loop_output(); get_loop_output();
/* discard all saved packets */ /* discard all saved packets */
for (pkt = pend_q; pkt != NULL; pkt = nextpkt) { for (pkt = pend_q; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next; nextpkt = pkt->next;
free(pkt); free(pkt);
} }
pend_q = NULL; pend_q = NULL;
framelen = 0; framelen = 0;
@ -174,46 +174,46 @@ demand_unblock()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS);
} }
/* /*
* FCS lookup table as calculated by genfcstab. * FCS lookup table as calculated by genfcstab.
*/ */
static u_short fcstab[256] = { static u_short fcstab[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
}; };
/* /*
@ -238,35 +238,35 @@ loop_chars(p, n)
} }
for (; n > 0; --n) { for (; n > 0; --n) {
c = *p++; c = *p++;
if (c == PPP_FLAG) { if (c == PPP_FLAG) {
if (!escape_flag && !flush_flag if (!escape_flag && !flush_flag
&& framelen > 2 && fcs == PPP_GOODFCS) { && framelen > 2 && fcs == PPP_GOODFCS) {
framelen -= 2; framelen -= 2;
if (loop_frame((unsigned char *)frame, framelen)) if (loop_frame((unsigned char *)frame, framelen))
rv = 1; rv = 1;
} }
framelen = 0; framelen = 0;
flush_flag = 0; flush_flag = 0;
escape_flag = 0; escape_flag = 0;
fcs = PPP_INITFCS; fcs = PPP_INITFCS;
continue; continue;
} }
if (flush_flag) if (flush_flag)
continue; continue;
if (escape_flag) { if (escape_flag) {
c ^= PPP_TRANS; c ^= PPP_TRANS;
escape_flag = 0; escape_flag = 0;
} else if (c == PPP_ESCAPE) { } else if (c == PPP_ESCAPE) {
escape_flag = 1; escape_flag = 1;
continue; continue;
} }
if (framelen >= framemax) { if (framelen >= framemax) {
flush_flag = 1; flush_flag = 1;
continue; continue;
} }
frame[framelen++] = c; frame[framelen++] = c;
fcs = PPP_FCS(fcs, c); fcs = PPP_FCS(fcs, c);
} }
return rv; return rv;
} }
@ -290,22 +290,22 @@ loop_frame(frame, len)
/* dbglog("from loop: %P", frame, len); */ /* dbglog("from loop: %P", frame, len); */
if (len < PPP_HDRLEN) if (len < PPP_HDRLEN)
return 0; return 0;
if ((PPP_PROTOCOL(frame) & 0x8000) != 0) if ((PPP_PROTOCOL(frame) & 0x8000) != 0)
return 0; /* shouldn't get any of these anyway */ return 0; /* shouldn't get any of these anyway */
if (!active_packet(frame, len)) if (!active_packet(frame, len))
return 0; return 0;
pkt = (struct packet *) malloc(sizeof(struct packet) + len); pkt = (struct packet *) malloc(sizeof(struct packet) + len);
if (pkt != NULL) { if (pkt != NULL) {
pkt->length = len; pkt->length = len;
pkt->next = NULL; pkt->next = NULL;
memcpy(pkt->data, frame, len); memcpy(pkt->data, frame, len);
if (pend_q == NULL) if (pend_q == NULL)
pend_q = pkt; pend_q = pkt;
else else
pend_qtail->next = pkt; pend_qtail->next = pkt;
pend_qtail = pkt; pend_qtail = pkt;
} }
return 1; return 1;
} }
@ -332,15 +332,15 @@ demand_rexmit(proto, newip)
pend_q = NULL; pend_q = NULL;
tv.tv_sec = 1; tv.tv_sec = 1;
tv.tv_usec = 0; tv.tv_usec = 0;
select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) { for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next; nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) { if (PPP_PROTOCOL(pkt->data) == proto) {
if ( (proto == PPP_IP) && newip ) { if ( (proto == PPP_IP) && newip ) {
/* Get old checksum */ /* Get old checksum */
iphdr = (pkt->data[4] & 15) << 2; iphdr = (pkt->data[4] & 15) << 2;
checksum = *((unsigned short *) (pkt->data+14)); checksum = *((unsigned short *) (pkt->data+14));
if (checksum == 0xFFFF) { if (checksum == 0xFFFF) {
checksum = 0; checksum = 0;
} }
@ -348,7 +348,7 @@ demand_rexmit(proto, newip)
if (pkt->data[13] == 17) { if (pkt->data[13] == 17) {
pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr)); pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
if (pkt_checksum) { if (pkt_checksum) {
cv = 1; cv = 1;
if (pkt_checksum == 0xFFFF) { if (pkt_checksum == 0xFFFF) {
pkt_checksum = 0; pkt_checksum = 0;
@ -359,71 +359,71 @@ demand_rexmit(proto, newip)
} }
} }
if (pkt->data[13] == 6) { if (pkt->data[13] == 6) {
pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr)); pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
cv = 1; cv = 1;
if (pkt_checksum == 0xFFFF) { if (pkt_checksum == 0xFFFF) {
pkt_checksum = 0; pkt_checksum = 0;
} }
} }
/* Delete old Source-IP-Address */ /* Delete old Source-IP-Address */
checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
/* Change Source-IP-Address */ /* Change Source-IP-Address */
* ((u32_t *) (pkt->data + 16)) = newip; * ((u32_t *) (pkt->data + 16)) = newip;
/* Add new Source-IP-Address */ /* Add new Source-IP-Address */
checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
/* Write new checksum */ /* Write new checksum */
if (!checksum) { if (!checksum) {
checksum = 0xFFFF; checksum = 0xFFFF;
} }
*((unsigned short *) (pkt->data+14)) = checksum; *((unsigned short *) (pkt->data+14)) = checksum;
if (pkt->data[13] == 6) { if (pkt->data[13] == 6) {
*((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum; *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
} }
if (cv && (pkt->data[13] == 17) ) { if (cv && (pkt->data[13] == 17) ) {
*((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum; *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
} }
/* Log Packet */ /* Log Packet */
strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16)))); strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
if (pkt->data[13] == 1) { if (pkt->data[13] == 1) {
syslog(LOG_INFO,"Open ICMP %s -> %s\n", syslog(LOG_INFO,"Open ICMP %s -> %s\n",
ipstr, ipstr,
inet_ntoa(*( (struct in_addr *) (pkt->data+20)))); inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
} else { } else {
syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n", syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
pkt->data[13] == 6 ? "TCP" : "UDP", pkt->data[13] == 6 ? "TCP" : "UDP",
ipstr, ipstr,
ntohs(*( (short *) (pkt->data+iphdr+4))), ntohs(*( (short *) (pkt->data+iphdr+4))),
inet_ntoa(*( (struct in_addr *) (pkt->data+20))), inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
ntohs(*( (short *) (pkt->data+iphdr+6)))); ntohs(*( (short *) (pkt->data+iphdr+6))));
} }
} }
output(pcb, pkt->data, pkt->length); output(pcb, pkt->data, pkt->length);
free(pkt); free(pkt);
} else { } else {
if (prev == NULL) if (prev == NULL)
pend_q = pkt; pend_q = pkt;
else else
prev->next = pkt; prev->next = pkt;
prev = pkt; prev = pkt;
} }
} }
pend_qtail = prev; pend_qtail = prev;
if (prev != NULL) if (prev != NULL)
prev->next = NULL; prev->next = NULL;
} }
/* /*
@ -439,27 +439,27 @@ active_packet(p, len)
const struct protent *protp; const struct protent *protp;
if (len < PPP_HDRLEN) if (len < PPP_HDRLEN)
return 0; return 0;
proto = PPP_PROTOCOL(p); proto = PPP_PROTOCOL(p);
#ifdef PPP_FILTER #ifdef PPP_FILTER
p[0] = 1; /* outbound packet indicator */ p[0] = 1; /* outbound packet indicator */
if ((pass_filter.bf_len != 0 if ((pass_filter.bf_len != 0
&& bpf_filter(pass_filter.bf_insns, p, len, len) == 0) && bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
|| (active_filter.bf_len != 0 || (active_filter.bf_len != 0
&& bpf_filter(active_filter.bf_insns, p, len, len) == 0)) { && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) {
p[0] = 0xff; p[0] = 0xff;
return 0; return 0;
} }
p[0] = 0xff; p[0] = 0xff;
#endif #endif
for (i = 0; (protp = protocols[i]) != NULL; ++i) { for (i = 0; (protp = protocols[i]) != NULL; ++i) {
if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) { if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
if (protp->active_pkt == NULL) if (protp->active_pkt == NULL)
return 1; return 1;
return (*protp->active_pkt)(p, len); return (*protp->active_pkt)(p, len);
}
} }
} return 0; /* not a supported protocol !!?? */
return 0; /* not a supported protocol !!?? */
} }
#endif /* PPP_SUPPORT && DEMAND_SUPPORT */ #endif /* PPP_SUPPORT && DEMAND_SUPPORT */

File diff suppressed because it is too large Load Diff

View File

@ -92,8 +92,8 @@ static void ecp_protrej (int unit);
*/ */
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
static int ecp_printpkt (const u_char *pkt, int len, static int ecp_printpkt (const u_char *pkt, int len,
void (*printer) (void *, char *, ...), void (*printer) (void *, char *, ...),
void *arg); void *arg);
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
/* /*
static void ecp_datainput (int unit, u_char *pkt, int len); static void ecp_datainput (int unit, u_char *pkt, int len);
@ -129,10 +129,10 @@ const struct protent ecp_protent = {
}; };
fsm ecp_fsm[NUM_PPP]; fsm ecp_fsm[NUM_PPP];
ecp_options ecp_wantoptions[NUM_PPP]; /* what to request the peer to use */ ecp_options ecp_wantoptions[NUM_PPP]; /* what to request the peer to use */
ecp_options ecp_gotoptions[NUM_PPP]; /* what the peer agreed to do */ ecp_options ecp_gotoptions[NUM_PPP]; /* what the peer agreed to do */
ecp_options ecp_allowoptions[NUM_PPP]; /* what we'll agree to do */ ecp_options ecp_allowoptions[NUM_PPP]; /* what we'll agree to do */
ecp_options ecp_hisoptions[NUM_PPP]; /* what we agreed to do */ ecp_options ecp_hisoptions[NUM_PPP]; /* what we agreed to do */
static const fsm_callbacks ecp_callbacks = { static const fsm_callbacks ecp_callbacks = {
NULL, /* ecp_resetci, */ NULL, /* ecp_resetci, */

View File

@ -48,8 +48,8 @@ char *eui64_ntoa(eui64_t e) {
static char buf[20]; static char buf[20];
sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x", sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x",
e.e8[0], e.e8[1], e.e8[2], e.e8[3], e.e8[0], e.e8[1], e.e8[2], e.e8[3],
e.e8[4], e.e8[5], e.e8[6], e.e8[7]); e.e8[4], e.e8[5], e.e8[6], e.e8[7]);
return buf; return buf;
} }

View File

@ -68,7 +68,7 @@ static void fsm_rtermack(fsm *f);
static void fsm_rcoderej(fsm *f, u_char *inp, int len); static void fsm_rcoderej(fsm *f, u_char *inp, int len);
static void fsm_sconfreq(fsm *f, int retransmit); static void fsm_sconfreq(fsm *f, int retransmit);
#define PROTO_NAME(f) ((f)->callbacks->proto_name) #define PROTO_NAME(f) ((f)->callbacks->proto_name)
/* /*
* fsm_init - Initialize fsm. * fsm_init - Initialize fsm.
@ -79,7 +79,7 @@ void fsm_init(fsm *f) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
f->flags = 0; f->flags = 0;
f->id = 0; /* XXX Start with random id? */ f->id = 0; /* XXX Start with random id? */
f->maxnakloops = pcb->settings.fsm_max_nak_loops; f->maxnakloops = pcb->settings.fsm_max_nak_loops;
f->term_reason_len = 0; f->term_reason_len = 0;
} }
@ -91,22 +91,22 @@ void fsm_init(fsm *f) {
void fsm_lowerup(fsm *f) { void fsm_lowerup(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_INITIAL: case PPP_FSM_INITIAL:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
break; break;
case PPP_FSM_STARTING: case PPP_FSM_STARTING:
if( f->flags & OPT_SILENT ) if( f->flags & OPT_SILENT )
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
else { else {
/* Send an initial configure-request */ /* Send an initial configure-request */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
default: default:
FSMDEBUG(("%s: Up event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Up event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -119,37 +119,37 @@ void fsm_lowerup(fsm *f) {
void fsm_lowerdown(fsm *f) { void fsm_lowerdown(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
if( f->callbacks->starting ) if( f->callbacks->starting )
(*f->callbacks->starting)(f); (*f->callbacks->starting)(f);
break; break;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if( f->callbacks->down ) if( f->callbacks->down )
(*f->callbacks->down)(f); (*f->callbacks->down)(f);
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
break; break;
default: default:
FSMDEBUG(("%s: Down event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Down event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -160,34 +160,34 @@ void fsm_lowerdown(fsm *f) {
void fsm_open(fsm *f) { void fsm_open(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_INITIAL: case PPP_FSM_INITIAL:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
if( f->callbacks->starting ) if( f->callbacks->starting )
(*f->callbacks->starting)(f); (*f->callbacks->starting)(f);
break; break;
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
if( f->flags & OPT_SILENT ) if( f->flags & OPT_SILENT )
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
else { else {
/* Send an initial configure-request */ /* Send an initial configure-request */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
f->state = PPP_FSM_STOPPING; f->state = PPP_FSM_STOPPING;
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if( f->flags & OPT_RESTART ){ if( f->flags & OPT_RESTART ){
fsm_lowerdown(f); fsm_lowerdown(f);
fsm_lowerup(f); fsm_lowerup(f);
} }
break; break;
default: default:
break; break;
} }
} }
@ -201,25 +201,25 @@ static void terminate_layer(fsm *f, int nextstate) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
if( f->state != PPP_FSM_OPENED ) if( f->state != PPP_FSM_OPENED )
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
else if( f->callbacks->down ) else if( f->callbacks->down )
(*f->callbacks->down)(f); /* Inform upper layers we're down */ (*f->callbacks->down)(f); /* Inform upper layers we're down */
/* Init restart counter and send Terminate-Request */ /* Init restart counter and send Terminate-Request */
f->retransmits = pcb->settings.fsm_max_term_transmits; f->retransmits = pcb->settings.fsm_max_term_transmits;
fsm_sdata(f, TERMREQ, f->reqid = ++f->id, fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
(const u_char *) f->term_reason, f->term_reason_len); (const u_char *) f->term_reason, f->term_reason_len);
if (f->retransmits == 0) { if (f->retransmits == 0) {
/* /*
* User asked for no terminate requests at all; just close it. * User asked for no terminate requests at all; just close it.
* We've already fired off one Terminate-Request just to be nice * We've already fired off one Terminate-Request just to be nice
* to the peer, but we're not going to wait for a reply. * to the peer, but we're not going to wait for a reply.
*/ */
f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED; f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
return; return;
} }
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
@ -239,23 +239,23 @@ void fsm_close(fsm *f, const char *reason) {
f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) ); f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) );
switch( f->state ){ switch( f->state ){
case PPP_FSM_STARTING: case PPP_FSM_STARTING:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
f->state = PPP_FSM_CLOSING; f->state = PPP_FSM_CLOSING;
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
terminate_layer(f, PPP_FSM_CLOSING); terminate_layer(f, PPP_FSM_CLOSING);
break; break;
default: default:
break; break;
} }
} }
@ -270,44 +270,44 @@ static void fsm_timeout(void *arg) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
if( f->retransmits <= 0 ){ if( f->retransmits <= 0 ){
/* /*
* We've waited for an ack long enough. Peer probably heard us. * We've waited for an ack long enough. Peer probably heard us.
*/ */
f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED; f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
} else { } else {
/* Send Terminate-Request */ /* Send Terminate-Request */
fsm_sdata(f, TERMREQ, f->reqid = ++f->id, fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
(const u_char *) f->term_reason, f->term_reason_len); (const u_char *) f->term_reason, f->term_reason_len);
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
--f->retransmits; --f->retransmits;
} }
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
if (f->retransmits <= 0) { if (f->retransmits <= 0) {
ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f)); ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f));
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished ) if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
} else { } else {
/* Retransmit the configure-request */ /* Retransmit the configure-request */
if (f->callbacks->retransmit) if (f->callbacks->retransmit)
(*f->callbacks->retransmit)(f); (*f->callbacks->retransmit)(f);
fsm_sconfreq(f, 1); /* Re-send Configure-Request */ fsm_sconfreq(f, 1); /* Re-send Configure-Request */
if( f->state == PPP_FSM_ACKRCVD ) if( f->state == PPP_FSM_ACKRCVD )
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
default: default:
FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -326,26 +326,26 @@ void fsm_input(fsm *f, u_char *inpacket, int l) {
*/ */
inp = inpacket; inp = inpacket;
if (l < HEADERLEN) { if (l < HEADERLEN) {
FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
GETSHORT(len, inp); GETSHORT(len, inp);
if (len < HEADERLEN) { if (len < HEADERLEN) {
FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol));
return; return;
} }
if (len > l) { if (len > l) {
FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol));
return; return;
} }
len -= HEADERLEN; /* subtract header length */ len -= HEADERLEN; /* subtract header length */
if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){ if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){
FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.", FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.",
f->protocol, f->state)); f->protocol, f->state));
return; return;
} }
/* /*
@ -353,35 +353,35 @@ void fsm_input(fsm *f, u_char *inpacket, int l) {
*/ */
switch (code) { switch (code) {
case CONFREQ: case CONFREQ:
fsm_rconfreq(f, id, inp, len); fsm_rconfreq(f, id, inp, len);
break; break;
case CONFACK: case CONFACK:
fsm_rconfack(f, id, inp, len); fsm_rconfack(f, id, inp, len);
break; break;
case CONFNAK: case CONFNAK:
case CONFREJ: case CONFREJ:
fsm_rconfnakrej(f, code, id, inp, len); fsm_rconfnakrej(f, code, id, inp, len);
break; break;
case TERMREQ: case TERMREQ:
fsm_rtermreq(f, id, inp, len); fsm_rtermreq(f, id, inp, len);
break; break;
case TERMACK: case TERMACK:
fsm_rtermack(f); fsm_rtermack(f);
break; break;
case CODEREJ: case CODEREJ:
fsm_rcoderej(f, inp, len); fsm_rcoderej(f, inp, len);
break; break;
default: default:
if( !f->callbacks->extcode if( !f->callbacks->extcode
|| !(*f->callbacks->extcode)(f, code, id, inp, len) ) || !(*f->callbacks->extcode)(f, code, id, inp, len) )
fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN); fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
break; break;
} }
} }
@ -394,61 +394,61 @@ static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
/* Go away, we're closed */ /* Go away, we're closed */
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
return; return;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
return; return;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if( f->callbacks->down ) if( f->callbacks->down )
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
/* Negotiation started by our peer */ /* Negotiation started by our peer */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
/* /*
* Pass the requested configuration options * Pass the requested configuration options
* to protocol-specific code for checking. * to protocol-specific code for checking.
*/ */
if (f->callbacks->reqci){ /* Check CI */ if (f->callbacks->reqci){ /* Check CI */
reject_if_disagree = (f->nakloops >= f->maxnakloops); reject_if_disagree = (f->nakloops >= f->maxnakloops);
code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree); code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
} else if (len) } else if (len)
code = CONFREJ; /* Reject all CI */ code = CONFREJ; /* Reject all CI */
else else
code = CONFACK; code = CONFACK;
/* send the Ack, Nak or Rej to the peer */ /* send the Ack, Nak or Rej to the peer */
fsm_sdata(f, code, id, inp, len); fsm_sdata(f, code, id, inp, len);
if (code == CONFACK) { if (code == CONFACK) {
if (f->state == PPP_FSM_ACKRCVD) { if (f->state == PPP_FSM_ACKRCVD) {
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = PPP_FSM_OPENED; f->state = PPP_FSM_OPENED;
if (f->callbacks->up) if (f->callbacks->up)
(*f->callbacks->up)(f); /* Inform upper layers */ (*f->callbacks->up)(f); /* Inform upper layers */
} else } else
f->state = PPP_FSM_ACKSENT; f->state = PPP_FSM_ACKSENT;
f->nakloops = 0; f->nakloops = 0;
} else { } else {
/* we sent CONFACK or CONFREJ */ /* we sent CONFACK or CONFREJ */
if (f->state != PPP_FSM_ACKRCVD) if (f->state != PPP_FSM_ACKRCVD)
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
if( code == CONFNAK ) if( code == CONFNAK )
++f->nakloops; ++f->nakloops;
} }
} }
@ -459,13 +459,13 @@ static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {
static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) { static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
if (id != f->reqid || f->seen_ack) /* Expected id? */ if (id != f->reqid || f->seen_ack) /* Expected id? */
return; /* Nope, toss... */ return; /* Nope, toss... */
if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
(len == 0)) ){ (len == 0)) ){
/* Ack is bad - ignore it */ /* Ack is bad - ignore it */
ppp_error("Received bad configure-ack: %P", inp, len); ppp_error("Received bad configure-ack: %P", inp, len);
return; return;
} }
f->seen_ack = 1; f->seen_ack = 1;
f->rnakloops = 0; f->rnakloops = 0;
@ -473,38 +473,38 @@ static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
f->state = PPP_FSM_ACKRCVD; f->state = PPP_FSM_ACKRCVD;
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
/* Huh? an extra valid Ack? oh well... */ /* Huh? an extra valid Ack? oh well... */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = PPP_FSM_OPENED; f->state = PPP_FSM_OPENED;
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
if (f->callbacks->up) if (f->callbacks->up)
(*f->callbacks->up)(f); /* Inform upper layers */ (*f->callbacks->up)(f); /* Inform upper layers */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -516,24 +516,24 @@ static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {
int ret; int ret;
int treat_as_reject; int treat_as_reject;
if (id != f->reqid || f->seen_ack) /* Expected id? */ if (id != f->reqid || f->seen_ack) /* Expected id? */
return; /* Nope, toss... */ return; /* Nope, toss... */
if (code == CONFNAK) { if (code == CONFNAK) {
++f->rnakloops; ++f->rnakloops;
treat_as_reject = (f->rnakloops >= f->maxnakloops); treat_as_reject = (f->rnakloops >= f->maxnakloops);
if (f->callbacks->nakci == NULL if (f->callbacks->nakci == NULL
|| !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) { || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {
ppp_error("Received bad configure-nak: %P", inp, len); ppp_error("Received bad configure-nak: %P", inp, len);
return; return;
} }
} else { } else {
f->rnakloops = 0; f->rnakloops = 0;
if (f->callbacks->rejci == NULL if (f->callbacks->rejci == NULL
|| !(ret = f->callbacks->rejci(f, inp, len))) { || !(ret = f->callbacks->rejci(f, inp, len))) {
ppp_error("Received bad configure-rej: %P", inp, len); ppp_error("Received bad configure-rej: %P", inp, len);
return; return;
} }
} }
f->seen_ack = 1; f->seen_ack = 1;
@ -541,35 +541,35 @@ static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
/* They didn't agree to what we wanted - try another request */ /* They didn't agree to what we wanted - try another request */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
if (ret < 0) if (ret < 0)
f->state = PPP_FSM_STOPPED; /* kludge for stopping CCP */ f->state = PPP_FSM_STOPPED; /* kludge for stopping CCP */
else else
fsm_sconfreq(f, 0); /* Send Configure-Request */ fsm_sconfreq(f, 0); /* Send Configure-Request */
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
/* Got a Nak/reject when we had already had an Ack?? oh well... */ /* Got a Nak/reject when we had already had an Ack?? oh well... */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -583,22 +583,22 @@ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
f->state = PPP_FSM_REQSENT; /* Start over but keep trying */ f->state = PPP_FSM_REQSENT; /* Start over but keep trying */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if (len > 0) { if (len > 0) {
ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p); ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);
} else } else
ppp_info("%s terminated by peer", PROTO_NAME(f)); ppp_info("%s terminated by peer", PROTO_NAME(f));
f->retransmits = 0; f->retransmits = 0;
f->state = PPP_FSM_STOPPING; f->state = PPP_FSM_STOPPING;
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
break; break;
default: default:
break; break;
} }
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
@ -611,30 +611,30 @@ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {
static void fsm_rtermack(fsm *f) { static void fsm_rtermack(fsm *f) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
UNTIMEOUT(fsm_timeout, f); UNTIMEOUT(fsm_timeout, f);
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
UNTIMEOUT(fsm_timeout, f); UNTIMEOUT(fsm_timeout, f);
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -646,15 +646,15 @@ static void fsm_rcoderej(fsm *f, u_char *inp, int len) {
u_char code, id; u_char code, id;
if (len < HEADERLEN) { if (len < HEADERLEN) {
FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!")); FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!"));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id); ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);
if( f->state == PPP_FSM_ACKRCVD ) if( f->state == PPP_FSM_ACKRCVD )
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
@ -666,36 +666,36 @@ static void fsm_rcoderej(fsm *f, u_char *inp, int len) {
void fsm_protreject(fsm *f) { void fsm_protreject(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
terminate_layer(f, PPP_FSM_STOPPING); terminate_layer(f, PPP_FSM_STOPPING);
break; break;
default: default:
FSMDEBUG(("%s: Protocol-reject event in state %d!", FSMDEBUG(("%s: Protocol-reject event in state %d!",
PROTO_NAME(f), f->state)); PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -710,17 +710,17 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
int cilen; int cilen;
if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){ if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){
/* Not currently negotiating - reset options */ /* Not currently negotiating - reset options */
if( f->callbacks->resetci ) if( f->callbacks->resetci )
(*f->callbacks->resetci)(f); (*f->callbacks->resetci)(f);
f->nakloops = 0; f->nakloops = 0;
f->rnakloops = 0; f->rnakloops = 0;
} }
if( !retransmit ){ if( !retransmit ){
/* New request - reset retransmission counter, use new ID */ /* New request - reset retransmission counter, use new ID */
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
f->reqid = ++f->id; f->reqid = ++f->id;
} }
f->seen_ack = 0; f->seen_ack = 0;
@ -729,11 +729,11 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
* Make up the request packet * Make up the request packet
*/ */
if( f->callbacks->cilen && f->callbacks->addci ){ if( f->callbacks->cilen && f->callbacks->addci ){
cilen = (*f->callbacks->cilen)(f); cilen = (*f->callbacks->cilen)(f);
if( cilen > pcb->peer_mru - HEADERLEN ) if( cilen > pcb->peer_mru - HEADERLEN )
cilen = pcb->peer_mru - HEADERLEN; cilen = pcb->peer_mru - HEADERLEN;
} else } else
cilen = 0; cilen = 0;
p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
if(NULL == p) if(NULL == p)
@ -750,8 +750,8 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
PUTCHAR(f->reqid, outp); PUTCHAR(f->reqid, outp);
PUTSHORT(cilen + HEADERLEN, outp); PUTSHORT(cilen + HEADERLEN, outp);
if (cilen != 0) { if (cilen != 0) {
(*f->callbacks->addci)(f, outp, &cilen); (*f->callbacks->addci)(f, outp, &cilen);
LWIP_ASSERT("cilen == p->len - HEADERLEN - PPP_HDRLEN", cilen == p->len - HEADERLEN - PPP_HDRLEN); LWIP_ASSERT("cilen == p->len - HEADERLEN - PPP_HDRLEN", cilen == p->len - HEADERLEN - PPP_HDRLEN);
} }
ppp_write(pcb, p); ppp_write(pcb, p);
@ -775,7 +775,7 @@ void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen)
/* Adjust length to be smaller than MTU */ /* Adjust length to be smaller than MTU */
if (datalen > pcb->peer_mru - HEADERLEN) if (datalen > pcb->peer_mru - HEADERLEN)
datalen = pcb->peer_mru - HEADERLEN; datalen = pcb->peer_mru - HEADERLEN;
outlen = datalen + HEADERLEN; outlen = datalen + HEADERLEN;
p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
@ -788,7 +788,7 @@ void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen)
outp = (u_char*)p->payload; outp = (u_char*)p->payload;
if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */ if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */
MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen); MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen);
MAKEHEADER(outp, f->protocol); MAKEHEADER(outp, f->protocol);
PUTCHAR(code, outp); PUTCHAR(code, outp);
PUTCHAR(id, outp); PUTCHAR(id, outp);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,20 +39,20 @@
#define SHA1_SIGNATURE_SIZE 20 #define SHA1_SIGNATURE_SIZE 20
/* ppp_mppe_state.bits definitions */ /* ppp_mppe_state.bits definitions */
#define MPPE_BIT_A 0x80 /* Encryption table were (re)inititalized */ #define MPPE_BIT_A 0x80 /* Encryption table were (re)inititalized */
#define MPPE_BIT_B 0x40 /* MPPC only (not implemented) */ #define MPPE_BIT_B 0x40 /* MPPC only (not implemented) */
#define MPPE_BIT_C 0x20 /* MPPC only (not implemented) */ #define MPPE_BIT_C 0x20 /* MPPC only (not implemented) */
#define MPPE_BIT_D 0x10 /* This is an encrypted frame */ #define MPPE_BIT_D 0x10 /* This is an encrypted frame */
#define MPPE_BIT_FLUSHED MPPE_BIT_A #define MPPE_BIT_FLUSHED MPPE_BIT_A
#define MPPE_BIT_ENCRYPTED MPPE_BIT_D #define MPPE_BIT_ENCRYPTED MPPE_BIT_D
#define MPPE_BITS(p) ((p)[0] & 0xf0) #define MPPE_BITS(p) ((p)[0] & 0xf0)
#define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1]) #define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1])
#define MPPE_CCOUNT_SPACE 0x1000 /* The size of the ccount space */ #define MPPE_CCOUNT_SPACE 0x1000 /* The size of the ccount space */
#define MPPE_OVHD 2 /* MPPE overhead/packet */ #define MPPE_OVHD 2 /* MPPE overhead/packet */
#define SANITY_MAX 1600 /* Max bogon factor we will tolerate */ #define SANITY_MAX 1600 /* Max bogon factor we will tolerate */
/* /*
* Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3. * Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3.
@ -60,37 +60,37 @@
*/ */
static void mppe_rekey(ppp_mppe_state * state, int initial_key) static void mppe_rekey(ppp_mppe_state * state, int initial_key)
{ {
lwip_sha1_context sha1_ctx; lwip_sha1_context sha1_ctx;
u8_t sha1_digest[SHA1_SIGNATURE_SIZE]; u8_t sha1_digest[SHA1_SIGNATURE_SIZE];
/* /*
* Key Derivation, from RFC 3078, RFC 3079. * Key Derivation, from RFC 3078, RFC 3079.
* Equivalent to Get_Key() for MS-CHAP as described in RFC 3079. * Equivalent to Get_Key() for MS-CHAP as described in RFC 3079.
*/ */
lwip_sha1_init(&sha1_ctx); lwip_sha1_init(&sha1_ctx);
lwip_sha1_starts(&sha1_ctx); lwip_sha1_starts(&sha1_ctx);
lwip_sha1_update(&sha1_ctx, state->master_key, state->keylen); lwip_sha1_update(&sha1_ctx, state->master_key, state->keylen);
lwip_sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE); lwip_sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE);
lwip_sha1_update(&sha1_ctx, state->session_key, state->keylen); lwip_sha1_update(&sha1_ctx, state->session_key, state->keylen);
lwip_sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE); lwip_sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE);
lwip_sha1_finish(&sha1_ctx, sha1_digest); lwip_sha1_finish(&sha1_ctx, sha1_digest);
lwip_sha1_free(&sha1_ctx); lwip_sha1_free(&sha1_ctx);
MEMCPY(state->session_key, sha1_digest, state->keylen); MEMCPY(state->session_key, sha1_digest, state->keylen);
if (!initial_key) { if (!initial_key) {
lwip_arc4_init(&state->arc4); lwip_arc4_init(&state->arc4);
lwip_arc4_setup(&state->arc4, sha1_digest, state->keylen); lwip_arc4_setup(&state->arc4, sha1_digest, state->keylen);
lwip_arc4_crypt(&state->arc4, state->session_key, state->keylen); lwip_arc4_crypt(&state->arc4, state->session_key, state->keylen);
lwip_arc4_free(&state->arc4); lwip_arc4_free(&state->arc4);
} }
if (state->keylen == 8) { if (state->keylen == 8) {
/* See RFC 3078 */ /* See RFC 3078 */
state->session_key[0] = 0xd1; state->session_key[0] = 0xd1;
state->session_key[1] = 0x26; state->session_key[1] = 0x26;
state->session_key[2] = 0x9e; state->session_key[2] = 0x9e;
} }
lwip_arc4_init(&state->arc4); lwip_arc4_init(&state->arc4);
lwip_arc4_setup(&state->arc4, state->session_key, state->keylen); lwip_arc4_setup(&state->arc4, state->session_key, state->keylen);
} }
/* /*
@ -98,8 +98,8 @@ static void mppe_rekey(ppp_mppe_state * state, int initial_key)
* don't have to keep multiple copies of keys. * don't have to keep multiple copies of keys.
*/ */
void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) { void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN); MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN);
} }
/* /*
@ -109,64 +109,64 @@ void
mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options) mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)
{ {
#if PPP_DEBUG #if PPP_DEBUG
const u8_t *debugstr = (const u8_t*)"mppe_comp_init"; const u8_t *debugstr = (const u8_t*)"mppe_comp_init";
if (&pcb->mppe_decomp == state) { if (&pcb->mppe_decomp == state) {
debugstr = (const u8_t*)"mppe_decomp_init"; debugstr = (const u8_t*)"mppe_decomp_init";
} }
#endif /* PPP_DEBUG */ #endif /* PPP_DEBUG */
/* Save keys. */ /* Save keys. */
MEMCPY(state->session_key, state->master_key, sizeof(state->master_key)); MEMCPY(state->session_key, state->master_key, sizeof(state->master_key));
if (options & MPPE_OPT_128) if (options & MPPE_OPT_128)
state->keylen = 16; state->keylen = 16;
else if (options & MPPE_OPT_40) else if (options & MPPE_OPT_40)
state->keylen = 8; state->keylen = 8;
else { else {
PPPDEBUG(LOG_DEBUG, ("%s[%d]: unknown key length\n", debugstr, PPPDEBUG(LOG_DEBUG, ("%s[%d]: unknown key length\n", debugstr,
pcb->netif->num)); pcb->netif->num));
lcp_close(pcb, "MPPE required but peer negotiation failed"); lcp_close(pcb, "MPPE required but peer negotiation failed");
return; return;
} }
if (options & MPPE_OPT_STATEFUL) if (options & MPPE_OPT_STATEFUL)
state->stateful = 1; state->stateful = 1;
/* Generate the initial session key. */ /* Generate the initial session key. */
mppe_rekey(state, 1); mppe_rekey(state, 1);
#if PPP_DEBUG #if PPP_DEBUG
{ {
int i; int i;
char mkey[sizeof(state->master_key) * 2 + 1]; char mkey[sizeof(state->master_key) * 2 + 1];
char skey[sizeof(state->session_key) * 2 + 1]; char skey[sizeof(state->session_key) * 2 + 1];
PPPDEBUG(LOG_DEBUG, ("%s[%d]: initialized with %d-bit %s mode\n", PPPDEBUG(LOG_DEBUG, ("%s[%d]: initialized with %d-bit %s mode\n",
debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40, debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40,
(state->stateful) ? "stateful" : "stateless")); (state->stateful) ? "stateful" : "stateless"));
for (i = 0; i < (int)sizeof(state->master_key); i++) for (i = 0; i < (int)sizeof(state->master_key); i++)
sprintf(mkey + i * 2, "%02x", state->master_key[i]); sprintf(mkey + i * 2, "%02x", state->master_key[i]);
for (i = 0; i < (int)sizeof(state->session_key); i++) for (i = 0; i < (int)sizeof(state->session_key); i++)
sprintf(skey + i * 2, "%02x", state->session_key[i]); sprintf(skey + i * 2, "%02x", state->session_key[i]);
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("%s[%d]: keys: master: %s initial session: %s\n", ("%s[%d]: keys: master: %s initial session: %s\n",
debugstr, pcb->netif->num, mkey, skey)); debugstr, pcb->netif->num, mkey, skey));
} }
#endif /* PPP_DEBUG */ #endif /* PPP_DEBUG */
/* /*
* Initialize the coherency count. The initial value is not specified * Initialize the coherency count. The initial value is not specified
* in RFC 3078, but we can make a reasonable assumption that it will * in RFC 3078, but we can make a reasonable assumption that it will
* start at 0. Setting it to the max here makes the comp/decomp code * start at 0. Setting it to the max here makes the comp/decomp code
* do the right thing (determined through experiment). * do the right thing (determined through experiment).
*/ */
state->ccount = MPPE_CCOUNT_SPACE - 1; state->ccount = MPPE_CCOUNT_SPACE - 1;
/* /*
* Note that even though we have initialized the key table, we don't * Note that even though we have initialized the key table, we don't
* set the FLUSHED bit. This is contrary to RFC 3078, sec. 3.1. * set the FLUSHED bit. This is contrary to RFC 3078, sec. 3.1.
*/ */
state->bits = MPPE_BIT_ENCRYPTED; state->bits = MPPE_BIT_ENCRYPTED;
} }
/* /*
@ -180,8 +180,8 @@ mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)
*/ */
void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state) void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
{ {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
state->bits |= MPPE_BIT_FLUSHED; state->bits |= MPPE_BIT_FLUSHED;
} }
/* /*
@ -192,74 +192,74 @@ void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
err_t err_t
mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol) mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol)
{ {
struct pbuf *n, *np; struct pbuf *n, *np;
u8_t *pl; u8_t *pl;
err_t err; err_t err;
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
/* TCP stack requires that we don't change the packet payload, therefore we copy /* TCP stack requires that we don't change the packet payload, therefore we copy
* the whole packet before encryption. * the whole packet before encryption.
*/ */
np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_POOL); np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_POOL);
if (!np) { if (!np) {
return ERR_MEM; return ERR_MEM;
} }
/* Hide MPPE header + protocol */ /* Hide MPPE header + protocol */
pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol))); pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol)));
if ((err = pbuf_copy(np, *pb)) != ERR_OK) { if ((err = pbuf_copy(np, *pb)) != ERR_OK) {
pbuf_free(np); pbuf_free(np);
return err; return err;
} }
/* Reveal MPPE header + protocol */ /* Reveal MPPE header + protocol */
pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol))); pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol)));
*pb = np; *pb = np;
pl = (u8_t*)np->payload; pl = (u8_t*)np->payload;
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: ccount %d\n", pcb->netif->num, state->ccount)); PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: ccount %d\n", pcb->netif->num, state->ccount));
/* FIXME: use PUT* macros */ /* FIXME: use PUT* macros */
pl[0] = state->ccount>>8; pl[0] = state->ccount>>8;
pl[1] = state->ccount; pl[1] = state->ccount;
if (!state->stateful || /* stateless mode */ if (!state->stateful || /* stateless mode */
((state->ccount & 0xff) == 0xff) || /* "flag" packet */ ((state->ccount & 0xff) == 0xff) || /* "flag" packet */
(state->bits & MPPE_BIT_FLUSHED)) { /* CCP Reset-Request */ (state->bits & MPPE_BIT_FLUSHED)) { /* CCP Reset-Request */
/* We must rekey */ /* We must rekey */
if (state->stateful) { if (state->stateful) {
PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: rekeying\n", pcb->netif->num)); PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: rekeying\n", pcb->netif->num));
} }
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->bits |= MPPE_BIT_FLUSHED; state->bits |= MPPE_BIT_FLUSHED;
} }
pl[0] |= state->bits; pl[0] |= state->bits;
state->bits &= ~MPPE_BIT_FLUSHED; /* reset for next xmit */ state->bits &= ~MPPE_BIT_FLUSHED; /* reset for next xmit */
pl += MPPE_OVHD; pl += MPPE_OVHD;
/* Add protocol */ /* Add protocol */
/* FIXME: add PFC support */ /* FIXME: add PFC support */
pl[0] = protocol >> 8; pl[0] = protocol >> 8;
pl[1] = protocol; pl[1] = protocol;
/* Hide MPPE header */ /* Hide MPPE header */
pbuf_header(np, -(s16_t)MPPE_OVHD); pbuf_header(np, -(s16_t)MPPE_OVHD);
/* Encrypt packet */ /* Encrypt packet */
for (n = np; n != NULL; n = n->next) { for (n = np; n != NULL; n = n->next) {
lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len); lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
if (n->tot_len == n->len) { if (n->tot_len == n->len) {
break; break;
} }
} }
/* Reveal MPPE header */ /* Reveal MPPE header */
pbuf_header(np, (s16_t)MPPE_OVHD); pbuf_header(np, (s16_t)MPPE_OVHD);
return ERR_OK; return ERR_OK;
} }
/* /*
@ -267,9 +267,9 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto
*/ */
void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state) void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
{ {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
LWIP_UNUSED_ARG(state); LWIP_UNUSED_ARG(state);
return; return;
} }
/* /*
@ -278,135 +278,135 @@ void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
err_t err_t
mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb) mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb)
{ {
struct pbuf *n0 = *pb, *n; struct pbuf *n0 = *pb, *n;
u8_t *pl; u8_t *pl;
u16_t ccount; u16_t ccount;
u8_t flushed; u8_t flushed;
/* MPPE Header */ /* MPPE Header */
if (n0->len < MPPE_OVHD) { if (n0->len < MPPE_OVHD) {
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("mppe_decompress[%d]: short pkt (%d)\n", ("mppe_decompress[%d]: short pkt (%d)\n",
pcb->netif->num, n0->len)); pcb->netif->num, n0->len));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
pl = (u8_t*)n0->payload; pl = (u8_t*)n0->payload;
flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED; flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED;
ccount = MPPE_CCOUNT(pl); ccount = MPPE_CCOUNT(pl);
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: ccount %d\n", PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: ccount %d\n",
pcb->netif->num, ccount)); pcb->netif->num, ccount));
/* sanity checks -- terminate with extreme prejudice */ /* sanity checks -- terminate with extreme prejudice */
if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) { if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) {
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("mppe_decompress[%d]: ENCRYPTED bit not set!\n", ("mppe_decompress[%d]: ENCRYPTED bit not set!\n",
pcb->netif->num)); pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
if (!state->stateful && !flushed) { if (!state->stateful && !flushed) {
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set in " PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set in "
"stateless mode!\n", pcb->netif->num)); "stateless mode!\n", pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) { if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) {
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set on " PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set on "
"flag packet!\n", pcb->netif->num)); "flag packet!\n", pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
/* /*
* Check the coherency count. * Check the coherency count.
*/ */
if (!state->stateful) { if (!state->stateful) {
/* Discard late packet */ /* Discard late packet */
if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) { if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) {
state->sanity_errors++; state->sanity_errors++;
goto sanity_error; goto sanity_error;
} }
/* RFC 3078, sec 8.1. Rekey for every packet. */ /* RFC 3078, sec 8.1. Rekey for every packet. */
while (state->ccount != ccount) { while (state->ccount != ccount) {
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
} }
} else { } else {
/* RFC 3078, sec 8.2. */ /* RFC 3078, sec 8.2. */
if (!state->discard) { if (!state->discard) {
/* normal state */ /* normal state */
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
if (ccount != state->ccount) { if (ccount != state->ccount) {
/* /*
* (ccount > state->ccount) * (ccount > state->ccount)
* Packet loss detected, enter the discard state. * Packet loss detected, enter the discard state.
* Signal the peer to rekey (by sending a CCP Reset-Request). * Signal the peer to rekey (by sending a CCP Reset-Request).
*/ */
state->discard = 1; state->discard = 1;
ccp_resetrequest(pcb); ccp_resetrequest(pcb);
return ERR_BUF; return ERR_BUF;
} }
} else { } else {
/* discard state */ /* discard state */
if (!flushed) { if (!flushed) {
/* ccp.c will be silent (no additional CCP Reset-Requests). */ /* ccp.c will be silent (no additional CCP Reset-Requests). */
return ERR_BUF; return ERR_BUF;
} else { } else {
/* Rekey for every missed "flag" packet. */ /* Rekey for every missed "flag" packet. */
while ((ccount & ~0xff) != while ((ccount & ~0xff) !=
(state->ccount & ~0xff)) { (state->ccount & ~0xff)) {
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->ccount = state->ccount =
(state->ccount + (state->ccount +
256) % MPPE_CCOUNT_SPACE; 256) % MPPE_CCOUNT_SPACE;
} }
/* reset */ /* reset */
state->discard = 0; state->discard = 0;
state->ccount = ccount; state->ccount = ccount;
/* /*
* Another problem with RFC 3078 here. It implies that the * Another problem with RFC 3078 here. It implies that the
* peer need not send a Reset-Ack packet. But RFC 1962 * peer need not send a Reset-Ack packet. But RFC 1962
* requires it. Hopefully, M$ does send a Reset-Ack; even * requires it. Hopefully, M$ does send a Reset-Ack; even
* though it isn't required for MPPE synchronization, it is * though it isn't required for MPPE synchronization, it is
* required to reset CCP state. * required to reset CCP state.
*/ */
} }
} }
if (flushed) if (flushed)
mppe_rekey(state, 0); mppe_rekey(state, 0);
} }
/* Hide MPPE header */ /* Hide MPPE header */
pbuf_header(n0, -(s16_t)(MPPE_OVHD)); pbuf_header(n0, -(s16_t)(MPPE_OVHD));
/* Decrypt the packet. */ /* Decrypt the packet. */
for (n = n0; n != NULL; n = n->next) { for (n = n0; n != NULL; n = n->next) {
lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len); lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
if (n->tot_len == n->len) { if (n->tot_len == n->len) {
break; break;
} }
} }
/* good packet credit */ /* good packet credit */
state->sanity_errors >>= 1; state->sanity_errors >>= 1;
return ERR_OK; return ERR_OK;
sanity_error: sanity_error:
if (state->sanity_errors >= SANITY_MAX) { if (state->sanity_errors >= SANITY_MAX) {
/* /*
* Take LCP down if the peer is sending too many bogons. * Take LCP down if the peer is sending too many bogons.
* We don't want to do this for a single or just a few * We don't want to do this for a single or just a few
* instances since it could just be due to packet corruption. * instances since it could just be due to packet corruption.
*/ */
lcp_close(pcb, "Too many MPPE errors"); lcp_close(pcb, "Too many MPPE errors");
} }
return ERR_BUF; return ERR_BUF;
} }
#endif /* PPP_SUPPORT && MPPE_SUPPORT */ #endif /* PPP_SUPPORT && MPPE_SUPPORT */

View File

@ -55,11 +55,11 @@
#include "netif/ppp/lcp.h" #include "netif/ppp/lcp.h"
#include "netif/ppp/tdb.h" #include "netif/ppp/tdb.h"
bool endpoint_specified; /* user gave explicit endpoint discriminator */ bool endpoint_specified; /* user gave explicit endpoint discriminator */
char *bundle_id; /* identifier for our bundle */ char *bundle_id; /* identifier for our bundle */
char *blinks_id; /* key for the list of links */ char *blinks_id; /* key for the list of links */
bool doing_multilink; /* multilink was enabled and agreed to */ bool doing_multilink; /* multilink was enabled and agreed to */
bool multilink_master; /* we own the multilink bundle */ bool multilink_master; /* we own the multilink bundle */
extern TDB_CONTEXT *pppdb; extern TDB_CONTEXT *pppdb;
extern char db_key[]; extern char db_key[];
@ -72,43 +72,43 @@ static int get_default_epdisc (struct epdisc *);
static int parse_num (char *str, const char *key, int *valp); static int parse_num (char *str, const char *key, int *valp);
static int owns_unit (TDB_DATA pid, int unit); static int owns_unit (TDB_DATA pid, int unit);
#define set_ip_epdisc(ep, addr) do { \ #define set_ip_epdisc(ep, addr) do { \
ep->length = 4; \ ep->length = 4; \
ep->value[0] = addr >> 24; \ ep->value[0] = addr >> 24; \
ep->value[1] = addr >> 16; \ ep->value[1] = addr >> 16; \
ep->value[2] = addr >> 8; \ ep->value[2] = addr >> 8; \
ep->value[3] = addr; \ ep->value[3] = addr; \
} while (0) } while (0)
#define LOCAL_IP_ADDR(addr) \ #define LOCAL_IP_ADDR(addr) \
(((addr) & 0xff000000) == 0x0a000000 /* 10.x.x.x */ \ (((addr) & 0xff000000) == 0x0a000000 /* 10.x.x.x */ \
|| ((addr) & 0xfff00000) == 0xac100000 /* 172.16.x.x */ \ || ((addr) & 0xfff00000) == 0xac100000 /* 172.16.x.x */ \
|| ((addr) & 0xffff0000) == 0xc0a80000) /* 192.168.x.x */ || ((addr) & 0xffff0000) == 0xc0a80000) /* 192.168.x.x */
#define process_exists(n) (kill((n), 0) == 0 || errno != ESRCH) #define process_exists(n) (kill((n), 0) == 0 || errno != ESRCH)
void void
mp_check_options() mp_check_options()
{ {
lcp_options *wo = &lcp_wantoptions[0]; lcp_options *wo = &lcp_wantoptions[0];
lcp_options *ao = &lcp_allowoptions[0]; lcp_options *ao = &lcp_allowoptions[0];
doing_multilink = 0; doing_multilink = 0;
if (!multilink) if (!multilink)
return; return;
/* if we're doing multilink, we have to negotiate MRRU */ /* if we're doing multilink, we have to negotiate MRRU */
if (!wo->neg_mrru) { if (!wo->neg_mrru) {
/* mrru not specified, default to mru */ /* mrru not specified, default to mru */
wo->mrru = wo->mru; wo->mrru = wo->mru;
wo->neg_mrru = 1; wo->neg_mrru = 1;
} }
ao->mrru = ao->mru; ao->mrru = ao->mru;
ao->neg_mrru = 1; ao->neg_mrru = 1;
if (!wo->neg_endpoint && !noendpoint) { if (!wo->neg_endpoint && !noendpoint) {
/* get a default endpoint value */ /* get a default endpoint value */
wo->neg_endpoint = get_default_epdisc(&wo->endpoint); wo->neg_endpoint = get_default_epdisc(&wo->endpoint);
} }
} }
/* /*
@ -118,289 +118,289 @@ mp_check_options()
int int
mp_join_bundle() mp_join_bundle()
{ {
lcp_options *go = &lcp_gotoptions[0]; lcp_options *go = &lcp_gotoptions[0];
lcp_options *ho = &lcp_hisoptions[0]; lcp_options *ho = &lcp_hisoptions[0];
lcp_options *ao = &lcp_allowoptions[0]; lcp_options *ao = &lcp_allowoptions[0];
int unit, pppd_pid; int unit, pppd_pid;
int l, mtu; int l, mtu;
char *p; char *p;
TDB_DATA key, pid, rec; TDB_DATA key, pid, rec;
if (doing_multilink) { if (doing_multilink) {
/* have previously joined a bundle */ /* have previously joined a bundle */
if (!go->neg_mrru || !ho->neg_mrru) { if (!go->neg_mrru || !ho->neg_mrru) {
notice("oops, didn't get multilink on renegotiation"); notice("oops, didn't get multilink on renegotiation");
lcp_close(pcb, "multilink required"); lcp_close(pcb, "multilink required");
return 0; return 0;
} }
/* XXX should check the peer_authname and ho->endpoint /* XXX should check the peer_authname and ho->endpoint
are the same as previously */ are the same as previously */
return 0; return 0;
} }
if (!go->neg_mrru || !ho->neg_mrru) { if (!go->neg_mrru || !ho->neg_mrru) {
/* not doing multilink */ /* not doing multilink */
if (go->neg_mrru) if (go->neg_mrru)
notice("oops, multilink negotiated only for receive"); notice("oops, multilink negotiated only for receive");
mtu = ho->neg_mru? ho->mru: PPP_MRU; mtu = ho->neg_mru? ho->mru: PPP_MRU;
if (mtu > ao->mru) if (mtu > ao->mru)
mtu = ao->mru; mtu = ao->mru;
if (demand) { if (demand) {
/* already have a bundle */ /* already have a bundle */
cfg_bundle(0, 0, 0, 0); cfg_bundle(0, 0, 0, 0);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
return 0; return 0;
} }
make_new_bundle(0, 0, 0, 0); make_new_bundle(0, 0, 0, 0);
set_ifunit(1); set_ifunit(1);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
return 0; return 0;
} }
doing_multilink = 1; doing_multilink = 1;
/* /*
* Find the appropriate bundle or join a new one. * Find the appropriate bundle or join a new one.
* First we make up a name for the bundle. * First we make up a name for the bundle.
* The length estimate is worst-case assuming every * The length estimate is worst-case assuming every
* character has to be quoted. * character has to be quoted.
*/ */
l = 4 * strlen(peer_authname) + 10; l = 4 * strlen(peer_authname) + 10;
if (ho->neg_endpoint) if (ho->neg_endpoint)
l += 3 * ho->endpoint.length + 8; l += 3 * ho->endpoint.length + 8;
if (bundle_name) if (bundle_name)
l += 3 * strlen(bundle_name) + 2; l += 3 * strlen(bundle_name) + 2;
bundle_id = malloc(l); bundle_id = malloc(l);
if (bundle_id == 0) if (bundle_id == 0)
novm("bundle identifier"); novm("bundle identifier");
p = bundle_id; p = bundle_id;
p += slprintf(p, l-1, "BUNDLE=\"%q\"", peer_authname); p += slprintf(p, l-1, "BUNDLE=\"%q\"", peer_authname);
if (ho->neg_endpoint || bundle_name) if (ho->neg_endpoint || bundle_name)
*p++ = '/'; *p++ = '/';
if (ho->neg_endpoint) if (ho->neg_endpoint)
p += slprintf(p, bundle_id+l-p, "%s", p += slprintf(p, bundle_id+l-p, "%s",
epdisc_to_str(&ho->endpoint)); epdisc_to_str(&ho->endpoint));
if (bundle_name) if (bundle_name)
p += slprintf(p, bundle_id+l-p, "/%v", bundle_name); p += slprintf(p, bundle_id+l-p, "/%v", bundle_name);
/* Make the key for the list of links belonging to the bundle */ /* Make the key for the list of links belonging to the bundle */
l = p - bundle_id; l = p - bundle_id;
blinks_id = malloc(l + 7); blinks_id = malloc(l + 7);
if (blinks_id == NULL) if (blinks_id == NULL)
novm("bundle links key"); novm("bundle links key");
slprintf(blinks_id, l + 7, "BUNDLE_LINKS=%s", bundle_id + 7); slprintf(blinks_id, l + 7, "BUNDLE_LINKS=%s", bundle_id + 7);
/* /*
* For demand mode, we only need to configure the bundle * For demand mode, we only need to configure the bundle
* and attach the link. * and attach the link.
*/ */
mtu = LWIP_MIN(ho->mrru, ao->mru); mtu = LWIP_MIN(ho->mrru, ao->mru);
if (demand) { if (demand) {
cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf); cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
script_setenv("BUNDLE", bundle_id + 7, 1); script_setenv("BUNDLE", bundle_id + 7, 1);
return 0; return 0;
} }
/* /*
* Check if the bundle ID is already in the database. * Check if the bundle ID is already in the database.
*/ */
unit = -1; unit = -1;
lock_db(); lock_db();
key.dptr = bundle_id; key.dptr = bundle_id;
key.dsize = p - bundle_id; key.dsize = p - bundle_id;
pid = tdb_fetch(pppdb, key); pid = tdb_fetch(pppdb, key);
if (pid.dptr != NULL) { if (pid.dptr != NULL) {
/* bundle ID exists, see if the pppd record exists */ /* bundle ID exists, see if the pppd record exists */
rec = tdb_fetch(pppdb, pid); rec = tdb_fetch(pppdb, pid);
if (rec.dptr != NULL && rec.dsize > 0) { if (rec.dptr != NULL && rec.dsize > 0) {
/* make sure the string is null-terminated */ /* make sure the string is null-terminated */
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
/* parse the interface number */ /* parse the interface number */
parse_num(rec.dptr, "IFNAME=ppp", &unit); parse_num(rec.dptr, "IFNAME=ppp", &unit);
/* check the pid value */ /* check the pid value */
if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid) if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
|| !process_exists(pppd_pid) || !process_exists(pppd_pid)
|| !owns_unit(pid, unit)) || !owns_unit(pid, unit))
unit = -1; unit = -1;
free(rec.dptr); free(rec.dptr);
} }
free(pid.dptr); free(pid.dptr);
} }
if (unit >= 0) { if (unit >= 0) {
/* attach to existing unit */ /* attach to existing unit */
if (bundle_attach(unit)) { if (bundle_attach(unit)) {
set_ifunit(0); set_ifunit(0);
script_setenv("BUNDLE", bundle_id + 7, 0); script_setenv("BUNDLE", bundle_id + 7, 0);
make_bundle_links(1); make_bundle_links(1);
unlock_db(); unlock_db();
info("Link attached to %s", ifname); info("Link attached to %s", ifname);
return 1; return 1;
} }
/* attach failed because bundle doesn't exist */ /* attach failed because bundle doesn't exist */
} }
/* we have to make a new bundle */ /* we have to make a new bundle */
make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf); make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
set_ifunit(1); set_ifunit(1);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
script_setenv("BUNDLE", bundle_id + 7, 1); script_setenv("BUNDLE", bundle_id + 7, 1);
make_bundle_links(pcb); make_bundle_links(pcb);
unlock_db(); unlock_db();
info("New bundle %s created", ifname); info("New bundle %s created", ifname);
multilink_master = 1; multilink_master = 1;
return 0; return 0;
} }
void mp_exit_bundle() void mp_exit_bundle()
{ {
lock_db(); lock_db();
remove_bundle_link(); remove_bundle_link();
unlock_db(); unlock_db();
} }
static void sendhup(char *str) static void sendhup(char *str)
{ {
int pid; int pid;
if (parse_num(str, "PPPD_PID=", &pid) && pid != getpid()) { if (parse_num(str, "PPPD_PID=", &pid) && pid != getpid()) {
if (debug) if (debug)
dbglog("sending SIGHUP to process %d", pid); dbglog("sending SIGHUP to process %d", pid);
kill(pid, SIGHUP); kill(pid, SIGHUP);
} }
} }
void mp_bundle_terminated() void mp_bundle_terminated()
{ {
TDB_DATA key; TDB_DATA key;
bundle_terminating = 1; bundle_terminating = 1;
upper_layers_down(pcb); upper_layers_down(pcb);
notice("Connection terminated."); notice("Connection terminated.");
#if PPP_STATS_SUPPORT #if PPP_STATS_SUPPORT
print_link_stats(); print_link_stats();
#endif /* PPP_STATS_SUPPORT */ #endif /* PPP_STATS_SUPPORT */
if (!demand) { if (!demand) {
remove_pidfiles(); remove_pidfiles();
script_unsetenv("IFNAME"); script_unsetenv("IFNAME");
} }
lock_db(); lock_db();
destroy_bundle(); destroy_bundle();
iterate_bundle_links(sendhup); iterate_bundle_links(sendhup);
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
tdb_delete(pppdb, key); tdb_delete(pppdb, key);
unlock_db(); unlock_db();
new_phase(PPP_PHASE_DEAD); new_phase(PPP_PHASE_DEAD);
doing_multilink = 0; doing_multilink = 0;
multilink_master = 0; multilink_master = 0;
} }
static void make_bundle_links(int append) static void make_bundle_links(int append)
{ {
TDB_DATA key, rec; TDB_DATA key, rec;
char *p; char *p;
char entry[32]; char entry[32];
int l; int l;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
slprintf(entry, sizeof(entry), "%s;", db_key); slprintf(entry, sizeof(entry), "%s;", db_key);
p = entry; p = entry;
if (append) { if (append) {
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr != NULL && rec.dsize > 0) { if (rec.dptr != NULL && rec.dsize > 0) {
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
if (strstr(rec.dptr, db_key) != NULL) { if (strstr(rec.dptr, db_key) != NULL) {
/* already in there? strange */ /* already in there? strange */
warn("link entry already exists in tdb"); warn("link entry already exists in tdb");
return; return;
} }
l = rec.dsize + strlen(entry); l = rec.dsize + strlen(entry);
p = malloc(l); p = malloc(l);
if (p == NULL) if (p == NULL)
novm("bundle link list"); novm("bundle link list");
slprintf(p, l, "%s%s", rec.dptr, entry); slprintf(p, l, "%s%s", rec.dptr, entry);
} else { } else {
warn("bundle link list not found"); warn("bundle link list not found");
} }
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
} }
rec.dptr = p; rec.dptr = p;
rec.dsize = strlen(p) + 1; rec.dsize = strlen(p) + 1;
if (tdb_store(pppdb, key, rec, TDB_REPLACE)) if (tdb_store(pppdb, key, rec, TDB_REPLACE))
error("couldn't %s bundle link list", error("couldn't %s bundle link list",
append? "update": "create"); append? "update": "create");
if (p != entry) if (p != entry)
free(p); free(p);
} }
static void remove_bundle_link() static void remove_bundle_link()
{ {
TDB_DATA key, rec; TDB_DATA key, rec;
char entry[32]; char entry[32];
char *p, *q; char *p, *q;
int l; int l;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
slprintf(entry, sizeof(entry), "%s;", db_key); slprintf(entry, sizeof(entry), "%s;", db_key);
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr == NULL || rec.dsize <= 0) { if (rec.dptr == NULL || rec.dsize <= 0) {
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
return; return;
} }
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
p = strstr(rec.dptr, entry); p = strstr(rec.dptr, entry);
if (p != NULL) { if (p != NULL) {
q = p + strlen(entry); q = p + strlen(entry);
l = strlen(q) + 1; l = strlen(q) + 1;
memmove(p, q, l); memmove(p, q, l);
rec.dsize = p - rec.dptr + l; rec.dsize = p - rec.dptr + l;
if (tdb_store(pppdb, key, rec, TDB_REPLACE)) if (tdb_store(pppdb, key, rec, TDB_REPLACE))
error("couldn't update bundle link list (removal)"); error("couldn't update bundle link list (removal)");
} }
free(rec.dptr); free(rec.dptr);
} }
static void iterate_bundle_links(void (*func)(char *)) static void iterate_bundle_links(void (*func)(char *))
{ {
TDB_DATA key, rec, pp; TDB_DATA key, rec, pp;
char *p, *q; char *p, *q;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr == NULL || rec.dsize <= 0) { if (rec.dptr == NULL || rec.dsize <= 0) {
error("bundle link list not found (iterating list)"); error("bundle link list not found (iterating list)");
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
return; return;
} }
p = rec.dptr; p = rec.dptr;
p[rec.dsize-1] = 0; p[rec.dsize-1] = 0;
while ((q = strchr(p, ';')) != NULL) { while ((q = strchr(p, ';')) != NULL) {
*q = 0; *q = 0;
key.dptr = p; key.dptr = p;
key.dsize = q - p; key.dsize = q - p;
pp = tdb_fetch(pppdb, key); pp = tdb_fetch(pppdb, key);
if (pp.dptr != NULL && pp.dsize > 0) { if (pp.dptr != NULL && pp.dsize > 0) {
pp.dptr[pp.dsize-1] = 0; pp.dptr[pp.dsize-1] = 0;
func(pp.dptr); func(pp.dptr);
} }
if (pp.dptr != NULL) if (pp.dptr != NULL)
free(pp.dptr); free(pp.dptr);
p = q + 1; p = q + 1;
} }
free(rec.dptr); free(rec.dptr);
} }
static int static int
@ -409,19 +409,19 @@ parse_num(str, key, valp)
const char *key; const char *key;
int *valp; int *valp;
{ {
char *p, *endp; char *p, *endp;
int i; int i;
p = strstr(str, key); p = strstr(str, key);
if (p != 0) { if (p != 0) {
p += strlen(key); p += strlen(key);
i = strtol(p, &endp, 10); i = strtol(p, &endp, 10);
if (endp != p && (*endp == 0 || *endp == ';')) { if (endp != p && (*endp == 0 || *endp == ';')) {
*valp = i; *valp = i;
return 1; return 1;
} }
} }
return 0; return 0;
} }
/* /*
@ -432,53 +432,53 @@ owns_unit(key, unit)
TDB_DATA key; TDB_DATA key;
int unit; int unit;
{ {
char ifkey[32]; char ifkey[32];
TDB_DATA kd, vd; TDB_DATA kd, vd;
int ret = 0; int ret = 0;
slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit); slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit);
kd.dptr = ifkey; kd.dptr = ifkey;
kd.dsize = strlen(ifkey); kd.dsize = strlen(ifkey);
vd = tdb_fetch(pppdb, kd); vd = tdb_fetch(pppdb, kd);
if (vd.dptr != NULL) { if (vd.dptr != NULL) {
ret = vd.dsize == key.dsize ret = vd.dsize == key.dsize
&& memcmp(vd.dptr, key.dptr, vd.dsize) == 0; && memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
free(vd.dptr); free(vd.dptr);
} }
return ret; return ret;
} }
static int static int
get_default_epdisc(ep) get_default_epdisc(ep)
struct epdisc *ep; struct epdisc *ep;
{ {
char *p; char *p;
struct hostent *hp; struct hostent *hp;
u32_t addr; u32_t addr;
/* First try for an ethernet MAC address */ /* First try for an ethernet MAC address */
p = get_first_ethernet(); p = get_first_ethernet();
if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) { if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) {
ep->class = EPD_MAC; ep->class = EPD_MAC;
ep->length = 6; ep->length = 6;
return 1; return 1;
} }
/* see if our hostname corresponds to a reasonable IP address */ /* see if our hostname corresponds to a reasonable IP address */
hp = gethostbyname(hostname); hp = gethostbyname(hostname);
if (hp != NULL) { if (hp != NULL) {
addr = *(u32_t *)hp->h_addr; addr = *(u32_t *)hp->h_addr;
if (!bad_ip_adrs(addr)) { if (!bad_ip_adrs(addr)) {
addr = lwip_ntohl(addr); addr = lwip_ntohl(addr);
if (!LOCAL_IP_ADDR(addr)) { if (!LOCAL_IP_ADDR(addr)) {
ep->class = EPD_IP; ep->class = EPD_IP;
set_ip_epdisc(ep, addr); set_ip_epdisc(ep, addr);
return 1; return 1;
} }
} }
} }
return 0; return 0;
} }
/* /*
@ -493,51 +493,51 @@ char *
epdisc_to_str(ep) epdisc_to_str(ep)
struct epdisc *ep; struct epdisc *ep;
{ {
static char str[MAX_ENDP_LEN*3+8]; static char str[MAX_ENDP_LEN*3+8];
u_char *p = ep->value; u_char *p = ep->value;
int i, mask = 0; int i, mask = 0;
char *q, c, c2; char *q, c, c2;
if (ep->class == EPD_NULL && ep->length == 0) if (ep->class == EPD_NULL && ep->length == 0)
return "null"; return "null";
if (ep->class == EPD_IP && ep->length == 4) { if (ep->class == EPD_IP && ep->length == 4) {
u32_t addr; u32_t addr;
GETLONG(addr, p); GETLONG(addr, p);
slprintf(str, sizeof(str), "IP:%I", lwip_htonl(addr)); slprintf(str, sizeof(str), "IP:%I", lwip_htonl(addr));
return str; return str;
} }
c = ':'; c = ':';
c2 = '.'; c2 = '.';
if (ep->class == EPD_MAC && ep->length == 6) if (ep->class == EPD_MAC && ep->length == 6)
c2 = ':'; c2 = ':';
else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0) else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0)
mask = 3; mask = 3;
q = str; q = str;
if (ep->class <= EPD_PHONENUM) if (ep->class <= EPD_PHONENUM)
q += slprintf(q, sizeof(str)-1, "%s", q += slprintf(q, sizeof(str)-1, "%s",
endp_class_names[ep->class]); endp_class_names[ep->class]);
else else
q += slprintf(q, sizeof(str)-1, "%d", ep->class); q += slprintf(q, sizeof(str)-1, "%d", ep->class);
c = ':'; c = ':';
for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) { for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) {
if ((i & mask) == 0) { if ((i & mask) == 0) {
*q++ = c; *q++ = c;
c = c2; c = c2;
} }
q += slprintf(q, str + sizeof(str) - q, "%.2x", ep->value[i]); q += slprintf(q, str + sizeof(str) - q, "%.2x", ep->value[i]);
} }
return str; return str;
} }
static int hexc_val(int c) static int hexc_val(int c)
{ {
if (c >= 'a') if (c >= 'a')
return c - 'a' + 10; return c - 'a' + 10;
if (c >= 'A') if (c >= 'A')
return c - 'A' + 10; return c - 'A' + 10;
return c - '0'; return c - '0';
} }
int int
@ -545,65 +545,65 @@ str_to_epdisc(ep, str)
struct epdisc *ep; struct epdisc *ep;
char *str; char *str;
{ {
int i, l; int i, l;
char *p, *endp; char *p, *endp;
for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) { for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) {
int sl = strlen(endp_class_names[i]); int sl = strlen(endp_class_names[i]);
if (strncasecmp(str, endp_class_names[i], sl) == 0) { if (strncasecmp(str, endp_class_names[i], sl) == 0) {
str += sl; str += sl;
break; break;
} }
} }
if (i > EPD_PHONENUM) { if (i > EPD_PHONENUM) {
/* not a class name, try a decimal class number */ /* not a class name, try a decimal class number */
i = strtol(str, &endp, 10); i = strtol(str, &endp, 10);
if (endp == str) if (endp == str)
return 0; /* can't parse class number */ return 0; /* can't parse class number */
str = endp; str = endp;
} }
ep->class = i; ep->class = i;
if (*str == 0) { if (*str == 0) {
ep->length = 0; ep->length = 0;
return 1; return 1;
} }
if (*str != ':' && *str != '.') if (*str != ':' && *str != '.')
return 0; return 0;
++str; ++str;
if (i == EPD_IP) { if (i == EPD_IP) {
u32_t addr; u32_t addr;
i = parse_dotted_ip(str, &addr); i = parse_dotted_ip(str, &addr);
if (i == 0 || str[i] != 0) if (i == 0 || str[i] != 0)
return 0; return 0;
set_ip_epdisc(ep, addr); set_ip_epdisc(ep, addr);
return 1; return 1;
} }
if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) { if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) {
ep->length = 6; ep->length = 6;
return 1; return 1;
} }
p = str; p = str;
for (l = 0; l < MAX_ENDP_LEN; ++l) { for (l = 0; l < MAX_ENDP_LEN; ++l) {
if (*str == 0) if (*str == 0)
break; break;
if (p <= str) if (p <= str)
for (p = str; isxdigit(*p); ++p) for (p = str; isxdigit(*p); ++p)
; ;
i = p - str; i = p - str;
if (i == 0) if (i == 0)
return 0; return 0;
ep->value[l] = hexc_val(*str++); ep->value[l] = hexc_val(*str++);
if ((i & 1) == 0) if ((i & 1) == 0)
ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++); ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++);
if (*str == ':' || *str == '.') if (*str == ':' || *str == '.')
++str; ++str;
} }
if (*str != 0 || (ep->class == EPD_MAC && l != 6)) if (*str != 0 || (ep->class == EPD_MAC && l != 6))
return 0; return 0;
ep->length = l; ep->length = l;
return 1; return 1;
} }
#endif /* PPP_SUPPORT && HAVE_MULTILINK */ #endif /* PPP_SUPPORT && HAVE_MULTILINK */

View File

@ -39,28 +39,28 @@
static u_char pppcrypt_get_7bits(u_char *input, int startBit) { static u_char pppcrypt_get_7bits(u_char *input, int startBit) {
unsigned int word; unsigned int word;
word = (unsigned)input[startBit / 8] << 8; word = (unsigned)input[startBit / 8] << 8;
word |= (unsigned)input[startBit / 8 + 1]; word |= (unsigned)input[startBit / 8 + 1];
word >>= 15 - (startBit % 8 + 7); word >>= 15 - (startBit % 8 + 7);
return word & 0xFE; return word & 0xFE;
} }
/* IN 56 bit DES key missing parity bits /* IN 56 bit DES key missing parity bits
* OUT 64 bit DES key with parity bits added * OUT 64 bit DES key with parity bits added
*/ */
void pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) { void pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) {
des_key[0] = pppcrypt_get_7bits(key, 0); des_key[0] = pppcrypt_get_7bits(key, 0);
des_key[1] = pppcrypt_get_7bits(key, 7); des_key[1] = pppcrypt_get_7bits(key, 7);
des_key[2] = pppcrypt_get_7bits(key, 14); des_key[2] = pppcrypt_get_7bits(key, 14);
des_key[3] = pppcrypt_get_7bits(key, 21); des_key[3] = pppcrypt_get_7bits(key, 21);
des_key[4] = pppcrypt_get_7bits(key, 28); des_key[4] = pppcrypt_get_7bits(key, 28);
des_key[5] = pppcrypt_get_7bits(key, 35); des_key[5] = pppcrypt_get_7bits(key, 35);
des_key[6] = pppcrypt_get_7bits(key, 42); des_key[6] = pppcrypt_get_7bits(key, 42);
des_key[7] = pppcrypt_get_7bits(key, 49); des_key[7] = pppcrypt_get_7bits(key, 49);
} }
#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */ #endif /* PPP_SUPPORT && MSCHAP_SUPPORT */

View File

@ -740,15 +740,15 @@ static void pppol2tp_timeout(void *arg) {
PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried)); PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried));
if (l2tp->peer_nr <= l2tp->our_ns -1) { /* the SCCCN was not acknowledged */ if (l2tp->peer_nr <= l2tp->our_ns -1) { /* the SCCCN was not acknowledged */
if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) { if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {
l2tp->icrq_retried--; l2tp->icrq_retried--;
PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err)); PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err));
sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
break; break;
} }
} }
if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) { if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {
l2tp->icrq_retried--; l2tp->icrq_retried--;
PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err)); PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err));
} }
sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
break; break;
@ -761,8 +761,8 @@ static void pppol2tp_timeout(void *arg) {
} }
PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried)); PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried));
if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) { if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {
l2tp->iccn_retried--; l2tp->iccn_retried--;
PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err)); PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err));
} }
sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);
break; break;

View File

@ -166,12 +166,12 @@ void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password) {
/* Lower layer up yet? */ /* Lower layer up yet? */
if (pcb->upap.us_clientstate == UPAPCS_INITIAL || if (pcb->upap.us_clientstate == UPAPCS_INITIAL ||
pcb->upap.us_clientstate == UPAPCS_PENDING) { pcb->upap.us_clientstate == UPAPCS_PENDING) {
pcb->upap.us_clientstate = UPAPCS_PENDING; pcb->upap.us_clientstate = UPAPCS_PENDING;
return; return;
} }
upap_sauthreq(pcb); /* Start protocol */ upap_sauthreq(pcb); /* Start protocol */
} }
#if PPP_SERVER #if PPP_SERVER
@ -184,14 +184,14 @@ void upap_authpeer(ppp_pcb *pcb) {
/* Lower layer up yet? */ /* Lower layer up yet? */
if (pcb->upap.us_serverstate == UPAPSS_INITIAL || if (pcb->upap.us_serverstate == UPAPSS_INITIAL ||
pcb->upap.us_serverstate == UPAPSS_PENDING) { pcb->upap.us_serverstate == UPAPSS_PENDING) {
pcb->upap.us_serverstate = UPAPSS_PENDING; pcb->upap.us_serverstate = UPAPSS_PENDING;
return; return;
} }
pcb->upap.us_serverstate = UPAPSS_LISTEN; pcb->upap.us_serverstate = UPAPSS_LISTEN;
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout); TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
@ -202,17 +202,17 @@ static void upap_timeout(void *arg) {
ppp_pcb *pcb = (ppp_pcb*)arg; ppp_pcb *pcb = (ppp_pcb*)arg;
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ)
return; return;
if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) { if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) {
/* give up in disgust */ /* give up in disgust */
ppp_error("No response to PAP authenticate-requests"); ppp_error("No response to PAP authenticate-requests");
pcb->upap.us_clientstate = UPAPCS_BADAUTH; pcb->upap.us_clientstate = UPAPCS_BADAUTH;
auth_withpeer_fail(pcb, PPP_PAP); auth_withpeer_fail(pcb, PPP_PAP);
return; return;
} }
upap_sauthreq(pcb); /* Send Authenticate-Request */ upap_sauthreq(pcb); /* Send Authenticate-Request */
} }
@ -224,7 +224,7 @@ static void upap_reqtimeout(void *arg) {
ppp_pcb *pcb = (ppp_pcb*)arg; ppp_pcb *pcb = (ppp_pcb*)arg;
if (pcb->upap.us_serverstate != UPAPSS_LISTEN) if (pcb->upap.us_serverstate != UPAPSS_LISTEN)
return; /* huh?? */ return; /* huh?? */
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
pcb->upap.us_serverstate = UPAPSS_BADAUTH; pcb->upap.us_serverstate = UPAPSS_BADAUTH;
@ -240,18 +240,18 @@ static void upap_reqtimeout(void *arg) {
static void upap_lowerup(ppp_pcb *pcb) { static void upap_lowerup(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_INITIAL) if (pcb->upap.us_clientstate == UPAPCS_INITIAL)
pcb->upap.us_clientstate = UPAPCS_CLOSED; pcb->upap.us_clientstate = UPAPCS_CLOSED;
else if (pcb->upap.us_clientstate == UPAPCS_PENDING) { else if (pcb->upap.us_clientstate == UPAPCS_PENDING) {
upap_sauthreq(pcb); /* send an auth-request */ upap_sauthreq(pcb); /* send an auth-request */
} }
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_INITIAL) if (pcb->upap.us_serverstate == UPAPSS_INITIAL)
pcb->upap.us_serverstate = UPAPSS_CLOSED; pcb->upap.us_serverstate = UPAPSS_CLOSED;
else if (pcb->upap.us_serverstate == UPAPSS_PENDING) { else if (pcb->upap.us_serverstate == UPAPSS_PENDING) {
pcb->upap.us_serverstate = UPAPSS_LISTEN; pcb->upap.us_serverstate = UPAPSS_LISTEN;
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout); TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
} }
@ -264,11 +264,11 @@ static void upap_lowerup(ppp_pcb *pcb) {
*/ */
static void upap_lowerdown(ppp_pcb *pcb) { static void upap_lowerdown(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */ if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */
UNTIMEOUT(upap_timeout, pcb); /* Cancel timeout */ UNTIMEOUT(upap_timeout, pcb); /* Cancel timeout */
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0) if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0)
UNTIMEOUT(upap_reqtimeout, pcb); UNTIMEOUT(upap_reqtimeout, pcb);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
pcb->upap.us_clientstate = UPAPCS_INITIAL; pcb->upap.us_clientstate = UPAPCS_INITIAL;
@ -286,13 +286,13 @@ static void upap_lowerdown(ppp_pcb *pcb) {
static void upap_protrej(ppp_pcb *pcb) { static void upap_protrej(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) { if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) {
ppp_error("PAP authentication failed due to protocol-reject"); ppp_error("PAP authentication failed due to protocol-reject");
auth_withpeer_fail(pcb, PPP_PAP); auth_withpeer_fail(pcb, PPP_PAP);
} }
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_LISTEN) { if (pcb->upap.us_serverstate == UPAPSS_LISTEN) {
ppp_error("PAP authentication of peer failed (protocol-reject)"); ppp_error("PAP authentication of peer failed (protocol-reject)");
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
upap_lowerdown(pcb); upap_lowerdown(pcb);
@ -313,19 +313,19 @@ static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {
*/ */
inp = inpacket; inp = inpacket;
if (l < UPAP_HEADERLEN) { if (l < UPAP_HEADERLEN) {
UPAPDEBUG(("pap_input: rcvd short header.")); UPAPDEBUG(("pap_input: rcvd short header."));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
GETSHORT(len, inp); GETSHORT(len, inp);
if (len < UPAP_HEADERLEN) { if (len < UPAP_HEADERLEN) {
UPAPDEBUG(("pap_input: rcvd illegal length.")); UPAPDEBUG(("pap_input: rcvd illegal length."));
return; return;
} }
if (len > l) { if (len > l) {
UPAPDEBUG(("pap_input: rcvd short packet.")); UPAPDEBUG(("pap_input: rcvd short packet."));
return; return;
} }
len -= UPAP_HEADERLEN; len -= UPAP_HEADERLEN;
@ -335,20 +335,20 @@ static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {
switch (code) { switch (code) {
case UPAP_AUTHREQ: case UPAP_AUTHREQ:
#if PPP_SERVER #if PPP_SERVER
upap_rauthreq(pcb, inp, id, len); upap_rauthreq(pcb, inp, id, len);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
break; break;
case UPAP_AUTHACK: case UPAP_AUTHACK:
upap_rauthack(pcb, inp, id, len); upap_rauthack(pcb, inp, id, len);
break; break;
case UPAP_AUTHNAK: case UPAP_AUTHNAK:
upap_rauthnak(pcb, inp, id, len); upap_rauthnak(pcb, inp, id, len);
break; break;
default: /* XXX Need code reject */ default: /* XXX Need code reject */
break; break;
} }
} }
@ -366,40 +366,40 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
int msglen; int msglen;
if (pcb->upap.us_serverstate < UPAPSS_LISTEN) if (pcb->upap.us_serverstate < UPAPSS_LISTEN)
return; return;
/* /*
* If we receive a duplicate authenticate-request, we are * If we receive a duplicate authenticate-request, we are
* supposed to return the same status as for the first request. * supposed to return the same status as for the first request.
*/ */
if (pcb->upap.us_serverstate == UPAPSS_OPEN) { if (pcb->upap.us_serverstate == UPAPSS_OPEN) {
upap_sresp(pcb, UPAP_AUTHACK, id, "", 0); /* return auth-ack */ upap_sresp(pcb, UPAP_AUTHACK, id, "", 0); /* return auth-ack */
return; return;
} }
if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) { if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) {
upap_sresp(pcb, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */ upap_sresp(pcb, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */
return; return;
} }
/* /*
* Parse user/passwd. * Parse user/passwd.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
GETCHAR(ruserlen, inp); GETCHAR(ruserlen, inp);
len -= sizeof (u_char) + ruserlen + sizeof (u_char); len -= sizeof (u_char) + ruserlen + sizeof (u_char);
if (len < 0) { if (len < 0) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
ruser = (char *) inp; ruser = (char *) inp;
INCPTR(ruserlen, inp); INCPTR(ruserlen, inp);
GETCHAR(rpasswdlen, inp); GETCHAR(rpasswdlen, inp);
if (len < rpasswdlen) { if (len < rpasswdlen) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
rpasswd = (char *) inp; rpasswd = (char *) inp;
@ -420,16 +420,16 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
* return an authenticate failure, is leaving it for us to verify. * return an authenticate failure, is leaving it for us to verify.
*/ */
if (retcode == UPAP_AUTHACK) { if (retcode == UPAP_AUTHACK) {
if (!auth_number()) { if (!auth_number()) {
/* We do not want to leak info about the pap result. */ /* We do not want to leak info about the pap result. */
retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */ retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */
warn("calling number %q is not authorized", remote_number); warn("calling number %q is not authorized", remote_number);
} }
} }
msglen = strlen(msg); msglen = strlen(msg);
if (msglen > 255) if (msglen > 255)
msglen = 255; msglen = 255;
#endif /* UNUSED */ #endif /* UNUSED */
upap_sresp(pcb, retcode, id, msg, msglen); upap_sresp(pcb, retcode, id, msg, msglen);
@ -438,17 +438,17 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
ppp_slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser); ppp_slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser);
if (retcode == UPAP_AUTHACK) { if (retcode == UPAP_AUTHACK) {
pcb->upap.us_serverstate = UPAPSS_OPEN; pcb->upap.us_serverstate = UPAPSS_OPEN;
ppp_notice("PAP peer authentication succeeded for %q", rhostname); ppp_notice("PAP peer authentication succeeded for %q", rhostname);
auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen); auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen);
} else { } else {
pcb->upap.us_serverstate = UPAPSS_BADAUTH; pcb->upap.us_serverstate = UPAPSS_BADAUTH;
ppp_warn("PAP peer authentication failed for %q", rhostname); ppp_warn("PAP peer authentication failed for %q", rhostname);
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
} }
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
UNTIMEOUT(upap_reqtimeout, pcb); UNTIMEOUT(upap_reqtimeout, pcb);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
@ -461,24 +461,24 @@ static void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len) {
LWIP_UNUSED_ARG(id); LWIP_UNUSED_ARG(id);
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */ if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
return; return;
/* /*
* Parse message. * Parse message.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauthack: ignoring missing msg-length.")); UPAPDEBUG(("pap_rauthack: ignoring missing msg-length."));
} else { } else {
GETCHAR(msglen, inp); GETCHAR(msglen, inp);
if (msglen > 0) { if (msglen > 0) {
len -= sizeof (u_char); len -= sizeof (u_char);
if (len < msglen) { if (len < msglen) {
UPAPDEBUG(("pap_rauthack: rcvd short packet.")); UPAPDEBUG(("pap_rauthack: rcvd short packet."));
return; return;
} }
msg = (char *) inp; msg = (char *) inp;
PRINTMSG(msg, msglen); PRINTMSG(msg, msglen);
} }
} }
pcb->upap.us_clientstate = UPAPCS_OPEN; pcb->upap.us_clientstate = UPAPCS_OPEN;
@ -496,24 +496,24 @@ static void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len) {
LWIP_UNUSED_ARG(id); LWIP_UNUSED_ARG(id);
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */ if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
return; return;
/* /*
* Parse message. * Parse message.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length.")); UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length."));
} else { } else {
GETCHAR(msglen, inp); GETCHAR(msglen, inp);
if (msglen > 0) { if (msglen > 0) {
len -= sizeof (u_char); len -= sizeof (u_char);
if (len < msglen) { if (len < msglen) {
UPAPDEBUG(("pap_rauthnak: rcvd short packet.")); UPAPDEBUG(("pap_rauthnak: rcvd short packet."));
return; return;
} }
msg = (char *) inp; msg = (char *) inp;
PRINTMSG(msg, msglen); PRINTMSG(msg, msglen);
} }
} }
pcb->upap.us_clientstate = UPAPCS_BADAUTH; pcb->upap.us_clientstate = UPAPCS_BADAUTH;
@ -532,7 +532,7 @@ static void upap_sauthreq(ppp_pcb *pcb) {
int outlen; int outlen;
outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) + outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +
pcb->upap.us_userlen + pcb->upap.us_passwdlen; pcb->upap.us_userlen + pcb->upap.us_passwdlen;
p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
if(NULL == p) if(NULL == p)
return; return;
@ -606,68 +606,68 @@ static int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, con
const u_char *pstart; const u_char *pstart;
if (plen < UPAP_HEADERLEN) if (plen < UPAP_HEADERLEN)
return 0; return 0;
pstart = p; pstart = p;
GETCHAR(code, p); GETCHAR(code, p);
GETCHAR(id, p); GETCHAR(id, p);
GETSHORT(len, p); GETSHORT(len, p);
if (len < UPAP_HEADERLEN || len > plen) if (len < UPAP_HEADERLEN || len > plen)
return 0; return 0;
if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(upap_codenames)) if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(upap_codenames))
printer(arg, " %s", upap_codenames[code-1]); printer(arg, " %s", upap_codenames[code-1]);
else else
printer(arg, " code=0x%x", code); printer(arg, " code=0x%x", code);
printer(arg, " id=0x%x", id); printer(arg, " id=0x%x", id);
len -= UPAP_HEADERLEN; len -= UPAP_HEADERLEN;
switch (code) { switch (code) {
case UPAP_AUTHREQ: case UPAP_AUTHREQ:
if (len < 1) if (len < 1)
break; break;
ulen = p[0]; ulen = p[0];
if (len < ulen + 2) if (len < ulen + 2)
break; break;
wlen = p[ulen + 1]; wlen = p[ulen + 1];
if (len < ulen + wlen + 2) if (len < ulen + wlen + 2)
break; break;
user = (const u_char *) (p + 1); user = (const u_char *) (p + 1);
pwd = (const u_char *) (p + ulen + 2); pwd = (const u_char *) (p + ulen + 2);
p += ulen + wlen + 2; p += ulen + wlen + 2;
len -= ulen + wlen + 2; len -= ulen + wlen + 2;
printer(arg, " user="); printer(arg, " user=");
ppp_print_string(user, ulen, printer, arg); ppp_print_string(user, ulen, printer, arg);
printer(arg, " password="); printer(arg, " password=");
/* FIXME: require ppp_pcb struct as printpkt() argument */ /* FIXME: require ppp_pcb struct as printpkt() argument */
#if 0 #if 0
if (!pcb->settings.hide_password) if (!pcb->settings.hide_password)
#endif #endif
ppp_print_string(pwd, wlen, printer, arg); ppp_print_string(pwd, wlen, printer, arg);
#if 0 #if 0
else else
printer(arg, "<hidden>"); printer(arg, "<hidden>");
#endif #endif
break; break;
case UPAP_AUTHACK: case UPAP_AUTHACK:
case UPAP_AUTHNAK: case UPAP_AUTHNAK:
if (len < 1) if (len < 1)
break; break;
mlen = p[0]; mlen = p[0];
if (len < mlen + 1) if (len < mlen + 1)
break; break;
msg = (const u_char *) (p + 1); msg = (const u_char *) (p + 1);
p += mlen + 1; p += mlen + 1;
len -= mlen + 1; len -= mlen + 1;
printer(arg, " "); printer(arg, " ");
ppp_print_string(msg, mlen, printer, arg); ppp_print_string(msg, mlen, printer, arg);
break; break;
default: default:
break; break;
} }
/* print the rest of the bytes in the packet */ /* print the rest of the bytes in the packet */
for (; len > 0; --len) { for (; len > 0; --len) {
GETCHAR(code, p); GETCHAR(code, p);
printer(arg, " %.2x", code); printer(arg, " %.2x", code);
} }
return p - pstart; return p - pstart;

File diff suppressed because it is too large Load Diff

View File

@ -121,7 +121,7 @@ extern "C" {
/* readdir_r is a POSIX-only function, and may not be available under various /* readdir_r is a POSIX-only function, and may not be available under various
* environments/settings, e.g. MinGW. Use readdir fallback */ * environments/settings, e.g. MinGW. Use readdir fallback */
#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\ #if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\
_POSIX_SOURCE _POSIX_SOURCE
# define _TINYDIR_HAS_READDIR_R # define _TINYDIR_HAS_READDIR_R
#endif #endif
#if _POSIX_C_SOURCE >= 200112L #if _POSIX_C_SOURCE >= 200112L
@ -129,16 +129,16 @@ extern "C" {
# include <unistd.h> # include <unistd.h>
#endif #endif
#if _BSD_SOURCE || _SVID_SOURCE || \ #if _BSD_SOURCE || _SVID_SOURCE || \
(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
# define _TINYDIR_HAS_DIRFD # define _TINYDIR_HAS_DIRFD
# include <sys/types.h> # include <sys/types.h>
#endif #endif
#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\ #if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\
defined _PC_NAME_MAX defined _PC_NAME_MAX
# define _TINYDIR_USE_FPATHCONF # define _TINYDIR_USE_FPATHCONF
#endif #endif
#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\ #if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\
!(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX) !(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX)
# define _TINYDIR_USE_READDIR # define _TINYDIR_USE_READDIR
#endif #endif
@ -172,42 +172,42 @@ extern "C" {
#endif #endif
#if !defined(_TINYDIR_MALLOC) #if !defined(_TINYDIR_MALLOC)
#define _TINYDIR_MALLOC(_size) malloc(_size) #define _TINYDIR_MALLOC(_size) malloc(_size)
#define _TINYDIR_FREE(_ptr) free(_ptr) #define _TINYDIR_FREE(_ptr) free(_ptr)
#endif /* !defined(_TINYDIR_MALLOC) */ #endif /* !defined(_TINYDIR_MALLOC) */
typedef struct tinydir_file typedef struct tinydir_file
{ {
_tinydir_char_t path[_TINYDIR_PATH_MAX]; _tinydir_char_t path[_TINYDIR_PATH_MAX];
_tinydir_char_t name[_TINYDIR_FILENAME_MAX]; _tinydir_char_t name[_TINYDIR_FILENAME_MAX];
_tinydir_char_t *extension; _tinydir_char_t *extension;
int is_dir; int is_dir;
int is_reg; int is_reg;
#ifndef _MSC_VER #ifndef _MSC_VER
#ifdef __MINGW32__ #ifdef __MINGW32__
struct _stat _s; struct _stat _s;
#else #else
struct stat _s; struct stat _s;
#endif #endif
#endif #endif
} tinydir_file; } tinydir_file;
typedef struct tinydir_dir typedef struct tinydir_dir
{ {
_tinydir_char_t path[_TINYDIR_PATH_MAX]; _tinydir_char_t path[_TINYDIR_PATH_MAX];
int has_next; int has_next;
size_t n_files; size_t n_files;
tinydir_file *_files; tinydir_file *_files;
#ifdef _MSC_VER #ifdef _MSC_VER
HANDLE _h; HANDLE _h;
WIN32_FIND_DATA _f; WIN32_FIND_DATA _f;
#else #else
_TINYDIR_DIR *_d; _TINYDIR_DIR *_d;
struct _tinydir_dirent *_e; struct _tinydir_dirent *_e;
#ifndef _TINYDIR_USE_READDIR #ifndef _TINYDIR_USE_READDIR
struct _tinydir_dirent *_ep; struct _tinydir_dirent *_ep;
#endif #endif
#endif #endif
} tinydir_dir; } tinydir_dir;
@ -252,184 +252,184 @@ int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path)
{ {
#ifndef _MSC_VER #ifndef _MSC_VER
#ifndef _TINYDIR_USE_READDIR #ifndef _TINYDIR_USE_READDIR
int error; int error;
int size; /* using int size */ int size; /* using int size */
#endif #endif
#else #else
_tinydir_char_t path_buf[_TINYDIR_PATH_MAX]; _tinydir_char_t path_buf[_TINYDIR_PATH_MAX];
#endif #endif
_tinydir_char_t *pathp; _tinydir_char_t *pathp;
if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0) if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
{ {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
return -1; return -1;
} }
/* initialise dir */ /* initialise dir */
dir->_files = NULL; dir->_files = NULL;
#ifdef _MSC_VER #ifdef _MSC_VER
dir->_h = INVALID_HANDLE_VALUE; dir->_h = INVALID_HANDLE_VALUE;
#else #else
dir->_d = NULL; dir->_d = NULL;
#ifndef _TINYDIR_USE_READDIR #ifndef _TINYDIR_USE_READDIR
dir->_ep = NULL; dir->_ep = NULL;
#endif #endif
#endif #endif
tinydir_close(dir); tinydir_close(dir);
_tinydir_strcpy(dir->path, path); _tinydir_strcpy(dir->path, path);
/* Remove trailing slashes */ /* Remove trailing slashes */
pathp = &dir->path[_tinydir_strlen(dir->path) - 1]; pathp = &dir->path[_tinydir_strlen(dir->path) - 1];
while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/'))) while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/')))
{ {
*pathp = TINYDIR_STRING('\0'); *pathp = TINYDIR_STRING('\0');
pathp++; pathp++;
} }
#ifdef _MSC_VER #ifdef _MSC_VER
_tinydir_strcpy(path_buf, dir->path); _tinydir_strcpy(path_buf, dir->path);
_tinydir_strcat(path_buf, TINYDIR_STRING("\\*")); _tinydir_strcat(path_buf, TINYDIR_STRING("\\*"));
#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) #if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0); dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0);
#else #else
dir->_h = FindFirstFile(path_buf, &dir->_f); dir->_h = FindFirstFile(path_buf, &dir->_f);
#endif #endif
if (dir->_h == INVALID_HANDLE_VALUE) if (dir->_h == INVALID_HANDLE_VALUE)
{ {
errno = ENOENT; errno = ENOENT;
#else #else
dir->_d = _tinydir_opendir(path); dir->_d = _tinydir_opendir(path);
if (dir->_d == NULL) if (dir->_d == NULL)
{ {
#endif #endif
goto bail; goto bail;
} }
/* read first file */ /* read first file */
dir->has_next = 1; dir->has_next = 1;
#ifndef _MSC_VER #ifndef _MSC_VER
#ifdef _TINYDIR_USE_READDIR #ifdef _TINYDIR_USE_READDIR
dir->_e = _tinydir_readdir(dir->_d); dir->_e = _tinydir_readdir(dir->_d);
#else #else
/* allocate dirent buffer for readdir_r */ /* allocate dirent buffer for readdir_r */
size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */ size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */
if (size == -1) return -1; if (size == -1) return -1;
dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size); dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size);
if (dir->_ep == NULL) return -1; if (dir->_ep == NULL) return -1;
error = readdir_r(dir->_d, dir->_ep, &dir->_e); error = readdir_r(dir->_d, dir->_ep, &dir->_e);
if (error != 0) return -1; if (error != 0) return -1;
#endif #endif
if (dir->_e == NULL) if (dir->_e == NULL)
{ {
dir->has_next = 0; dir->has_next = 0;
} }
#endif #endif
return 0; return 0;
bail: bail:
tinydir_close(dir); tinydir_close(dir);
return -1; return -1;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path) int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path)
{ {
/* Count the number of files first, to pre-allocate the files array */ /* Count the number of files first, to pre-allocate the files array */
size_t n_files = 0; size_t n_files = 0;
if (tinydir_open(dir, path) == -1) if (tinydir_open(dir, path) == -1)
{ {
return -1; return -1;
} }
while (dir->has_next) while (dir->has_next)
{ {
n_files++; n_files++;
if (tinydir_next(dir) == -1) if (tinydir_next(dir) == -1)
{ {
goto bail; goto bail;
} }
} }
tinydir_close(dir); tinydir_close(dir);
if (tinydir_open(dir, path) == -1) if (tinydir_open(dir, path) == -1)
{ {
return -1; return -1;
} }
dir->n_files = 0; dir->n_files = 0;
dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files); dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files);
if (dir->_files == NULL) if (dir->_files == NULL)
{ {
goto bail; goto bail;
} }
while (dir->has_next) while (dir->has_next)
{ {
tinydir_file *p_file; tinydir_file *p_file;
dir->n_files++; dir->n_files++;
p_file = &dir->_files[dir->n_files - 1]; p_file = &dir->_files[dir->n_files - 1];
if (tinydir_readfile(dir, p_file) == -1) if (tinydir_readfile(dir, p_file) == -1)
{ {
goto bail; goto bail;
} }
if (tinydir_next(dir) == -1) if (tinydir_next(dir) == -1)
{ {
goto bail; goto bail;
} }
/* Just in case the number of files has changed between the first and /* Just in case the number of files has changed between the first and
second reads, terminate without writing into unallocated memory */ second reads, terminate without writing into unallocated memory */
if (dir->n_files == n_files) if (dir->n_files == n_files)
{ {
break; break;
} }
} }
qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp); qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp);
return 0; return 0;
bail: bail:
tinydir_close(dir); tinydir_close(dir);
return -1; return -1;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
void tinydir_close(tinydir_dir *dir) void tinydir_close(tinydir_dir *dir)
{ {
if (dir == NULL) if (dir == NULL)
{ {
return; return;
} }
memset(dir->path, 0, sizeof(dir->path)); memset(dir->path, 0, sizeof(dir->path));
dir->has_next = 0; dir->has_next = 0;
dir->n_files = 0; dir->n_files = 0;
_TINYDIR_FREE(dir->_files); _TINYDIR_FREE(dir->_files);
dir->_files = NULL; dir->_files = NULL;
#ifdef _MSC_VER #ifdef _MSC_VER
if (dir->_h != INVALID_HANDLE_VALUE) if (dir->_h != INVALID_HANDLE_VALUE)
{ {
FindClose(dir->_h); FindClose(dir->_h);
} }
dir->_h = INVALID_HANDLE_VALUE; dir->_h = INVALID_HANDLE_VALUE;
#else #else
if (dir->_d) if (dir->_d)
{ {
_tinydir_closedir(dir->_d); _tinydir_closedir(dir->_d);
} }
dir->_d = NULL; dir->_d = NULL;
dir->_e = NULL; dir->_e = NULL;
#ifndef _TINYDIR_USE_READDIR #ifndef _TINYDIR_USE_READDIR
_TINYDIR_FREE(dir->_ep); _TINYDIR_FREE(dir->_ep);
dir->_ep = NULL; dir->_ep = NULL;
#endif #endif
#endif #endif
} }
@ -437,323 +437,323 @@ void tinydir_close(tinydir_dir *dir)
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_next(tinydir_dir *dir) int tinydir_next(tinydir_dir *dir)
{ {
if (dir == NULL) if (dir == NULL)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (!dir->has_next) if (!dir->has_next)
{ {
errno = ENOENT; errno = ENOENT;
return -1; return -1;
} }
#ifdef _MSC_VER #ifdef _MSC_VER
if (FindNextFile(dir->_h, &dir->_f) == 0) if (FindNextFile(dir->_h, &dir->_f) == 0)
#else #else
#ifdef _TINYDIR_USE_READDIR #ifdef _TINYDIR_USE_READDIR
dir->_e = _tinydir_readdir(dir->_d); dir->_e = _tinydir_readdir(dir->_d);
#else #else
if (dir->_ep == NULL) if (dir->_ep == NULL)
{ {
return -1; return -1;
} }
if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0) if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0)
{ {
return -1; return -1;
} }
#endif #endif
if (dir->_e == NULL) if (dir->_e == NULL)
#endif #endif
{ {
dir->has_next = 0; dir->has_next = 0;
#ifdef _MSC_VER #ifdef _MSC_VER
if (GetLastError() != ERROR_SUCCESS && if (GetLastError() != ERROR_SUCCESS &&
GetLastError() != ERROR_NO_MORE_FILES) GetLastError() != ERROR_NO_MORE_FILES)
{ {
tinydir_close(dir); tinydir_close(dir);
errno = EIO; errno = EIO;
return -1; return -1;
} }
#endif #endif
} }
return 0; return 0;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file) int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file)
{ {
if (dir == NULL || file == NULL) if (dir == NULL || file == NULL)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
#ifdef _MSC_VER #ifdef _MSC_VER
if (dir->_h == INVALID_HANDLE_VALUE) if (dir->_h == INVALID_HANDLE_VALUE)
#else #else
if (dir->_e == NULL) if (dir->_e == NULL)
#endif #endif
{ {
errno = ENOENT; errno = ENOENT;
return -1; return -1;
} }
if (_tinydir_strlen(dir->path) + if (_tinydir_strlen(dir->path) +
_tinydir_strlen( _tinydir_strlen(
#ifdef _MSC_VER #ifdef _MSC_VER
dir->_f.cFileName dir->_f.cFileName
#else #else
dir->_e->d_name dir->_e->d_name
#endif #endif
) + 1 + _TINYDIR_PATH_EXTRA >= ) + 1 + _TINYDIR_PATH_EXTRA >=
_TINYDIR_PATH_MAX) _TINYDIR_PATH_MAX)
{ {
/* the path for the file will be too long */ /* the path for the file will be too long */
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
return -1; return -1;
} }
if (_tinydir_strlen( if (_tinydir_strlen(
#ifdef _MSC_VER #ifdef _MSC_VER
dir->_f.cFileName dir->_f.cFileName
#else #else
dir->_e->d_name dir->_e->d_name
#endif #endif
) >= _TINYDIR_FILENAME_MAX) ) >= _TINYDIR_FILENAME_MAX)
{ {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
return -1; return -1;
} }
_tinydir_strcpy(file->path, dir->path); _tinydir_strcpy(file->path, dir->path);
_tinydir_strcat(file->path, TINYDIR_STRING("/")); _tinydir_strcat(file->path, TINYDIR_STRING("/"));
_tinydir_strcpy(file->name, _tinydir_strcpy(file->name,
#ifdef _MSC_VER #ifdef _MSC_VER
dir->_f.cFileName dir->_f.cFileName
#else #else
dir->_e->d_name dir->_e->d_name
#endif #endif
); );
_tinydir_strcat(file->path, file->name); _tinydir_strcat(file->path, file->name);
#ifndef _MSC_VER #ifndef _MSC_VER
#ifdef __MINGW32__ #ifdef __MINGW32__
if (_tstat( if (_tstat(
#else #else
if (stat( if (stat(
#endif #endif
file->path, &file->_s) == -1) file->path, &file->_s) == -1)
{ {
return -1; return -1;
} }
#endif #endif
_tinydir_get_ext(file); _tinydir_get_ext(file);
file->is_dir = file->is_dir =
#ifdef _MSC_VER #ifdef _MSC_VER
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
#else #else
S_ISDIR(file->_s.st_mode); S_ISDIR(file->_s.st_mode);
#endif #endif
file->is_reg = file->is_reg =
#ifdef _MSC_VER #ifdef _MSC_VER
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) ||
( (
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) &&
#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM #ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) &&
#endif #endif
#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA #ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) &&
#endif #endif
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) && !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY)); !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY));
#else #else
S_ISREG(file->_s.st_mode); S_ISREG(file->_s.st_mode);
#endif #endif
return 0; return 0;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i) int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i)
{ {
if (dir == NULL || file == NULL) if (dir == NULL || file == NULL)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (i >= dir->n_files) if (i >= dir->n_files)
{ {
errno = ENOENT; errno = ENOENT;
return -1; return -1;
} }
memcpy(file, &dir->_files[i], sizeof(tinydir_file)); memcpy(file, &dir->_files[i], sizeof(tinydir_file));
_tinydir_get_ext(file); _tinydir_get_ext(file);
return 0; return 0;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i) int tinydir_open_subdir_n(tinydir_dir *dir, size_t i)
{ {
_tinydir_char_t path[_TINYDIR_PATH_MAX]; _tinydir_char_t path[_TINYDIR_PATH_MAX];
if (dir == NULL) if (dir == NULL)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (i >= dir->n_files || !dir->_files[i].is_dir) if (i >= dir->n_files || !dir->_files[i].is_dir)
{ {
errno = ENOENT; errno = ENOENT;
return -1; return -1;
} }
_tinydir_strcpy(path, dir->_files[i].path); _tinydir_strcpy(path, dir->_files[i].path);
tinydir_close(dir); tinydir_close(dir);
if (tinydir_open_sorted(dir, path) == -1) if (tinydir_open_sorted(dir, path) == -1)
{ {
return -1; return -1;
} }
return 0; return 0;
} }
/* Open a single file given its path */ /* Open a single file given its path */
_TINYDIR_FUNC _TINYDIR_FUNC
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path) int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
{ {
tinydir_dir dir; tinydir_dir dir;
int result = 0; int result = 0;
int found = 0; int found = 0;
_tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX]; _tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX];
_tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX]; _tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX];
_tinydir_char_t *dir_name; _tinydir_char_t *dir_name;
_tinydir_char_t *base_name; _tinydir_char_t *base_name;
#if (defined _MSC_VER || defined __MINGW32__) #if (defined _MSC_VER || defined __MINGW32__)
_tinydir_char_t drive_buf[_TINYDIR_PATH_MAX]; _tinydir_char_t drive_buf[_TINYDIR_PATH_MAX];
_tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX]; _tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX];
#endif #endif
if (file == NULL || path == NULL || _tinydir_strlen(path) == 0) if (file == NULL || path == NULL || _tinydir_strlen(path) == 0)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
{ {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
return -1; return -1;
} }
/* Get the parent path */ /* Get the parent path */
#if (defined _MSC_VER || defined __MINGW32__) #if (defined _MSC_VER || defined __MINGW32__)
#if ((defined _MSC_VER) && (_MSC_VER >= 1400)) #if ((defined _MSC_VER) && (_MSC_VER >= 1400))
_tsplitpath_s( _tsplitpath_s(
path, path,
drive_buf, _TINYDIR_DRIVE_MAX, drive_buf, _TINYDIR_DRIVE_MAX,
dir_name_buf, _TINYDIR_FILENAME_MAX, dir_name_buf, _TINYDIR_FILENAME_MAX,
file_name_buf, _TINYDIR_FILENAME_MAX, file_name_buf, _TINYDIR_FILENAME_MAX,
ext_buf, _TINYDIR_FILENAME_MAX); ext_buf, _TINYDIR_FILENAME_MAX);
#else #else
_tsplitpath( _tsplitpath(
path, path,
drive_buf, drive_buf,
dir_name_buf, dir_name_buf,
file_name_buf, file_name_buf,
ext_buf); ext_buf);
#endif #endif
/* _splitpath_s not work fine with only filename and widechar support */ /* _splitpath_s not work fine with only filename and widechar support */
#ifdef _UNICODE #ifdef _UNICODE
if (drive_buf[0] == L'\xFEFE') if (drive_buf[0] == L'\xFEFE')
drive_buf[0] = '\0'; drive_buf[0] = '\0';
if (dir_name_buf[0] == L'\xFEFE') if (dir_name_buf[0] == L'\xFEFE')
dir_name_buf[0] = '\0'; dir_name_buf[0] = '\0';
#endif #endif
if (errno) if (errno)
{ {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
/* Emulate the behavior of dirname by returning "." for dir name if it's /* Emulate the behavior of dirname by returning "." for dir name if it's
empty */ empty */
if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0') if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
{ {
_tinydir_strcpy(dir_name_buf, TINYDIR_STRING(".")); _tinydir_strcpy(dir_name_buf, TINYDIR_STRING("."));
} }
/* Concatenate the drive letter and dir name to form full dir name */ /* Concatenate the drive letter and dir name to form full dir name */
_tinydir_strcat(drive_buf, dir_name_buf); _tinydir_strcat(drive_buf, dir_name_buf);
dir_name = drive_buf; dir_name = drive_buf;
/* Concatenate the file name and extension to form base name */ /* Concatenate the file name and extension to form base name */
_tinydir_strcat(file_name_buf, ext_buf); _tinydir_strcat(file_name_buf, ext_buf);
base_name = file_name_buf; base_name = file_name_buf;
#else #else
_tinydir_strcpy(dir_name_buf, path); _tinydir_strcpy(dir_name_buf, path);
dir_name = dirname(dir_name_buf); dir_name = dirname(dir_name_buf);
_tinydir_strcpy(file_name_buf, path); _tinydir_strcpy(file_name_buf, path);
base_name =basename(file_name_buf); base_name =basename(file_name_buf);
#endif #endif
/* Open the parent directory */ /* Open the parent directory */
if (tinydir_open(&dir, dir_name) == -1) if (tinydir_open(&dir, dir_name) == -1)
{ {
return -1; return -1;
} }
/* Read through the parent directory and look for the file */ /* Read through the parent directory and look for the file */
while (dir.has_next) while (dir.has_next)
{ {
if (tinydir_readfile(&dir, file) == -1) if (tinydir_readfile(&dir, file) == -1)
{ {
result = -1; result = -1;
goto bail; goto bail;
} }
if (_tinydir_strcmp(file->name, base_name) == 0) if (_tinydir_strcmp(file->name, base_name) == 0)
{ {
/* File found */ /* File found */
found = 1; found = 1;
break; break;
} }
tinydir_next(&dir); tinydir_next(&dir);
} }
if (!found) if (!found)
{ {
result = -1; result = -1;
errno = ENOENT; errno = ENOENT;
} }
bail: bail:
tinydir_close(&dir); tinydir_close(&dir);
return result; return result;
} }
_TINYDIR_FUNC _TINYDIR_FUNC
void _tinydir_get_ext(tinydir_file *file) void _tinydir_get_ext(tinydir_file *file)
{ {
_tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.')); _tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.'));
if (period == NULL) if (period == NULL)
{ {
file->extension = &(file->name[_tinydir_strlen(file->name)]); file->extension = &(file->name[_tinydir_strlen(file->name)]);
} }
else else
{ {
file->extension = period + 1; file->extension = period + 1;
} }
} }
_TINYDIR_FUNC _TINYDIR_FUNC
int _tinydir_file_cmp(const void *a, const void *b) int _tinydir_file_cmp(const void *a, const void *b)
{ {
const tinydir_file *fa = (const tinydir_file *)a; const tinydir_file *fa = (const tinydir_file *)a;
const tinydir_file *fb = (const tinydir_file *)b; const tinydir_file *fb = (const tinydir_file *)b;
if (fa->is_dir != fb->is_dir) if (fa->is_dir != fb->is_dir)
{ {
return -(fa->is_dir - fb->is_dir); return -(fa->is_dir - fb->is_dir);
} }
return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX); return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX);
} }
#ifndef _MSC_VER #ifndef _MSC_VER
@ -772,27 +772,27 @@ from https://womble.decadent.org.uk/readdir_r-advisory.html
_TINYDIR_FUNC _TINYDIR_FUNC
size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp) size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp)
{ {
long name_max; long name_max;
size_t name_end; size_t name_end;
/* parameter may be unused */ /* parameter may be unused */
(void)dirp; (void)dirp;
#if defined _TINYDIR_USE_FPATHCONF #if defined _TINYDIR_USE_FPATHCONF
name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX); name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX);
if (name_max == -1) if (name_max == -1)
#if defined(NAME_MAX) #if defined(NAME_MAX)
name_max = (NAME_MAX > 255) ? NAME_MAX : 255; name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
#else #else
return (size_t)(-1); return (size_t)(-1);
#endif #endif
#elif defined(NAME_MAX) #elif defined(NAME_MAX)
name_max = (NAME_MAX > 255) ? NAME_MAX : 255; name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
#else #else
#error "buffer size for readdir_r cannot be determined" #error "buffer size for readdir_r cannot be determined"
#endif #endif
name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1; name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1;
return (name_end > sizeof(struct _tinydir_dirent) ? return (name_end > sizeof(struct _tinydir_dirent) ?
name_end : sizeof(struct _tinydir_dirent)); name_end : sizeof(struct _tinydir_dirent));
} }
#endif #endif
#endif #endif

View File

@ -42,8 +42,8 @@
/* /*
void perf_print(unsigned long c1l, unsigned long c1h, void perf_print(unsigned long c1l, unsigned long c1h,
unsigned long c2l, unsigned long c2h, unsigned long c2l, unsigned long c2h,
char *key); char *key);
void perf_print_times(struct tms *start, struct tms *end, char *key); void perf_print_times(struct tms *start, struct tms *end, char *key);

View File

@ -4,16 +4,16 @@
#include "lwip/netif.h" #include "lwip/netif.h"
#include <rtthread.h> #include <rtthread.h>
#define NIOCTL_GADDR 0x01 #define NIOCTL_GADDR 0x01
#ifndef RT_LWIP_ETH_MTU #ifndef RT_LWIP_ETH_MTU
#define ETHERNET_MTU 1500 #define ETHERNET_MTU 1500
#else #else
#define ETHERNET_MTU RT_LWIP_ETH_MTU #define ETHERNET_MTU RT_LWIP_ETH_MTU
#endif #endif
/* eth flag with auto_linkup or phy_linkup */ /* eth flag with auto_linkup or phy_linkup */
#define ETHIF_LINK_AUTOUP 0x0000 #define ETHIF_LINK_AUTOUP 0x0000
#define ETHIF_LINK_PHYUP 0x0100 #define ETHIF_LINK_PHYUP 0x0100
struct eth_device struct eth_device
{ {

View File

@ -44,48 +44,48 @@ extern "C" {
* CCP codes. * CCP codes.
*/ */
#define CCP_CONFREQ 1 #define CCP_CONFREQ 1
#define CCP_CONFACK 2 #define CCP_CONFACK 2
#define CCP_TERMREQ 5 #define CCP_TERMREQ 5
#define CCP_TERMACK 6 #define CCP_TERMACK 6
#define CCP_RESETREQ 14 #define CCP_RESETREQ 14
#define CCP_RESETACK 15 #define CCP_RESETACK 15
/* /*
* Max # bytes for a CCP option * Max # bytes for a CCP option
*/ */
#define CCP_MAX_OPTION_LENGTH 32 #define CCP_MAX_OPTION_LENGTH 32
/* /*
* Parts of a CCP packet. * Parts of a CCP packet.
*/ */
#define CCP_CODE(dp) ((dp)[0]) #define CCP_CODE(dp) ((dp)[0])
#define CCP_ID(dp) ((dp)[1]) #define CCP_ID(dp) ((dp)[1])
#define CCP_LENGTH(dp) (((dp)[2] << 8) + (dp)[3]) #define CCP_LENGTH(dp) (((dp)[2] << 8) + (dp)[3])
#define CCP_HDRLEN 4 #define CCP_HDRLEN 4
#define CCP_OPT_CODE(dp) ((dp)[0]) #define CCP_OPT_CODE(dp) ((dp)[0])
#define CCP_OPT_LENGTH(dp) ((dp)[1]) #define CCP_OPT_LENGTH(dp) ((dp)[1])
#define CCP_OPT_MINLEN 2 #define CCP_OPT_MINLEN 2
#if BSDCOMPRESS_SUPPORT #if BSDCOMPRESS_SUPPORT
/* /*
* Definitions for BSD-Compress. * Definitions for BSD-Compress.
*/ */
#define CI_BSD_COMPRESS 21 /* config. option for BSD-Compress */ #define CI_BSD_COMPRESS 21 /* config. option for BSD-Compress */
#define CILEN_BSD_COMPRESS 3 /* length of config. option */ #define CILEN_BSD_COMPRESS 3 /* length of config. option */
/* Macros for handling the 3rd byte of the BSD-Compress config option. */ /* Macros for handling the 3rd byte of the BSD-Compress config option. */
#define BSD_NBITS(x) ((x) & 0x1F) /* number of bits requested */ #define BSD_NBITS(x) ((x) & 0x1F) /* number of bits requested */
#define BSD_VERSION(x) ((x) >> 5) /* version of option format */ #define BSD_VERSION(x) ((x) >> 5) /* version of option format */
#define BSD_CURRENT_VERSION 1 /* current version number */ #define BSD_CURRENT_VERSION 1 /* current version number */
#define BSD_MAKE_OPT(v, n) (((v) << 5) | (n)) #define BSD_MAKE_OPT(v, n) (((v) << 5) | (n))
#define BSD_MIN_BITS 9 /* smallest code size supported */ #define BSD_MIN_BITS 9 /* smallest code size supported */
#define BSD_MAX_BITS 15 /* largest code size supported */ #define BSD_MAX_BITS 15 /* largest code size supported */
#endif /* BSDCOMPRESS_SUPPORT */ #endif /* BSDCOMPRESS_SUPPORT */
#if DEFLATE_SUPPORT #if DEFLATE_SUPPORT
@ -93,17 +93,17 @@ extern "C" {
* Definitions for Deflate. * Definitions for Deflate.
*/ */
#define CI_DEFLATE 26 /* config option for Deflate */ #define CI_DEFLATE 26 /* config option for Deflate */
#define CI_DEFLATE_DRAFT 24 /* value used in original draft RFC */ #define CI_DEFLATE_DRAFT 24 /* value used in original draft RFC */
#define CILEN_DEFLATE 4 /* length of its config option */ #define CILEN_DEFLATE 4 /* length of its config option */
#define DEFLATE_MIN_SIZE 9 #define DEFLATE_MIN_SIZE 9
#define DEFLATE_MAX_SIZE 15 #define DEFLATE_MAX_SIZE 15
#define DEFLATE_METHOD_VAL 8 #define DEFLATE_METHOD_VAL 8
#define DEFLATE_SIZE(x) (((x) >> 4) + 8) #define DEFLATE_SIZE(x) (((x) >> 4) + 8)
#define DEFLATE_METHOD(x) ((x) & 0x0F) #define DEFLATE_METHOD(x) ((x) & 0x0F)
#define DEFLATE_MAKE_OPT(w) ((((w) - 8) << 4) + DEFLATE_METHOD_VAL) #define DEFLATE_MAKE_OPT(w) ((((w) - 8) << 4) + DEFLATE_METHOD_VAL)
#define DEFLATE_CHK_SEQUENCE 0 #define DEFLATE_CHK_SEQUENCE 0
#endif /* DEFLATE_SUPPORT */ #endif /* DEFLATE_SUPPORT */
#if MPPE_SUPPORT #if MPPE_SUPPORT
@ -120,10 +120,10 @@ extern "C" {
* Definitions for other, as yet unsupported, compression methods. * Definitions for other, as yet unsupported, compression methods.
*/ */
#define CI_PREDICTOR_1 1 /* config option for Predictor-1 */ #define CI_PREDICTOR_1 1 /* config option for Predictor-1 */
#define CILEN_PREDICTOR_1 2 /* length of its config option */ #define CILEN_PREDICTOR_1 2 /* length of its config option */
#define CI_PREDICTOR_2 2 /* config option for Predictor-2 */ #define CI_PREDICTOR_2 2 /* config option for Predictor-2 */
#define CILEN_PREDICTOR_2 2 /* length of its config option */ #define CILEN_PREDICTOR_2 2 /* length of its config option */
#endif /* PREDICTOR_SUPPORT */ #endif /* PREDICTOR_SUPPORT */
typedef struct ccp_options { typedef struct ccp_options {
@ -141,15 +141,15 @@ typedef struct ccp_options {
#endif /* PREDICTOR_SUPPORT */ #endif /* PREDICTOR_SUPPORT */
#if MPPE_SUPPORT #if MPPE_SUPPORT
u8_t mppe; /* MPPE bitfield */ u8_t mppe; /* MPPE bitfield */
#endif /* MPPE_SUPPORT */ #endif /* MPPE_SUPPORT */
#if BSDCOMPRESS_SUPPORT #if BSDCOMPRESS_SUPPORT
u_short bsd_bits; /* # bits/code for BSD Compress */ u_short bsd_bits; /* # bits/code for BSD Compress */
#endif /* BSDCOMPRESS_SUPPORT */ #endif /* BSDCOMPRESS_SUPPORT */
#if DEFLATE_SUPPORT #if DEFLATE_SUPPORT
u_short deflate_size; /* lg(window size) for Deflate */ u_short deflate_size; /* lg(window size) for Deflate */
#endif /* DEFLATE_SUPPORT */ #endif /* DEFLATE_SUPPORT */
u8_t method; /* code for chosen compression method */ u8_t method; /* code for chosen compression method */
} ccp_options; } ccp_options;
extern const struct protent ccp_protent; extern const struct protent ccp_protent;

View File

@ -43,45 +43,45 @@ extern "C" {
/* /*
* CHAP packets begin with a standard header with code, id, len (2 bytes). * CHAP packets begin with a standard header with code, id, len (2 bytes).
*/ */
#define CHAP_HDRLEN 4 #define CHAP_HDRLEN 4
/* /*
* Values for the code field. * Values for the code field.
*/ */
#define CHAP_CHALLENGE 1 #define CHAP_CHALLENGE 1
#define CHAP_RESPONSE 2 #define CHAP_RESPONSE 2
#define CHAP_SUCCESS 3 #define CHAP_SUCCESS 3
#define CHAP_FAILURE 4 #define CHAP_FAILURE 4
/* /*
* CHAP digest codes. * CHAP digest codes.
*/ */
#define CHAP_MD5 5 #define CHAP_MD5 5
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define CHAP_MICROSOFT 0x80 #define CHAP_MICROSOFT 0x80
#define CHAP_MICROSOFT_V2 0x81 #define CHAP_MICROSOFT_V2 0x81
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
/* /*
* Semi-arbitrary limits on challenge and response fields. * Semi-arbitrary limits on challenge and response fields.
*/ */
#define MAX_CHALLENGE_LEN 64 #define MAX_CHALLENGE_LEN 64
#define MAX_RESPONSE_LEN 64 #define MAX_RESPONSE_LEN 64
/* /*
* These limits apply to challenge and response packets we send. * These limits apply to challenge and response packets we send.
* The +4 is the +1 that we actually need rounded up. * The +4 is the +1 that we actually need rounded up.
*/ */
#define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN) #define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN)
#define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN) #define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN)
/* bitmask of supported algorithms */ /* bitmask of supported algorithms */
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define MDTYPE_MICROSOFT_V2 0x1 #define MDTYPE_MICROSOFT_V2 0x1
#define MDTYPE_MICROSOFT 0x2 #define MDTYPE_MICROSOFT 0x2
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
#define MDTYPE_MD5 0x4 #define MDTYPE_MD5 0x4
#define MDTYPE_NONE 0 #define MDTYPE_NONE 0
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
/* Return the digest alg. ID for the most preferred digest type. */ /* Return the digest alg. ID for the most preferred digest type. */
@ -129,24 +129,24 @@ extern "C" {
* The code for each digest type has to supply one of these. * The code for each digest type has to supply one of these.
*/ */
struct chap_digest_type { struct chap_digest_type {
int code; int code;
#if PPP_SERVER #if PPP_SERVER
/* /*
* Note: challenge and response arguments below are formatted as * Note: challenge and response arguments below are formatted as
* a length byte followed by the actual challenge/response data. * a length byte followed by the actual challenge/response data.
*/ */
void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge); void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge);
int (*verify_response)(ppp_pcb *pcb, int id, const char *name, int (*verify_response)(ppp_pcb *pcb, int id, const char *name,
const unsigned char *secret, int secret_len, const unsigned char *secret, int secret_len,
const unsigned char *challenge, const unsigned char *response, const unsigned char *challenge, const unsigned char *response,
char *message, int message_space); char *message, int message_space);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name, void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
const unsigned char *challenge, const char *secret, int secret_len, const unsigned char *challenge, const char *secret, int secret_len,
unsigned char *priv); unsigned char *priv);
int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv); int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv);
void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len); void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len);
}; };
/* /*
@ -154,21 +154,21 @@ struct chap_digest_type {
*/ */
#if CHAP_SUPPORT #if CHAP_SUPPORT
typedef struct chap_client_state { typedef struct chap_client_state {
u8_t flags; u8_t flags;
const char *name; const char *name;
const struct chap_digest_type *digest; const struct chap_digest_type *digest;
unsigned char priv[64]; /* private area for digest's use */ unsigned char priv[64]; /* private area for digest's use */
} chap_client_state; } chap_client_state;
#if PPP_SERVER #if PPP_SERVER
typedef struct chap_server_state { typedef struct chap_server_state {
u8_t flags; u8_t flags;
u8_t id; u8_t id;
const char *name; const char *name;
const struct chap_digest_type *digest; const struct chap_digest_type *digest;
int challenge_xmits; int challenge_xmits;
int challenge_pktlen; int challenge_pktlen;
unsigned char challenge[CHAL_MAX_PKTLEN]; unsigned char challenge[CHAL_MAX_PKTLEN];
} chap_server_state; } chap_server_state;
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
@ -176,9 +176,9 @@ typedef struct chap_server_state {
#if 0 /* UNUSED */ #if 0 /* UNUSED */
/* Hook for a plugin to validate CHAP challenge */ /* Hook for a plugin to validate CHAP challenge */
extern int (*chap_verify_hook)(char *name, char *ourname, int id, extern int (*chap_verify_hook)(char *name, char *ourname, int id,
const struct chap_digest_type *digest, const struct chap_digest_type *digest,
unsigned char *challenge, unsigned char *response, unsigned char *challenge, unsigned char *response,
char *message, int message_space); char *message, int message_space);
#endif /* UNUSED */ #endif /* UNUSED */
#if PPP_SERVER #if PPP_SERVER

View File

@ -24,135 +24,135 @@
#if PPP_SUPPORT && EAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && EAP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef PPP_EAP_H #ifndef PPP_EAP_H
#define PPP_EAP_H #define PPP_EAP_H
#include "ppp.h" #include "ppp.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define EAP_HEADERLEN 4 #define EAP_HEADERLEN 4
/* EAP message codes. */ /* EAP message codes. */
#define EAP_REQUEST 1 #define EAP_REQUEST 1
#define EAP_RESPONSE 2 #define EAP_RESPONSE 2
#define EAP_SUCCESS 3 #define EAP_SUCCESS 3
#define EAP_FAILURE 4 #define EAP_FAILURE 4
/* EAP types */ /* EAP types */
#define EAPT_IDENTITY 1 #define EAPT_IDENTITY 1
#define EAPT_NOTIFICATION 2 #define EAPT_NOTIFICATION 2
#define EAPT_NAK 3 /* (response only) */ #define EAPT_NAK 3 /* (response only) */
#define EAPT_MD5CHAP 4 #define EAPT_MD5CHAP 4
#define EAPT_OTP 5 /* One-Time Password; RFC 1938 */ #define EAPT_OTP 5 /* One-Time Password; RFC 1938 */
#define EAPT_TOKEN 6 /* Generic Token Card */ #define EAPT_TOKEN 6 /* Generic Token Card */
/* 7 and 8 are unassigned. */ /* 7 and 8 are unassigned. */
#define EAPT_RSA 9 /* RSA Public Key Authentication */ #define EAPT_RSA 9 /* RSA Public Key Authentication */
#define EAPT_DSS 10 /* DSS Unilateral */ #define EAPT_DSS 10 /* DSS Unilateral */
#define EAPT_KEA 11 /* KEA */ #define EAPT_KEA 11 /* KEA */
#define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */ #define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */
#define EAPT_TLS 13 /* EAP-TLS */ #define EAPT_TLS 13 /* EAP-TLS */
#define EAPT_DEFENDER 14 /* Defender Token (AXENT) */ #define EAPT_DEFENDER 14 /* Defender Token (AXENT) */
#define EAPT_W2K 15 /* Windows 2000 EAP */ #define EAPT_W2K 15 /* Windows 2000 EAP */
#define EAPT_ARCOT 16 /* Arcot Systems */ #define EAPT_ARCOT 16 /* Arcot Systems */
#define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */ #define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */
#define EAPT_NOKIACARD 18 /* Nokia IP smart card */ #define EAPT_NOKIACARD 18 /* Nokia IP smart card */
#define EAPT_SRP 19 /* Secure Remote Password */ #define EAPT_SRP 19 /* Secure Remote Password */
/* 20 is deprecated */ /* 20 is deprecated */
/* EAP SRP-SHA1 Subtypes */ /* EAP SRP-SHA1 Subtypes */
#define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */ #define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */
#define EAPSRP_CKEY 1 /* Response 1 - Client Key */ #define EAPSRP_CKEY 1 /* Response 1 - Client Key */
#define EAPSRP_SKEY 2 /* Request 2 - Server Key */ #define EAPSRP_SKEY 2 /* Request 2 - Server Key */
#define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */ #define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */
#define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */ #define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */
#define EAPSRP_ACK 3 /* Response 3 - final ack */ #define EAPSRP_ACK 3 /* Response 3 - final ack */
#define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */ #define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */
#define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */ #define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */
#define SRP_PSEUDO_ID "pseudo_" #define SRP_PSEUDO_ID "pseudo_"
#define SRP_PSEUDO_LEN 7 #define SRP_PSEUDO_LEN 7
#define MD5_SIGNATURE_SIZE 16 #define MD5_SIGNATURE_SIZE 16
#define EAP_MIN_CHALLENGE_LENGTH 17 #define EAP_MIN_CHALLENGE_LENGTH 17
#define EAP_MAX_CHALLENGE_LENGTH 24 #define EAP_MAX_CHALLENGE_LENGTH 24
#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3 /* 2^3-1 = 7, 17+7 = 24 */ #define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3 /* 2^3-1 = 7, 17+7 = 24 */
#define EAP_STATES \ #define EAP_STATES \
"Initial", "Pending", "Closed", "Listen", "Identify", \ "Initial", "Pending", "Closed", "Listen", "Identify", \
"SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth" "SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth"
#define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen) #define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen)
#if PPP_SERVER #if PPP_SERVER
#define eap_server_active(pcb) \ #define eap_server_active(pcb) \
((pcb)->eap.es_server.ea_state >= eapIdentify && \ ((pcb)->eap.es_server.ea_state >= eapIdentify && \
(pcb)->eap.es_server.ea_state <= eapMD5Chall) (pcb)->eap.es_server.ea_state <= eapMD5Chall)
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
/* /*
* Complete EAP state for one PPP session. * Complete EAP state for one PPP session.
*/ */
enum eap_state_code { enum eap_state_code {
eapInitial = 0, /* No EAP authentication yet requested */ eapInitial = 0, /* No EAP authentication yet requested */
eapPending, /* Waiting for LCP (no timer) */ eapPending, /* Waiting for LCP (no timer) */
eapClosed, /* Authentication not in use */ eapClosed, /* Authentication not in use */
eapListen, /* Client ready (and timer running) */ eapListen, /* Client ready (and timer running) */
eapIdentify, /* EAP Identify sent */ eapIdentify, /* EAP Identify sent */
eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */ eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */
eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */ eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */
eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */ eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */
eapMD5Chall, /* Sent MD5-Challenge */ eapMD5Chall, /* Sent MD5-Challenge */
eapOpen, /* Completed authentication */ eapOpen, /* Completed authentication */
eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */ eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */
eapBadAuth /* Failed authentication */ eapBadAuth /* Failed authentication */
}; };
struct eap_auth { struct eap_auth {
const char *ea_name; /* Our name */ const char *ea_name; /* Our name */
char ea_peer[MAXNAMELEN +1]; /* Peer's name */ char ea_peer[MAXNAMELEN +1]; /* Peer's name */
void *ea_session; /* Authentication library linkage */ void *ea_session; /* Authentication library linkage */
u_char *ea_skey; /* Shared encryption key */ u_char *ea_skey; /* Shared encryption key */
u_short ea_namelen; /* Length of our name */ u_short ea_namelen; /* Length of our name */
u_short ea_peerlen; /* Length of peer's name */ u_short ea_peerlen; /* Length of peer's name */
enum eap_state_code ea_state; enum eap_state_code ea_state;
u_char ea_id; /* Current id */ u_char ea_id; /* Current id */
u_char ea_requests; /* Number of Requests sent/received */ u_char ea_requests; /* Number of Requests sent/received */
u_char ea_responses; /* Number of Responses */ u_char ea_responses; /* Number of Responses */
u_char ea_type; /* One of EAPT_* */ u_char ea_type; /* One of EAPT_* */
u32_t ea_keyflags; /* SRP shared key usage flags */ u32_t ea_keyflags; /* SRP shared key usage flags */
}; };
#ifndef EAP_MAX_CHALLENGE_LENGTH #ifndef EAP_MAX_CHALLENGE_LENGTH
#define EAP_MAX_CHALLENGE_LENGTH 24 #define EAP_MAX_CHALLENGE_LENGTH 24
#endif #endif
typedef struct eap_state { typedef struct eap_state {
struct eap_auth es_client; /* Client (authenticatee) data */ struct eap_auth es_client; /* Client (authenticatee) data */
#if PPP_SERVER #if PPP_SERVER
struct eap_auth es_server; /* Server (authenticator) data */ struct eap_auth es_server; /* Server (authenticator) data */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
int es_savedtime; /* Saved timeout */ int es_savedtime; /* Saved timeout */
int es_rechallenge; /* EAP rechallenge interval */ int es_rechallenge; /* EAP rechallenge interval */
int es_lwrechallenge; /* SRP lightweight rechallenge inter */ int es_lwrechallenge; /* SRP lightweight rechallenge inter */
u8_t es_usepseudo; /* Use SRP Pseudonym if offered one */ u8_t es_usepseudo; /* Use SRP Pseudonym if offered one */
int es_usedpseudo; /* Set if we already sent PN */ int es_usedpseudo; /* Set if we already sent PN */
int es_challen; /* Length of challenge string */ int es_challen; /* Length of challenge string */
u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH]; u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH];
} eap_state; } eap_state;
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define EAP_DEFTIMEOUT 3 /* Timeout (seconds) for rexmit */ #define EAP_DEFTIMEOUT 3 /* Timeout (seconds) for rexmit */
#define EAP_DEFTRANSMITS 10 /* max # times to transmit */ #define EAP_DEFTRANSMITS 10 /* max # times to transmit */
#define EAP_DEFREQTIME 20 /* Time to wait for peer request */ #define EAP_DEFREQTIME 20 /* Time to wait for peer request */
#define EAP_DEFALLOWREQ 20 /* max # times to accept requests */ #define EAP_DEFALLOWREQ 20 /* max # times to accept requests */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
void eap_authwithpeer(ppp_pcb *pcb, const char *localname); void eap_authwithpeer(ppp_pcb *pcb, const char *localname);
@ -160,7 +160,7 @@ void eap_authpeer(ppp_pcb *pcb, const char *localname);
extern const struct protent eap_protent; extern const struct protent eap_protent;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -42,8 +42,8 @@ extern "C" {
#endif #endif
typedef struct ecp_options { typedef struct ecp_options {
bool required; /* Is ECP required? */ bool required; /* Is ECP required? */
unsigned enctype; /* Encryption type */ unsigned enctype; /* Encryption type */
} ecp_options; } ecp_options;
extern fsm ecp_fsm[]; extern fsm ecp_fsm[];

View File

@ -57,42 +57,42 @@ typedef union
u32_t e32[2]; u32_t e32[2];
} eui64_t; } eui64_t;
#define eui64_iszero(e) (((e).e32[0] | (e).e32[1]) == 0) #define eui64_iszero(e) (((e).e32[0] | (e).e32[1]) == 0)
#define eui64_equals(e, o) (((e).e32[0] == (o).e32[0]) && \ #define eui64_equals(e, o) (((e).e32[0] == (o).e32[0]) && \
((e).e32[1] == (o).e32[1])) ((e).e32[1] == (o).e32[1]))
#define eui64_zero(e) (e).e32[0] = (e).e32[1] = 0; #define eui64_zero(e) (e).e32[0] = (e).e32[1] = 0;
#define eui64_copy(s, d) memcpy(&(d), &(s), sizeof(eui64_t)) #define eui64_copy(s, d) memcpy(&(d), &(s), sizeof(eui64_t))
#define eui64_magic(e) do { \ #define eui64_magic(e) do { \
(e).e32[0] = magic(); \ (e).e32[0] = magic(); \
(e).e32[1] = magic(); \ (e).e32[1] = magic(); \
(e).e8[0] &= ~2; \ (e).e8[0] &= ~2; \
} while (0) } while (0)
#define eui64_magic_nz(x) do { \ #define eui64_magic_nz(x) do { \
eui64_magic(x); \ eui64_magic(x); \
} while (eui64_iszero(x)) } while (eui64_iszero(x))
#define eui64_magic_ne(x, y) do { \ #define eui64_magic_ne(x, y) do { \
eui64_magic(x); \ eui64_magic(x); \
} while (eui64_equals(x, y)) } while (eui64_equals(x, y))
#define eui64_get(ll, cp) do { \ #define eui64_get(ll, cp) do { \
eui64_copy((*cp), (ll)); \ eui64_copy((*cp), (ll)); \
(cp) += sizeof(eui64_t); \ (cp) += sizeof(eui64_t); \
} while (0) } while (0)
#define eui64_put(ll, cp) do { \ #define eui64_put(ll, cp) do { \
eui64_copy((ll), (*cp)); \ eui64_copy((ll), (*cp)); \
(cp) += sizeof(eui64_t); \ (cp) += sizeof(eui64_t); \
} while (0) } while (0)
#define eui64_set32(e, l) do { \ #define eui64_set32(e, l) do { \
(e).e32[0] = 0; \ (e).e32[0] = 0; \
(e).e32[1] = lwip_htonl(l); \ (e).e32[1] = lwip_htonl(l); \
} while (0) } while (0)
#define eui64_setlo32(e, l) eui64_set32(e, l) #define eui64_setlo32(e, l) eui64_set32(e, l)
char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */ char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -46,7 +46,7 @@
#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef FSM_H #ifndef FSM_H
#define FSM_H #define FSM_H
#include "ppp.h" #include "ppp.h"
@ -57,108 +57,108 @@ extern "C" {
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define HEADERLEN 4 #define HEADERLEN 4
/* /*
* CP (LCP, IPCP, etc.) codes. * CP (LCP, IPCP, etc.) codes.
*/ */
#define CONFREQ 1 /* Configuration Request */ #define CONFREQ 1 /* Configuration Request */
#define CONFACK 2 /* Configuration Ack */ #define CONFACK 2 /* Configuration Ack */
#define CONFNAK 3 /* Configuration Nak */ #define CONFNAK 3 /* Configuration Nak */
#define CONFREJ 4 /* Configuration Reject */ #define CONFREJ 4 /* Configuration Reject */
#define TERMREQ 5 /* Termination Request */ #define TERMREQ 5 /* Termination Request */
#define TERMACK 6 /* Termination Ack */ #define TERMACK 6 /* Termination Ack */
#define CODEREJ 7 /* Code Reject */ #define CODEREJ 7 /* Code Reject */
/* /*
* Each FSM is described by an fsm structure and fsm callbacks. * Each FSM is described by an fsm structure and fsm callbacks.
*/ */
typedef struct fsm { typedef struct fsm {
ppp_pcb *pcb; /* PPP Interface */ ppp_pcb *pcb; /* PPP Interface */
const struct fsm_callbacks *callbacks; /* Callback routines */ const struct fsm_callbacks *callbacks; /* Callback routines */
const char *term_reason; /* Reason for closing protocol */ const char *term_reason; /* Reason for closing protocol */
u8_t seen_ack; /* Have received valid Ack/Nak/Rej to Req */ u8_t seen_ack; /* Have received valid Ack/Nak/Rej to Req */
/* -- This is our only flag, we might use u_int :1 if we have more flags */ /* -- This is our only flag, we might use u_int :1 if we have more flags */
u16_t protocol; /* Data Link Layer Protocol field value */ u16_t protocol; /* Data Link Layer Protocol field value */
u8_t state; /* State */ u8_t state; /* State */
u8_t flags; /* Contains option bits */ u8_t flags; /* Contains option bits */
u8_t id; /* Current id */ u8_t id; /* Current id */
u8_t reqid; /* Current request id */ u8_t reqid; /* Current request id */
u8_t retransmits; /* Number of retransmissions left */ u8_t retransmits; /* Number of retransmissions left */
u8_t nakloops; /* Number of nak loops since last ack */ u8_t nakloops; /* Number of nak loops since last ack */
u8_t rnakloops; /* Number of naks received */ u8_t rnakloops; /* Number of naks received */
u8_t maxnakloops; /* Maximum number of nak loops tolerated u8_t maxnakloops; /* Maximum number of nak loops tolerated
(necessary because IPCP require a custom large max nak loops value) */ (necessary because IPCP require a custom large max nak loops value) */
u8_t term_reason_len; /* Length of term_reason */ u8_t term_reason_len; /* Length of term_reason */
} fsm; } fsm;
typedef struct fsm_callbacks { typedef struct fsm_callbacks {
void (*resetci) /* Reset our Configuration Information */ void (*resetci) /* Reset our Configuration Information */
(fsm *); (fsm *);
int (*cilen) /* Length of our Configuration Information */ int (*cilen) /* Length of our Configuration Information */
(fsm *); (fsm *);
void (*addci) /* Add our Configuration Information */ void (*addci) /* Add our Configuration Information */
(fsm *, u_char *, int *); (fsm *, u_char *, int *);
int (*ackci) /* ACK our Configuration Information */ int (*ackci) /* ACK our Configuration Information */
(fsm *, u_char *, int); (fsm *, u_char *, int);
int (*nakci) /* NAK our Configuration Information */ int (*nakci) /* NAK our Configuration Information */
(fsm *, u_char *, int, int); (fsm *, u_char *, int, int);
int (*rejci) /* Reject our Configuration Information */ int (*rejci) /* Reject our Configuration Information */
(fsm *, u_char *, int); (fsm *, u_char *, int);
int (*reqci) /* Request peer's Configuration Information */ int (*reqci) /* Request peer's Configuration Information */
(fsm *, u_char *, int *, int); (fsm *, u_char *, int *, int);
void (*up) /* Called when fsm reaches PPP_FSM_OPENED state */ void (*up) /* Called when fsm reaches PPP_FSM_OPENED state */
(fsm *); (fsm *);
void (*down) /* Called when fsm leaves PPP_FSM_OPENED state */ void (*down) /* Called when fsm leaves PPP_FSM_OPENED state */
(fsm *); (fsm *);
void (*starting) /* Called when we want the lower layer */ void (*starting) /* Called when we want the lower layer */
(fsm *); (fsm *);
void (*finished) /* Called when we don't want the lower layer */ void (*finished) /* Called when we don't want the lower layer */
(fsm *); (fsm *);
void (*protreject) /* Called when Protocol-Reject received */ void (*protreject) /* Called when Protocol-Reject received */
(int); (int);
void (*retransmit) /* Retransmission is necessary */ void (*retransmit) /* Retransmission is necessary */
(fsm *); (fsm *);
int (*extcode) /* Called when unknown code received */ int (*extcode) /* Called when unknown code received */
(fsm *, int, int, u_char *, int); (fsm *, int, int, u_char *, int);
const char *proto_name; /* String name for protocol (for messages) */ const char *proto_name; /* String name for protocol (for messages) */
} fsm_callbacks; } fsm_callbacks;
/* /*
* Link states. * Link states.
*/ */
#define PPP_FSM_INITIAL 0 /* Down, hasn't been opened */ #define PPP_FSM_INITIAL 0 /* Down, hasn't been opened */
#define PPP_FSM_STARTING 1 /* Down, been opened */ #define PPP_FSM_STARTING 1 /* Down, been opened */
#define PPP_FSM_CLOSED 2 /* Up, hasn't been opened */ #define PPP_FSM_CLOSED 2 /* Up, hasn't been opened */
#define PPP_FSM_STOPPED 3 /* Open, waiting for down event */ #define PPP_FSM_STOPPED 3 /* Open, waiting for down event */
#define PPP_FSM_CLOSING 4 /* Terminating the connection, not open */ #define PPP_FSM_CLOSING 4 /* Terminating the connection, not open */
#define PPP_FSM_STOPPING 5 /* Terminating, but open */ #define PPP_FSM_STOPPING 5 /* Terminating, but open */
#define PPP_FSM_REQSENT 6 /* We've sent a Config Request */ #define PPP_FSM_REQSENT 6 /* We've sent a Config Request */
#define PPP_FSM_ACKRCVD 7 /* We've received a Config Ack */ #define PPP_FSM_ACKRCVD 7 /* We've received a Config Ack */
#define PPP_FSM_ACKSENT 8 /* We've sent a Config Ack */ #define PPP_FSM_ACKSENT 8 /* We've sent a Config Ack */
#define PPP_FSM_OPENED 9 /* Connection available */ #define PPP_FSM_OPENED 9 /* Connection available */
/* /*
* Flags - indicate options controlling FSM operation * Flags - indicate options controlling FSM operation
*/ */
#define OPT_PASSIVE 1 /* Don't die if we don't get a response */ #define OPT_PASSIVE 1 /* Don't die if we don't get a response */
#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ #define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */
#define OPT_SILENT 4 /* Wait for peer to speak first */ #define OPT_SILENT 4 /* Wait for peer to speak first */
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define DEFTIMEOUT 3 /* Timeout time in seconds */ #define DEFTIMEOUT 3 /* Timeout time in seconds */
#define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ #define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */
#define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ #define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */
#define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ #define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */

View File

@ -46,7 +46,7 @@
#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef IPCP_H #ifndef IPCP_H
#define IPCP_H #define IPCP_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -55,32 +55,32 @@ extern "C" {
/* /*
* Options. * Options.
*/ */
#define CI_ADDRS 1 /* IP Addresses */ #define CI_ADDRS 1 /* IP Addresses */
#if VJ_SUPPORT #if VJ_SUPPORT
#define CI_COMPRESSTYPE 2 /* Compression Type */ #define CI_COMPRESSTYPE 2 /* Compression Type */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
#define CI_ADDR 3 #define CI_ADDR 3
#if LWIP_DNS #if LWIP_DNS
#define CI_MS_DNS1 129 /* Primary DNS value */ #define CI_MS_DNS1 129 /* Primary DNS value */
#define CI_MS_DNS2 131 /* Secondary DNS value */ #define CI_MS_DNS2 131 /* Secondary DNS value */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
#if 0 /* UNUSED - WINS */ #if 0 /* UNUSED - WINS */
#define CI_MS_WINS1 130 /* Primary WINS value */ #define CI_MS_WINS1 130 /* Primary WINS value */
#define CI_MS_WINS2 132 /* Secondary WINS value */ #define CI_MS_WINS2 132 /* Secondary WINS value */
#endif /* UNUSED - WINS */ #endif /* UNUSED - WINS */
#if VJ_SUPPORT #if VJ_SUPPORT
#define MAX_STATES 16 /* from slcompress.h */ #define MAX_STATES 16 /* from slcompress.h */
#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */ #define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */
#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */ #define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */
#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */ #define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */
/* maxslot and slot number compression) */ /* maxslot and slot number compression) */
#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/ #define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/
#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */ #define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */
/* compression option*/ /* compression option*/
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
typedef struct ipcp_options { typedef struct ipcp_options {
@ -106,17 +106,17 @@ typedef struct ipcp_options {
unsigned int req_dns2 :1; /* Ask peer to send secondary DNS address? */ unsigned int req_dns2 :1; /* Ask peer to send secondary DNS address? */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */ u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */
#if LWIP_DNS #if LWIP_DNS
u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */ u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */
#endif /* LWIP_DNS */ #endif /* LWIP_DNS */
#if 0 /* UNUSED - WINS */ #if 0 /* UNUSED - WINS */
u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */ u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */
#endif /* UNUSED - WINS */ #endif /* UNUSED - WINS */
#if VJ_SUPPORT #if VJ_SUPPORT
u16_t vj_protocol; /* protocol value to use in VJ option */ u16_t vj_protocol; /* protocol value to use in VJ option */
u8_t maxslotindex; /* values for RFC1332 VJ compression neg. */ u8_t maxslotindex; /* values for RFC1332 VJ compression neg. */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
} ipcp_options; } ipcp_options;

View File

@ -142,7 +142,7 @@
#if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef IPV6CP_H #ifndef IPV6CP_H
#define IPV6CP_H #define IPV6CP_H
#include "eui64.h" #include "eui64.h"
@ -153,13 +153,13 @@ extern "C" {
/* /*
* Options. * Options.
*/ */
#define CI_IFACEID 1 /* Interface Identifier */ #define CI_IFACEID 1 /* Interface Identifier */
#ifdef IPV6CP_COMP #ifdef IPV6CP_COMP
#define CI_COMPRESSTYPE 2 /* Compression Type */ #define CI_COMPRESSTYPE 2 /* Compression Type */
#endif /* IPV6CP_COMP */ #endif /* IPV6CP_COMP */
/* No compression types yet defined. /* No compression types yet defined.
*#define IPV6CP_COMP 0x004f *#define IPV6CP_COMP 0x004f
*/ */
typedef struct ipv6cp_options { typedef struct ipv6cp_options {
unsigned int neg_ifaceid :1; /* Negotiate interface identifier? */ unsigned int neg_ifaceid :1; /* Negotiate interface identifier? */

View File

@ -46,7 +46,7 @@
#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
#ifndef LCP_H #ifndef LCP_H
#define LCP_H #define LCP_H
#include "ppp.h" #include "ppp.h"
@ -57,55 +57,55 @@ extern "C" {
/* /*
* Options. * Options.
*/ */
#define CI_VENDOR 0 /* Vendor Specific */ #define CI_VENDOR 0 /* Vendor Specific */
#define CI_MRU 1 /* Maximum Receive Unit */ #define CI_MRU 1 /* Maximum Receive Unit */
#define CI_ASYNCMAP 2 /* Async Control Character Map */ #define CI_ASYNCMAP 2 /* Async Control Character Map */
#define CI_AUTHTYPE 3 /* Authentication Type */ #define CI_AUTHTYPE 3 /* Authentication Type */
#define CI_QUALITY 4 /* Quality Protocol */ #define CI_QUALITY 4 /* Quality Protocol */
#define CI_MAGICNUMBER 5 /* Magic Number */ #define CI_MAGICNUMBER 5 /* Magic Number */
#define CI_PCOMPRESSION 7 /* Protocol Field Compression */ #define CI_PCOMPRESSION 7 /* Protocol Field Compression */
#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ #define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */
#define CI_FCSALTERN 9 /* FCS-Alternatives */ #define CI_FCSALTERN 9 /* FCS-Alternatives */
#define CI_SDP 10 /* Self-Describing-Pad */ #define CI_SDP 10 /* Self-Describing-Pad */
#define CI_NUMBERED 11 /* Numbered-Mode */ #define CI_NUMBERED 11 /* Numbered-Mode */
#define CI_CALLBACK 13 /* callback */ #define CI_CALLBACK 13 /* callback */
#define CI_MRRU 17 /* max reconstructed receive unit; multilink */ #define CI_MRRU 17 /* max reconstructed receive unit; multilink */
#define CI_SSNHF 18 /* short sequence numbers for multilink */ #define CI_SSNHF 18 /* short sequence numbers for multilink */
#define CI_EPDISC 19 /* endpoint discriminator */ #define CI_EPDISC 19 /* endpoint discriminator */
#define CI_MPPLUS 22 /* Multi-Link-Plus-Procedure */ #define CI_MPPLUS 22 /* Multi-Link-Plus-Procedure */
#define CI_LDISC 23 /* Link-Discriminator */ #define CI_LDISC 23 /* Link-Discriminator */
#define CI_LCPAUTH 24 /* LCP Authentication */ #define CI_LCPAUTH 24 /* LCP Authentication */
#define CI_COBS 25 /* Consistent Overhead Byte Stuffing */ #define CI_COBS 25 /* Consistent Overhead Byte Stuffing */
#define CI_PREFELIS 26 /* Prefix Elision */ #define CI_PREFELIS 26 /* Prefix Elision */
#define CI_MPHDRFMT 27 /* MP Header Format */ #define CI_MPHDRFMT 27 /* MP Header Format */
#define CI_I18N 28 /* Internationalization */ #define CI_I18N 28 /* Internationalization */
#define CI_SDL 29 /* Simple Data Link */ #define CI_SDL 29 /* Simple Data Link */
/* /*
* LCP-specific packet types (code numbers). * LCP-specific packet types (code numbers).
*/ */
#define PROTREJ 8 /* Protocol Reject */ #define PROTREJ 8 /* Protocol Reject */
#define ECHOREQ 9 /* Echo Request */ #define ECHOREQ 9 /* Echo Request */
#define ECHOREP 10 /* Echo Reply */ #define ECHOREP 10 /* Echo Reply */
#define DISCREQ 11 /* Discard Request */ #define DISCREQ 11 /* Discard Request */
#define IDENTIF 12 /* Identification */ #define IDENTIF 12 /* Identification */
#define TIMEREM 13 /* Time Remaining */ #define TIMEREM 13 /* Time Remaining */
/* Value used as data for CI_CALLBACK option */ /* Value used as data for CI_CALLBACK option */
#define CBCP_OPT 6 /* Use callback control protocol */ #define CBCP_OPT 6 /* Use callback control protocol */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define DEFMRU 1500 /* Try for this */ #define DEFMRU 1500 /* Try for this */
#define MINMRU 128 /* No MRUs below this */ #define MINMRU 128 /* No MRUs below this */
#define MAXMRU 16384 /* Normally limit MRU to this */ #define MAXMRU 16384 /* Normally limit MRU to this */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
/* An endpoint discriminator, used with multilink. */ /* An endpoint discriminator, used with multilink. */
#define MAX_ENDP_LEN 20 /* maximum length of discriminator value */ #define MAX_ENDP_LEN 20 /* maximum length of discriminator value */
struct epdisc { struct epdisc {
unsigned char class_; /* -- The word "class" is reserved in C++. */ unsigned char class_; /* -- The word "class" is reserved in C++. */
unsigned char length; unsigned char length;
unsigned char value[MAX_ENDP_LEN]; unsigned char value[MAX_ENDP_LEN];
}; };
/* /*
@ -141,20 +141,20 @@ typedef struct lcp_options {
unsigned int neg_ssnhf :1; /* negotiate short sequence numbers */ unsigned int neg_ssnhf :1; /* negotiate short sequence numbers */
unsigned int neg_endpoint :1; /* negotiate endpoint discriminator */ unsigned int neg_endpoint :1; /* negotiate endpoint discriminator */
u16_t mru; /* Value of MRU */ u16_t mru; /* Value of MRU */
#ifdef HAVE_MULTILINK #ifdef HAVE_MULTILINK
u16_t mrru; /* Value of MRRU, and multilink enable */ u16_t mrru; /* Value of MRRU, and multilink enable */
#endif /* MULTILINK */ #endif /* MULTILINK */
#if CHAP_SUPPORT #if CHAP_SUPPORT
u8_t chap_mdtype; /* which MD types (hashing algorithm) */ u8_t chap_mdtype; /* which MD types (hashing algorithm) */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
u32_t asyncmap; /* Value of async map */ u32_t asyncmap; /* Value of async map */
u32_t magicnumber; u32_t magicnumber;
u8_t numloops; /* Number of loops during magic number neg. */ u8_t numloops; /* Number of loops during magic number neg. */
#if LQR_SUPPORT #if LQR_SUPPORT
u32_t lqr_period; /* Reporting period for LQR 1/100ths second */ u32_t lqr_period; /* Reporting period for LQR 1/100ths second */
#endif /* LQR_SUPPORT */ #endif /* LQR_SUPPORT */
struct epdisc endpoint; /* endpoint discriminator */ struct epdisc endpoint; /* endpoint discriminator */
} lcp_options; } lcp_options;
void lcp_open(ppp_pcb *pcb); void lcp_open(ppp_pcb *pcb);
@ -168,7 +168,7 @@ extern const struct protent lcp_protent;
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
/* Default number of times we receive our magic number from the peer /* Default number of times we receive our magic number from the peer
before deciding the link is looped-back. */ before deciding the link is looped-back. */
#define DEFLOOPBACKFAIL 10 #define DEFLOOPBACKFAIL 10
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -102,7 +102,7 @@ void magic_randomize(void);
/* /*
* Return a new random number. * Return a new random number.
*/ */
u32_t magic(void); /* Returns the next magic number */ u32_t magic(void); /* Returns the next magic number */
/* /*
* Fill buffer with random bytes * Fill buffer with random bytes

View File

@ -45,19 +45,19 @@
extern "C" { extern "C" {
#endif #endif
#define MPPE_PAD 4 /* MPPE growth per frame */ #define MPPE_PAD 4 /* MPPE growth per frame */
#define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */ #define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */
/* option bits for ccp_options.mppe */ /* option bits for ccp_options.mppe */
#define MPPE_OPT_40 0x01 /* 40 bit */ #define MPPE_OPT_40 0x01 /* 40 bit */
#define MPPE_OPT_128 0x02 /* 128 bit */ #define MPPE_OPT_128 0x02 /* 128 bit */
#define MPPE_OPT_STATEFUL 0x04 /* stateful mode */ #define MPPE_OPT_STATEFUL 0x04 /* stateful mode */
/* unsupported opts */ /* unsupported opts */
#define MPPE_OPT_56 0x08 /* 56 bit */ #define MPPE_OPT_56 0x08 /* 56 bit */
#define MPPE_OPT_MPPC 0x10 /* MPPC compression */ #define MPPE_OPT_MPPC 0x10 /* MPPC compression */
#define MPPE_OPT_D 0x20 /* Unknown */ #define MPPE_OPT_D 0x20 /* Unknown */
#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D) #define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)
#define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */ #define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */
/* /*
* This is not nice ... the alternative is a bitfield struct though. * This is not nice ... the alternative is a bitfield struct though.
@ -66,70 +66,70 @@ extern "C" {
* but then we have to do a lwip_htonl() all the time and/or we still need * but then we have to do a lwip_htonl() all the time and/or we still need
* to know which octet is which. * to know which octet is which.
*/ */
#define MPPE_C_BIT 0x01 /* MPPC */ #define MPPE_C_BIT 0x01 /* MPPC */
#define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */ #define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */
#define MPPE_L_BIT 0x20 /* 40-bit */ #define MPPE_L_BIT 0x20 /* 40-bit */
#define MPPE_S_BIT 0x40 /* 128-bit */ #define MPPE_S_BIT 0x40 /* 128-bit */
#define MPPE_M_BIT 0x80 /* 56-bit, not supported */ #define MPPE_M_BIT 0x80 /* 56-bit, not supported */
#define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */ #define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */
/* Does not include H bit; used for least significant octet only. */ /* Does not include H bit; used for least significant octet only. */
#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT) #define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)
/* Build a CI from mppe opts (see RFC 3078) */ /* Build a CI from mppe opts (see RFC 3078) */
#define MPPE_OPTS_TO_CI(opts, ci) \ #define MPPE_OPTS_TO_CI(opts, ci) \
do { \ do { \
u_char *ptr = ci; /* u_char[4] */ \ u_char *ptr = ci; /* u_char[4] */ \
\ \
/* H bit */ \ /* H bit */ \
if (opts & MPPE_OPT_STATEFUL) \ if (opts & MPPE_OPT_STATEFUL) \
*ptr++ = 0x0; \ *ptr++ = 0x0; \
else \ else \
*ptr++ = MPPE_H_BIT; \ *ptr++ = MPPE_H_BIT; \
*ptr++ = 0; \ *ptr++ = 0; \
*ptr++ = 0; \ *ptr++ = 0; \
\ \
/* S,L bits */ \ /* S,L bits */ \
*ptr = 0; \ *ptr = 0; \
if (opts & MPPE_OPT_128) \ if (opts & MPPE_OPT_128) \
*ptr |= MPPE_S_BIT; \ *ptr |= MPPE_S_BIT; \
if (opts & MPPE_OPT_40) \ if (opts & MPPE_OPT_40) \
*ptr |= MPPE_L_BIT; \ *ptr |= MPPE_L_BIT; \
/* M,D,C bits not supported */ \ /* M,D,C bits not supported */ \
} while (/* CONSTCOND */ 0) } while (/* CONSTCOND */ 0)
/* The reverse of the above */ /* The reverse of the above */
#define MPPE_CI_TO_OPTS(ci, opts) \ #define MPPE_CI_TO_OPTS(ci, opts) \
do { \ do { \
const u_char *ptr = ci; /* u_char[4] */ \ const u_char *ptr = ci; /* u_char[4] */ \
\ \
opts = 0; \ opts = 0; \
\ \
/* H bit */ \ /* H bit */ \
if (!(ptr[0] & MPPE_H_BIT)) \ if (!(ptr[0] & MPPE_H_BIT)) \
opts |= MPPE_OPT_STATEFUL; \ opts |= MPPE_OPT_STATEFUL; \
\ \
/* S,L bits */ \ /* S,L bits */ \
if (ptr[3] & MPPE_S_BIT) \ if (ptr[3] & MPPE_S_BIT) \
opts |= MPPE_OPT_128; \ opts |= MPPE_OPT_128; \
if (ptr[3] & MPPE_L_BIT) \ if (ptr[3] & MPPE_L_BIT) \
opts |= MPPE_OPT_40; \ opts |= MPPE_OPT_40; \
\ \
/* M,D,C bits */ \ /* M,D,C bits */ \
if (ptr[3] & MPPE_M_BIT) \ if (ptr[3] & MPPE_M_BIT) \
opts |= MPPE_OPT_56; \ opts |= MPPE_OPT_56; \
if (ptr[3] & MPPE_D_BIT) \ if (ptr[3] & MPPE_D_BIT) \
opts |= MPPE_OPT_D; \ opts |= MPPE_OPT_D; \
if (ptr[3] & MPPE_C_BIT) \ if (ptr[3] & MPPE_C_BIT) \
opts |= MPPE_OPT_MPPC; \ opts |= MPPE_OPT_MPPC; \
\ \
/* Other bits */ \ /* Other bits */ \
if (ptr[0] & ~MPPE_H_BIT) \ if (ptr[0] & ~MPPE_H_BIT) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
if (ptr[1] || ptr[2]) \ if (ptr[1] || ptr[2]) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
if (ptr[3] & ~MPPE_ALL_BITS) \ if (ptr[3] & ~MPPE_ALL_BITS) \
opts |= MPPE_OPT_UNKNOWN; \ opts |= MPPE_OPT_UNKNOWN; \
} while (/* CONSTCOND */ 0) } while (/* CONSTCOND */ 0)
/* Shared MPPE padding between MSCHAP and MPPE */ /* Shared MPPE padding between MSCHAP and MPPE */
@ -152,18 +152,18 @@ static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {
* State for an MPPE (de)compressor. * State for an MPPE (de)compressor.
*/ */
typedef struct ppp_mppe_state { typedef struct ppp_mppe_state {
lwip_arc4_context arc4; lwip_arc4_context arc4;
u8_t master_key[MPPE_MAX_KEY_LEN]; u8_t master_key[MPPE_MAX_KEY_LEN];
u8_t session_key[MPPE_MAX_KEY_LEN]; u8_t session_key[MPPE_MAX_KEY_LEN];
u8_t keylen; /* key length in bytes */ u8_t keylen; /* key length in bytes */
/* NB: 128-bit == 16, 40-bit == 8! /* NB: 128-bit == 16, 40-bit == 8!
* If we want to support 56-bit, the unit has to change to bits * If we want to support 56-bit, the unit has to change to bits
*/ */
u8_t bits; /* MPPE control bits */ u8_t bits; /* MPPE control bits */
u16_t ccount; /* 12-bit coherency count (seqno) */ u16_t ccount; /* 12-bit coherency count (seqno) */
u16_t sanity_errors; /* take down LCP if too many */ u16_t sanity_errors; /* take down LCP if too many */
unsigned int stateful :1; /* stateful mode flag */ unsigned int stateful :1; /* stateful mode flag */
unsigned int discard :1; /* stateful mode packet loss flag */ unsigned int discard :1; /* stateful mode packet loss flag */
} ppp_mppe_state; } ppp_mppe_state;
void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key); void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);

View File

@ -107,8 +107,8 @@ extern "C" {
/* /*
* The basic PPP frame. * The basic PPP frame.
*/ */
#define PPP_HDRLEN 4 /* octets for standard ppp header */ #define PPP_HDRLEN 4 /* octets for standard ppp header */
#define PPP_FCSLEN 2 /* octets for FCS */ #define PPP_FCSLEN 2 /* octets for FCS */
/* /*
* Values for phase. * Values for phase.

View File

@ -74,66 +74,66 @@ extern "C" {
/* /*
* The basic PPP frame. * The basic PPP frame.
*/ */
#define PPP_ADDRESS(p) (((u_char *)(p))[0]) #define PPP_ADDRESS(p) (((u_char *)(p))[0])
#define PPP_CONTROL(p) (((u_char *)(p))[1]) #define PPP_CONTROL(p) (((u_char *)(p))[1])
#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3]) #define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
/* /*
* Significant octet values. * Significant octet values.
*/ */
#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ #define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */
#define PPP_UI 0x03 /* Unnumbered Information */ #define PPP_UI 0x03 /* Unnumbered Information */
#define PPP_FLAG 0x7e /* Flag Sequence */ #define PPP_FLAG 0x7e /* Flag Sequence */
#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */ #define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */
#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */ #define PPP_TRANS 0x20 /* Asynchronous transparency modifier */
/* /*
* Protocol field values. * Protocol field values.
*/ */
#define PPP_IP 0x21 /* Internet Protocol */ #define PPP_IP 0x21 /* Internet Protocol */
#if 0 /* UNUSED */ #if 0 /* UNUSED */
#define PPP_AT 0x29 /* AppleTalk Protocol */ #define PPP_AT 0x29 /* AppleTalk Protocol */
#define PPP_IPX 0x2b /* IPX protocol */ #define PPP_IPX 0x2b /* IPX protocol */
#endif /* UNUSED */ #endif /* UNUSED */
#if VJ_SUPPORT #if VJ_SUPPORT
#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */ #define PPP_VJC_COMP 0x2d /* VJ compressed TCP */
#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */ #define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
#if PPP_IPV6_SUPPORT #if PPP_IPV6_SUPPORT
#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */ #define PPP_IPV6 0x57 /* Internet Protocol Version 6 */
#endif /* PPP_IPV6_SUPPORT */ #endif /* PPP_IPV6_SUPPORT */
#if CCP_SUPPORT #if CCP_SUPPORT
#define PPP_COMP 0xfd /* compressed packet */ #define PPP_COMP 0xfd /* compressed packet */
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
#define PPP_IPCP 0x8021 /* IP Control Protocol */ #define PPP_IPCP 0x8021 /* IP Control Protocol */
#if 0 /* UNUSED */ #if 0 /* UNUSED */
#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */ #define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
#define PPP_IPXCP 0x802b /* IPX Control Protocol */ #define PPP_IPXCP 0x802b /* IPX Control Protocol */
#endif /* UNUSED */ #endif /* UNUSED */
#if PPP_IPV6_SUPPORT #if PPP_IPV6_SUPPORT
#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */ #define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */
#endif /* PPP_IPV6_SUPPORT */ #endif /* PPP_IPV6_SUPPORT */
#if CCP_SUPPORT #if CCP_SUPPORT
#define PPP_CCP 0x80fd /* Compression Control Protocol */ #define PPP_CCP 0x80fd /* Compression Control Protocol */
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
#if ECP_SUPPORT #if ECP_SUPPORT
#define PPP_ECP 0x8053 /* Encryption Control Protocol */ #define PPP_ECP 0x8053 /* Encryption Control Protocol */
#endif /* ECP_SUPPORT */ #endif /* ECP_SUPPORT */
#define PPP_LCP 0xc021 /* Link Control Protocol */ #define PPP_LCP 0xc021 /* Link Control Protocol */
#if PAP_SUPPORT #if PAP_SUPPORT
#define PPP_PAP 0xc023 /* Password Authentication Protocol */ #define PPP_PAP 0xc023 /* Password Authentication Protocol */
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */
#if LQR_SUPPORT #if LQR_SUPPORT
#define PPP_LQR 0xc025 /* Link Quality Report protocol */ #define PPP_LQR 0xc025 /* Link Quality Report protocol */
#endif /* LQR_SUPPORT */ #endif /* LQR_SUPPORT */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */ #define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
#if CBCP_SUPPORT #if CBCP_SUPPORT
#define PPP_CBCP 0xc029 /* Callback Control Protocol */ #define PPP_CBCP 0xc029 /* Callback Control Protocol */
#endif /* CBCP_SUPPORT */ #endif /* CBCP_SUPPORT */
#if EAP_SUPPORT #if EAP_SUPPORT
#define PPP_EAP 0xc227 /* Extensible Authentication Protocol */ #define PPP_EAP 0xc227 /* Extensible Authentication Protocol */
#endif /* EAP_SUPPORT */ #endif /* EAP_SUPPORT */
/* /*
@ -165,59 +165,59 @@ struct link_callbacks {
* What to do with network protocol (NP) packets. * What to do with network protocol (NP) packets.
*/ */
enum NPmode { enum NPmode {
NPMODE_PASS, /* pass the packet through */ NPMODE_PASS, /* pass the packet through */
NPMODE_DROP, /* silently drop the packet */ NPMODE_DROP, /* silently drop the packet */
NPMODE_ERROR, /* return an error */ NPMODE_ERROR, /* return an error */
NPMODE_QUEUE /* save it up for later. */ NPMODE_QUEUE /* save it up for later. */
}; };
/* /*
* Statistics. * Statistics.
*/ */
#if PPP_STATS_SUPPORT #if PPP_STATS_SUPPORT
struct pppstat { struct pppstat {
unsigned int ppp_ibytes; /* bytes received */ unsigned int ppp_ibytes; /* bytes received */
unsigned int ppp_ipackets; /* packets received */ unsigned int ppp_ipackets; /* packets received */
unsigned int ppp_ierrors; /* receive errors */ unsigned int ppp_ierrors; /* receive errors */
unsigned int ppp_obytes; /* bytes sent */ unsigned int ppp_obytes; /* bytes sent */
unsigned int ppp_opackets; /* packets sent */ unsigned int ppp_opackets; /* packets sent */
unsigned int ppp_oerrors; /* transmit errors */ unsigned int ppp_oerrors; /* transmit errors */
}; };
#if VJ_SUPPORT #if VJ_SUPPORT
struct vjstat { struct vjstat {
unsigned int vjs_packets; /* outbound packets */ unsigned int vjs_packets; /* outbound packets */
unsigned int vjs_compressed; /* outbound compressed packets */ unsigned int vjs_compressed; /* outbound compressed packets */
unsigned int vjs_searches; /* searches for connection state */ unsigned int vjs_searches; /* searches for connection state */
unsigned int vjs_misses; /* times couldn't find conn. state */ unsigned int vjs_misses; /* times couldn't find conn. state */
unsigned int vjs_uncompressedin; /* inbound uncompressed packets */ unsigned int vjs_uncompressedin; /* inbound uncompressed packets */
unsigned int vjs_compressedin; /* inbound compressed packets */ unsigned int vjs_compressedin; /* inbound compressed packets */
unsigned int vjs_errorin; /* inbound unknown type packets */ unsigned int vjs_errorin; /* inbound unknown type packets */
unsigned int vjs_tossed; /* inbound packets tossed because of error */ unsigned int vjs_tossed; /* inbound packets tossed because of error */
}; };
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
struct ppp_stats { struct ppp_stats {
struct pppstat p; /* basic PPP statistics */ struct pppstat p; /* basic PPP statistics */
#if VJ_SUPPORT #if VJ_SUPPORT
struct vjstat vj; /* VJ header compression statistics */ struct vjstat vj; /* VJ header compression statistics */
#endif /* VJ_SUPPORT */ #endif /* VJ_SUPPORT */
}; };
#if CCP_SUPPORT #if CCP_SUPPORT
struct compstat { struct compstat {
unsigned int unc_bytes; /* total uncompressed bytes */ unsigned int unc_bytes; /* total uncompressed bytes */
unsigned int unc_packets; /* total uncompressed packets */ unsigned int unc_packets; /* total uncompressed packets */
unsigned int comp_bytes; /* compressed bytes */ unsigned int comp_bytes; /* compressed bytes */
unsigned int comp_packets; /* compressed packets */ unsigned int comp_packets; /* compressed packets */
unsigned int inc_bytes; /* incompressible bytes */ unsigned int inc_bytes; /* incompressible bytes */
unsigned int inc_packets; /* incompressible packets */ unsigned int inc_packets; /* incompressible packets */
unsigned int ratio; /* recent compression ratio << 8 */ unsigned int ratio; /* recent compression ratio << 8 */
}; };
struct ppp_comp_stats { struct ppp_comp_stats {
struct compstat c; /* packet compression statistics */ struct compstat c; /* packet compression statistics */
struct compstat d; /* packet decompression statistics */ struct compstat d; /* packet decompression statistics */
}; };
#endif /* CCP_SUPPORT */ #endif /* CCP_SUPPORT */
@ -229,37 +229,37 @@ struct ppp_comp_stats {
* the last NP packet was sent or received. * the last NP packet was sent or received.
*/ */
struct ppp_idle { struct ppp_idle {
time_t xmit_idle; /* time since last NP packet sent */ time_t xmit_idle; /* time since last NP packet sent */
time_t recv_idle; /* time since last NP packet received */ time_t recv_idle; /* time since last NP packet received */
}; };
#endif /* PPP_IDLETIMELIMIT */ #endif /* PPP_IDLETIMELIMIT */
/* values for epdisc.class */ /* values for epdisc.class */
#define EPD_NULL 0 /* null discriminator, no data */ #define EPD_NULL 0 /* null discriminator, no data */
#define EPD_LOCAL 1 #define EPD_LOCAL 1
#define EPD_IP 2 #define EPD_IP 2
#define EPD_MAC 3 #define EPD_MAC 3
#define EPD_MAGIC 4 #define EPD_MAGIC 4
#define EPD_PHONENUM 5 #define EPD_PHONENUM 5
/* /*
* Global variables. * Global variables.
*/ */
#ifdef HAVE_MULTILINK #ifdef HAVE_MULTILINK
extern u8_t multilink; /* enable multilink operation */ extern u8_t multilink; /* enable multilink operation */
extern u8_t doing_multilink; extern u8_t doing_multilink;
extern u8_t multilink_master; extern u8_t multilink_master;
extern u8_t bundle_eof; extern u8_t bundle_eof;
extern u8_t bundle_terminating; extern u8_t bundle_terminating;
#endif #endif
#ifdef MAXOCTETS #ifdef MAXOCTETS
extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */ extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */
extern int maxoctets_dir; /* Direction : extern int maxoctets_dir; /* Direction :
0 - in+out (default) 0 - in+out (default)
1 - in 1 - in
2 - out 2 - out
3 - max(in,out) */ 3 - max(in,out) */
extern int maxoctets_timeout; /* Timeout for check of octets limit */ extern int maxoctets_timeout; /* Timeout for check of octets limit */
#define PPP_OCTETS_DIRECTION_SUM 0 #define PPP_OCTETS_DIRECTION_SUM 0
#define PPP_OCTETS_DIRECTION_IN 1 #define PPP_OCTETS_DIRECTION_IN 1
@ -279,7 +279,7 @@ extern int maxoctets_timeout; /* Timeout for check of octets limit */
* for a particular protocol. * for a particular protocol.
*/ */
struct protent { struct protent {
u_short protocol; /* PPP protocol number */ u_short protocol; /* PPP protocol number */
/* Initialization procedure */ /* Initialization procedure */
void (*init) (ppp_pcb *pcb); void (*init) (ppp_pcb *pcb);
/* Process a received packet */ /* Process a received packet */
@ -297,19 +297,19 @@ struct protent {
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
/* Print a packet in readable form */ /* Print a packet in readable form */
int (*printpkt) (const u_char *pkt, int len, int (*printpkt) (const u_char *pkt, int len,
void (*printer) (void *, const char *, ...), void (*printer) (void *, const char *, ...),
void *arg); void *arg);
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
#if PPP_DATAINPUT #if PPP_DATAINPUT
/* Process a received data packet */ /* Process a received data packet */
void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len); void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len);
#endif /* PPP_DATAINPUT */ #endif /* PPP_DATAINPUT */
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
const char *name; /* Text name of protocol */ const char *name; /* Text name of protocol */
const char *data_name; /* Text name of corresponding data protocol */ const char *data_name; /* Text name of corresponding data protocol */
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
#if PPP_OPTIONS #if PPP_OPTIONS
option_t *options; /* List of command-line options */ option_t *options; /* List of command-line options */
/* Check requested options, assign defaults */ /* Check requested options, assign defaults */
void (*check_options) (void); void (*check_options) (void);
#endif /* PPP_OPTIONS */ #endif /* PPP_OPTIONS */
@ -327,28 +327,28 @@ extern const struct protent* const protocols[];
/* Values for auth_pending, auth_done */ /* Values for auth_pending, auth_done */
#if PAP_SUPPORT #if PAP_SUPPORT
#define PAP_WITHPEER 0x1 #define PAP_WITHPEER 0x1
#define PAP_PEER 0x2 #define PAP_PEER 0x2
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define CHAP_WITHPEER 0x4 #define CHAP_WITHPEER 0x4
#define CHAP_PEER 0x8 #define CHAP_PEER 0x8
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
#if EAP_SUPPORT #if EAP_SUPPORT
#define EAP_WITHPEER 0x10 #define EAP_WITHPEER 0x10
#define EAP_PEER 0x20 #define EAP_PEER 0x20
#endif /* EAP_SUPPORT */ #endif /* EAP_SUPPORT */
/* Values for auth_done only */ /* Values for auth_done only */
#if CHAP_SUPPORT #if CHAP_SUPPORT
#define CHAP_MD5_WITHPEER 0x40 #define CHAP_MD5_WITHPEER 0x40
#define CHAP_MD5_PEER 0x80 #define CHAP_MD5_PEER 0x80
#if MSCHAP_SUPPORT #if MSCHAP_SUPPORT
#define CHAP_MS_SHIFT 8 /* LSB position for MS auths */ #define CHAP_MS_SHIFT 8 /* LSB position for MS auths */
#define CHAP_MS_WITHPEER 0x100 #define CHAP_MS_WITHPEER 0x100
#define CHAP_MS_PEER 0x200 #define CHAP_MS_PEER 0x200
#define CHAP_MS2_WITHPEER 0x400 #define CHAP_MS2_WITHPEER 0x400
#define CHAP_MS2_PEER 0x800 #define CHAP_MS2_PEER 0x800
#endif /* MSCHAP_SUPPORT */ #endif /* MSCHAP_SUPPORT */
#endif /* CHAP_SUPPORT */ #endif /* CHAP_SUPPORT */
@ -370,10 +370,10 @@ extern const struct protent* const protocols[];
* PPP statistics structure * PPP statistics structure
*/ */
struct pppd_stats { struct pppd_stats {
unsigned int bytes_in; unsigned int bytes_in;
unsigned int bytes_out; unsigned int bytes_out;
unsigned int pkts_in; unsigned int pkts_in;
unsigned int pkts_out; unsigned int pkts_out;
}; };
#endif /* PPP_STATS_SUPPORT */ #endif /* PPP_STATS_SUPPORT */
@ -500,34 +500,34 @@ void update_link_stats(int u); /* Get stats at link termination */
* cp MUST be u_char *. * cp MUST be u_char *.
*/ */
#define GETCHAR(c, cp) { \ #define GETCHAR(c, cp) { \
(c) = *(cp)++; \ (c) = *(cp)++; \
} }
#define PUTCHAR(c, cp) { \ #define PUTCHAR(c, cp) { \
*(cp)++ = (u_char) (c); \ *(cp)++ = (u_char) (c); \
} }
#define GETSHORT(s, cp) { \ #define GETSHORT(s, cp) { \
(s) = *(cp)++ << 8; \ (s) = *(cp)++ << 8; \
(s) |= *(cp)++; \ (s) |= *(cp)++; \
} }
#define PUTSHORT(s, cp) { \ #define PUTSHORT(s, cp) { \
*(cp)++ = (u_char) ((s) >> 8); \ *(cp)++ = (u_char) ((s) >> 8); \
*(cp)++ = (u_char) (s); \ *(cp)++ = (u_char) (s); \
} }
#define GETLONG(l, cp) { \ #define GETLONG(l, cp) { \
(l) = *(cp)++ << 8; \ (l) = *(cp)++ << 8; \
(l) |= *(cp)++; (l) <<= 8; \ (l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; (l) <<= 8; \ (l) |= *(cp)++; (l) <<= 8; \
(l) |= *(cp)++; \ (l) |= *(cp)++; \
} }
#define PUTLONG(l, cp) { \ #define PUTLONG(l, cp) { \
*(cp)++ = (u_char) ((l) >> 24); \ *(cp)++ = (u_char) ((l) >> 24); \
*(cp)++ = (u_char) ((l) >> 16); \ *(cp)++ = (u_char) ((l) >> 16); \
*(cp)++ = (u_char) ((l) >> 8); \ *(cp)++ = (u_char) ((l) >> 8); \
*(cp)++ = (u_char) (l); \ *(cp)++ = (u_char) (l); \
} }
#define INCPTR(n, cp) ((cp) += (n)) #define INCPTR(n, cp) ((cp) += (n))
#define DECPTR(n, cp) ((cp) -= (n)) #define DECPTR(n, cp) ((cp) -= (n))
/* /*
* System dependent definitions for user-level 4.3BSD UNIX implementation. * System dependent definitions for user-level 4.3BSD UNIX implementation.
@ -536,10 +536,10 @@ void update_link_stats(int u); /* Get stats at link termination */
#define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0) #define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0)
#define UNTIMEOUT(f, a) sys_untimeout((f), (a)) #define UNTIMEOUT(f, a) sys_untimeout((f), (a))
#define BZERO(s, n) memset(s, 0, n) #define BZERO(s, n) memset(s, 0, n)
#define BCMP(s1, s2, l) memcmp(s1, s2, l) #define BCMP(s1, s2, l) memcmp(s1, s2, l)
#define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); } #define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); }
/* /*
* MAKEHEADER - Add Header fields to a packet. * MAKEHEADER - Add Header fields to a packet.
@ -552,7 +552,7 @@ void update_link_stats(int u); /* Get stats at link termination */
/* Procedures exported from auth.c */ /* Procedures exported from auth.c */
void link_required(ppp_pcb *pcb); /* we are starting to use the link */ void link_required(ppp_pcb *pcb); /* we are starting to use the link */
void link_terminated(ppp_pcb *pcb); /* we are finished with the link */ void link_terminated(ppp_pcb *pcb); /* we are finished with the link */
void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */ void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */
void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */ void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */
void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */ void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */
void start_networks(ppp_pcb *pcb); /* start all the network control protos */ void start_networks(ppp_pcb *pcb); /* start all the network control protos */
@ -562,21 +562,21 @@ void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos
int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen); int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen);
/* check the user name and passwd against configuration */ /* check the user name and passwd against configuration */
void auth_peer_fail(ppp_pcb *pcb, int protocol); void auth_peer_fail(ppp_pcb *pcb, int protocol);
/* peer failed to authenticate itself */ /* peer failed to authenticate itself */
void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen); void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen);
/* peer successfully authenticated itself */ /* peer successfully authenticated itself */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
void auth_withpeer_fail(ppp_pcb *pcb, int protocol); void auth_withpeer_fail(ppp_pcb *pcb, int protocol);
/* we failed to authenticate ourselves */ /* we failed to authenticate ourselves */
void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor); void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor);
/* we successfully authenticated ourselves */ /* we successfully authenticated ourselves */
#endif /* PPP_AUTH_SUPPORT */ #endif /* PPP_AUTH_SUPPORT */
void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */ void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */
void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */ void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */
void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */ void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */
#if PPP_AUTH_SUPPORT #if PPP_AUTH_SUPPORT
int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server); int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server);
/* get "secret" for chap */ /* get "secret" for chap */
#endif /* PPP_AUTH_SUPPORT */ #endif /* PPP_AUTH_SUPPORT */
/* Procedures exported from ipcp.c */ /* Procedures exported from ipcp.c */
@ -584,8 +584,8 @@ int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secre
/* Procedures exported from demand.c */ /* Procedures exported from demand.c */
#if DEMAND_SUPPORT #if DEMAND_SUPPORT
void demand_conf (void); /* config interface(s) for demand-dial */ void demand_conf (void); /* config interface(s) for demand-dial */
void demand_block (void); /* set all NPs to queue up packets */ void demand_block (void); /* set all NPs to queue up packets */
void demand_unblock (void); /* set all NPs to pass packets */ void demand_unblock (void); /* set all NPs to pass packets */
void demand_discard (void); /* set all NPs to discard packets */ void demand_discard (void); /* set all NPs to discard packets */
void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/ void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/
@ -602,10 +602,10 @@ void mp_bundle_terminated (void);
char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */ char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */
int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */ int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */
#else #else
#define mp_bundle_terminated() /* nothing */ #define mp_bundle_terminated() /* nothing */
#define mp_exit_bundle() /* nothing */ #define mp_exit_bundle() /* nothing */
#define doing_multilink 0 #define doing_multilink 0
#define multilink_master 0 #define multilink_master 0
#endif #endif
/* Procedures exported from utils.c. */ /* Procedures exported from utils.c. */

View File

@ -36,7 +36,7 @@
/* This header file is included in all PPP modules needing hashes and/or ciphers */ /* This header file is included in all PPP modules needing hashes and/or ciphers */
#ifndef PPPCRYPT_H #ifndef PPPCRYPT_H
#define PPPCRYPT_H #define PPPCRYPT_H
/* /*
* If included PolarSSL copy is not used, user is expected to include * If included PolarSSL copy is not used, user is expected to include

View File

@ -57,44 +57,44 @@ extern "C" {
/* /*
* Packet header = Code, id, length. * Packet header = Code, id, length.
*/ */
#define UPAP_HEADERLEN 4 #define UPAP_HEADERLEN 4
/* /*
* UPAP codes. * UPAP codes.
*/ */
#define UPAP_AUTHREQ 1 /* Authenticate-Request */ #define UPAP_AUTHREQ 1 /* Authenticate-Request */
#define UPAP_AUTHACK 2 /* Authenticate-Ack */ #define UPAP_AUTHACK 2 /* Authenticate-Ack */
#define UPAP_AUTHNAK 3 /* Authenticate-Nak */ #define UPAP_AUTHNAK 3 /* Authenticate-Nak */
/* /*
* Client states. * Client states.
*/ */
#define UPAPCS_INITIAL 0 /* Connection down */ #define UPAPCS_INITIAL 0 /* Connection down */
#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */ #define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */
#define UPAPCS_PENDING 2 /* Connection down, have requested auth */ #define UPAPCS_PENDING 2 /* Connection down, have requested auth */
#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */ #define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */
#define UPAPCS_OPEN 4 /* We've received an Ack */ #define UPAPCS_OPEN 4 /* We've received an Ack */
#define UPAPCS_BADAUTH 5 /* We've received a Nak */ #define UPAPCS_BADAUTH 5 /* We've received a Nak */
/* /*
* Server states. * Server states.
*/ */
#define UPAPSS_INITIAL 0 /* Connection down */ #define UPAPSS_INITIAL 0 /* Connection down */
#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */ #define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */
#define UPAPSS_PENDING 2 /* Connection down, have requested auth */ #define UPAPSS_PENDING 2 /* Connection down, have requested auth */
#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */ #define UPAPSS_LISTEN 3 /* Listening for an Authenticate */
#define UPAPSS_OPEN 4 /* We've sent an Ack */ #define UPAPSS_OPEN 4 /* We've sent an Ack */
#define UPAPSS_BADAUTH 5 /* We've sent a Nak */ #define UPAPSS_BADAUTH 5 /* We've sent a Nak */
/* /*
* Timeouts. * Timeouts.
*/ */
#if 0 /* moved to ppp_opts.h */ #if 0 /* moved to ppp_opts.h */
#define UPAP_DEFTIMEOUT 3 /* Timeout (seconds) for retransmitting req */ #define UPAP_DEFTIMEOUT 3 /* Timeout (seconds) for retransmitting req */
#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ #define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */
#endif /* moved to ppp_opts.h */ #endif /* moved to ppp_opts.h */
/* /*
@ -102,16 +102,16 @@ extern "C" {
*/ */
#if PAP_SUPPORT #if PAP_SUPPORT
typedef struct upap_state { typedef struct upap_state {
const char *us_user; /* User */ const char *us_user; /* User */
u8_t us_userlen; /* User length */ u8_t us_userlen; /* User length */
const char *us_passwd; /* Password */ const char *us_passwd; /* Password */
u8_t us_passwdlen; /* Password length */ u8_t us_passwdlen; /* Password length */
u8_t us_clientstate; /* Client state */ u8_t us_clientstate; /* Client state */
#if PPP_SERVER #if PPP_SERVER
u8_t us_serverstate; /* Server state */ u8_t us_serverstate; /* Server state */
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
u8_t us_id; /* Current id */ u8_t us_id; /* Current id */
u8_t us_transmits; /* Number of auth-reqs sent */ u8_t us_transmits; /* Number of auth-reqs sent */
} upap_state; } upap_state;
#endif /* PAP_SUPPORT */ #endif /* PAP_SUPPORT */

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2001-2004 Swedish Institute of Computer Science. * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
* COPYRIGHT (C) 2006-2021, RT-Thread Development Team * COPYRIGHT (C) 2006-2018, RT-Thread Development Team
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, * Redistribution and use in source and binary forms, with or without modification,
@ -870,27 +870,27 @@ void list_if(void)
rt_kprintf("gw address: %s\n", ipaddr_ntoa(&(netif->gw))); rt_kprintf("gw address: %s\n", ipaddr_ntoa(&(netif->gw)));
rt_kprintf("net mask : %s\n", ipaddr_ntoa(&(netif->netmask))); rt_kprintf("net mask : %s\n", ipaddr_ntoa(&(netif->netmask)));
#if LWIP_IPV6 #if LWIP_IPV6
{ {
ip6_addr_t *addr; ip6_addr_t *addr;
int addr_state; int addr_state;
int i; int i;
addr = (ip6_addr_t *)&netif->ip6_addr[0]; addr = (ip6_addr_t *)&netif->ip6_addr[0];
addr_state = netif->ip6_addr_state[0]; addr_state = netif->ip6_addr_state[0];
rt_kprintf("\nipv6 link-local: %s state:%02X %s\n", ip6addr_ntoa(addr), rt_kprintf("\nipv6 link-local: %s state:%02X %s\n", ip6addr_ntoa(addr),
addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID"); addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID");
for(i=1; i<LWIP_IPV6_NUM_ADDRESSES; i++) for(i=1; i<LWIP_IPV6_NUM_ADDRESSES; i++)
{ {
addr = (ip6_addr_t *)&netif->ip6_addr[i]; addr = (ip6_addr_t *)&netif->ip6_addr[i];
addr_state = netif->ip6_addr_state[i]; addr_state = netif->ip6_addr_state[i];
rt_kprintf("ipv6[%d] address: %s state:%02X %s\n", i, ip6addr_ntoa(addr), rt_kprintf("ipv6[%d] address: %s state:%02X %s\n", i, ip6addr_ntoa(addr),
addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID"); addr_state, ip6_addr_isvalid(addr_state)?"VALID":"INVALID");
} }
} }
rt_kprintf("\r\n"); rt_kprintf("\r\n");
#endif /* LWIP_IPV6 */ #endif /* LWIP_IPV6 */
netif = netif->next; netif = netif->next;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -43,84 +43,84 @@
#include "netif/ppp/magic.h" #include "netif/ppp/magic.h"
#include "netif/ppp/pppcrypt.h" #include "netif/ppp/pppcrypt.h"
#define MD5_HASH_SIZE 16 #define MD5_HASH_SIZE 16
#define MD5_MIN_CHALLENGE 17 #define MD5_MIN_CHALLENGE 17
#define MD5_MAX_CHALLENGE 24 #define MD5_MAX_CHALLENGE 24
#define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE 3 /* 2^3-1 = 7, 17+7 = 24 */ #define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE 3 /* 2^3-1 = 7, 17+7 = 24 */
#if PPP_SERVER #if PPP_SERVER
static void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) { static void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) {
int clen; int clen;
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE); clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE);
*cp++ = clen; *cp++ = clen;
magic_random_bytes(cp, clen); magic_random_bytes(cp, clen);
} }
static int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name, static int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name,
const unsigned char *secret, int secret_len, const unsigned char *secret, int secret_len,
const unsigned char *challenge, const unsigned char *response, const unsigned char *challenge, const unsigned char *response,
char *message, int message_space) { char *message, int message_space) {
lwip_md5_context ctx; lwip_md5_context ctx;
unsigned char idbyte = id; unsigned char idbyte = id;
unsigned char hash[MD5_HASH_SIZE]; unsigned char hash[MD5_HASH_SIZE];
int challenge_len, response_len; int challenge_len, response_len;
LWIP_UNUSED_ARG(name); LWIP_UNUSED_ARG(name);
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
challenge_len = *challenge++; challenge_len = *challenge++;
response_len = *response++; response_len = *response++;
if (response_len == MD5_HASH_SIZE) { if (response_len == MD5_HASH_SIZE) {
/* Generate hash of ID, secret, challenge */ /* Generate hash of ID, secret, challenge */
lwip_md5_init(&ctx); lwip_md5_init(&ctx);
lwip_md5_starts(&ctx); lwip_md5_starts(&ctx);
lwip_md5_update(&ctx, &idbyte, 1); lwip_md5_update(&ctx, &idbyte, 1);
lwip_md5_update(&ctx, secret, secret_len); lwip_md5_update(&ctx, secret, secret_len);
lwip_md5_update(&ctx, challenge, challenge_len); lwip_md5_update(&ctx, challenge, challenge_len);
lwip_md5_finish(&ctx, hash); lwip_md5_finish(&ctx, hash);
lwip_md5_free(&ctx); lwip_md5_free(&ctx);
/* Test if our hash matches the peer's response */ /* Test if our hash matches the peer's response */
if (memcmp(hash, response, MD5_HASH_SIZE) == 0) { if (memcmp(hash, response, MD5_HASH_SIZE) == 0) {
ppp_slprintf(message, message_space, "Access granted"); ppp_slprintf(message, message_space, "Access granted");
return 1; return 1;
} }
} }
ppp_slprintf(message, message_space, "Access denied"); ppp_slprintf(message, message_space, "Access denied");
return 0; return 0;
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
static void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name, static void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,
const unsigned char *challenge, const char *secret, int secret_len, const unsigned char *challenge, const char *secret, int secret_len,
unsigned char *private_) { unsigned char *private_) {
lwip_md5_context ctx; lwip_md5_context ctx;
unsigned char idbyte = id; unsigned char idbyte = id;
int challenge_len = *challenge++; int challenge_len = *challenge++;
LWIP_UNUSED_ARG(our_name); LWIP_UNUSED_ARG(our_name);
LWIP_UNUSED_ARG(private_); LWIP_UNUSED_ARG(private_);
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
lwip_md5_init(&ctx); lwip_md5_init(&ctx);
lwip_md5_starts(&ctx); lwip_md5_starts(&ctx);
lwip_md5_update(&ctx, &idbyte, 1); lwip_md5_update(&ctx, &idbyte, 1);
lwip_md5_update(&ctx, (const u_char *)secret, secret_len); lwip_md5_update(&ctx, (const u_char *)secret, secret_len);
lwip_md5_update(&ctx, challenge, challenge_len); lwip_md5_update(&ctx, challenge, challenge_len);
lwip_md5_finish(&ctx, &response[1]); lwip_md5_finish(&ctx, &response[1]);
lwip_md5_free(&ctx); lwip_md5_free(&ctx);
response[0] = MD5_HASH_SIZE; response[0] = MD5_HASH_SIZE;
} }
const struct chap_digest_type md5_digest = { const struct chap_digest_type md5_digest = {
CHAP_MD5, /* code */ CHAP_MD5, /* code */
#if PPP_SERVER #if PPP_SERVER
chap_md5_generate_challenge, chap_md5_generate_challenge,
chap_md5_verify_response, chap_md5_verify_response,
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
chap_md5_make_response, chap_md5_make_response,
NULL, /* check_success */ NULL, /* check_success */
NULL, /* handle_failure */ NULL, /* handle_failure */
}; };
#endif /* PPP_SUPPORT && CHAP_SUPPORT */ #endif /* PPP_SUPPORT && CHAP_SUPPORT */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -87,11 +87,11 @@ demand_conf()
/* framemax = lcp_allowoptions[0].mru; /* framemax = lcp_allowoptions[0].mru;
if (framemax < PPP_MRU) */ if (framemax < PPP_MRU) */
framemax = PPP_MRU; framemax = PPP_MRU;
framemax += PPP_HDRLEN + PPP_FCSLEN; framemax += PPP_HDRLEN + PPP_FCSLEN;
frame = malloc(framemax); frame = malloc(framemax);
if (frame == NULL) if (frame == NULL)
novm("demand frame"); novm("demand frame");
framelen = 0; framelen = 0;
pend_q = NULL; pend_q = NULL;
escape_flag = 0; escape_flag = 0;
@ -100,8 +100,8 @@ demand_conf()
netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU)); netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));
if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0 if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0
|| ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0) || ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)
fatal("Couldn't set up demand-dialled PPP interface: %m"); fatal("Couldn't set up demand-dialled PPP interface: %m");
#ifdef PPP_FILTER #ifdef PPP_FILTER
set_filters(&pass_filter, &active_filter); set_filters(&pass_filter, &active_filter);
@ -111,12 +111,12 @@ demand_conf()
* Call the demand_conf procedure for each protocol that's got one. * Call the demand_conf procedure for each protocol that's got one.
*/ */
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
((*protp->demand_conf)(pcb)); ((*protp->demand_conf)(pcb));
/* FIXME: find a way to die() here */ /* FIXME: find a way to die() here */
#if 0 #if 0
if (!((*protp->demand_conf)(pcb))) if (!((*protp->demand_conf)(pcb)))
die(1); die(1);
#endif #endif
} }
@ -131,8 +131,8 @@ demand_block()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE);
get_loop_output(); get_loop_output();
} }
@ -148,14 +148,14 @@ demand_discard()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR);
get_loop_output(); get_loop_output();
/* discard all saved packets */ /* discard all saved packets */
for (pkt = pend_q; pkt != NULL; pkt = nextpkt) { for (pkt = pend_q; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next; nextpkt = pkt->next;
free(pkt); free(pkt);
} }
pend_q = NULL; pend_q = NULL;
framelen = 0; framelen = 0;
@ -174,46 +174,46 @@ demand_unblock()
const struct protent *protp; const struct protent *protp;
for (i = 0; (protp = protocols[i]) != NULL; ++i) for (i = 0; (protp = protocols[i]) != NULL; ++i)
if (protp->demand_conf != NULL) if (protp->demand_conf != NULL)
sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS); sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS);
} }
/* /*
* FCS lookup table as calculated by genfcstab. * FCS lookup table as calculated by genfcstab.
*/ */
static u_short fcstab[256] = { static u_short fcstab[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
}; };
/* /*
@ -238,35 +238,35 @@ loop_chars(p, n)
} }
for (; n > 0; --n) { for (; n > 0; --n) {
c = *p++; c = *p++;
if (c == PPP_FLAG) { if (c == PPP_FLAG) {
if (!escape_flag && !flush_flag if (!escape_flag && !flush_flag
&& framelen > 2 && fcs == PPP_GOODFCS) { && framelen > 2 && fcs == PPP_GOODFCS) {
framelen -= 2; framelen -= 2;
if (loop_frame((unsigned char *)frame, framelen)) if (loop_frame((unsigned char *)frame, framelen))
rv = 1; rv = 1;
} }
framelen = 0; framelen = 0;
flush_flag = 0; flush_flag = 0;
escape_flag = 0; escape_flag = 0;
fcs = PPP_INITFCS; fcs = PPP_INITFCS;
continue; continue;
} }
if (flush_flag) if (flush_flag)
continue; continue;
if (escape_flag) { if (escape_flag) {
c ^= PPP_TRANS; c ^= PPP_TRANS;
escape_flag = 0; escape_flag = 0;
} else if (c == PPP_ESCAPE) { } else if (c == PPP_ESCAPE) {
escape_flag = 1; escape_flag = 1;
continue; continue;
} }
if (framelen >= framemax) { if (framelen >= framemax) {
flush_flag = 1; flush_flag = 1;
continue; continue;
} }
frame[framelen++] = c; frame[framelen++] = c;
fcs = PPP_FCS(fcs, c); fcs = PPP_FCS(fcs, c);
} }
return rv; return rv;
} }
@ -290,22 +290,22 @@ loop_frame(frame, len)
/* dbglog("from loop: %P", frame, len); */ /* dbglog("from loop: %P", frame, len); */
if (len < PPP_HDRLEN) if (len < PPP_HDRLEN)
return 0; return 0;
if ((PPP_PROTOCOL(frame) & 0x8000) != 0) if ((PPP_PROTOCOL(frame) & 0x8000) != 0)
return 0; /* shouldn't get any of these anyway */ return 0; /* shouldn't get any of these anyway */
if (!active_packet(frame, len)) if (!active_packet(frame, len))
return 0; return 0;
pkt = (struct packet *) malloc(sizeof(struct packet) + len); pkt = (struct packet *) malloc(sizeof(struct packet) + len);
if (pkt != NULL) { if (pkt != NULL) {
pkt->length = len; pkt->length = len;
pkt->next = NULL; pkt->next = NULL;
memcpy(pkt->data, frame, len); memcpy(pkt->data, frame, len);
if (pend_q == NULL) if (pend_q == NULL)
pend_q = pkt; pend_q = pkt;
else else
pend_qtail->next = pkt; pend_qtail->next = pkt;
pend_qtail = pkt; pend_qtail = pkt;
} }
return 1; return 1;
} }
@ -332,15 +332,15 @@ demand_rexmit(proto, newip)
pend_q = NULL; pend_q = NULL;
tv.tv_sec = 1; tv.tv_sec = 1;
tv.tv_usec = 0; tv.tv_usec = 0;
select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */ select(0,NULL,NULL,NULL,&tv); /* Sleep for 1 Seconds */
for (; pkt != NULL; pkt = nextpkt) { for (; pkt != NULL; pkt = nextpkt) {
nextpkt = pkt->next; nextpkt = pkt->next;
if (PPP_PROTOCOL(pkt->data) == proto) { if (PPP_PROTOCOL(pkt->data) == proto) {
if ( (proto == PPP_IP) && newip ) { if ( (proto == PPP_IP) && newip ) {
/* Get old checksum */ /* Get old checksum */
iphdr = (pkt->data[4] & 15) << 2; iphdr = (pkt->data[4] & 15) << 2;
checksum = *((unsigned short *) (pkt->data+14)); checksum = *((unsigned short *) (pkt->data+14));
if (checksum == 0xFFFF) { if (checksum == 0xFFFF) {
checksum = 0; checksum = 0;
} }
@ -348,7 +348,7 @@ demand_rexmit(proto, newip)
if (pkt->data[13] == 17) { if (pkt->data[13] == 17) {
pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr)); pkt_checksum = *((unsigned short *) (pkt->data+10+iphdr));
if (pkt_checksum) { if (pkt_checksum) {
cv = 1; cv = 1;
if (pkt_checksum == 0xFFFF) { if (pkt_checksum == 0xFFFF) {
pkt_checksum = 0; pkt_checksum = 0;
@ -359,71 +359,71 @@ demand_rexmit(proto, newip)
} }
} }
if (pkt->data[13] == 6) { if (pkt->data[13] == 6) {
pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr)); pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));
cv = 1; cv = 1;
if (pkt_checksum == 0xFFFF) { if (pkt_checksum == 0xFFFF) {
pkt_checksum = 0; pkt_checksum = 0;
} }
} }
/* Delete old Source-IP-Address */ /* Delete old Source-IP-Address */
checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
/* Change Source-IP-Address */ /* Change Source-IP-Address */
* ((u32_t *) (pkt->data + 16)) = newip; * ((u32_t *) (pkt->data + 16)) = newip;
/* Add new Source-IP-Address */ /* Add new Source-IP-Address */
checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF; pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;
pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF; pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;
/* Write new checksum */ /* Write new checksum */
if (!checksum) { if (!checksum) {
checksum = 0xFFFF; checksum = 0xFFFF;
} }
*((unsigned short *) (pkt->data+14)) = checksum; *((unsigned short *) (pkt->data+14)) = checksum;
if (pkt->data[13] == 6) { if (pkt->data[13] == 6) {
*((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum; *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;
} }
if (cv && (pkt->data[13] == 17) ) { if (cv && (pkt->data[13] == 17) ) {
*((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum; *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;
} }
/* Log Packet */ /* Log Packet */
strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16)))); strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));
if (pkt->data[13] == 1) { if (pkt->data[13] == 1) {
syslog(LOG_INFO,"Open ICMP %s -> %s\n", syslog(LOG_INFO,"Open ICMP %s -> %s\n",
ipstr, ipstr,
inet_ntoa(*( (struct in_addr *) (pkt->data+20)))); inet_ntoa(*( (struct in_addr *) (pkt->data+20))));
} else { } else {
syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n", syslog(LOG_INFO,"Open %s %s:%d -> %s:%d\n",
pkt->data[13] == 6 ? "TCP" : "UDP", pkt->data[13] == 6 ? "TCP" : "UDP",
ipstr, ipstr,
ntohs(*( (short *) (pkt->data+iphdr+4))), ntohs(*( (short *) (pkt->data+iphdr+4))),
inet_ntoa(*( (struct in_addr *) (pkt->data+20))), inet_ntoa(*( (struct in_addr *) (pkt->data+20))),
ntohs(*( (short *) (pkt->data+iphdr+6)))); ntohs(*( (short *) (pkt->data+iphdr+6))));
} }
} }
output(pcb, pkt->data, pkt->length); output(pcb, pkt->data, pkt->length);
free(pkt); free(pkt);
} else { } else {
if (prev == NULL) if (prev == NULL)
pend_q = pkt; pend_q = pkt;
else else
prev->next = pkt; prev->next = pkt;
prev = pkt; prev = pkt;
} }
} }
pend_qtail = prev; pend_qtail = prev;
if (prev != NULL) if (prev != NULL)
prev->next = NULL; prev->next = NULL;
} }
/* /*
@ -439,27 +439,27 @@ active_packet(p, len)
const struct protent *protp; const struct protent *protp;
if (len < PPP_HDRLEN) if (len < PPP_HDRLEN)
return 0; return 0;
proto = PPP_PROTOCOL(p); proto = PPP_PROTOCOL(p);
#ifdef PPP_FILTER #ifdef PPP_FILTER
p[0] = 1; /* outbound packet indicator */ p[0] = 1; /* outbound packet indicator */
if ((pass_filter.bf_len != 0 if ((pass_filter.bf_len != 0
&& bpf_filter(pass_filter.bf_insns, p, len, len) == 0) && bpf_filter(pass_filter.bf_insns, p, len, len) == 0)
|| (active_filter.bf_len != 0 || (active_filter.bf_len != 0
&& bpf_filter(active_filter.bf_insns, p, len, len) == 0)) { && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) {
p[0] = 0xff; p[0] = 0xff;
return 0; return 0;
} }
p[0] = 0xff; p[0] = 0xff;
#endif #endif
for (i = 0; (protp = protocols[i]) != NULL; ++i) { for (i = 0; (protp = protocols[i]) != NULL; ++i) {
if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) { if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {
if (protp->active_pkt == NULL) if (protp->active_pkt == NULL)
return 1; return 1;
return (*protp->active_pkt)(p, len); return (*protp->active_pkt)(p, len);
}
} }
} return 0; /* not a supported protocol !!?? */
return 0; /* not a supported protocol !!?? */
} }
#endif /* PPP_SUPPORT && DEMAND_SUPPORT */ #endif /* PPP_SUPPORT && DEMAND_SUPPORT */

File diff suppressed because it is too large Load Diff

View File

@ -92,8 +92,8 @@ static void ecp_protrej (int unit);
*/ */
#if PRINTPKT_SUPPORT #if PRINTPKT_SUPPORT
static int ecp_printpkt (const u_char *pkt, int len, static int ecp_printpkt (const u_char *pkt, int len,
void (*printer) (void *, char *, ...), void (*printer) (void *, char *, ...),
void *arg); void *arg);
#endif /* PRINTPKT_SUPPORT */ #endif /* PRINTPKT_SUPPORT */
/* /*
static void ecp_datainput (int unit, u_char *pkt, int len); static void ecp_datainput (int unit, u_char *pkt, int len);
@ -129,10 +129,10 @@ const struct protent ecp_protent = {
}; };
fsm ecp_fsm[NUM_PPP]; fsm ecp_fsm[NUM_PPP];
ecp_options ecp_wantoptions[NUM_PPP]; /* what to request the peer to use */ ecp_options ecp_wantoptions[NUM_PPP]; /* what to request the peer to use */
ecp_options ecp_gotoptions[NUM_PPP]; /* what the peer agreed to do */ ecp_options ecp_gotoptions[NUM_PPP]; /* what the peer agreed to do */
ecp_options ecp_allowoptions[NUM_PPP]; /* what we'll agree to do */ ecp_options ecp_allowoptions[NUM_PPP]; /* what we'll agree to do */
ecp_options ecp_hisoptions[NUM_PPP]; /* what we agreed to do */ ecp_options ecp_hisoptions[NUM_PPP]; /* what we agreed to do */
static const fsm_callbacks ecp_callbacks = { static const fsm_callbacks ecp_callbacks = {
NULL, /* ecp_resetci, */ NULL, /* ecp_resetci, */

View File

@ -48,8 +48,8 @@ char *eui64_ntoa(eui64_t e) {
static char buf[20]; static char buf[20];
sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x", sprintf(buf, "%02x%02x:%02x%02x:%02x%02x:%02x%02x",
e.e8[0], e.e8[1], e.e8[2], e.e8[3], e.e8[0], e.e8[1], e.e8[2], e.e8[3],
e.e8[4], e.e8[5], e.e8[6], e.e8[7]); e.e8[4], e.e8[5], e.e8[6], e.e8[7]);
return buf; return buf;
} }

View File

@ -68,7 +68,7 @@ static void fsm_rtermack(fsm *f);
static void fsm_rcoderej(fsm *f, u_char *inp, int len); static void fsm_rcoderej(fsm *f, u_char *inp, int len);
static void fsm_sconfreq(fsm *f, int retransmit); static void fsm_sconfreq(fsm *f, int retransmit);
#define PROTO_NAME(f) ((f)->callbacks->proto_name) #define PROTO_NAME(f) ((f)->callbacks->proto_name)
/* /*
* fsm_init - Initialize fsm. * fsm_init - Initialize fsm.
@ -79,7 +79,7 @@ void fsm_init(fsm *f) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
f->flags = 0; f->flags = 0;
f->id = 0; /* XXX Start with random id? */ f->id = 0; /* XXX Start with random id? */
f->maxnakloops = pcb->settings.fsm_max_nak_loops; f->maxnakloops = pcb->settings.fsm_max_nak_loops;
f->term_reason_len = 0; f->term_reason_len = 0;
} }
@ -91,22 +91,22 @@ void fsm_init(fsm *f) {
void fsm_lowerup(fsm *f) { void fsm_lowerup(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_INITIAL: case PPP_FSM_INITIAL:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
break; break;
case PPP_FSM_STARTING: case PPP_FSM_STARTING:
if( f->flags & OPT_SILENT ) if( f->flags & OPT_SILENT )
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
else { else {
/* Send an initial configure-request */ /* Send an initial configure-request */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
default: default:
FSMDEBUG(("%s: Up event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Up event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -119,37 +119,37 @@ void fsm_lowerup(fsm *f) {
void fsm_lowerdown(fsm *f) { void fsm_lowerdown(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
if( f->callbacks->starting ) if( f->callbacks->starting )
(*f->callbacks->starting)(f); (*f->callbacks->starting)(f);
break; break;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if( f->callbacks->down ) if( f->callbacks->down )
(*f->callbacks->down)(f); (*f->callbacks->down)(f);
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
break; break;
default: default:
FSMDEBUG(("%s: Down event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Down event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -160,34 +160,34 @@ void fsm_lowerdown(fsm *f) {
void fsm_open(fsm *f) { void fsm_open(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_INITIAL: case PPP_FSM_INITIAL:
f->state = PPP_FSM_STARTING; f->state = PPP_FSM_STARTING;
if( f->callbacks->starting ) if( f->callbacks->starting )
(*f->callbacks->starting)(f); (*f->callbacks->starting)(f);
break; break;
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
if( f->flags & OPT_SILENT ) if( f->flags & OPT_SILENT )
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
else { else {
/* Send an initial configure-request */ /* Send an initial configure-request */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
f->state = PPP_FSM_STOPPING; f->state = PPP_FSM_STOPPING;
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if( f->flags & OPT_RESTART ){ if( f->flags & OPT_RESTART ){
fsm_lowerdown(f); fsm_lowerdown(f);
fsm_lowerup(f); fsm_lowerup(f);
} }
break; break;
default: default:
break; break;
} }
} }
@ -201,25 +201,25 @@ static void terminate_layer(fsm *f, int nextstate) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
if( f->state != PPP_FSM_OPENED ) if( f->state != PPP_FSM_OPENED )
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
else if( f->callbacks->down ) else if( f->callbacks->down )
(*f->callbacks->down)(f); /* Inform upper layers we're down */ (*f->callbacks->down)(f); /* Inform upper layers we're down */
/* Init restart counter and send Terminate-Request */ /* Init restart counter and send Terminate-Request */
f->retransmits = pcb->settings.fsm_max_term_transmits; f->retransmits = pcb->settings.fsm_max_term_transmits;
fsm_sdata(f, TERMREQ, f->reqid = ++f->id, fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
(const u_char *) f->term_reason, f->term_reason_len); (const u_char *) f->term_reason, f->term_reason_len);
if (f->retransmits == 0) { if (f->retransmits == 0) {
/* /*
* User asked for no terminate requests at all; just close it. * User asked for no terminate requests at all; just close it.
* We've already fired off one Terminate-Request just to be nice * We've already fired off one Terminate-Request just to be nice
* to the peer, but we're not going to wait for a reply. * to the peer, but we're not going to wait for a reply.
*/ */
f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED; f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
return; return;
} }
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
@ -239,23 +239,23 @@ void fsm_close(fsm *f, const char *reason) {
f->term_reason_len = (reason == NULL? 0: (u8_t)LWIP_MIN(strlen(reason), 0xFF) ); f->term_reason_len = (reason == NULL? 0: (u8_t)LWIP_MIN(strlen(reason), 0xFF) );
switch( f->state ){ switch( f->state ){
case PPP_FSM_STARTING: case PPP_FSM_STARTING:
f->state = PPP_FSM_INITIAL; f->state = PPP_FSM_INITIAL;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
f->state = PPP_FSM_CLOSING; f->state = PPP_FSM_CLOSING;
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
terminate_layer(f, PPP_FSM_CLOSING); terminate_layer(f, PPP_FSM_CLOSING);
break; break;
default: default:
break; break;
} }
} }
@ -270,44 +270,44 @@ static void fsm_timeout(void *arg) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
if( f->retransmits <= 0 ){ if( f->retransmits <= 0 ){
/* /*
* We've waited for an ack long enough. Peer probably heard us. * We've waited for an ack long enough. Peer probably heard us.
*/ */
f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED; f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
} else { } else {
/* Send Terminate-Request */ /* Send Terminate-Request */
fsm_sdata(f, TERMREQ, f->reqid = ++f->id, fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
(const u_char *) f->term_reason, f->term_reason_len); (const u_char *) f->term_reason, f->term_reason_len);
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
--f->retransmits; --f->retransmits;
} }
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
if (f->retransmits <= 0) { if (f->retransmits <= 0) {
ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f)); ppp_warn("%s: timeout sending Config-Requests", PROTO_NAME(f));
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished ) if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
} else { } else {
/* Retransmit the configure-request */ /* Retransmit the configure-request */
if (f->callbacks->retransmit) if (f->callbacks->retransmit)
(*f->callbacks->retransmit)(f); (*f->callbacks->retransmit)(f);
fsm_sconfreq(f, 1); /* Re-send Configure-Request */ fsm_sconfreq(f, 1); /* Re-send Configure-Request */
if( f->state == PPP_FSM_ACKRCVD ) if( f->state == PPP_FSM_ACKRCVD )
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
break; break;
default: default:
FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state)); FSMDEBUG(("%s: Timeout event in state %d!", PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -326,26 +326,26 @@ void fsm_input(fsm *f, u_char *inpacket, int l) {
*/ */
inp = inpacket; inp = inpacket;
if (l < HEADERLEN) { if (l < HEADERLEN) {
FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd short header.", f->protocol));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
GETSHORT(len, inp); GETSHORT(len, inp);
if (len < HEADERLEN) { if (len < HEADERLEN) {
FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd illegal length.", f->protocol));
return; return;
} }
if (len > l) { if (len > l) {
FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol)); FSMDEBUG(("fsm_input(%x): Rcvd short packet.", f->protocol));
return; return;
} }
len -= HEADERLEN; /* subtract header length */ len -= HEADERLEN; /* subtract header length */
if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){ if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){
FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.", FSMDEBUG(("fsm_input(%x): Rcvd packet in state %d.",
f->protocol, f->state)); f->protocol, f->state));
return; return;
} }
/* /*
@ -353,35 +353,35 @@ void fsm_input(fsm *f, u_char *inpacket, int l) {
*/ */
switch (code) { switch (code) {
case CONFREQ: case CONFREQ:
fsm_rconfreq(f, id, inp, len); fsm_rconfreq(f, id, inp, len);
break; break;
case CONFACK: case CONFACK:
fsm_rconfack(f, id, inp, len); fsm_rconfack(f, id, inp, len);
break; break;
case CONFNAK: case CONFNAK:
case CONFREJ: case CONFREJ:
fsm_rconfnakrej(f, code, id, inp, len); fsm_rconfnakrej(f, code, id, inp, len);
break; break;
case TERMREQ: case TERMREQ:
fsm_rtermreq(f, id, inp, len); fsm_rtermreq(f, id, inp, len);
break; break;
case TERMACK: case TERMACK:
fsm_rtermack(f); fsm_rtermack(f);
break; break;
case CODEREJ: case CODEREJ:
fsm_rcoderej(f, inp, len); fsm_rcoderej(f, inp, len);
break; break;
default: default:
if( !f->callbacks->extcode if( !f->callbacks->extcode
|| !(*f->callbacks->extcode)(f, code, id, inp, len) ) || !(*f->callbacks->extcode)(f, code, id, inp, len) )
fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN); fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
break; break;
} }
} }
@ -394,61 +394,61 @@ static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
/* Go away, we're closed */ /* Go away, we're closed */
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
return; return;
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
return; return;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if( f->callbacks->down ) if( f->callbacks->down )
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
/* Negotiation started by our peer */ /* Negotiation started by our peer */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
/* /*
* Pass the requested configuration options * Pass the requested configuration options
* to protocol-specific code for checking. * to protocol-specific code for checking.
*/ */
if (f->callbacks->reqci){ /* Check CI */ if (f->callbacks->reqci){ /* Check CI */
reject_if_disagree = (f->nakloops >= f->maxnakloops); reject_if_disagree = (f->nakloops >= f->maxnakloops);
code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree); code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
} else if (len) } else if (len)
code = CONFREJ; /* Reject all CI */ code = CONFREJ; /* Reject all CI */
else else
code = CONFACK; code = CONFACK;
/* send the Ack, Nak or Rej to the peer */ /* send the Ack, Nak or Rej to the peer */
fsm_sdata(f, code, id, inp, len); fsm_sdata(f, code, id, inp, len);
if (code == CONFACK) { if (code == CONFACK) {
if (f->state == PPP_FSM_ACKRCVD) { if (f->state == PPP_FSM_ACKRCVD) {
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = PPP_FSM_OPENED; f->state = PPP_FSM_OPENED;
if (f->callbacks->up) if (f->callbacks->up)
(*f->callbacks->up)(f); /* Inform upper layers */ (*f->callbacks->up)(f); /* Inform upper layers */
} else } else
f->state = PPP_FSM_ACKSENT; f->state = PPP_FSM_ACKSENT;
f->nakloops = 0; f->nakloops = 0;
} else { } else {
/* we sent CONFACK or CONFREJ */ /* we sent CONFACK or CONFREJ */
if (f->state != PPP_FSM_ACKRCVD) if (f->state != PPP_FSM_ACKRCVD)
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
if( code == CONFNAK ) if( code == CONFNAK )
++f->nakloops; ++f->nakloops;
} }
} }
@ -459,13 +459,13 @@ static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {
static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) { static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {
ppp_pcb *pcb = f->pcb; ppp_pcb *pcb = f->pcb;
if (id != f->reqid || f->seen_ack) /* Expected id? */ if (id != f->reqid || f->seen_ack) /* Expected id? */
return; /* Nope, toss... */ return; /* Nope, toss... */
if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
(len == 0)) ){ (len == 0)) ){
/* Ack is bad - ignore it */ /* Ack is bad - ignore it */
ppp_error("Received bad configure-ack: %P", inp, len); ppp_error("Received bad configure-ack: %P", inp, len);
return; return;
} }
f->seen_ack = 1; f->seen_ack = 1;
f->rnakloops = 0; f->rnakloops = 0;
@ -473,38 +473,38 @@ static void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
f->state = PPP_FSM_ACKRCVD; f->state = PPP_FSM_ACKRCVD;
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
/* Huh? an extra valid Ack? oh well... */ /* Huh? an extra valid Ack? oh well... */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
f->state = PPP_FSM_OPENED; f->state = PPP_FSM_OPENED;
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
if (f->callbacks->up) if (f->callbacks->up)
(*f->callbacks->up)(f); /* Inform upper layers */ (*f->callbacks->up)(f); /* Inform upper layers */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -516,24 +516,24 @@ static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {
int ret; int ret;
int treat_as_reject; int treat_as_reject;
if (id != f->reqid || f->seen_ack) /* Expected id? */ if (id != f->reqid || f->seen_ack) /* Expected id? */
return; /* Nope, toss... */ return; /* Nope, toss... */
if (code == CONFNAK) { if (code == CONFNAK) {
++f->rnakloops; ++f->rnakloops;
treat_as_reject = (f->rnakloops >= f->maxnakloops); treat_as_reject = (f->rnakloops >= f->maxnakloops);
if (f->callbacks->nakci == NULL if (f->callbacks->nakci == NULL
|| !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) { || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {
ppp_error("Received bad configure-nak: %P", inp, len); ppp_error("Received bad configure-nak: %P", inp, len);
return; return;
} }
} else { } else {
f->rnakloops = 0; f->rnakloops = 0;
if (f->callbacks->rejci == NULL if (f->callbacks->rejci == NULL
|| !(ret = f->callbacks->rejci(f, inp, len))) { || !(ret = f->callbacks->rejci(f, inp, len))) {
ppp_error("Received bad configure-rej: %P", inp, len); ppp_error("Received bad configure-rej: %P", inp, len);
return; return;
} }
} }
f->seen_ack = 1; f->seen_ack = 1;
@ -541,35 +541,35 @@ static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
break; break;
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
/* They didn't agree to what we wanted - try another request */ /* They didn't agree to what we wanted - try another request */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
if (ret < 0) if (ret < 0)
f->state = PPP_FSM_STOPPED; /* kludge for stopping CCP */ f->state = PPP_FSM_STOPPED; /* kludge for stopping CCP */
else else
fsm_sconfreq(f, 0); /* Send Configure-Request */ fsm_sconfreq(f, 0); /* Send Configure-Request */
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
/* Got a Nak/reject when we had already had an Ack?? oh well... */ /* Got a Nak/reject when we had already had an Ack?? oh well... */
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
/* Go down and restart negotiation */ /* Go down and restart negotiation */
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); /* Send initial Configure-Request */ fsm_sconfreq(f, 0); /* Send initial Configure-Request */
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -583,22 +583,22 @@ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {
switch (f->state) { switch (f->state) {
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
f->state = PPP_FSM_REQSENT; /* Start over but keep trying */ f->state = PPP_FSM_REQSENT; /* Start over but keep trying */
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if (len > 0) { if (len > 0) {
ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p); ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p);
} else } else
ppp_info("%s terminated by peer", PROTO_NAME(f)); ppp_info("%s terminated by peer", PROTO_NAME(f));
f->retransmits = 0; f->retransmits = 0;
f->state = PPP_FSM_STOPPING; f->state = PPP_FSM_STOPPING;
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);
break; break;
default: default:
break; break;
} }
fsm_sdata(f, TERMACK, id, NULL, 0); fsm_sdata(f, TERMACK, id, NULL, 0);
@ -611,30 +611,30 @@ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {
static void fsm_rtermack(fsm *f) { static void fsm_rtermack(fsm *f) {
switch (f->state) { switch (f->state) {
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
UNTIMEOUT(fsm_timeout, f); UNTIMEOUT(fsm_timeout, f);
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
UNTIMEOUT(fsm_timeout, f); UNTIMEOUT(fsm_timeout, f);
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
if (f->callbacks->down) if (f->callbacks->down)
(*f->callbacks->down)(f); /* Inform upper layers */ (*f->callbacks->down)(f); /* Inform upper layers */
fsm_sconfreq(f, 0); fsm_sconfreq(f, 0);
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
break; break;
default: default:
break; break;
} }
} }
@ -646,15 +646,15 @@ static void fsm_rcoderej(fsm *f, u_char *inp, int len) {
u_char code, id; u_char code, id;
if (len < HEADERLEN) { if (len < HEADERLEN) {
FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!")); FSMDEBUG(("fsm_rcoderej: Rcvd short Code-Reject packet!"));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id); ppp_warn("%s: Rcvd Code-Reject for code %d, id %d", PROTO_NAME(f), code, id);
if( f->state == PPP_FSM_ACKRCVD ) if( f->state == PPP_FSM_ACKRCVD )
f->state = PPP_FSM_REQSENT; f->state = PPP_FSM_REQSENT;
} }
@ -666,36 +666,36 @@ static void fsm_rcoderej(fsm *f, u_char *inp, int len) {
void fsm_protreject(fsm *f) { void fsm_protreject(fsm *f) {
switch( f->state ){ switch( f->state ){
case PPP_FSM_CLOSING: case PPP_FSM_CLOSING:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_CLOSED: case PPP_FSM_CLOSED:
f->state = PPP_FSM_CLOSED; f->state = PPP_FSM_CLOSED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_STOPPING: case PPP_FSM_STOPPING:
case PPP_FSM_REQSENT: case PPP_FSM_REQSENT:
case PPP_FSM_ACKRCVD: case PPP_FSM_ACKRCVD:
case PPP_FSM_ACKSENT: case PPP_FSM_ACKSENT:
UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
/* fall through */ /* fall through */
/* no break */ /* no break */
case PPP_FSM_STOPPED: case PPP_FSM_STOPPED:
f->state = PPP_FSM_STOPPED; f->state = PPP_FSM_STOPPED;
if( f->callbacks->finished ) if( f->callbacks->finished )
(*f->callbacks->finished)(f); (*f->callbacks->finished)(f);
break; break;
case PPP_FSM_OPENED: case PPP_FSM_OPENED:
terminate_layer(f, PPP_FSM_STOPPING); terminate_layer(f, PPP_FSM_STOPPING);
break; break;
default: default:
FSMDEBUG(("%s: Protocol-reject event in state %d!", FSMDEBUG(("%s: Protocol-reject event in state %d!",
PROTO_NAME(f), f->state)); PROTO_NAME(f), f->state));
/* no break */ /* no break */
} }
} }
@ -710,17 +710,17 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
int cilen; int cilen;
if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){ if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){
/* Not currently negotiating - reset options */ /* Not currently negotiating - reset options */
if( f->callbacks->resetci ) if( f->callbacks->resetci )
(*f->callbacks->resetci)(f); (*f->callbacks->resetci)(f);
f->nakloops = 0; f->nakloops = 0;
f->rnakloops = 0; f->rnakloops = 0;
} }
if( !retransmit ){ if( !retransmit ){
/* New request - reset retransmission counter, use new ID */ /* New request - reset retransmission counter, use new ID */
f->retransmits = pcb->settings.fsm_max_conf_req_transmits; f->retransmits = pcb->settings.fsm_max_conf_req_transmits;
f->reqid = ++f->id; f->reqid = ++f->id;
} }
f->seen_ack = 0; f->seen_ack = 0;
@ -729,11 +729,11 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
* Make up the request packet * Make up the request packet
*/ */
if( f->callbacks->cilen && f->callbacks->addci ){ if( f->callbacks->cilen && f->callbacks->addci ){
cilen = (*f->callbacks->cilen)(f); cilen = (*f->callbacks->cilen)(f);
if( cilen > pcb->peer_mru - HEADERLEN ) if( cilen > pcb->peer_mru - HEADERLEN )
cilen = pcb->peer_mru - HEADERLEN; cilen = pcb->peer_mru - HEADERLEN;
} else } else
cilen = 0; cilen = 0;
p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
if(NULL == p) if(NULL == p)
@ -750,8 +750,8 @@ static void fsm_sconfreq(fsm *f, int retransmit) {
PUTCHAR(f->reqid, outp); PUTCHAR(f->reqid, outp);
PUTSHORT(cilen + HEADERLEN, outp); PUTSHORT(cilen + HEADERLEN, outp);
if (cilen != 0) { if (cilen != 0) {
(*f->callbacks->addci)(f, outp, &cilen); (*f->callbacks->addci)(f, outp, &cilen);
LWIP_ASSERT("cilen == p->len - HEADERLEN - PPP_HDRLEN", cilen == p->len - HEADERLEN - PPP_HDRLEN); LWIP_ASSERT("cilen == p->len - HEADERLEN - PPP_HDRLEN", cilen == p->len - HEADERLEN - PPP_HDRLEN);
} }
ppp_write(pcb, p); ppp_write(pcb, p);
@ -775,7 +775,7 @@ void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen)
/* Adjust length to be smaller than MTU */ /* Adjust length to be smaller than MTU */
if (datalen > pcb->peer_mru - HEADERLEN) if (datalen > pcb->peer_mru - HEADERLEN)
datalen = pcb->peer_mru - HEADERLEN; datalen = pcb->peer_mru - HEADERLEN;
outlen = datalen + HEADERLEN; outlen = datalen + HEADERLEN;
p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);
@ -788,7 +788,7 @@ void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen)
outp = (u_char*)p->payload; outp = (u_char*)p->payload;
if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */ if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN) -- was only for fsm_sconfreq() */
MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen); MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen);
MAKEHEADER(outp, f->protocol); MAKEHEADER(outp, f->protocol);
PUTCHAR(code, outp); PUTCHAR(code, outp);
PUTCHAR(id, outp); PUTCHAR(id, outp);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,20 +39,20 @@
#define SHA1_SIGNATURE_SIZE 20 #define SHA1_SIGNATURE_SIZE 20
/* ppp_mppe_state.bits definitions */ /* ppp_mppe_state.bits definitions */
#define MPPE_BIT_A 0x80 /* Encryption table were (re)inititalized */ #define MPPE_BIT_A 0x80 /* Encryption table were (re)inititalized */
#define MPPE_BIT_B 0x40 /* MPPC only (not implemented) */ #define MPPE_BIT_B 0x40 /* MPPC only (not implemented) */
#define MPPE_BIT_C 0x20 /* MPPC only (not implemented) */ #define MPPE_BIT_C 0x20 /* MPPC only (not implemented) */
#define MPPE_BIT_D 0x10 /* This is an encrypted frame */ #define MPPE_BIT_D 0x10 /* This is an encrypted frame */
#define MPPE_BIT_FLUSHED MPPE_BIT_A #define MPPE_BIT_FLUSHED MPPE_BIT_A
#define MPPE_BIT_ENCRYPTED MPPE_BIT_D #define MPPE_BIT_ENCRYPTED MPPE_BIT_D
#define MPPE_BITS(p) ((p)[0] & 0xf0) #define MPPE_BITS(p) ((p)[0] & 0xf0)
#define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1]) #define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1])
#define MPPE_CCOUNT_SPACE 0x1000 /* The size of the ccount space */ #define MPPE_CCOUNT_SPACE 0x1000 /* The size of the ccount space */
#define MPPE_OVHD 2 /* MPPE overhead/packet */ #define MPPE_OVHD 2 /* MPPE overhead/packet */
#define SANITY_MAX 1600 /* Max bogon factor we will tolerate */ #define SANITY_MAX 1600 /* Max bogon factor we will tolerate */
/* /*
* Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3. * Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3.
@ -60,37 +60,37 @@
*/ */
static void mppe_rekey(ppp_mppe_state * state, int initial_key) static void mppe_rekey(ppp_mppe_state * state, int initial_key)
{ {
lwip_sha1_context sha1_ctx; lwip_sha1_context sha1_ctx;
u8_t sha1_digest[SHA1_SIGNATURE_SIZE]; u8_t sha1_digest[SHA1_SIGNATURE_SIZE];
/* /*
* Key Derivation, from RFC 3078, RFC 3079. * Key Derivation, from RFC 3078, RFC 3079.
* Equivalent to Get_Key() for MS-CHAP as described in RFC 3079. * Equivalent to Get_Key() for MS-CHAP as described in RFC 3079.
*/ */
lwip_sha1_init(&sha1_ctx); lwip_sha1_init(&sha1_ctx);
lwip_sha1_starts(&sha1_ctx); lwip_sha1_starts(&sha1_ctx);
lwip_sha1_update(&sha1_ctx, state->master_key, state->keylen); lwip_sha1_update(&sha1_ctx, state->master_key, state->keylen);
lwip_sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE); lwip_sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE);
lwip_sha1_update(&sha1_ctx, state->session_key, state->keylen); lwip_sha1_update(&sha1_ctx, state->session_key, state->keylen);
lwip_sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE); lwip_sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE);
lwip_sha1_finish(&sha1_ctx, sha1_digest); lwip_sha1_finish(&sha1_ctx, sha1_digest);
lwip_sha1_free(&sha1_ctx); lwip_sha1_free(&sha1_ctx);
MEMCPY(state->session_key, sha1_digest, state->keylen); MEMCPY(state->session_key, sha1_digest, state->keylen);
if (!initial_key) { if (!initial_key) {
lwip_arc4_init(&state->arc4); lwip_arc4_init(&state->arc4);
lwip_arc4_setup(&state->arc4, sha1_digest, state->keylen); lwip_arc4_setup(&state->arc4, sha1_digest, state->keylen);
lwip_arc4_crypt(&state->arc4, state->session_key, state->keylen); lwip_arc4_crypt(&state->arc4, state->session_key, state->keylen);
lwip_arc4_free(&state->arc4); lwip_arc4_free(&state->arc4);
} }
if (state->keylen == 8) { if (state->keylen == 8) {
/* See RFC 3078 */ /* See RFC 3078 */
state->session_key[0] = 0xd1; state->session_key[0] = 0xd1;
state->session_key[1] = 0x26; state->session_key[1] = 0x26;
state->session_key[2] = 0x9e; state->session_key[2] = 0x9e;
} }
lwip_arc4_init(&state->arc4); lwip_arc4_init(&state->arc4);
lwip_arc4_setup(&state->arc4, state->session_key, state->keylen); lwip_arc4_setup(&state->arc4, state->session_key, state->keylen);
} }
/* /*
@ -98,8 +98,8 @@ static void mppe_rekey(ppp_mppe_state * state, int initial_key)
* don't have to keep multiple copies of keys. * don't have to keep multiple copies of keys.
*/ */
void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) { void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN); MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN);
} }
/* /*
@ -109,64 +109,64 @@ void
mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options) mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)
{ {
#if PPP_DEBUG #if PPP_DEBUG
const u8_t *debugstr = (const u8_t*)"mppe_comp_init"; const u8_t *debugstr = (const u8_t*)"mppe_comp_init";
if (&pcb->mppe_decomp == state) { if (&pcb->mppe_decomp == state) {
debugstr = (const u8_t*)"mppe_decomp_init"; debugstr = (const u8_t*)"mppe_decomp_init";
} }
#endif /* PPP_DEBUG */ #endif /* PPP_DEBUG */
/* Save keys. */ /* Save keys. */
MEMCPY(state->session_key, state->master_key, sizeof(state->master_key)); MEMCPY(state->session_key, state->master_key, sizeof(state->master_key));
if (options & MPPE_OPT_128) if (options & MPPE_OPT_128)
state->keylen = 16; state->keylen = 16;
else if (options & MPPE_OPT_40) else if (options & MPPE_OPT_40)
state->keylen = 8; state->keylen = 8;
else { else {
PPPDEBUG(LOG_DEBUG, ("%s[%d]: unknown key length\n", debugstr, PPPDEBUG(LOG_DEBUG, ("%s[%d]: unknown key length\n", debugstr,
pcb->netif->num)); pcb->netif->num));
lcp_close(pcb, "MPPE required but peer negotiation failed"); lcp_close(pcb, "MPPE required but peer negotiation failed");
return; return;
} }
if (options & MPPE_OPT_STATEFUL) if (options & MPPE_OPT_STATEFUL)
state->stateful = 1; state->stateful = 1;
/* Generate the initial session key. */ /* Generate the initial session key. */
mppe_rekey(state, 1); mppe_rekey(state, 1);
#if PPP_DEBUG #if PPP_DEBUG
{ {
int i; int i;
char mkey[sizeof(state->master_key) * 2 + 1]; char mkey[sizeof(state->master_key) * 2 + 1];
char skey[sizeof(state->session_key) * 2 + 1]; char skey[sizeof(state->session_key) * 2 + 1];
PPPDEBUG(LOG_DEBUG, ("%s[%d]: initialized with %d-bit %s mode\n", PPPDEBUG(LOG_DEBUG, ("%s[%d]: initialized with %d-bit %s mode\n",
debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40, debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40,
(state->stateful) ? "stateful" : "stateless")); (state->stateful) ? "stateful" : "stateless"));
for (i = 0; i < (int)sizeof(state->master_key); i++) for (i = 0; i < (int)sizeof(state->master_key); i++)
sprintf(mkey + i * 2, "%02x", state->master_key[i]); sprintf(mkey + i * 2, "%02x", state->master_key[i]);
for (i = 0; i < (int)sizeof(state->session_key); i++) for (i = 0; i < (int)sizeof(state->session_key); i++)
sprintf(skey + i * 2, "%02x", state->session_key[i]); sprintf(skey + i * 2, "%02x", state->session_key[i]);
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("%s[%d]: keys: master: %s initial session: %s\n", ("%s[%d]: keys: master: %s initial session: %s\n",
debugstr, pcb->netif->num, mkey, skey)); debugstr, pcb->netif->num, mkey, skey));
} }
#endif /* PPP_DEBUG */ #endif /* PPP_DEBUG */
/* /*
* Initialize the coherency count. The initial value is not specified * Initialize the coherency count. The initial value is not specified
* in RFC 3078, but we can make a reasonable assumption that it will * in RFC 3078, but we can make a reasonable assumption that it will
* start at 0. Setting it to the max here makes the comp/decomp code * start at 0. Setting it to the max here makes the comp/decomp code
* do the right thing (determined through experiment). * do the right thing (determined through experiment).
*/ */
state->ccount = MPPE_CCOUNT_SPACE - 1; state->ccount = MPPE_CCOUNT_SPACE - 1;
/* /*
* Note that even though we have initialized the key table, we don't * Note that even though we have initialized the key table, we don't
* set the FLUSHED bit. This is contrary to RFC 3078, sec. 3.1. * set the FLUSHED bit. This is contrary to RFC 3078, sec. 3.1.
*/ */
state->bits = MPPE_BIT_ENCRYPTED; state->bits = MPPE_BIT_ENCRYPTED;
} }
/* /*
@ -180,8 +180,8 @@ mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)
*/ */
void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state) void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
{ {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
state->bits |= MPPE_BIT_FLUSHED; state->bits |= MPPE_BIT_FLUSHED;
} }
/* /*
@ -192,74 +192,74 @@ void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
err_t err_t
mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol) mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol)
{ {
struct pbuf *n, *np; struct pbuf *n, *np;
u8_t *pl; u8_t *pl;
err_t err; err_t err;
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
/* TCP stack requires that we don't change the packet payload, therefore we copy /* TCP stack requires that we don't change the packet payload, therefore we copy
* the whole packet before encryption. * the whole packet before encryption.
*/ */
np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_RAM); np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_RAM);
if (!np) { if (!np) {
return ERR_MEM; return ERR_MEM;
} }
/* Hide MPPE header + protocol */ /* Hide MPPE header + protocol */
pbuf_remove_header(np, MPPE_OVHD + sizeof(protocol)); pbuf_remove_header(np, MPPE_OVHD + sizeof(protocol));
if ((err = pbuf_copy(np, *pb)) != ERR_OK) { if ((err = pbuf_copy(np, *pb)) != ERR_OK) {
pbuf_free(np); pbuf_free(np);
return err; return err;
} }
/* Reveal MPPE header + protocol */ /* Reveal MPPE header + protocol */
pbuf_add_header(np, MPPE_OVHD + sizeof(protocol)); pbuf_add_header(np, MPPE_OVHD + sizeof(protocol));
*pb = np; *pb = np;
pl = (u8_t*)np->payload; pl = (u8_t*)np->payload;
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: ccount %d\n", pcb->netif->num, state->ccount)); PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: ccount %d\n", pcb->netif->num, state->ccount));
/* FIXME: use PUT* macros */ /* FIXME: use PUT* macros */
pl[0] = state->ccount>>8; pl[0] = state->ccount>>8;
pl[1] = state->ccount; pl[1] = state->ccount;
if (!state->stateful || /* stateless mode */ if (!state->stateful || /* stateless mode */
((state->ccount & 0xff) == 0xff) || /* "flag" packet */ ((state->ccount & 0xff) == 0xff) || /* "flag" packet */
(state->bits & MPPE_BIT_FLUSHED)) { /* CCP Reset-Request */ (state->bits & MPPE_BIT_FLUSHED)) { /* CCP Reset-Request */
/* We must rekey */ /* We must rekey */
if (state->stateful) { if (state->stateful) {
PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: rekeying\n", pcb->netif->num)); PPPDEBUG(LOG_DEBUG, ("mppe_compress[%d]: rekeying\n", pcb->netif->num));
} }
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->bits |= MPPE_BIT_FLUSHED; state->bits |= MPPE_BIT_FLUSHED;
} }
pl[0] |= state->bits; pl[0] |= state->bits;
state->bits &= ~MPPE_BIT_FLUSHED; /* reset for next xmit */ state->bits &= ~MPPE_BIT_FLUSHED; /* reset for next xmit */
pl += MPPE_OVHD; pl += MPPE_OVHD;
/* Add protocol */ /* Add protocol */
/* FIXME: add PFC support */ /* FIXME: add PFC support */
pl[0] = protocol >> 8; pl[0] = protocol >> 8;
pl[1] = protocol; pl[1] = protocol;
/* Hide MPPE header */ /* Hide MPPE header */
pbuf_remove_header(np, MPPE_OVHD); pbuf_remove_header(np, MPPE_OVHD);
/* Encrypt packet */ /* Encrypt packet */
for (n = np; n != NULL; n = n->next) { for (n = np; n != NULL; n = n->next) {
lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len); lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
if (n->tot_len == n->len) { if (n->tot_len == n->len) {
break; break;
} }
} }
/* Reveal MPPE header */ /* Reveal MPPE header */
pbuf_add_header(np, MPPE_OVHD); pbuf_add_header(np, MPPE_OVHD);
return ERR_OK; return ERR_OK;
} }
/* /*
@ -267,9 +267,9 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto
*/ */
void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state) void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
{ {
LWIP_UNUSED_ARG(pcb); LWIP_UNUSED_ARG(pcb);
LWIP_UNUSED_ARG(state); LWIP_UNUSED_ARG(state);
return; return;
} }
/* /*
@ -278,135 +278,135 @@ void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)
err_t err_t
mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb) mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb)
{ {
struct pbuf *n0 = *pb, *n; struct pbuf *n0 = *pb, *n;
u8_t *pl; u8_t *pl;
u16_t ccount; u16_t ccount;
u8_t flushed; u8_t flushed;
/* MPPE Header */ /* MPPE Header */
if (n0->len < MPPE_OVHD) { if (n0->len < MPPE_OVHD) {
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("mppe_decompress[%d]: short pkt (%d)\n", ("mppe_decompress[%d]: short pkt (%d)\n",
pcb->netif->num, n0->len)); pcb->netif->num, n0->len));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
pl = (u8_t*)n0->payload; pl = (u8_t*)n0->payload;
flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED; flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED;
ccount = MPPE_CCOUNT(pl); ccount = MPPE_CCOUNT(pl);
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: ccount %d\n", PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: ccount %d\n",
pcb->netif->num, ccount)); pcb->netif->num, ccount));
/* sanity checks -- terminate with extreme prejudice */ /* sanity checks -- terminate with extreme prejudice */
if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) { if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) {
PPPDEBUG(LOG_DEBUG, PPPDEBUG(LOG_DEBUG,
("mppe_decompress[%d]: ENCRYPTED bit not set!\n", ("mppe_decompress[%d]: ENCRYPTED bit not set!\n",
pcb->netif->num)); pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
if (!state->stateful && !flushed) { if (!state->stateful && !flushed) {
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set in " PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set in "
"stateless mode!\n", pcb->netif->num)); "stateless mode!\n", pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) { if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) {
PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set on " PPPDEBUG(LOG_DEBUG, ("mppe_decompress[%d]: FLUSHED bit not set on "
"flag packet!\n", pcb->netif->num)); "flag packet!\n", pcb->netif->num));
state->sanity_errors += 100; state->sanity_errors += 100;
goto sanity_error; goto sanity_error;
} }
/* /*
* Check the coherency count. * Check the coherency count.
*/ */
if (!state->stateful) { if (!state->stateful) {
/* Discard late packet */ /* Discard late packet */
if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) { if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) {
state->sanity_errors++; state->sanity_errors++;
goto sanity_error; goto sanity_error;
} }
/* RFC 3078, sec 8.1. Rekey for every packet. */ /* RFC 3078, sec 8.1. Rekey for every packet. */
while (state->ccount != ccount) { while (state->ccount != ccount) {
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
} }
} else { } else {
/* RFC 3078, sec 8.2. */ /* RFC 3078, sec 8.2. */
if (!state->discard) { if (!state->discard) {
/* normal state */ /* normal state */
state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;
if (ccount != state->ccount) { if (ccount != state->ccount) {
/* /*
* (ccount > state->ccount) * (ccount > state->ccount)
* Packet loss detected, enter the discard state. * Packet loss detected, enter the discard state.
* Signal the peer to rekey (by sending a CCP Reset-Request). * Signal the peer to rekey (by sending a CCP Reset-Request).
*/ */
state->discard = 1; state->discard = 1;
ccp_resetrequest(pcb); ccp_resetrequest(pcb);
return ERR_BUF; return ERR_BUF;
} }
} else { } else {
/* discard state */ /* discard state */
if (!flushed) { if (!flushed) {
/* ccp.c will be silent (no additional CCP Reset-Requests). */ /* ccp.c will be silent (no additional CCP Reset-Requests). */
return ERR_BUF; return ERR_BUF;
} else { } else {
/* Rekey for every missed "flag" packet. */ /* Rekey for every missed "flag" packet. */
while ((ccount & ~0xff) != while ((ccount & ~0xff) !=
(state->ccount & ~0xff)) { (state->ccount & ~0xff)) {
mppe_rekey(state, 0); mppe_rekey(state, 0);
state->ccount = state->ccount =
(state->ccount + (state->ccount +
256) % MPPE_CCOUNT_SPACE; 256) % MPPE_CCOUNT_SPACE;
} }
/* reset */ /* reset */
state->discard = 0; state->discard = 0;
state->ccount = ccount; state->ccount = ccount;
/* /*
* Another problem with RFC 3078 here. It implies that the * Another problem with RFC 3078 here. It implies that the
* peer need not send a Reset-Ack packet. But RFC 1962 * peer need not send a Reset-Ack packet. But RFC 1962
* requires it. Hopefully, M$ does send a Reset-Ack; even * requires it. Hopefully, M$ does send a Reset-Ack; even
* though it isn't required for MPPE synchronization, it is * though it isn't required for MPPE synchronization, it is
* required to reset CCP state. * required to reset CCP state.
*/ */
} }
} }
if (flushed) if (flushed)
mppe_rekey(state, 0); mppe_rekey(state, 0);
} }
/* Hide MPPE header */ /* Hide MPPE header */
pbuf_remove_header(n0, MPPE_OVHD); pbuf_remove_header(n0, MPPE_OVHD);
/* Decrypt the packet. */ /* Decrypt the packet. */
for (n = n0; n != NULL; n = n->next) { for (n = n0; n != NULL; n = n->next) {
lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len); lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);
if (n->tot_len == n->len) { if (n->tot_len == n->len) {
break; break;
} }
} }
/* good packet credit */ /* good packet credit */
state->sanity_errors >>= 1; state->sanity_errors >>= 1;
return ERR_OK; return ERR_OK;
sanity_error: sanity_error:
if (state->sanity_errors >= SANITY_MAX) { if (state->sanity_errors >= SANITY_MAX) {
/* /*
* Take LCP down if the peer is sending too many bogons. * Take LCP down if the peer is sending too many bogons.
* We don't want to do this for a single or just a few * We don't want to do this for a single or just a few
* instances since it could just be due to packet corruption. * instances since it could just be due to packet corruption.
*/ */
lcp_close(pcb, "Too many MPPE errors"); lcp_close(pcb, "Too many MPPE errors");
} }
return ERR_BUF; return ERR_BUF;
} }
#endif /* PPP_SUPPORT && MPPE_SUPPORT */ #endif /* PPP_SUPPORT && MPPE_SUPPORT */

View File

@ -55,11 +55,11 @@
#include "netif/ppp/lcp.h" #include "netif/ppp/lcp.h"
#include "netif/ppp/tdb.h" #include "netif/ppp/tdb.h"
bool endpoint_specified; /* user gave explicit endpoint discriminator */ bool endpoint_specified; /* user gave explicit endpoint discriminator */
char *bundle_id; /* identifier for our bundle */ char *bundle_id; /* identifier for our bundle */
char *blinks_id; /* key for the list of links */ char *blinks_id; /* key for the list of links */
bool doing_multilink; /* multilink was enabled and agreed to */ bool doing_multilink; /* multilink was enabled and agreed to */
bool multilink_master; /* we own the multilink bundle */ bool multilink_master; /* we own the multilink bundle */
extern TDB_CONTEXT *pppdb; extern TDB_CONTEXT *pppdb;
extern char db_key[]; extern char db_key[];
@ -72,43 +72,43 @@ static int get_default_epdisc (struct epdisc *);
static int parse_num (char *str, const char *key, int *valp); static int parse_num (char *str, const char *key, int *valp);
static int owns_unit (TDB_DATA pid, int unit); static int owns_unit (TDB_DATA pid, int unit);
#define set_ip_epdisc(ep, addr) do { \ #define set_ip_epdisc(ep, addr) do { \
ep->length = 4; \ ep->length = 4; \
ep->value[0] = addr >> 24; \ ep->value[0] = addr >> 24; \
ep->value[1] = addr >> 16; \ ep->value[1] = addr >> 16; \
ep->value[2] = addr >> 8; \ ep->value[2] = addr >> 8; \
ep->value[3] = addr; \ ep->value[3] = addr; \
} while (0) } while (0)
#define LOCAL_IP_ADDR(addr) \ #define LOCAL_IP_ADDR(addr) \
(((addr) & 0xff000000) == 0x0a000000 /* 10.x.x.x */ \ (((addr) & 0xff000000) == 0x0a000000 /* 10.x.x.x */ \
|| ((addr) & 0xfff00000) == 0xac100000 /* 172.16.x.x */ \ || ((addr) & 0xfff00000) == 0xac100000 /* 172.16.x.x */ \
|| ((addr) & 0xffff0000) == 0xc0a80000) /* 192.168.x.x */ || ((addr) & 0xffff0000) == 0xc0a80000) /* 192.168.x.x */
#define process_exists(n) (kill((n), 0) == 0 || errno != ESRCH) #define process_exists(n) (kill((n), 0) == 0 || errno != ESRCH)
void void
mp_check_options() mp_check_options()
{ {
lcp_options *wo = &lcp_wantoptions[0]; lcp_options *wo = &lcp_wantoptions[0];
lcp_options *ao = &lcp_allowoptions[0]; lcp_options *ao = &lcp_allowoptions[0];
doing_multilink = 0; doing_multilink = 0;
if (!multilink) if (!multilink)
return; return;
/* if we're doing multilink, we have to negotiate MRRU */ /* if we're doing multilink, we have to negotiate MRRU */
if (!wo->neg_mrru) { if (!wo->neg_mrru) {
/* mrru not specified, default to mru */ /* mrru not specified, default to mru */
wo->mrru = wo->mru; wo->mrru = wo->mru;
wo->neg_mrru = 1; wo->neg_mrru = 1;
} }
ao->mrru = ao->mru; ao->mrru = ao->mru;
ao->neg_mrru = 1; ao->neg_mrru = 1;
if (!wo->neg_endpoint && !noendpoint) { if (!wo->neg_endpoint && !noendpoint) {
/* get a default endpoint value */ /* get a default endpoint value */
wo->neg_endpoint = get_default_epdisc(&wo->endpoint); wo->neg_endpoint = get_default_epdisc(&wo->endpoint);
} }
} }
/* /*
@ -118,289 +118,289 @@ mp_check_options()
int int
mp_join_bundle() mp_join_bundle()
{ {
lcp_options *go = &lcp_gotoptions[0]; lcp_options *go = &lcp_gotoptions[0];
lcp_options *ho = &lcp_hisoptions[0]; lcp_options *ho = &lcp_hisoptions[0];
lcp_options *ao = &lcp_allowoptions[0]; lcp_options *ao = &lcp_allowoptions[0];
int unit, pppd_pid; int unit, pppd_pid;
int l, mtu; int l, mtu;
char *p; char *p;
TDB_DATA key, pid, rec; TDB_DATA key, pid, rec;
if (doing_multilink) { if (doing_multilink) {
/* have previously joined a bundle */ /* have previously joined a bundle */
if (!go->neg_mrru || !ho->neg_mrru) { if (!go->neg_mrru || !ho->neg_mrru) {
notice("oops, didn't get multilink on renegotiation"); notice("oops, didn't get multilink on renegotiation");
lcp_close(pcb, "multilink required"); lcp_close(pcb, "multilink required");
return 0; return 0;
} }
/* XXX should check the peer_authname and ho->endpoint /* XXX should check the peer_authname and ho->endpoint
are the same as previously */ are the same as previously */
return 0; return 0;
} }
if (!go->neg_mrru || !ho->neg_mrru) { if (!go->neg_mrru || !ho->neg_mrru) {
/* not doing multilink */ /* not doing multilink */
if (go->neg_mrru) if (go->neg_mrru)
notice("oops, multilink negotiated only for receive"); notice("oops, multilink negotiated only for receive");
mtu = ho->neg_mru? ho->mru: PPP_MRU; mtu = ho->neg_mru? ho->mru: PPP_MRU;
if (mtu > ao->mru) if (mtu > ao->mru)
mtu = ao->mru; mtu = ao->mru;
if (demand) { if (demand) {
/* already have a bundle */ /* already have a bundle */
cfg_bundle(0, 0, 0, 0); cfg_bundle(0, 0, 0, 0);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
return 0; return 0;
} }
make_new_bundle(0, 0, 0, 0); make_new_bundle(0, 0, 0, 0);
set_ifunit(1); set_ifunit(1);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
return 0; return 0;
} }
doing_multilink = 1; doing_multilink = 1;
/* /*
* Find the appropriate bundle or join a new one. * Find the appropriate bundle or join a new one.
* First we make up a name for the bundle. * First we make up a name for the bundle.
* The length estimate is worst-case assuming every * The length estimate is worst-case assuming every
* character has to be quoted. * character has to be quoted.
*/ */
l = 4 * strlen(peer_authname) + 10; l = 4 * strlen(peer_authname) + 10;
if (ho->neg_endpoint) if (ho->neg_endpoint)
l += 3 * ho->endpoint.length + 8; l += 3 * ho->endpoint.length + 8;
if (bundle_name) if (bundle_name)
l += 3 * strlen(bundle_name) + 2; l += 3 * strlen(bundle_name) + 2;
bundle_id = malloc(l); bundle_id = malloc(l);
if (bundle_id == 0) if (bundle_id == 0)
novm("bundle identifier"); novm("bundle identifier");
p = bundle_id; p = bundle_id;
p += slprintf(p, l-1, "BUNDLE=\"%q\"", peer_authname); p += slprintf(p, l-1, "BUNDLE=\"%q\"", peer_authname);
if (ho->neg_endpoint || bundle_name) if (ho->neg_endpoint || bundle_name)
*p++ = '/'; *p++ = '/';
if (ho->neg_endpoint) if (ho->neg_endpoint)
p += slprintf(p, bundle_id+l-p, "%s", p += slprintf(p, bundle_id+l-p, "%s",
epdisc_to_str(&ho->endpoint)); epdisc_to_str(&ho->endpoint));
if (bundle_name) if (bundle_name)
p += slprintf(p, bundle_id+l-p, "/%v", bundle_name); p += slprintf(p, bundle_id+l-p, "/%v", bundle_name);
/* Make the key for the list of links belonging to the bundle */ /* Make the key for the list of links belonging to the bundle */
l = p - bundle_id; l = p - bundle_id;
blinks_id = malloc(l + 7); blinks_id = malloc(l + 7);
if (blinks_id == NULL) if (blinks_id == NULL)
novm("bundle links key"); novm("bundle links key");
slprintf(blinks_id, l + 7, "BUNDLE_LINKS=%s", bundle_id + 7); slprintf(blinks_id, l + 7, "BUNDLE_LINKS=%s", bundle_id + 7);
/* /*
* For demand mode, we only need to configure the bundle * For demand mode, we only need to configure the bundle
* and attach the link. * and attach the link.
*/ */
mtu = LWIP_MIN(ho->mrru, ao->mru); mtu = LWIP_MIN(ho->mrru, ao->mru);
if (demand) { if (demand) {
cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf); cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
script_setenv("BUNDLE", bundle_id + 7, 1); script_setenv("BUNDLE", bundle_id + 7, 1);
return 0; return 0;
} }
/* /*
* Check if the bundle ID is already in the database. * Check if the bundle ID is already in the database.
*/ */
unit = -1; unit = -1;
lock_db(); lock_db();
key.dptr = bundle_id; key.dptr = bundle_id;
key.dsize = p - bundle_id; key.dsize = p - bundle_id;
pid = tdb_fetch(pppdb, key); pid = tdb_fetch(pppdb, key);
if (pid.dptr != NULL) { if (pid.dptr != NULL) {
/* bundle ID exists, see if the pppd record exists */ /* bundle ID exists, see if the pppd record exists */
rec = tdb_fetch(pppdb, pid); rec = tdb_fetch(pppdb, pid);
if (rec.dptr != NULL && rec.dsize > 0) { if (rec.dptr != NULL && rec.dsize > 0) {
/* make sure the string is null-terminated */ /* make sure the string is null-terminated */
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
/* parse the interface number */ /* parse the interface number */
parse_num(rec.dptr, "IFNAME=ppp", &unit); parse_num(rec.dptr, "IFNAME=ppp", &unit);
/* check the pid value */ /* check the pid value */
if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid) if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
|| !process_exists(pppd_pid) || !process_exists(pppd_pid)
|| !owns_unit(pid, unit)) || !owns_unit(pid, unit))
unit = -1; unit = -1;
free(rec.dptr); free(rec.dptr);
} }
free(pid.dptr); free(pid.dptr);
} }
if (unit >= 0) { if (unit >= 0) {
/* attach to existing unit */ /* attach to existing unit */
if (bundle_attach(unit)) { if (bundle_attach(unit)) {
set_ifunit(0); set_ifunit(0);
script_setenv("BUNDLE", bundle_id + 7, 0); script_setenv("BUNDLE", bundle_id + 7, 0);
make_bundle_links(1); make_bundle_links(1);
unlock_db(); unlock_db();
info("Link attached to %s", ifname); info("Link attached to %s", ifname);
return 1; return 1;
} }
/* attach failed because bundle doesn't exist */ /* attach failed because bundle doesn't exist */
} }
/* we have to make a new bundle */ /* we have to make a new bundle */
make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf); make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
set_ifunit(1); set_ifunit(1);
netif_set_mtu(pcb, mtu); netif_set_mtu(pcb, mtu);
script_setenv("BUNDLE", bundle_id + 7, 1); script_setenv("BUNDLE", bundle_id + 7, 1);
make_bundle_links(pcb); make_bundle_links(pcb);
unlock_db(); unlock_db();
info("New bundle %s created", ifname); info("New bundle %s created", ifname);
multilink_master = 1; multilink_master = 1;
return 0; return 0;
} }
void mp_exit_bundle() void mp_exit_bundle()
{ {
lock_db(); lock_db();
remove_bundle_link(); remove_bundle_link();
unlock_db(); unlock_db();
} }
static void sendhup(char *str) static void sendhup(char *str)
{ {
int pid; int pid;
if (parse_num(str, "PPPD_PID=", &pid) && pid != getpid()) { if (parse_num(str, "PPPD_PID=", &pid) && pid != getpid()) {
if (debug) if (debug)
dbglog("sending SIGHUP to process %d", pid); dbglog("sending SIGHUP to process %d", pid);
kill(pid, SIGHUP); kill(pid, SIGHUP);
} }
} }
void mp_bundle_terminated() void mp_bundle_terminated()
{ {
TDB_DATA key; TDB_DATA key;
bundle_terminating = 1; bundle_terminating = 1;
upper_layers_down(pcb); upper_layers_down(pcb);
notice("Connection terminated."); notice("Connection terminated.");
#if PPP_STATS_SUPPORT #if PPP_STATS_SUPPORT
print_link_stats(); print_link_stats();
#endif /* PPP_STATS_SUPPORT */ #endif /* PPP_STATS_SUPPORT */
if (!demand) { if (!demand) {
remove_pidfiles(); remove_pidfiles();
script_unsetenv("IFNAME"); script_unsetenv("IFNAME");
} }
lock_db(); lock_db();
destroy_bundle(); destroy_bundle();
iterate_bundle_links(sendhup); iterate_bundle_links(sendhup);
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
tdb_delete(pppdb, key); tdb_delete(pppdb, key);
unlock_db(); unlock_db();
new_phase(PPP_PHASE_DEAD); new_phase(PPP_PHASE_DEAD);
doing_multilink = 0; doing_multilink = 0;
multilink_master = 0; multilink_master = 0;
} }
static void make_bundle_links(int append) static void make_bundle_links(int append)
{ {
TDB_DATA key, rec; TDB_DATA key, rec;
char *p; char *p;
char entry[32]; char entry[32];
int l; int l;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
slprintf(entry, sizeof(entry), "%s;", db_key); slprintf(entry, sizeof(entry), "%s;", db_key);
p = entry; p = entry;
if (append) { if (append) {
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr != NULL && rec.dsize > 0) { if (rec.dptr != NULL && rec.dsize > 0) {
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
if (strstr(rec.dptr, db_key) != NULL) { if (strstr(rec.dptr, db_key) != NULL) {
/* already in there? strange */ /* already in there? strange */
warn("link entry already exists in tdb"); warn("link entry already exists in tdb");
return; return;
} }
l = rec.dsize + strlen(entry); l = rec.dsize + strlen(entry);
p = malloc(l); p = malloc(l);
if (p == NULL) if (p == NULL)
novm("bundle link list"); novm("bundle link list");
slprintf(p, l, "%s%s", rec.dptr, entry); slprintf(p, l, "%s%s", rec.dptr, entry);
} else { } else {
warn("bundle link list not found"); warn("bundle link list not found");
} }
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
} }
rec.dptr = p; rec.dptr = p;
rec.dsize = strlen(p) + 1; rec.dsize = strlen(p) + 1;
if (tdb_store(pppdb, key, rec, TDB_REPLACE)) if (tdb_store(pppdb, key, rec, TDB_REPLACE))
error("couldn't %s bundle link list", error("couldn't %s bundle link list",
append? "update": "create"); append? "update": "create");
if (p != entry) if (p != entry)
free(p); free(p);
} }
static void remove_bundle_link() static void remove_bundle_link()
{ {
TDB_DATA key, rec; TDB_DATA key, rec;
char entry[32]; char entry[32];
char *p, *q; char *p, *q;
int l; int l;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
slprintf(entry, sizeof(entry), "%s;", db_key); slprintf(entry, sizeof(entry), "%s;", db_key);
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr == NULL || rec.dsize <= 0) { if (rec.dptr == NULL || rec.dsize <= 0) {
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
return; return;
} }
rec.dptr[rec.dsize-1] = 0; rec.dptr[rec.dsize-1] = 0;
p = strstr(rec.dptr, entry); p = strstr(rec.dptr, entry);
if (p != NULL) { if (p != NULL) {
q = p + strlen(entry); q = p + strlen(entry);
l = strlen(q) + 1; l = strlen(q) + 1;
memmove(p, q, l); memmove(p, q, l);
rec.dsize = p - rec.dptr + l; rec.dsize = p - rec.dptr + l;
if (tdb_store(pppdb, key, rec, TDB_REPLACE)) if (tdb_store(pppdb, key, rec, TDB_REPLACE))
error("couldn't update bundle link list (removal)"); error("couldn't update bundle link list (removal)");
} }
free(rec.dptr); free(rec.dptr);
} }
static void iterate_bundle_links(void (*func)(char *)) static void iterate_bundle_links(void (*func)(char *))
{ {
TDB_DATA key, rec, pp; TDB_DATA key, rec, pp;
char *p, *q; char *p, *q;
key.dptr = blinks_id; key.dptr = blinks_id;
key.dsize = strlen(blinks_id); key.dsize = strlen(blinks_id);
rec = tdb_fetch(pppdb, key); rec = tdb_fetch(pppdb, key);
if (rec.dptr == NULL || rec.dsize <= 0) { if (rec.dptr == NULL || rec.dsize <= 0) {
error("bundle link list not found (iterating list)"); error("bundle link list not found (iterating list)");
if (rec.dptr != NULL) if (rec.dptr != NULL)
free(rec.dptr); free(rec.dptr);
return; return;
} }
p = rec.dptr; p = rec.dptr;
p[rec.dsize-1] = 0; p[rec.dsize-1] = 0;
while ((q = strchr(p, ';')) != NULL) { while ((q = strchr(p, ';')) != NULL) {
*q = 0; *q = 0;
key.dptr = p; key.dptr = p;
key.dsize = q - p; key.dsize = q - p;
pp = tdb_fetch(pppdb, key); pp = tdb_fetch(pppdb, key);
if (pp.dptr != NULL && pp.dsize > 0) { if (pp.dptr != NULL && pp.dsize > 0) {
pp.dptr[pp.dsize-1] = 0; pp.dptr[pp.dsize-1] = 0;
func(pp.dptr); func(pp.dptr);
} }
if (pp.dptr != NULL) if (pp.dptr != NULL)
free(pp.dptr); free(pp.dptr);
p = q + 1; p = q + 1;
} }
free(rec.dptr); free(rec.dptr);
} }
static int static int
@ -409,19 +409,19 @@ parse_num(str, key, valp)
const char *key; const char *key;
int *valp; int *valp;
{ {
char *p, *endp; char *p, *endp;
int i; int i;
p = strstr(str, key); p = strstr(str, key);
if (p != 0) { if (p != 0) {
p += strlen(key); p += strlen(key);
i = strtol(p, &endp, 10); i = strtol(p, &endp, 10);
if (endp != p && (*endp == 0 || *endp == ';')) { if (endp != p && (*endp == 0 || *endp == ';')) {
*valp = i; *valp = i;
return 1; return 1;
} }
} }
return 0; return 0;
} }
/* /*
@ -432,53 +432,53 @@ owns_unit(key, unit)
TDB_DATA key; TDB_DATA key;
int unit; int unit;
{ {
char ifkey[32]; char ifkey[32];
TDB_DATA kd, vd; TDB_DATA kd, vd;
int ret = 0; int ret = 0;
slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit); slprintf(ifkey, sizeof(ifkey), "IFNAME=ppp%d", unit);
kd.dptr = ifkey; kd.dptr = ifkey;
kd.dsize = strlen(ifkey); kd.dsize = strlen(ifkey);
vd = tdb_fetch(pppdb, kd); vd = tdb_fetch(pppdb, kd);
if (vd.dptr != NULL) { if (vd.dptr != NULL) {
ret = vd.dsize == key.dsize ret = vd.dsize == key.dsize
&& memcmp(vd.dptr, key.dptr, vd.dsize) == 0; && memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
free(vd.dptr); free(vd.dptr);
} }
return ret; return ret;
} }
static int static int
get_default_epdisc(ep) get_default_epdisc(ep)
struct epdisc *ep; struct epdisc *ep;
{ {
char *p; char *p;
struct hostent *hp; struct hostent *hp;
u32_t addr; u32_t addr;
/* First try for an ethernet MAC address */ /* First try for an ethernet MAC address */
p = get_first_ethernet(); p = get_first_ethernet();
if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) { if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) {
ep->class = EPD_MAC; ep->class = EPD_MAC;
ep->length = 6; ep->length = 6;
return 1; return 1;
} }
/* see if our hostname corresponds to a reasonable IP address */ /* see if our hostname corresponds to a reasonable IP address */
hp = gethostbyname(hostname); hp = gethostbyname(hostname);
if (hp != NULL) { if (hp != NULL) {
addr = *(u32_t *)hp->h_addr; addr = *(u32_t *)hp->h_addr;
if (!bad_ip_adrs(addr)) { if (!bad_ip_adrs(addr)) {
addr = lwip_ntohl(addr); addr = lwip_ntohl(addr);
if (!LOCAL_IP_ADDR(addr)) { if (!LOCAL_IP_ADDR(addr)) {
ep->class = EPD_IP; ep->class = EPD_IP;
set_ip_epdisc(ep, addr); set_ip_epdisc(ep, addr);
return 1; return 1;
} }
} }
} }
return 0; return 0;
} }
/* /*
@ -493,51 +493,51 @@ char *
epdisc_to_str(ep) epdisc_to_str(ep)
struct epdisc *ep; struct epdisc *ep;
{ {
static char str[MAX_ENDP_LEN*3+8]; static char str[MAX_ENDP_LEN*3+8];
u_char *p = ep->value; u_char *p = ep->value;
int i, mask = 0; int i, mask = 0;
char *q, c, c2; char *q, c, c2;
if (ep->class == EPD_NULL && ep->length == 0) if (ep->class == EPD_NULL && ep->length == 0)
return "null"; return "null";
if (ep->class == EPD_IP && ep->length == 4) { if (ep->class == EPD_IP && ep->length == 4) {
u32_t addr; u32_t addr;
GETLONG(addr, p); GETLONG(addr, p);
slprintf(str, sizeof(str), "IP:%I", lwip_htonl(addr)); slprintf(str, sizeof(str), "IP:%I", lwip_htonl(addr));
return str; return str;
} }
c = ':'; c = ':';
c2 = '.'; c2 = '.';
if (ep->class == EPD_MAC && ep->length == 6) if (ep->class == EPD_MAC && ep->length == 6)
c2 = ':'; c2 = ':';
else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0) else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0)
mask = 3; mask = 3;
q = str; q = str;
if (ep->class <= EPD_PHONENUM) if (ep->class <= EPD_PHONENUM)
q += slprintf(q, sizeof(str)-1, "%s", q += slprintf(q, sizeof(str)-1, "%s",
endp_class_names[ep->class]); endp_class_names[ep->class]);
else else
q += slprintf(q, sizeof(str)-1, "%d", ep->class); q += slprintf(q, sizeof(str)-1, "%d", ep->class);
c = ':'; c = ':';
for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) { for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) {
if ((i & mask) == 0) { if ((i & mask) == 0) {
*q++ = c; *q++ = c;
c = c2; c = c2;
} }
q += slprintf(q, str + sizeof(str) - q, "%.2x", ep->value[i]); q += slprintf(q, str + sizeof(str) - q, "%.2x", ep->value[i]);
} }
return str; return str;
} }
static int hexc_val(int c) static int hexc_val(int c)
{ {
if (c >= 'a') if (c >= 'a')
return c - 'a' + 10; return c - 'a' + 10;
if (c >= 'A') if (c >= 'A')
return c - 'A' + 10; return c - 'A' + 10;
return c - '0'; return c - '0';
} }
int int
@ -545,65 +545,65 @@ str_to_epdisc(ep, str)
struct epdisc *ep; struct epdisc *ep;
char *str; char *str;
{ {
int i, l; int i, l;
char *p, *endp; char *p, *endp;
for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) { for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) {
int sl = strlen(endp_class_names[i]); int sl = strlen(endp_class_names[i]);
if (strncasecmp(str, endp_class_names[i], sl) == 0) { if (strncasecmp(str, endp_class_names[i], sl) == 0) {
str += sl; str += sl;
break; break;
} }
} }
if (i > EPD_PHONENUM) { if (i > EPD_PHONENUM) {
/* not a class name, try a decimal class number */ /* not a class name, try a decimal class number */
i = strtol(str, &endp, 10); i = strtol(str, &endp, 10);
if (endp == str) if (endp == str)
return 0; /* can't parse class number */ return 0; /* can't parse class number */
str = endp; str = endp;
} }
ep->class = i; ep->class = i;
if (*str == 0) { if (*str == 0) {
ep->length = 0; ep->length = 0;
return 1; return 1;
} }
if (*str != ':' && *str != '.') if (*str != ':' && *str != '.')
return 0; return 0;
++str; ++str;
if (i == EPD_IP) { if (i == EPD_IP) {
u32_t addr; u32_t addr;
i = parse_dotted_ip(str, &addr); i = parse_dotted_ip(str, &addr);
if (i == 0 || str[i] != 0) if (i == 0 || str[i] != 0)
return 0; return 0;
set_ip_epdisc(ep, addr); set_ip_epdisc(ep, addr);
return 1; return 1;
} }
if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) { if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) {
ep->length = 6; ep->length = 6;
return 1; return 1;
} }
p = str; p = str;
for (l = 0; l < MAX_ENDP_LEN; ++l) { for (l = 0; l < MAX_ENDP_LEN; ++l) {
if (*str == 0) if (*str == 0)
break; break;
if (p <= str) if (p <= str)
for (p = str; isxdigit(*p); ++p) for (p = str; isxdigit(*p); ++p)
; ;
i = p - str; i = p - str;
if (i == 0) if (i == 0)
return 0; return 0;
ep->value[l] = hexc_val(*str++); ep->value[l] = hexc_val(*str++);
if ((i & 1) == 0) if ((i & 1) == 0)
ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++); ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++);
if (*str == ':' || *str == '.') if (*str == ':' || *str == '.')
++str; ++str;
} }
if (*str != 0 || (ep->class == EPD_MAC && l != 6)) if (*str != 0 || (ep->class == EPD_MAC && l != 6))
return 0; return 0;
ep->length = l; ep->length = l;
return 1; return 1;
} }
#endif /* PPP_SUPPORT && HAVE_MULTILINK */ #endif /* PPP_SUPPORT && HAVE_MULTILINK */

View File

@ -39,28 +39,28 @@
static u_char pppcrypt_get_7bits(u_char *input, int startBit) { static u_char pppcrypt_get_7bits(u_char *input, int startBit) {
unsigned int word; unsigned int word;
word = (unsigned)input[startBit / 8] << 8; word = (unsigned)input[startBit / 8] << 8;
word |= (unsigned)input[startBit / 8 + 1]; word |= (unsigned)input[startBit / 8 + 1];
word >>= 15 - (startBit % 8 + 7); word >>= 15 - (startBit % 8 + 7);
return word & 0xFE; return word & 0xFE;
} }
/* IN 56 bit DES key missing parity bits /* IN 56 bit DES key missing parity bits
* OUT 64 bit DES key with parity bits added * OUT 64 bit DES key with parity bits added
*/ */
void pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) { void pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) {
des_key[0] = pppcrypt_get_7bits(key, 0); des_key[0] = pppcrypt_get_7bits(key, 0);
des_key[1] = pppcrypt_get_7bits(key, 7); des_key[1] = pppcrypt_get_7bits(key, 7);
des_key[2] = pppcrypt_get_7bits(key, 14); des_key[2] = pppcrypt_get_7bits(key, 14);
des_key[3] = pppcrypt_get_7bits(key, 21); des_key[3] = pppcrypt_get_7bits(key, 21);
des_key[4] = pppcrypt_get_7bits(key, 28); des_key[4] = pppcrypt_get_7bits(key, 28);
des_key[5] = pppcrypt_get_7bits(key, 35); des_key[5] = pppcrypt_get_7bits(key, 35);
des_key[6] = pppcrypt_get_7bits(key, 42); des_key[6] = pppcrypt_get_7bits(key, 42);
des_key[7] = pppcrypt_get_7bits(key, 49); des_key[7] = pppcrypt_get_7bits(key, 49);
} }
#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */ #endif /* PPP_SUPPORT && MSCHAP_SUPPORT */

View File

@ -166,12 +166,12 @@ void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password) {
/* Lower layer up yet? */ /* Lower layer up yet? */
if (pcb->upap.us_clientstate == UPAPCS_INITIAL || if (pcb->upap.us_clientstate == UPAPCS_INITIAL ||
pcb->upap.us_clientstate == UPAPCS_PENDING) { pcb->upap.us_clientstate == UPAPCS_PENDING) {
pcb->upap.us_clientstate = UPAPCS_PENDING; pcb->upap.us_clientstate = UPAPCS_PENDING;
return; return;
} }
upap_sauthreq(pcb); /* Start protocol */ upap_sauthreq(pcb); /* Start protocol */
} }
#if PPP_SERVER #if PPP_SERVER
@ -184,14 +184,14 @@ void upap_authpeer(ppp_pcb *pcb) {
/* Lower layer up yet? */ /* Lower layer up yet? */
if (pcb->upap.us_serverstate == UPAPSS_INITIAL || if (pcb->upap.us_serverstate == UPAPSS_INITIAL ||
pcb->upap.us_serverstate == UPAPSS_PENDING) { pcb->upap.us_serverstate == UPAPSS_PENDING) {
pcb->upap.us_serverstate = UPAPSS_PENDING; pcb->upap.us_serverstate = UPAPSS_PENDING;
return; return;
} }
pcb->upap.us_serverstate = UPAPSS_LISTEN; pcb->upap.us_serverstate = UPAPSS_LISTEN;
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout); TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
@ -202,17 +202,17 @@ static void upap_timeout(void *arg) {
ppp_pcb *pcb = (ppp_pcb*)arg; ppp_pcb *pcb = (ppp_pcb*)arg;
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ)
return; return;
if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) { if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) {
/* give up in disgust */ /* give up in disgust */
ppp_error("No response to PAP authenticate-requests"); ppp_error("No response to PAP authenticate-requests");
pcb->upap.us_clientstate = UPAPCS_BADAUTH; pcb->upap.us_clientstate = UPAPCS_BADAUTH;
auth_withpeer_fail(pcb, PPP_PAP); auth_withpeer_fail(pcb, PPP_PAP);
return; return;
} }
upap_sauthreq(pcb); /* Send Authenticate-Request */ upap_sauthreq(pcb); /* Send Authenticate-Request */
} }
@ -224,7 +224,7 @@ static void upap_reqtimeout(void *arg) {
ppp_pcb *pcb = (ppp_pcb*)arg; ppp_pcb *pcb = (ppp_pcb*)arg;
if (pcb->upap.us_serverstate != UPAPSS_LISTEN) if (pcb->upap.us_serverstate != UPAPSS_LISTEN)
return; /* huh?? */ return; /* huh?? */
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
pcb->upap.us_serverstate = UPAPSS_BADAUTH; pcb->upap.us_serverstate = UPAPSS_BADAUTH;
@ -240,18 +240,18 @@ static void upap_reqtimeout(void *arg) {
static void upap_lowerup(ppp_pcb *pcb) { static void upap_lowerup(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_INITIAL) if (pcb->upap.us_clientstate == UPAPCS_INITIAL)
pcb->upap.us_clientstate = UPAPCS_CLOSED; pcb->upap.us_clientstate = UPAPCS_CLOSED;
else if (pcb->upap.us_clientstate == UPAPCS_PENDING) { else if (pcb->upap.us_clientstate == UPAPCS_PENDING) {
upap_sauthreq(pcb); /* send an auth-request */ upap_sauthreq(pcb); /* send an auth-request */
} }
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_INITIAL) if (pcb->upap.us_serverstate == UPAPSS_INITIAL)
pcb->upap.us_serverstate = UPAPSS_CLOSED; pcb->upap.us_serverstate = UPAPSS_CLOSED;
else if (pcb->upap.us_serverstate == UPAPSS_PENDING) { else if (pcb->upap.us_serverstate == UPAPSS_PENDING) {
pcb->upap.us_serverstate = UPAPSS_LISTEN; pcb->upap.us_serverstate = UPAPSS_LISTEN;
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout); TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
} }
@ -264,11 +264,11 @@ static void upap_lowerup(ppp_pcb *pcb) {
*/ */
static void upap_lowerdown(ppp_pcb *pcb) { static void upap_lowerdown(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */ if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */
UNTIMEOUT(upap_timeout, pcb); /* Cancel timeout */ UNTIMEOUT(upap_timeout, pcb); /* Cancel timeout */
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0) if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0)
UNTIMEOUT(upap_reqtimeout, pcb); UNTIMEOUT(upap_reqtimeout, pcb);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
pcb->upap.us_clientstate = UPAPCS_INITIAL; pcb->upap.us_clientstate = UPAPCS_INITIAL;
@ -286,13 +286,13 @@ static void upap_lowerdown(ppp_pcb *pcb) {
static void upap_protrej(ppp_pcb *pcb) { static void upap_protrej(ppp_pcb *pcb) {
if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) { if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) {
ppp_error("PAP authentication failed due to protocol-reject"); ppp_error("PAP authentication failed due to protocol-reject");
auth_withpeer_fail(pcb, PPP_PAP); auth_withpeer_fail(pcb, PPP_PAP);
} }
#if PPP_SERVER #if PPP_SERVER
if (pcb->upap.us_serverstate == UPAPSS_LISTEN) { if (pcb->upap.us_serverstate == UPAPSS_LISTEN) {
ppp_error("PAP authentication of peer failed (protocol-reject)"); ppp_error("PAP authentication of peer failed (protocol-reject)");
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
upap_lowerdown(pcb); upap_lowerdown(pcb);
@ -313,19 +313,19 @@ static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {
*/ */
inp = inpacket; inp = inpacket;
if (l < UPAP_HEADERLEN) { if (l < UPAP_HEADERLEN) {
UPAPDEBUG(("pap_input: rcvd short header.")); UPAPDEBUG(("pap_input: rcvd short header."));
return; return;
} }
GETCHAR(code, inp); GETCHAR(code, inp);
GETCHAR(id, inp); GETCHAR(id, inp);
GETSHORT(len, inp); GETSHORT(len, inp);
if (len < UPAP_HEADERLEN) { if (len < UPAP_HEADERLEN) {
UPAPDEBUG(("pap_input: rcvd illegal length.")); UPAPDEBUG(("pap_input: rcvd illegal length."));
return; return;
} }
if (len > l) { if (len > l) {
UPAPDEBUG(("pap_input: rcvd short packet.")); UPAPDEBUG(("pap_input: rcvd short packet."));
return; return;
} }
len -= UPAP_HEADERLEN; len -= UPAP_HEADERLEN;
@ -335,20 +335,20 @@ static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {
switch (code) { switch (code) {
case UPAP_AUTHREQ: case UPAP_AUTHREQ:
#if PPP_SERVER #if PPP_SERVER
upap_rauthreq(pcb, inp, id, len); upap_rauthreq(pcb, inp, id, len);
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
break; break;
case UPAP_AUTHACK: case UPAP_AUTHACK:
upap_rauthack(pcb, inp, id, len); upap_rauthack(pcb, inp, id, len);
break; break;
case UPAP_AUTHNAK: case UPAP_AUTHNAK:
upap_rauthnak(pcb, inp, id, len); upap_rauthnak(pcb, inp, id, len);
break; break;
default: /* XXX Need code reject */ default: /* XXX Need code reject */
break; break;
} }
} }
@ -366,40 +366,40 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
int msglen; int msglen;
if (pcb->upap.us_serverstate < UPAPSS_LISTEN) if (pcb->upap.us_serverstate < UPAPSS_LISTEN)
return; return;
/* /*
* If we receive a duplicate authenticate-request, we are * If we receive a duplicate authenticate-request, we are
* supposed to return the same status as for the first request. * supposed to return the same status as for the first request.
*/ */
if (pcb->upap.us_serverstate == UPAPSS_OPEN) { if (pcb->upap.us_serverstate == UPAPSS_OPEN) {
upap_sresp(pcb, UPAP_AUTHACK, id, "", 0); /* return auth-ack */ upap_sresp(pcb, UPAP_AUTHACK, id, "", 0); /* return auth-ack */
return; return;
} }
if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) { if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) {
upap_sresp(pcb, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */ upap_sresp(pcb, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */
return; return;
} }
/* /*
* Parse user/passwd. * Parse user/passwd.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
GETCHAR(ruserlen, inp); GETCHAR(ruserlen, inp);
len -= sizeof (u_char) + ruserlen + sizeof (u_char); len -= sizeof (u_char) + ruserlen + sizeof (u_char);
if (len < 0) { if (len < 0) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
ruser = (char *) inp; ruser = (char *) inp;
INCPTR(ruserlen, inp); INCPTR(ruserlen, inp);
GETCHAR(rpasswdlen, inp); GETCHAR(rpasswdlen, inp);
if (len < rpasswdlen) { if (len < rpasswdlen) {
UPAPDEBUG(("pap_rauth: rcvd short packet.")); UPAPDEBUG(("pap_rauth: rcvd short packet."));
return; return;
} }
rpasswd = (char *) inp; rpasswd = (char *) inp;
@ -420,16 +420,16 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
* return an authenticate failure, is leaving it for us to verify. * return an authenticate failure, is leaving it for us to verify.
*/ */
if (retcode == UPAP_AUTHACK) { if (retcode == UPAP_AUTHACK) {
if (!auth_number()) { if (!auth_number()) {
/* We do not want to leak info about the pap result. */ /* We do not want to leak info about the pap result. */
retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */ retcode = UPAP_AUTHNAK; /* XXX exit value will be "wrong" */
warn("calling number %q is not authorized", remote_number); warn("calling number %q is not authorized", remote_number);
} }
} }
msglen = strlen(msg); msglen = strlen(msg);
if (msglen > 255) if (msglen > 255)
msglen = 255; msglen = 255;
#endif /* UNUSED */ #endif /* UNUSED */
upap_sresp(pcb, retcode, id, msg, msglen); upap_sresp(pcb, retcode, id, msg, msglen);
@ -438,17 +438,17 @@ static void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {
ppp_slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser); ppp_slprintf(rhostname, sizeof(rhostname), "%.*v", ruserlen, ruser);
if (retcode == UPAP_AUTHACK) { if (retcode == UPAP_AUTHACK) {
pcb->upap.us_serverstate = UPAPSS_OPEN; pcb->upap.us_serverstate = UPAPSS_OPEN;
ppp_notice("PAP peer authentication succeeded for %q", rhostname); ppp_notice("PAP peer authentication succeeded for %q", rhostname);
auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen); auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen);
} else { } else {
pcb->upap.us_serverstate = UPAPSS_BADAUTH; pcb->upap.us_serverstate = UPAPSS_BADAUTH;
ppp_warn("PAP peer authentication failed for %q", rhostname); ppp_warn("PAP peer authentication failed for %q", rhostname);
auth_peer_fail(pcb, PPP_PAP); auth_peer_fail(pcb, PPP_PAP);
} }
if (pcb->settings.pap_req_timeout > 0) if (pcb->settings.pap_req_timeout > 0)
UNTIMEOUT(upap_reqtimeout, pcb); UNTIMEOUT(upap_reqtimeout, pcb);
} }
#endif /* PPP_SERVER */ #endif /* PPP_SERVER */
@ -461,24 +461,24 @@ static void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len) {
LWIP_UNUSED_ARG(id); LWIP_UNUSED_ARG(id);
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */ if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
return; return;
/* /*
* Parse message. * Parse message.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauthack: ignoring missing msg-length.")); UPAPDEBUG(("pap_rauthack: ignoring missing msg-length."));
} else { } else {
GETCHAR(msglen, inp); GETCHAR(msglen, inp);
if (msglen > 0) { if (msglen > 0) {
len -= sizeof (u_char); len -= sizeof (u_char);
if (len < msglen) { if (len < msglen) {
UPAPDEBUG(("pap_rauthack: rcvd short packet.")); UPAPDEBUG(("pap_rauthack: rcvd short packet."));
return; return;
} }
msg = (char *) inp; msg = (char *) inp;
PRINTMSG(msg, msglen); PRINTMSG(msg, msglen);
} }
} }
pcb->upap.us_clientstate = UPAPCS_OPEN; pcb->upap.us_clientstate = UPAPCS_OPEN;
@ -496,24 +496,24 @@ static void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len) {
LWIP_UNUSED_ARG(id); LWIP_UNUSED_ARG(id);
if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */ if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */
return; return;
/* /*
* Parse message. * Parse message.
*/ */
if (len < 1) { if (len < 1) {
UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length.")); UPAPDEBUG(("pap_rauthnak: ignoring missing msg-length."));
} else { } else {
GETCHAR(msglen, inp); GETCHAR(msglen, inp);
if (msglen > 0) { if (msglen > 0) {
len -= sizeof (u_char); len -= sizeof (u_char);
if (len < msglen) { if (len < msglen) {
UPAPDEBUG(("pap_rauthnak: rcvd short packet.")); UPAPDEBUG(("pap_rauthnak: rcvd short packet."));
return; return;
} }
msg = (char *) inp; msg = (char *) inp;
PRINTMSG(msg, msglen); PRINTMSG(msg, msglen);
} }
} }
pcb->upap.us_clientstate = UPAPCS_BADAUTH; pcb->upap.us_clientstate = UPAPCS_BADAUTH;
@ -532,7 +532,7 @@ static void upap_sauthreq(ppp_pcb *pcb) {
int outlen; int outlen;
outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) + outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +
pcb->upap.us_userlen + pcb->upap.us_passwdlen; pcb->upap.us_userlen + pcb->upap.us_passwdlen;
p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE); p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);
if(NULL == p) if(NULL == p)
return; return;
@ -606,68 +606,68 @@ static int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, con
const u_char *pstart; const u_char *pstart;
if (plen < UPAP_HEADERLEN) if (plen < UPAP_HEADERLEN)
return 0; return 0;
pstart = p; pstart = p;
GETCHAR(code, p); GETCHAR(code, p);
GETCHAR(id, p); GETCHAR(id, p);
GETSHORT(len, p); GETSHORT(len, p);
if (len < UPAP_HEADERLEN || len > plen) if (len < UPAP_HEADERLEN || len > plen)
return 0; return 0;
if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(upap_codenames)) if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(upap_codenames))
printer(arg, " %s", upap_codenames[code-1]); printer(arg, " %s", upap_codenames[code-1]);
else else
printer(arg, " code=0x%x", code); printer(arg, " code=0x%x", code);
printer(arg, " id=0x%x", id); printer(arg, " id=0x%x", id);
len -= UPAP_HEADERLEN; len -= UPAP_HEADERLEN;
switch (code) { switch (code) {
case UPAP_AUTHREQ: case UPAP_AUTHREQ:
if (len < 1) if (len < 1)
break; break;
ulen = p[0]; ulen = p[0];
if (len < ulen + 2) if (len < ulen + 2)
break; break;
wlen = p[ulen + 1]; wlen = p[ulen + 1];
if (len < ulen + wlen + 2) if (len < ulen + wlen + 2)
break; break;
user = (const u_char *) (p + 1); user = (const u_char *) (p + 1);
pwd = (const u_char *) (p + ulen + 2); pwd = (const u_char *) (p + ulen + 2);
p += ulen + wlen + 2; p += ulen + wlen + 2;
len -= ulen + wlen + 2; len -= ulen + wlen + 2;
printer(arg, " user="); printer(arg, " user=");
ppp_print_string(user, ulen, printer, arg); ppp_print_string(user, ulen, printer, arg);
printer(arg, " password="); printer(arg, " password=");
/* FIXME: require ppp_pcb struct as printpkt() argument */ /* FIXME: require ppp_pcb struct as printpkt() argument */
#if 0 #if 0
if (!pcb->settings.hide_password) if (!pcb->settings.hide_password)
#endif #endif
ppp_print_string(pwd, wlen, printer, arg); ppp_print_string(pwd, wlen, printer, arg);
#if 0 #if 0
else else
printer(arg, "<hidden>"); printer(arg, "<hidden>");
#endif #endif
break; break;
case UPAP_AUTHACK: case UPAP_AUTHACK:
case UPAP_AUTHNAK: case UPAP_AUTHNAK:
if (len < 1) if (len < 1)
break; break;
mlen = p[0]; mlen = p[0];
if (len < mlen + 1) if (len < mlen + 1)
break; break;
msg = (const u_char *) (p + 1); msg = (const u_char *) (p + 1);
p += mlen + 1; p += mlen + 1;
len -= mlen + 1; len -= mlen + 1;
printer(arg, " "); printer(arg, " ");
ppp_print_string(msg, mlen, printer, arg); ppp_print_string(msg, mlen, printer, arg);
break; break;
default: default:
break; break;
} }
/* print the rest of the bytes in the packet */ /* print the rest of the bytes in the packet */
for (; len > 0; --len) { for (; len > 0; --len) {
GETCHAR(code, p); GETCHAR(code, p);
printer(arg, " %.2x", code); printer(arg, " %.2x", code);
} }
return p - pstart; return p - pstart;

File diff suppressed because it is too large Load Diff