]> git.ozlabs.org Git - ppp.git/commitdiff
Merge branch 'pppoe-discovery-cleanup' of https://github.com/TDT-AG/ppp
authorPaul Mackerras <paulus@ozlabs.org>
Sat, 23 Jun 2018 10:16:25 +0000 (20:16 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Sat, 23 Jun 2018 10:16:25 +0000 (20:16 +1000)
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
pppd/plugins/rp-pppoe/pppoe-discovery.c
pppd/plugins/rp-pppoe/pppoe.h

index 55037dffb02322e6d92cf099270b5e41739f46b4..bce71fce04f459b02053cba4c4d95b10a0206f4b 100644 (file)
@@ -387,7 +387,9 @@ parsePADOTags(UINT16_t type, UINT16_t len, unsigned char *data,
     switch(type) {
     case TAG_AC_NAME:
        pc->seenACName = 1;
-       printf("Access-Concentrator: %.*s\n", (int) len, data);
+       if (conn->printACNames) {
+           printf("Access-Concentrator: %.*s\n", (int) len, data);
+       }
        if (conn->acName && len == strlen(conn->acName) &&
            !strncmp((char *) data, conn->acName, len)) {
            pc->acNameOK = 1;
@@ -395,7 +397,7 @@ parsePADOTags(UINT16_t type, UINT16_t len, unsigned char *data,
        break;
     case TAG_SERVICE_NAME:
        pc->seenServiceName = 1;
-       if (len > 0) {
+       if (conn->printACNames && len > 0) {
            printf("       Service-Name: %.*s\n", (int) len, data);
        }
        if (conn->serviceName && len == strlen(conn->serviceName) &&
@@ -404,37 +406,47 @@ parsePADOTags(UINT16_t type, UINT16_t len, unsigned char *data,
        }
        break;
     case TAG_AC_COOKIE:
-       printf("Got a cookie:");
-       /* Print first 20 bytes of cookie */
-       for (i=0; i<len && i < 20; i++) {
-           printf(" %02x", (unsigned) data[i]);
+       if (conn->printACNames) {
+           printf("Got a cookie:");
+           /* Print first 20 bytes of cookie */
+           for (i=0; i<len && i < 20; i++) {
+               printf(" %02x", (unsigned) data[i]);
+           }
+           if (i < len) printf("...");
+           printf("\n");
        }
-       if (i < len) printf("...");
-       printf("\n");
        conn->cookie.type = htons(type);
        conn->cookie.length = htons(len);
        memcpy(conn->cookie.payload, data, len);
        break;
     case TAG_RELAY_SESSION_ID:
-       printf("Got a Relay-ID:");
-       /* Print first 20 bytes of relay ID */
-       for (i=0; i<len && i < 20; i++) {
-           printf(" %02x", (unsigned) data[i]);
+       if (conn->printACNames) {
+           printf("Got a Relay-ID:");
+           /* Print first 20 bytes of relay ID */
+           for (i=0; i<len && i < 20; i++) {
+               printf(" %02x", (unsigned) data[i]);
+           }
+           if (i < len) printf("...");
+           printf("\n");
        }
-       if (i < len) printf("...");
-       printf("\n");
        conn->relayId.type = htons(type);
        conn->relayId.length = htons(len);
        memcpy(conn->relayId.payload, data, len);
        break;
     case TAG_SERVICE_NAME_ERROR:
-       printf("Got a Service-Name-Error tag: %.*s\n", (int) len, data);
+       if (conn->printACNames) {
+           printf("Got a Service-Name-Error tag: %.*s\n", (int) len, data);
+       }
        break;
     case TAG_AC_SYSTEM_ERROR:
-       printf("Got a System-Error tag: %.*s\n", (int) len, data);
+       if (conn->printACNames) {
+           printf("Got a System-Error tag: %.*s\n", (int) len, data);
+       }
        break;
     case TAG_GENERIC_ERROR:
-       printf("Got a Generic-Error tag: %.*s\n", (int) len, data);
+       if (conn->printACNames) {
+           printf("Got a Generic-Error tag: %.*s\n", (int) len, data);
+       }
        break;
     }
 }
@@ -590,7 +602,6 @@ waitForPADO(PPPoEConnection *conn, int timeout)
                continue;
            }
            conn->numPADOs++;
-           printf("--------------------------------------------------\n");
            if (pc.acNameOK && pc.serviceNameOK) {
                memcpy(conn->peerEth, packet.ethHdr.h_source, ETH_ALEN);
                if (conn->printACNames) {
@@ -601,6 +612,7 @@ waitForPADO(PPPoEConnection *conn, int timeout)
                           (unsigned) conn->peerEth[3],
                           (unsigned) conn->peerEth[4],
                           (unsigned) conn->peerEth[5]);
+                   printf("--------------------------------------------------\n");
                    continue;
                }
                conn->discoveryState = STATE_RECEIVED_PADO;
@@ -623,14 +635,14 @@ void
 discovery(PPPoEConnection *conn)
 {
     int padiAttempts = 0;
-    int timeout = PADI_TIMEOUT;
+    int timeout = conn->discoveryTimeout;
 
     conn->discoverySocket =
        openInterface(conn->ifName, Eth_PPPOE_Discovery, conn->myEth);
 
     do {
        padiAttempts++;
-       if (padiAttempts > MAX_PADI_ATTEMPTS) {
+       if (padiAttempts > conn->discoveryAttempts) {
            fprintf(stderr, "Timeout waiting for PADO packets\n");
            close(conn->discoverySocket);
            conn->discoverySocket = -1;
@@ -653,7 +665,11 @@ int main(int argc, char *argv[])
 
     memset(conn, 0, sizeof(PPPoEConnection));
 
-    while ((opt = getopt(argc, argv, "I:D:VUAS:C:h")) > 0) {
+    conn->printACNames = 1;
+    conn->discoveryTimeout = PADI_TIMEOUT;
+    conn->discoveryAttempts = MAX_PADI_ATTEMPTS;
+
+    while ((opt = getopt(argc, argv, "I:D:VUQS:C:t:a:h")) > 0) {
        switch(opt) {
        case 'S':
            conn->serviceName = xstrdup(optarg);
@@ -661,6 +677,24 @@ int main(int argc, char *argv[])
        case 'C':
            conn->acName = xstrdup(optarg);
            break;
+       case 't':
+           if (sscanf(optarg, "%d", &conn->discoveryTimeout) != 1) {
+               fprintf(stderr, "Illegal argument to -t: Should be -t timeout\n");
+               exit(EXIT_FAILURE);
+           }
+           if (conn->discoveryTimeout < 1) {
+               conn->discoveryTimeout = 1;
+           }
+           break;
+       case 'a':
+           if (sscanf(optarg, "%d", &conn->discoveryAttempts) != 1) {
+               fprintf(stderr, "Illegal argument to -a: Should be -a attempts\n");
+               exit(EXIT_FAILURE);
+           }
+           if (conn->discoveryAttempts < 1) {
+               conn->discoveryAttempts = 1;
+           }
+           break;
        case 'U':
            conn->useHostUniq = 1;
            break;
@@ -676,8 +710,8 @@ int main(int argc, char *argv[])
        case 'I':
            conn->ifName = xstrdup(optarg);
            break;
-       case 'A':
-           /* this is the default */
+       case 'Q':
+           conn->printACNames = 0;
            break;
        case 'V':
        case 'h':
@@ -695,10 +729,13 @@ int main(int argc, char *argv[])
 
     conn->discoverySocket = -1;
     conn->sessionSocket = -1;
-    conn->printACNames = 1;
 
     discovery(conn);
-    exit(0);
+
+    if (!conn->numPADOs)
+       exit(1);
+    else
+       exit(0);
 }
 
 void rp_fatal(char const *str)
@@ -729,5 +766,17 @@ char *xstrdup(const char *s)
 void usage(void)
 {
     fprintf(stderr, "Usage: pppoe-discovery [options]\n");
+    fprintf(stderr, "Options:\n");
+    fprintf(stderr, "   -I if_name     -- Specify interface (default eth0)\n");
+    fprintf(stderr, "   -D filename    -- Log debugging information in filename.\n");
+    fprintf(stderr,
+           "   -t timeout     -- Initial timeout for discovery packets in seconds\n"
+           "   -a attempts    -- Number of discovery attempts\n"
+           "   -V             -- Print version and exit.\n"
+           "   -Q             -- Quit Mode: Do not print access concentrator names\n"
+           "   -S name        -- Set desired service name.\n"
+           "   -C name        -- Set desired access concentrator name.\n"
+           "   -U             -- Use Host-Unique to allow multiple PPPoE sessions.\n"
+           "   -h             -- Print usage information.\n");
     fprintf(stderr, "\nVersion " RP_VERSION "\n");
 }
index c4aaa6e68856e8506643a6c30c86177070af1fd7..813dcf368cf3369ff48a94db10b5e5b028716175 100644 (file)
@@ -245,6 +245,7 @@ typedef struct PPPoEConnectionStruct {
     int error;                 /* Error packet received */
     int debug;                 /* Set to log packets sent and received */
     int discoveryTimeout;       /* Timeout for discovery packets */
+    int discoveryAttempts;      /* Number of discovery attempts */
     int seenMaxPayload;
     int mtu;                   /* Stored MTU */
     int mru;                   /* Stored MRU */