diff -u ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c --- ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c 2007-06-25 11:33:58 +0200 +++ ppp-2.4.4/pppd/plugins/rp-pppoe/discovery.c 2007-06-25 11:42:08 +0200 @@ -312,7 +312,7 @@ { fd_set readable; int r; - struct timeval tv; + struct timeval tv, exp; PPPoEPacket packet; int len; @@ -322,12 +322,25 @@ pc.serviceNameOK = (conn->serviceName) ? 0 : 1; pc.seenACName = 0; pc.seenServiceName = 0; - + + gettimeofday(&exp, NULL); + exp.tv_sec += timeout; + do { if (BPF_BUFFER_IS_EMPTY) { - tv.tv_sec = timeout; - tv.tv_usec = 0; - + gettimeofday(&tv, NULL); + if (tv.tv_sec > exp.tv_sec) + return; + else if (tv.tv_sec == exp.tv_sec && tv.tv_usec > exp.tv_usec) + return; + + tv.tv_usec = exp.tv_usec - tv.tv_usec; + tv.tv_sec = exp.tv_sec - tv.tv_sec; + if (tv.tv_usec < 0) { + tv.tv_usec += 1000000; + tv.tv_sec -= 1; + } + FD_ZERO(&readable); FD_SET(conn->discoverySocket, &readable); @@ -527,15 +540,28 @@ { fd_set readable; int r; - struct timeval tv; + struct timeval tv, exp; PPPoEPacket packet; int len; + gettimeofday(&exp, NULL); + exp.tv_sec += timeout; + do { if (BPF_BUFFER_IS_EMPTY) { - tv.tv_sec = timeout; - tv.tv_usec = 0; - + gettimeofday(&tv, NULL); + if (tv.tv_sec > exp.tv_sec) + return; + else if (tv.tv_sec == exp.tv_sec && tv.tv_usec > exp.tv_usec) + return; + + tv.tv_usec = exp.tv_usec - tv.tv_usec; + tv.tv_sec = exp.tv_sec - tv.tv_sec; + if (tv.tv_usec < 0) { + tv.tv_usec += 1000000; + tv.tv_sec -= 1; + } + FD_ZERO(&readable); FD_SET(conn->discoverySocket, &readable);