Any ping from what we think is the master should force an election.
[l2tpns.git] / ppp.c
diff --git a/ppp.c b/ppp.c
index 0d9dc01..fd2f413 100644 (file)
--- a/ppp.c
+++ b/ppp.c
@@ -1,6 +1,6 @@
 // L2TPNS PPP Stuff
 
-char const *cvs_id_ppp = "$Id: ppp.c,v 1.40 2005/01/05 13:50:30 bodea Exp $";
+char const *cvs_id_ppp = "$Id: ppp.c,v 1.39.2.2 2005/02/14 05:55:49 bodea Exp $";
 
 #include <stdio.h>
 #include <string.h>
@@ -32,7 +32,7 @@ void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        char pass[129];
        uint16_t hl;
 
-       CSTAT(processpap);
+       CSTAT(call_processpap);
 
        LOG_HEX(5, "PAP", p, l);
        if (l < 4)
@@ -60,13 +60,18 @@ void processpap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        {
                uint8_t *b = p;
                b += 4;
+               user[0] = pass[0] = 0;
                if (*b && *b < sizeof(user))
+               {
                        memcpy(user, b + 1, *b);
-               user[*b] = 0;
-               b += 1 + *b;
-               if (*b && *b < sizeof(pass))
-                       memcpy(pass, b + 1, *b);
-               pass[*b] = 0;
+                       user[*b] = 0;
+                       b += 1 + *b;
+                       if (*b && *b < sizeof(pass))
+                       {
+                               memcpy(pass, b + 1, *b);
+                               pass[*b] = 0;
+                       }
+               }
                LOG(3, s, t, "PAP login %s/%s\n", user, pass);
        }
        if (session[s].ip || !session[s].radius)
@@ -132,7 +137,7 @@ void processchap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        uint16_t r;
        uint16_t hl;
 
-       CSTAT(processchap);
+       CSTAT(call_processchap);
 
        LOG_HEX(5, "CHAP", p, l);
        r = session[s].radius;
@@ -224,13 +229,29 @@ void processchap(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        radiussend(r, RADIUSAUTH);
 }
 
+static char *ppp_lcp_types[] = {
+       NULL,
+       "ConfigReq",
+       "ConfigAck",
+       "ConfigNak",
+       "ConfigRej",
+       "TerminateReq",
+       "TerminateAck",
+       "CodeRej",
+       "ProtocolRej",
+       "EchoReq",
+       "EchoReply",
+       "DiscardRequest",
+       "IdentRequest",
+};
+
 static void dumplcp(uint8_t *p, int l)
 {
        int x = l - 4;
        uint8_t *o = (p + 4);
 
        LOG_HEX(5, "PPP LCP Packet", p, l);
-       LOG(4, 0, 0, "PPP LCP Packet type %d (%s len %d)\n", *p, ppp_lcp_type((int)*p), ntohs( ((uint16_t *) p)[1]) );
+       LOG(4, 0, 0, "PPP LCP Packet type %d (%s len %d)\n", *p, ppp_lcp_types[(int)*p], ntohs( ((uint16_t *) p)[1]) );
        LOG(4, 0, 0, "Length: %d\n", l);
        if (*p != ConfigReq && *p != ConfigRej && *p != ConfigAck)
                return;
@@ -255,48 +276,48 @@ static void dumplcp(uint8_t *p, int l)
                {
                        case 1: // Maximum-Receive-Unit
                                if (length == 4)
-                                       LOG(4, 0, 0, "    %s %d\n", lcp_type(type), ntohs(*(uint16_t *)(o + 2)));
+                                       LOG(4, 0, 0, "    %s %d\n", lcp_types[type], ntohs(*(uint16_t *)(o + 2)));
                                else
-                                       LOG(4, 0, 0, "    %s odd length %d\n", lcp_type(type), length);
+                                       LOG(4, 0, 0, "    %s odd length %d\n", lcp_types[type], length);
                                break;
                        case 2: // Async-Control-Character-Map
                                if (length == 6)
                                {
                                        uint32_t asyncmap = ntohl(*(uint32_t *)(o + 2));
-                                       LOG(4, 0, 0, "    %s %x\n", lcp_type(type), asyncmap);
+                                       LOG(4, 0, 0, "    %s %x\n", lcp_types[type], asyncmap);
                                }
                                else
-                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_type(type), length);
+                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_types[type], length);
                                break;
                        case 3: // Authentication-Protocol
                                if (length == 4)
                                {
                                        int proto = ntohs(*(uint16_t *)(o + 2));
-                                       LOG(4, 0, 0, "   %s 0x%x (%s)\n", lcp_type(type), proto,
+                                       LOG(4, 0, 0, "   %s 0x%x (%s)\n", lcp_types[type], proto,
                                                proto == PPPCHAP ? "CHAP" :
                                                proto == PPPPAP  ? "PAP"  : "UNKNOWN");
                                }
                                else
-                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_type(type), length);
+                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_types[type], length);
                                break;
                        case 4: // Quality-Protocol
                                {
                                        uint32_t qp = ntohl(*(uint32_t *)(o + 2));
-                                       LOG(4, 0, 0, "    %s %x\n", lcp_type(type), qp);
+                                       LOG(4, 0, 0, "    %s %x\n", lcp_types[type], qp);
                                }
                                break;
                        case 5: // Magic-Number
                                if (length == 6)
                                {
                                        uint32_t magicno = ntohl(*(uint32_t *)(o + 2));
-                                       LOG(4, 0, 0, "    %s %x\n", lcp_type(type), magicno);
+                                       LOG(4, 0, 0, "    %s %x\n", lcp_types[type], magicno);
                                }
                                else
-                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_type(type), length);
+                                       LOG(4, 0, 0, "   %s odd length %d\n", lcp_types[type], length);
                                break;
                        case 7: // Protocol-Field-Compression
                        case 8: // Address-And-Control-Field-Compression
-                               LOG(4, 0, 0, "    %s\n", lcp_type(type));
+                               LOG(4, 0, 0, "    %s\n", lcp_types[type]);
                                break;
                        default:
                                LOG(2, 0, 0, "    Unknown PPP LCP Option type %d\n", type);
@@ -315,7 +336,7 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        uint32_t magicno = 0;
        uint16_t hl;
 
-       CSTAT(processlcp);
+       CSTAT(call_processlcp);
 
        LOG_HEX(5, "LCP", p, l);
        if (l < 4)
@@ -467,7 +488,7 @@ void processlcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
                        *q = ConfigAck;
                }
 
-               LOG(3, s, t, "Sending %s\n", ppp_lcp_type(*response));
+               LOG(3, s, t, "Sending %s\n", ppp_lcp_types[*response]);
                tunnelsend(b, l + (q - b), t);
 
                if (!(session[s].flags & SF_LCP_ACKED))
@@ -551,7 +572,7 @@ void processipcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
 {
        uint16_t hl;
 
-       CSTAT(processipcp);
+       CSTAT(call_processipcp);
 
        LOG_HEX(5, "IPCP", p, l);
        if (l < 5)
@@ -693,7 +714,7 @@ void processipin(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
 {
        in_addr_t ip;
 
-       CSTAT(processipin);
+       CSTAT(call_processipin);
 
        LOG_HEX(5, "IP", p, l);
 
@@ -750,7 +771,7 @@ void processipin(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
 
        session[s].cin += l - 4;
        session[s].total_cin += l - 4;
-       sess_count[s].cin += l - 4;
+       sess_local[s].cin += l - 4;
 
        session[s].pin++;
        eth_tx += l - 4;
@@ -785,7 +806,7 @@ void send_ipin(sessionidt s, uint8_t *buf, int len)
        // Increment packet counters
        session[s].cin += len - 4;
        session[s].total_cin += len - 4;
-       sess_count[s].cin += len - 4;
+       sess_local[s].cin += len - 4;
 
        session[s].pin++;
        eth_tx += len - 4;
@@ -801,7 +822,7 @@ void processccp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l)
        uint8_t b[MAXCONTROL];
        uint8_t *q;
 
-       CSTAT(processccp);
+       CSTAT(call_processccp);
 
        LOG_HEX(5, "CCP", p, l);
        switch (l > 1 ? *p : 0)
@@ -853,24 +874,25 @@ void sendchap(tunnelidt t, sessionidt s)
        uint16_t r = session[s].radius;
        uint8_t *q;
 
-       CSTAT(sendchap);
+       CSTAT(call_sendchap);
 
        if (!r)
        {
                LOG(1, s, t, "No RADIUS to send challenge\n");
                STAT(tunnel_tx_errors);
-               return;
+               return ;
        }
-
        LOG(1, s, t, "Send CHAP challenge\n");
-
-       // new challenge
-       random_data(radius[r].auth, sizeof(radius[r].auth));
+       {
+               // new challenge
+               int n;
+               for (n = 0; n < 15; n++)
+                       radius[r].auth[n] = rand();
+       }
        radius[r].chap = 1;             // CHAP not PAP
        radius[r].id++;
        if (radius[r].state != RADIUSCHAP)
                radius[r].try = 0;
-
        radius[r].state = RADIUSCHAP;
        radius[r].retry = backoff(radius[r].try++);
        if (radius[r].try > 5)