add attribut >no_throttle_local_IP
authorfendo <fendo@bi12info.com>
Tue, 12 Nov 2013 20:33:42 +0000 (21:33 +0100)
committerfendo <fendo@bi12info.com>
Tue, 12 Nov 2013 20:33:42 +0000 (21:33 +0100)
l2tpns.c
l2tpns.h
ppp.c

index 4028379..6c1e620 100644 (file)
--- a/l2tpns.c
+++ b/l2tpns.c
@@ -188,6 +188,7 @@ config_descriptt config_values[] = {
        CONFIG("bind_multi_address", bind_multi_address, STRING),
        CONFIG("pppoe_only_equal_svc_name", pppoe_only_equal_svc_name, BOOL),
        CONFIG("multi_hostname", multi_hostname, STRING),
        CONFIG("bind_multi_address", bind_multi_address, STRING),
        CONFIG("pppoe_only_equal_svc_name", pppoe_only_equal_svc_name, BOOL),
        CONFIG("multi_hostname", multi_hostname, STRING),
+       CONFIG("no_throttle_local_IP", no_throttle_local_IP, BOOL),
        { NULL, 0, 0, 0 }
 };
 
        { NULL, 0, 0, 0 }
 };
 
@@ -1417,7 +1418,7 @@ void processipout(uint8_t *buf, int len)
        sessionidt s;
        sessiont *sp;
        tunnelidt t;
        sessionidt s;
        sessiont *sp;
        tunnelidt t;
-       in_addr_t ip;
+       in_addr_t ip, ip_src;
 
        uint8_t *data = buf;    // Keep a copy of the originals.
        int size = len;
 
        uint8_t *data = buf;    // Keep a copy of the originals.
        int size = len;
@@ -1450,6 +1451,7 @@ void processipout(uint8_t *buf, int len)
                return;
        }
 
                return;
        }
 
+       ip_src = *(uint32_t *)(buf + 12);
        ip = *(uint32_t *)(buf + 16);
        if (!(s = sessionbyip(ip)))
        {
        ip = *(uint32_t *)(buf + 16);
        if (!(s = sessionbyip(ip)))
        {
@@ -1534,12 +1536,15 @@ void processipout(uint8_t *buf, int len)
 
        if (sp->tbf_out)
        {
 
        if (sp->tbf_out)
        {
-               // Are we throttling this session?
-               if (config->cluster_iam_master)
-                       tbf_queue_packet(sp->tbf_out, data, size);
-               else
-                       master_throttle_packet(sp->tbf_out, data, size);
-               return;
+               if (!config->no_throttle_local_IP || !sessionbyip(ip_src))
+               {
+                       // Are we throttling this session?
+                       if (config->cluster_iam_master)
+                               tbf_queue_packet(sp->tbf_out, data, size);
+                       else
+                               master_throttle_packet(sp->tbf_out, data, size);
+                       return;
+               }
        }
 
        if (sp->walled_garden && !config->cluster_iam_master)
        }
 
        if (sp->walled_garden && !config->cluster_iam_master)
index 4f2f784..73b5455 100644 (file)
--- a/l2tpns.h
+++ b/l2tpns.h
@@ -783,6 +783,7 @@ typedef struct
        int nbmultiaddress; // number multi address to bind
        int indexlacudpfd;      // Index UDP LAC file handle (in udpfd[])
        int nbmultihostname;    // number hostname, normally the same number as the nbudpfd
        int nbmultiaddress; // number multi address to bind
        int indexlacudpfd;      // Index UDP LAC file handle (in udpfd[])
        int nbmultihostname;    // number hostname, normally the same number as the nbudpfd
+       int no_throttle_local_IP;       // no throttle traffic from session to session
        in_addr_t bind_n_address[MAX_BINDADDR];
        in_addr_t iftun_n_address[MAX_BINDADDR];
        char bind_multi_address[256];
        in_addr_t bind_n_address[MAX_BINDADDR];
        in_addr_t iftun_n_address[MAX_BINDADDR];
        char bind_multi_address[256];
diff --git a/ppp.c b/ppp.c
index a4c9261..e786c16 100644 (file)
--- a/ppp.c
+++ b/ppp.c
@@ -1735,7 +1735,7 @@ static void update_sessions_in_stat(sessionidt s, uint16_t l)
 // (i.e. this routine writes to p[-4]).
 void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
 {
 // (i.e. this routine writes to p[-4]).
 void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
 {
-       in_addr_t ip;
+       in_addr_t ip, ip_dst;
 
        CSTAT(processipin);
 
 
        CSTAT(processipin);
 
@@ -1749,6 +1749,7 @@ void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
        }
 
        ip = ntohl(*(uint32_t *)(p + 12));
        }
 
        ip = ntohl(*(uint32_t *)(p + 12));
+       ip_dst = *(uint32_t *)(p + 16);
 
        if (l > MAXETHER)
        {
 
        if (l > MAXETHER)
        {
@@ -1789,12 +1790,15 @@ void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l)
 
        if (session[s].tbf_in)
        {
 
        if (session[s].tbf_in)
        {
-               // Are we throttling this session?
-               if (config->cluster_iam_master)
-                       tbf_queue_packet(session[s].tbf_in, p, l);
-               else
-                       master_throttle_packet(session[s].tbf_in, p, l);
-               return;
+               if (!config->no_throttle_local_IP || !sessionbyip(ip_dst))
+               {
+                       // Are we throttling this session?
+                       if (config->cluster_iam_master)
+                               tbf_queue_packet(session[s].tbf_in, p, l);
+                       else
+                               master_throttle_packet(session[s].tbf_in, p, l);
+                       return;
+               }
        }
 
        // send to ethernet
        }
 
        // send to ethernet