From 6b70732490a095f1937c7ad8882d5dd164de4e7e Mon Sep 17 00:00:00 2001 From: fendo Date: Tue, 12 Nov 2013 21:33:42 +0100 Subject: [PATCH] add attribut >no_throttle_local_IP --- l2tpns.c | 19 ++++++++++++------- l2tpns.h | 1 + ppp.c | 18 +++++++++++------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index 4028379..6c1e620 100644 --- 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("no_throttle_local_IP", no_throttle_local_IP, BOOL), { NULL, 0, 0, 0 } }; @@ -1417,7 +1418,7 @@ void processipout(uint8_t *buf, int len) 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; @@ -1450,6 +1451,7 @@ void processipout(uint8_t *buf, int len) return; } + ip_src = *(uint32_t *)(buf + 12); ip = *(uint32_t *)(buf + 16); if (!(s = sessionbyip(ip))) { @@ -1534,12 +1536,15 @@ void processipout(uint8_t *buf, int len) 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) diff --git a/l2tpns.h b/l2tpns.h index 4f2f784..73b5455 100644 --- 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 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]; diff --git a/ppp.c b/ppp.c index a4c9261..e786c16 100644 --- 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) { - in_addr_t ip; + in_addr_t ip, ip_dst; 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_dst = *(uint32_t *)(p + 16); if (l > MAXETHER) { @@ -1789,12 +1790,15 @@ void processipin(sessionidt s, tunnelidt t, uint8_t *p, uint16_t l) 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 -- 2.20.1