*
***********************************************************************/
-static char const RCSID[] =
-"$Id: discovery.c,v 1.6 2008/06/15 04:35:50 paulus Exp $";
-
#ifdef HAVE_CONFIG_H
-#include <config.h>
+#include "config.h"
#endif
#define _GNU_SOURCE 1
#include "pppoe.h"
-#include "pppd/pppd.h"
-#include "pppd/fsm.h"
-#include "pppd/lcp.h"
+#include <pppd/pppd.h>
+#include <pppd/fsm.h>
+#include <pppd/lcp.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
+#ifdef PLUGIN
+#define signaled(x) ppp_signaled(x)
+#define get_time(x) ppp_get_time(x)
+#else
+int signaled(int signal);
+int get_time(struct timeval *tv);
+
+#endif
+
/* Calculate time remaining until *exp, return 0 if now >= *exp */
static int time_left(struct timeval *diff, struct timeval *exp)
{
!strncmp((char *) data, conn->acName, len)) {
pc->acNameOK = 1;
}
+ /* save a copy of the AC name if we can */
+ conn->actualACname = realloc(conn->actualACname, len + 1);
+ if (conn->actualACname)
+ strlcpy(conn->actualACname, (char *) data, len + 1);
break;
case TAG_SERVICE_NAME:
pc->seenServiceName = 1;
* Waits for a PADO packet and copies useful information
***********************************************************************/
void
-waitForPADO(PPPoEConnection *conn, int timeout)
+waitForPADO(PPPoEConnection *conn, int timeout, int waitWholeTimeoutForPADO)
{
fd_set readable;
int r;
while(1) {
r = select(conn->discoverySocket+1, &readable, NULL, NULL, &tv);
- if (r >= 0 || errno != EINTR || got_sigterm) break;
+ if (r >= 0 || errno != EINTR || signaled(SIGTERM)) break;
}
if (r < 0) {
error("select (waitForPADO): %m");
conn->discoveryState = STATE_RECEIVED_PADO;
}
}
- } while (pppoe_verbose >= 1 || conn->discoveryState != STATE_RECEIVED_PADO);
+ } while (waitWholeTimeoutForPADO || conn->discoveryState != STATE_RECEIVED_PADO);
}
/***********************************************************************
while(1) {
r = select(conn->discoverySocket+1, &readable, NULL, NULL, &tv);
- if (r >= 0 || errno != EINTR || got_sigterm) break;
+ if (r >= 0 || errno != EINTR || signaled(SIGTERM)) break;
}
if (r < 0) {
error("select (waitForPADS): %m");
* Performs the PPPoE discovery phase 1
***********************************************************************/
void
-discovery1(PPPoEConnection *conn)
+discovery1(PPPoEConnection *conn, int waitWholeTimeoutForPADO)
{
int padiAttempts = 0;
int timeout = conn->discoveryTimeout;
do {
padiAttempts++;
- if (got_sigterm || padiAttempts > conn->discoveryAttempts) {
+ if (signaled(SIGTERM) || padiAttempts > conn->discoveryAttempts) {
warn("Timeout waiting for PADO packets");
close(conn->discoverySocket);
conn->discoverySocket = -1;
}
sendPADI(conn);
conn->discoveryState = STATE_SENT_PADI;
- waitForPADO(conn, timeout);
+ waitForPADO(conn, timeout, waitWholeTimeoutForPADO);
timeout *= 2;
} while (conn->discoveryState == STATE_SENT_PADI);
do {
padrAttempts++;
- if (got_sigterm || padrAttempts > conn->discoveryAttempts) {
+ if (signaled(SIGTERM) || padrAttempts > conn->discoveryAttempts) {
warn("Timeout waiting for PADS packets");
close(conn->discoverySocket);
conn->discoverySocket = -1;