PPP, moved EAP configuration to ppp_settings struct

This commit is contained in:
Sylvain Rochet 2012-12-09 21:45:14 +01:00
parent c719ba7bf3
commit 6764957d06
5 changed files with 42 additions and 31 deletions

View File

@ -1913,11 +1913,11 @@
#endif /* PPP_SERVER */
#ifndef EAP_DEFREQTIME
#define EAP_DEFREQTIME 20 /* Time to wait for peer request */
#define EAP_DEFREQTIME 6 /* Time to wait for peer request */
#endif
#ifndef EAP_DEFALLOWREQ
#define EAP_DEFALLOWREQ 20 /* max # times to accept requests */
#define EAP_DEFALLOWREQ 10 /* max # times to accept requests */
#endif
#if PPP_SERVER

View File

@ -117,8 +117,6 @@ struct eap_auth {
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;

View File

@ -240,6 +240,15 @@ typedef struct ppp_settings_s {
#endif /* PPP_SERVER */
#endif /* CHAP_SUPPPORT */
#if EAP_SUPPORT
u8_t eap_req_time; /* Time to wait (for retransmit/fail) */
u8_t eap_allow_req; /* Max Requests allowed */
#if PPP_SERVER
u8_t eap_timeout_time; /* Time to wait (for retransmit/fail) */
u8_t eap_max_transmits; /* Max Requests allowed */
#endif /* PPP_SERVER */
#endif /* EAP_SUPPORT */
u8_t lcp_loopbackfail; /* Number of times we receive our magic number from the peer
before deciding the link is looped-back. */
u8_t lcp_echo_interval; /* Interval between LCP echo-requests */

View File

@ -204,12 +204,8 @@ static void eap_init(ppp_pcb *pcb) {
BZERO(&pcb->eap, sizeof(eap_state));
#if PPP_SERVER
pcb->eap.es_server.ea_timeout = EAP_DEFTIMEOUT;
pcb->eap.es_server.ea_maxrequests = EAP_DEFTRANSMITS;
pcb->eap.es_server.ea_id = (u_char)(drand48() * 0x100);
pcb->eap.es_server.ea_id = (u_char)(drand48() * 0x100); /* FIXME: use magic.c random function */
#endif /* PPP_SERVER */
pcb->eap.es_client.ea_timeout = EAP_DEFREQTIME;
pcb->eap.es_client.ea_maxrequests = EAP_DEFALLOWREQ;
}
/*
@ -248,9 +244,9 @@ void eap_authwithpeer(ppp_pcb *pcb, char *localname) {
* Start a timer so that if the other end just goes
* silent, we don't sit here waiting forever.
*/
if (pcb->eap.es_client.ea_timeout > 0)
if (pcb->settings.eap_req_time > 0)
TIMEOUT(eap_client_timeout, pcb,
pcb->eap.es_client.ea_timeout);
pcb->settings.eap_req_time);
}
#if PPP_SERVER
@ -445,7 +441,7 @@ static void eap_figure_next_state(ppp_pcb *pcb, int status) {
struct b64state bs;
#endif /* USE_SRP */
pcb->eap.es_server.ea_timeout = pcb->eap.es_savedtime;
pcb->settings.eap_timeout_time = pcb->eap.es_savedtime;
switch (pcb->eap.es_server.ea_state) {
case eapBadAuth:
return;
@ -544,9 +540,9 @@ static void eap_figure_next_state(ppp_pcb *pcb, int status) {
* generator combination, and that will take
* a while. Lengthen the timeout here.
*/
if (pcb->eap.es_server.ea_timeout > 0 &&
pcb->eap.es_server.ea_timeout < 30)
pcb->eap.es_server.ea_timeout = 30;
if (pcb->settings.eap_timeout_time > 0 &&
pcb->settings.eap_timeout_time < 30)
pcb->settings.eap_timeout_time = 30;
} else {
break;
}
@ -680,8 +676,8 @@ static void eap_send_request(ppp_pcb *pcb) {
#endif /* PPP_REMOTENAME */
}
if (pcb->eap.es_server.ea_maxrequests > 0 &&
pcb->eap.es_server.ea_requests >= pcb->eap.es_server.ea_maxrequests) {
if (pcb->settings.eap_max_transmits > 0 &&
pcb->eap.es_server.ea_requests >= pcb->settings.eap_max_transmits) {
if (pcb->eap.es_server.ea_responses > 0)
ppp_error("EAP: too many Requests sent");
else
@ -882,8 +878,8 @@ static void eap_send_request(ppp_pcb *pcb) {
pcb->eap.es_server.ea_requests++;
if (pcb->eap.es_server.ea_timeout > 0)
TIMEOUT(eap_server_timeout, pcb, pcb->eap.es_server.ea_timeout);
if (pcb->settings.eap_timeout_time > 0)
TIMEOUT(eap_server_timeout, pcb, pcb->settings.eap_timeout_time);
}
/*
@ -898,7 +894,7 @@ void eap_authpeer(ppp_pcb *pcb, char *localname) {
pcb->eap.es_server.ea_name = localname;
pcb->eap.es_server.ea_namelen = strlen(localname);
pcb->eap.es_savedtime = pcb->eap.es_server.ea_timeout;
pcb->eap.es_savedtime = pcb->settings.eap_timeout_time;
/* Lower layer up yet? */
if (pcb->eap.es_server.ea_state == eapInitial ||
@ -997,12 +993,12 @@ static void eap_lowerup(ppp_pcb *pcb) {
*/
static void eap_lowerdown(ppp_pcb *pcb) {
if (eap_client_active(pcb) && pcb->eap.es_client.ea_timeout > 0) {
if (eap_client_active(pcb) && pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, pcb);
}
#if PPP_SERVER
if (eap_server_active(pcb)) {
if (pcb->eap.es_server.ea_timeout > 0) {
if (pcb->settings.eap_timeout_time > 0) {
UNTIMEOUT(eap_server_timeout, pcb);
}
} else {
@ -1366,10 +1362,10 @@ static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
*/
pcb->eap.es_client.ea_requests++;
if (pcb->eap.es_client.ea_maxrequests != 0 &&
pcb->eap.es_client.ea_requests > pcb->eap.es_client.ea_maxrequests) {
if (pcb->settings.eap_allow_req != 0 &&
pcb->eap.es_client.ea_requests > pcb->settings.eap_allow_req) {
ppp_info("EAP: received too many Request messages");
if (pcb->eap.es_client.ea_timeout > 0) {
if (pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, pcb);
}
auth_withpeer_fail(pcb, PPP_EAP);
@ -1726,17 +1722,17 @@ static void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {
break;
}
if (pcb->eap.es_client.ea_timeout > 0) {
if (pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, pcb);
TIMEOUT(eap_client_timeout, pcb,
pcb->eap.es_client.ea_timeout);
pcb->settings.eap_req_time);
}
return;
#ifdef USE_SRP
client_failure:
pcb->eap.es_client.ea_state = eapBadAuth;
if (pcb->eap.es_client.ea_timeout > 0) {
if (pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, (void *)esp);
}
pcb->eap.es_client.ea_session = NULL;
@ -2034,7 +2030,7 @@ static void eap_response(ppp_pcb *pcb, u_char *inp, int id, int len) {
return;
}
if (pcb->eap.es_server.ea_timeout > 0) {
if (pcb->settings.eap_timeout_time > 0) {
UNTIMEOUT(eap_server_timeout, pcb);
}
@ -2057,7 +2053,7 @@ static void eap_success(ppp_pcb *pcb, u_char *inp, int id, int len) {
return;
}
if (pcb->eap.es_client.ea_timeout > 0) {
if (pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, pcb);
}
@ -2080,7 +2076,7 @@ static void eap_failure(ppp_pcb *pcb, u_char *inp, int id, int len) {
pcb->eap.es_client.ea_state);
}
if (pcb->eap.es_client.ea_timeout > 0) {
if (pcb->settings.eap_req_time > 0) {
UNTIMEOUT(eap_client_timeout, pcb);
}

View File

@ -271,6 +271,14 @@ ppp_pcb *ppp_new(void) {
pcb->settings.chap_rechallenge_time = CHAP_DEFREQTIME;
#endif /* PPP_SERVER */
#endif /* CHAP_SUPPPORT */
#if EAP_SUPPORT
pcb->settings.eap_req_time = EAP_DEFREQTIME;
pcb->settings.eap_allow_req = EAP_DEFALLOWREQ;
#if PPP_SERVER
pcb->settings.eap_timeout_time = EAP_DEFTIMEOUT;
pcb->settings.eap_max_transmits = EAP_DEFTRANSMITS;
#endif /* PPP_SERVER */
#endif /* EAP_SUPPORT */
pcb->settings.lcp_loopbackfail = LCP_DEFLOOPBACKFAIL;
pcb->settings.lcp_echo_interval = LCP_ECHOINTERVAL;
pcb->settings.lcp_echo_fails = LCP_MAXECHOFAILS;