Fix LAC functionnality
authorfendo <fendo@bi12info.com>
Fri, 7 Dec 2012 22:42:44 +0000 (23:42 +0100)
committerfendo <fendo@bi12info.com>
Fri, 7 Dec 2012 22:42:44 +0000 (23:42 +0100)
l2tplac.c
l2tpns.h
ppp.c
radius.c

index 7fa8e87..4c71d6c 100644 (file)
--- a/l2tplac.c
+++ b/l2tplac.c
@@ -196,7 +196,8 @@ int lac_rad_select_assignment_id(sessionidt s, char *assignment_id)
        if (nbtagfound > 0)
        {
                // random between 0 and nbtagfound-1
-               idtag = (nbtagfound*rand()/(RAND_MAX+1.0));
+               idtag = (rand() % nbtagfound);
+
                if (idtag >= nbtagfound)
                        idtag = 0; //Sanity checks.
 
@@ -227,6 +228,7 @@ void lac_save_rad_tag_tunnels(sessionidt s)
                else if (strlen(ptunnelrlns[idtag].tunnel_assignment_id) <= 0)
                        LOG(1, s, session[s].tunnel, "Error, No tunnel_assignment_id \n");
                else
+               {
                        for (idrlns = 1; idrlns < MAXRLNSTUNNEL; ++idrlns)
                        {
                                if (pconfigrlns[idrlns].state == CONFRLNSFREE)
@@ -247,7 +249,6 @@ void lac_save_rad_tag_tunnels(sessionidt s)
                                        if ( (pconfigrlns[idrlns].ip == ptunnelrlns[idtag].tunnel_server_endpoint) &&
                                                 (strcmp(pconfigrlns[idrlns].tunnel_assignment_id, ptunnelrlns[idtag].tunnel_assignment_id) == 0) )
                                        {
-                                               LOG(3, s, session[s].tunnel, "Tunnel IP %s already defined\n", fmtaddr(htonl(pconfigrlns[idrlns].ip), 0));
                                                // l2tp_secret may be changed
                                                strcpy(pconfigrlns[idrlns].l2tp_secret, ptunnelrlns[idtag].tunnel_password);
                                                pconfigrlns[idrlns].port = L2TPPORT; //Default L2TP poart
@@ -259,10 +260,11 @@ void lac_save_rad_tag_tunnels(sessionidt s)
                                }
                        }
 
-               if (idrlns >= MAXRLNSTUNNEL)
-               {
-                       LOG(0, s, session[s].tunnel, "No more Remote LNS Conf Free\n");
-                       return;
+                       if (idrlns >= MAXRLNSTUNNEL)
+                       {
+                               LOG(0, s, session[s].tunnel, "No more Remote LNS Conf Free\n");
+                               return;
+                       }
                }
        }
 }
@@ -569,8 +571,9 @@ int lac_cli_show_remotelns(confrlnsidt idrlns, char *strout)
 
        if (idrlns == 0)
                // Show Summary
-               sprintf(strout, "%15s %-32s %-32s %11s %7s %10s",
+               sprintf(strout, "%15s %3s  %-32s %-32s %11s %7s %10s",
                                "IP Remote LNS",
+                               "TID",
                                "l2tp secret",
                                "assignment Id",
                                "File/Radius",
@@ -578,7 +581,7 @@ int lac_cli_show_remotelns(confrlnsidt idrlns, char *strout)
                                "Count Sess");
        else
        {
-               tunnelidt t;
+               tunnelidt t, tfound = 0;
                sessionidt s;
                int countsess = 0;
                char state[20];
@@ -586,29 +589,27 @@ int lac_cli_show_remotelns(confrlnsidt idrlns, char *strout)
                strcpy(state, "Close");
                for (t = 0; t <= config->cluster_highest_tunnelid ; ++t)
                {
-                       if ((tunnel[t].isremotelns) &&
+                       if ((tunnel[t].isremotelns == idrlns) &&
                                (tunnel[t].ip == pconfigrlns[idrlns].ip) &&
                                (tunnel[t].port == pconfigrlns[idrlns].port) &&
                                (tunnel[t].state != TUNNELDIE))
                        {
-                               if (tunnel[t].isremotelns)
-                               {
-                                       if (tunnel[t].state == TUNNELOPENING)
-                                               strcpy(state, "Opening");
-                                       else if (tunnel[t].state == TUNNELOPEN)
-                                               strcpy(state, "Open");
-
-                                       for (s = 1; s <= config->cluster_highest_sessionid ; ++s)
-                                               if (session[s].tunnel == t)
-                                                       countsess++;
-
-                                       break;
-                               }
+                               if (tunnel[t].state == TUNNELOPENING)
+                                       strcpy(state, "Opening");
+                               else if (tunnel[t].state == TUNNELOPEN)
+                                       strcpy(state, "Open");
+
+                               for (s = 1; s <= config->cluster_highest_sessionid ; ++s)
+                                       if (session[s].tunnel == t)
+                                               countsess++;
+                               tfound = t;
+                               break;
                        }
                }
 
-               sprintf(strout, "%15s %-32s %-32s %11s %7s %10u",
+               sprintf(strout, "%15s %3u  %-32s %-32s %11s %7s %10u",
                                fmtaddr(htonl(pconfigrlns[idrlns].ip), 0),
+                               tfound,
                                pconfigrlns[idrlns].l2tp_secret,
                                pconfigrlns[idrlns].tunnel_assignment_id,
                                (pconfigrlns[idrlns].state == CONFRLNSSET?"File":(pconfigrlns[idrlns].state == CONFRLNSSETBYRADIUS?"Radius":"Free")),
index 33b4cfc..8143736 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -874,6 +874,7 @@ void sendarp(int ifr_idx, const unsigned char* mac, in_addr_t ip);
 void processpap(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void processchap(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void lcp_open(sessionidt s, tunnelidt t);
+void lcp_restart(sessionidt s);
 void processlcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void processipcp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
 void processipv6cp(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l);
diff --git a/ppp.c b/ppp.c
index fb74ba9..584ce61 100644 (file)
--- a/ppp.c
+++ b/ppp.c
@@ -425,7 +425,7 @@ void lcp_open(sessionidt s, tunnelidt t)
        }
 }
 
-static void lcp_restart(sessionidt s)
+void lcp_restart(sessionidt s)
 {
        session[s].ppp.phase = Establish;
        // This-Layer-Down
index 5c2ab46..843931f 100644 (file)
--- a/radius.c
+++ b/radius.c
@@ -947,6 +947,8 @@ void processrad(uint8_t *buf, int len, char socket_index)
                                if (!lac_rad_select_assignment_id(s, assignment_id))
                                        break; // Error no assignment_id
 
+                               LOG(3, s, session[s].tunnel, "Select Tunnel Remote LNS for assignment_id == %s\n", assignment_id);
+
                                if (lac_rad_forwardtoremotelns(s, assignment_id, session[s].user))
                                {
                                        int ro;
@@ -956,6 +958,10 @@ void processrad(uint8_t *buf, int len, char socket_index)
                                        {
                                                session[s].route[ro].ip = 0;
                                        }
+
+                                       // Restart LCP auth...
+                                       lcp_restart(s);
+                                       sendlcp(s, t);
                                        break;
                                }
                        }