From be2d3b5886b3ee518119e6acb3fdbb932bcfcbb4 Mon Sep 17 00:00:00 2001 From: Sylvain Rochet Date: Sun, 17 Jun 2012 02:33:47 +0200 Subject: [PATCH] moved back temporarily moved structure definitions from various headers to ppp.h during unit to ppp_pcb transition --- src/netif/ppp/chap-new.h | 31 +++++++ src/netif/ppp/eap.h | 54 ++++++++++++ src/netif/ppp/fsm.h | 4 +- src/netif/ppp/ipcp.c | 2 +- src/netif/ppp/lcp.c | 2 +- src/netif/ppp/lcp.h | 50 +++++++++++ src/netif/ppp/ppp.c | 2 +- src/netif/ppp/ppp.h | 181 ++++++--------------------------------- src/netif/ppp/upap.h | 22 +++++ 9 files changed, 187 insertions(+), 161 deletions(-) diff --git a/src/netif/ppp/chap-new.h b/src/netif/ppp/chap-new.h index c85a91af..98f4c54d 100644 --- a/src/netif/ppp/chap-new.h +++ b/src/netif/ppp/chap-new.h @@ -31,6 +31,11 @@ #include "lwip/opt.h" #if PPP_SUPPORT && CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ +#ifndef CHAP_H +#define CHAP_H + +#include "ppp.h" + /* * CHAP packets begin with a standard header with code, id, len (2 bytes). */ @@ -135,6 +140,31 @@ struct chap_digest_type { struct chap_digest_type *next; }; +/* + * Each interface is described by chap structure. + */ +#if CHAP_SUPPORT +typedef struct chap_client_state { + int flags; + char *name; + struct chap_digest_type *digest; + unsigned char priv[64]; /* private area for digest's use */ +} chap_client_state; + +#if PPP_SERVER +static struct chap_server_state { + int flags; + int id; + char *name; + struct chap_digest_type *digest; + int challenge_xmits; + int challenge_pktlen; + unsigned char challenge[CHAL_MAX_PKTLEN]; + char message[256]; +} chap_server_state; +#endif /* PPP_SERVER */ +#endif /* CHAP_SUPPORT */ + #if 0 /* UNUSED */ /* Hook for a plugin to validate CHAP challenge */ extern int (*chap_verify_hook)(char *name, char *ourname, int id, @@ -157,4 +187,5 @@ extern void chap_auth_with_peer(ppp_pcb *pcb, char *our_name, int digest_code); /* Represents the CHAP protocol to the main pppd code */ extern struct protent chap_protent; +#endif /* CHAP_H */ #endif /* PPP_SUPPORT && CHAP_SUPPORT */ diff --git a/src/netif/ppp/eap.h b/src/netif/ppp/eap.h index 1f2fc5bf..5ee6daf4 100644 --- a/src/netif/ppp/eap.h +++ b/src/netif/ppp/eap.h @@ -26,6 +26,8 @@ #ifndef PPP_EAP_H #define PPP_EAP_H +#include "ppp.h" + #ifdef __cplusplus extern "C" { #endif @@ -92,6 +94,58 @@ extern "C" { (pcb)->eap.es_server.ea_state <= eapMD5Chall) #endif /* PPP_SERVER */ +/* + * Complete EAP state for one PPP session. + */ +enum eap_state_code { + eapInitial = 0, /* No EAP authentication yet requested */ + eapPending, /* Waiting for LCP (no timer) */ + eapClosed, /* Authentication not in use */ + eapListen, /* Client ready (and timer running) */ + eapIdentify, /* EAP Identify sent */ + eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */ + eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */ + eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */ + eapMD5Chall, /* Sent MD5-Challenge */ + eapOpen, /* Completed authentication */ + eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */ + eapBadAuth /* Failed authentication */ +}; + +struct eap_auth { + char *ea_name; /* Our name */ + char *ea_peer; /* Peer's name */ + void *ea_session; /* Authentication library linkage */ + u_char *ea_skey; /* Shared encryption key */ + int ea_timeout; /* Time to wait (for retransmit/fail) */ + int ea_maxrequests; /* Max Requests allowed */ + u_short ea_namelen; /* Length of our name */ + u_short ea_peerlen; /* Length of peer's name */ + enum eap_state_code ea_state; + u_char ea_id; /* Current id */ + u_char ea_requests; /* Number of Requests sent/received */ + u_char ea_responses; /* Number of Responses */ + u_char ea_type; /* One of EAPT_* */ + u_int32_t ea_keyflags; /* SRP shared key usage flags */ +}; + +#ifndef EAP_MAX_CHALLENGE_LENGTH +#define EAP_MAX_CHALLENGE_LENGTH 24 +#endif +typedef struct eap_state { + struct eap_auth es_client; /* Client (authenticatee) data */ +#if PPP_SERVER + struct eap_auth es_server; /* Server (authenticator) data */ +#endif /* PPP_SERVER */ + int es_savedtime; /* Saved timeout */ + int es_rechallenge; /* EAP rechallenge interval */ + int es_lwrechallenge; /* SRP lightweight rechallenge inter */ + bool es_usepseudo; /* Use SRP Pseudonym if offered one */ + int es_usedpseudo; /* Set if we already sent PN */ + int es_challen; /* Length of challenge string */ + u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH]; +} eap_state; + /* * Timeouts. */ diff --git a/src/netif/ppp/fsm.h b/src/netif/ppp/fsm.h index d02301ab..afa33edf 100644 --- a/src/netif/ppp/fsm.h +++ b/src/netif/ppp/fsm.h @@ -48,6 +48,8 @@ #ifndef FSM_H #define FSM_H +#include "ppp.h" + /* * Packet header = Code, id, length. */ @@ -70,7 +72,7 @@ * Each FSM is described by an fsm structure and fsm callbacks. */ typedef struct fsm { - void *pcb; /* PPP Interface */ /* FIXME: try to use ppp_pcb here */ + ppp_pcb *pcb; /* PPP Interface */ int protocol; /* Data Link Layer Protocol field value */ int state; /* State */ int flags; /* Contains option bits */ diff --git a/src/netif/ppp/ipcp.c b/src/netif/ppp/ipcp.c index 1f09cf5d..9445c63e 100644 --- a/src/netif/ppp/ipcp.c +++ b/src/netif/ppp/ipcp.c @@ -597,7 +597,7 @@ static void ipcp_init(ppp_pcb *pcb) { ipcp_options *wo = &pcb->ipcp_wantoptions; ipcp_options *ao = &pcb->ipcp_allowoptions; - f->pcb = (void*)pcb; + f->pcb = pcb; f->protocol = PPP_IPCP; f->callbacks = &ipcp_callbacks; fsm_init(f); diff --git a/src/netif/ppp/lcp.c b/src/netif/ppp/lcp.c index f8e51e35..1b05cb87 100644 --- a/src/netif/ppp/lcp.c +++ b/src/netif/ppp/lcp.c @@ -364,7 +364,7 @@ static void lcp_init(ppp_pcb *pcb) { lcp_options *wo = &pcb->lcp_wantoptions; lcp_options *ao = &pcb->lcp_allowoptions; - f->pcb = (void*)pcb; + f->pcb = pcb; f->protocol = PPP_LCP; f->callbacks = &lcp_callbacks; diff --git a/src/netif/ppp/lcp.h b/src/netif/ppp/lcp.h index 372cb155..3cfc1175 100644 --- a/src/netif/ppp/lcp.h +++ b/src/netif/ppp/lcp.h @@ -94,6 +94,56 @@ #define MINMRU 128 /* No MRUs below this */ #define MAXMRU 16384 /* Normally limit MRU to this */ +/* An endpoint discriminator, used with multilink. */ +#define MAX_ENDP_LEN 20 /* maximum length of discriminator value */ +struct epdisc { + unsigned char class; + unsigned char length; + unsigned char value[MAX_ENDP_LEN]; +}; + +/* + * The state of options is described by an lcp_options structure. + */ +typedef struct lcp_options { + bool passive; /* Don't die if we don't get a response */ + bool silent; /* Wait for the other end to start first */ + bool restart; /* Restart vs. exit after close */ + bool neg_mru; /* Negotiate the MRU? */ + bool neg_asyncmap; /* Negotiate the async map? */ +#if PAP_SUPPORT + bool neg_upap; /* Ask for UPAP authentication? */ +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT + bool neg_chap; /* Ask for CHAP authentication? */ +#endif /* CHAP_SUPPORT */ +#if EAP_SUPPORT + bool neg_eap; /* Ask for EAP authentication? */ +#endif /* EAP_SUPPORT */ + bool neg_magicnumber; /* Ask for magic number? */ + bool neg_pcompression; /* HDLC Protocol Field Compression? */ + bool neg_accompression; /* HDLC Address/Control Field Compression? */ +#if LQR_SUPPORT + bool neg_lqr; /* Negotiate use of Link Quality Reports */ +#endif /* LQR_SUPPORT */ + bool neg_cbcp; /* Negotiate use of CBCP */ + bool neg_mrru; /* negotiate multilink MRRU */ + bool neg_ssnhf; /* negotiate short sequence numbers */ + bool neg_endpoint; /* negotiate endpoint discriminator */ + int mru; /* Value of MRU */ + int mrru; /* Value of MRRU, and multilink enable */ +#if CHAP_SUPPORT + u_char chap_mdtype; /* which MD types (hashing algorithm) */ +#endif /* CHAP_SUPPORT */ + u_int32_t asyncmap; /* Value of async map */ + u_int32_t magicnumber; + int numloops; /* Number of loops during magic number neg. */ +#if LQR_SUPPORT + u_int32_t lqr_period; /* Reporting period for LQR 1/100ths second */ +#endif /* LQR_SUPPORT */ + struct epdisc endpoint; /* endpoint discriminator */ +} lcp_options; + void lcp_open(ppp_pcb *pcb); void lcp_close(ppp_pcb *pcb, char *reason); void lcp_lowerup(ppp_pcb *pcb); diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c index 58b4434f..58507306 100644 --- a/src/netif/ppp/ppp.c +++ b/src/netif/ppp/ppp.c @@ -332,7 +332,7 @@ int ppp_over_serial_open(ppp_pcb *pcb, sio_fd_t fd, ppp_link_status_cb_fn link_s pcb->fd = fd; - pcb->rx.pcb = (void*)pcb; + pcb->rx.pcb = pcb; pcb->rx.fd = fd; #if VJ_SUPPORT diff --git a/src/netif/ppp/ppp.h b/src/netif/ppp/ppp.h index fda50588..eebe58d8 100644 --- a/src/netif/ppp/ppp.h +++ b/src/netif/ppp/ppp.h @@ -88,10 +88,6 @@ typedef unsigned char u_char; typedef unsigned char bool; #endif -#include "fsm.h" -#include "ipcp.h" - - /************************* *** PUBLIC DEFINITIONS *** *************************/ @@ -129,6 +125,27 @@ typedef unsigned char bool; *** PUBLIC DATA TYPES *** ************************/ +/* + * Other headers require ppp_pcb definition for prototypes, but ppp_pcb + * require some structure definition from other headers as well, we are + * fixing the dependency loop here by declaring the ppp_pcb type then + * by including headers containing necessary struct definition for ppp_pcb + */ +typedef struct ppp_pcb_s ppp_pcb; + +#include "fsm.h" +#include "lcp.h" +#include "ipcp.h" +#if PAP_SUPPORT +#include "upap.h" +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT +#include "chap-new.h" +#endif /* CHAP_SUPPORT */ +#if EAP_SUPPORT +#include "eap.h" +#endif /* EAP_SUPPORT */ + /* * PPP configuration. */ @@ -217,7 +234,7 @@ typedef enum { */ typedef struct ppp_pcb_rx_s { /** ppp descriptor */ - void *pcb; + ppp_pcb *pcb; /** the rx file descriptor */ sio_fd_t fd; /** receive buffer - encoded data is stored here */ @@ -236,160 +253,10 @@ typedef struct ppp_pcb_rx_s { } ppp_pcb_rx; #endif /* PPPOS_SUPPORT */ -/* An endpoint discriminator, used with multilink. */ -#define MAX_ENDP_LEN 20 /* maximum length of discriminator value */ -struct epdisc { - unsigned char class; - unsigned char length; - unsigned char value[MAX_ENDP_LEN]; -}; - -/* - * The state of options is described by an lcp_options structure. - */ -typedef struct lcp_options { - bool passive; /* Don't die if we don't get a response */ - bool silent; /* Wait for the other end to start first */ - bool restart; /* Restart vs. exit after close */ - bool neg_mru; /* Negotiate the MRU? */ - bool neg_asyncmap; /* Negotiate the async map? */ -#if PAP_SUPPORT - bool neg_upap; /* Ask for UPAP authentication? */ -#endif /* PAP_SUPPORT */ -#if CHAP_SUPPORT - bool neg_chap; /* Ask for CHAP authentication? */ -#endif /* CHAP_SUPPORT */ -#if EAP_SUPPORT - bool neg_eap; /* Ask for EAP authentication? */ -#endif /* EAP_SUPPORT */ - bool neg_magicnumber; /* Ask for magic number? */ - bool neg_pcompression; /* HDLC Protocol Field Compression? */ - bool neg_accompression; /* HDLC Address/Control Field Compression? */ -#if LQR_SUPPORT - bool neg_lqr; /* Negotiate use of Link Quality Reports */ -#endif /* LQR_SUPPORT */ - bool neg_cbcp; /* Negotiate use of CBCP */ - bool neg_mrru; /* negotiate multilink MRRU */ - bool neg_ssnhf; /* negotiate short sequence numbers */ - bool neg_endpoint; /* negotiate endpoint discriminator */ - int mru; /* Value of MRU */ - int mrru; /* Value of MRRU, and multilink enable */ -#if CHAP_SUPPORT - u_char chap_mdtype; /* which MD types (hashing algorithm) */ -#endif /* CHAP_SUPPORT */ - u_int32_t asyncmap; /* Value of async map */ - u_int32_t magicnumber; - int numloops; /* Number of loops during magic number neg. */ -#if LQR_SUPPORT - u_int32_t lqr_period; /* Reporting period for LQR 1/100ths second */ -#endif /* LQR_SUPPORT */ - struct epdisc endpoint; /* endpoint discriminator */ -} lcp_options; - -/* - * Each interface is described by upap structure. - */ -#if PAP_SUPPORT -typedef struct upap_state { - char *us_user; /* User */ - int us_userlen; /* User length */ - char *us_passwd; /* Password */ - int us_passwdlen; /* Password length */ - int us_clientstate; /* Client state */ -#if PPP_SERVER - int us_serverstate; /* Server state */ -#endif /* PPP_SERVER */ - u_char us_id; /* Current id */ - int us_timeouttime; /* Timeout (seconds) for auth-req retrans. */ - int us_transmits; /* Number of auth-reqs sent */ - int us_maxtransmits; /* Maximum number of auth-reqs to send */ - int us_reqtimeout; /* Time to wait for auth-req from peer */ -} upap_state; -#endif /* PAP_SUPPORT */ - -/* - * Each interface is described by chap structure. - */ -#if CHAP_SUPPORT -typedef struct chap_client_state { - int flags; - char *name; - struct chap_digest_type *digest; - unsigned char priv[64]; /* private area for digest's use */ -} chap_client_state; - -#if PPP_SERVER -static struct chap_server_state { - int flags; - int id; - char *name; - struct chap_digest_type *digest; - int challenge_xmits; - int challenge_pktlen; - unsigned char challenge[CHAL_MAX_PKTLEN]; - char message[256]; -} chap_server_state; -#endif /* PPP_SERVER */ -#endif /* CHAP_SUPPORT */ - -#if EAP_SUPPORT -/* - * Complete EAP state for one PPP session. - */ -enum eap_state_code { - eapInitial = 0, /* No EAP authentication yet requested */ - eapPending, /* Waiting for LCP (no timer) */ - eapClosed, /* Authentication not in use */ - eapListen, /* Client ready (and timer running) */ - eapIdentify, /* EAP Identify sent */ - eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */ - eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */ - eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */ - eapMD5Chall, /* Sent MD5-Challenge */ - eapOpen, /* Completed authentication */ - eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */ - eapBadAuth /* Failed authentication */ -}; - -struct eap_auth { - char *ea_name; /* Our name */ - char *ea_peer; /* Peer's name */ - void *ea_session; /* Authentication library linkage */ - u_char *ea_skey; /* Shared encryption key */ - int ea_timeout; /* Time to wait (for retransmit/fail) */ - int ea_maxrequests; /* Max Requests allowed */ - u_short ea_namelen; /* Length of our name */ - u_short ea_peerlen; /* Length of peer's name */ - enum eap_state_code ea_state; - u_char ea_id; /* Current id */ - u_char ea_requests; /* Number of Requests sent/received */ - u_char ea_responses; /* Number of Responses */ - u_char ea_type; /* One of EAPT_* */ - u_int32_t ea_keyflags; /* SRP shared key usage flags */ -}; - -#ifndef EAP_MAX_CHALLENGE_LENGTH -#define EAP_MAX_CHALLENGE_LENGTH 24 -#endif -typedef struct eap_state { - struct eap_auth es_client; /* Client (authenticatee) data */ -#if PPP_SERVER - struct eap_auth es_server; /* Server (authenticator) data */ -#endif /* PPP_SERVER */ - int es_savedtime; /* Saved timeout */ - int es_rechallenge; /* EAP rechallenge interval */ - int es_lwrechallenge; /* SRP lightweight rechallenge inter */ - bool es_usepseudo; /* Use SRP Pseudonym if offered one */ - int es_usedpseudo; /* Set if we already sent PN */ - int es_challen; /* Length of challenge string */ - u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH]; -} eap_state; -#endif /* EAP_SUPPORT */ - /* * PPP interface control block. */ -typedef struct ppp_pcb_s { +struct ppp_pcb_s { ppp_settings settings; u8_t num; /* Interface number - only useful for debugging */ #if PPPOS_SUPPORT @@ -486,7 +353,7 @@ typedef struct ppp_pcb_s { */ u_char outpacket_buf[PPP_MRU+PPP_HDRLEN]; /* buffer for outgoing packet */ -} ppp_pcb; +}; /************************ *** PUBLIC FUNCTIONS *** diff --git a/src/netif/ppp/upap.h b/src/netif/ppp/upap.h index 18aaa6d1..27209265 100644 --- a/src/netif/ppp/upap.h +++ b/src/netif/ppp/upap.h @@ -93,6 +93,28 @@ #endif /* moved to opt.h */ #define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ +/* + * Each interface is described by upap structure. + */ +#if PAP_SUPPORT +typedef struct upap_state { + char *us_user; /* User */ + int us_userlen; /* User length */ + char *us_passwd; /* Password */ + int us_passwdlen; /* Password length */ + int us_clientstate; /* Client state */ +#if PPP_SERVER + int us_serverstate; /* Server state */ +#endif /* PPP_SERVER */ + u_char us_id; /* Current id */ + int us_timeouttime; /* Timeout (seconds) for auth-req retrans. */ + int us_transmits; /* Number of auth-reqs sent */ + int us_maxtransmits; /* Maximum number of auth-reqs to send */ + int us_reqtimeout; /* Time to wait for auth-req from peer */ +} upap_state; +#endif /* PAP_SUPPORT */ + + void upap_authwithpeer(ppp_pcb *pcb, char *user, char *password); #if PPP_SERVER void upap_authpeer(ppp_pcb *pcb);