#include <signal.h>
+/* Calculate time remaining until *exp, return 0 if now >= *exp */
+static int time_left(struct timeval *diff, struct timeval *exp)
+{
+ struct timeval now;
+
+ if (gettimeofday(&now, NULL) < 0) {
+ error("gettimeofday: %m");
+ return 0;
+ }
+
+ if (now.tv_sec > exp->tv_sec
+ || (now.tv_sec == exp->tv_sec && now.tv_usec >= exp->tv_usec))
+ return 0;
+
+ diff->tv_sec = exp->tv_sec - now.tv_sec;
+ diff->tv_usec = exp->tv_usec - now.tv_usec;
+ if (diff->tv_usec < 0) {
+ diff->tv_usec += 1000000;
+ --diff->tv_sec;
+ }
+
+ return 1;
+}
+
/**********************************************************************
*%FUNCTION: parseForHostUniq
*%ARGUMENTS:
fd_set readable;
int r;
struct timeval tv;
+ struct timeval expire_at;
+
PPPoEPacket packet;
int len;
conn->seenMaxPayload = 0;
conn->error = 0;
+ if (gettimeofday(&expire_at, NULL) < 0) {
+ error("gettimeofday (waitForPADO): %m");
+ return;
+ }
+ expire_at.tv_sec += timeout;
+
do {
if (BPF_BUFFER_IS_EMPTY) {
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
+ if (!time_left(&tv, &expire_at))
+ return; /* Timed out */
FD_ZERO(&readable);
FD_SET(conn->discoverySocket, &readable);
error("select (waitForPADO): %m");
return;
}
- if (r == 0) return; /* Timed out */
+ if (r == 0)
+ return; /* Timed out */
}
/* Get the packet */
fd_set readable;
int r;
struct timeval tv;
+ struct timeval expire_at;
+
PPPoEPacket packet;
int len;
+ if (gettimeofday(&expire_at, NULL) < 0) {
+ error("gettimeofday (waitForPADS): %m");
+ return;
+ }
+ expire_at.tv_sec += timeout;
+
conn->error = 0;
do {
if (BPF_BUFFER_IS_EMPTY) {
- tv.tv_sec = timeout;
- tv.tv_usec = 0;
+ if (!time_left(&tv, &expire_at))
+ return; /* Timed out */
FD_ZERO(&readable);
FD_SET(conn->discoverySocket, &readable);
error("select (waitForPADS): %m");
return;
}
- if (r == 0) return;
+ if (r == 0)
+ return; /* Timed out */
}
/* Get the packet */
int padrAttempts = 0;
int timeout = conn->discoveryTimeout;
- conn->discoverySocket =
- openInterface(conn->ifName, Eth_PPPOE_Discovery, conn->myEth);
-
do {
padiAttempts++;
if (padiAttempts > MAX_PADI_ATTEMPTS) {