From bcc2c7408be2d278ceef675b5d989ce6ed395315 Mon Sep 17 00:00:00 2001 From: fendo Date: Fri, 7 Dec 2012 23:42:44 +0100 Subject: [PATCH] Fix LAC functionnality --- l2tplac.c | 47 ++++++++++++++++++++++++----------------------- l2tpns.h | 1 + ppp.c | 2 +- radius.c | 6 ++++++ 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/l2tplac.c b/l2tplac.c index 7fa8e87..4c71d6c 100644 --- 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")), diff --git a/l2tpns.h b/l2tpns.h index 33b4cfc..8143736 100644 --- 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 --- 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 diff --git a/radius.c b/radius.c index 5c2ab46..843931f 100644 --- 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; } } -- 2.20.1