From aa4877277af227cb659473b94e7c092807a229a0 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Thu, 28 Oct 2004 03:58:38 +0000 Subject: [PATCH 01/16] unused --- l2tpns.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index 5d2990d..3366139 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.32 2004-10-28 03:31:39 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.33 2004-10-28 03:58:38 bodea Exp $"; #include #include @@ -2464,7 +2464,6 @@ void mainloop(void) void initdata(int optdebug, char *optconfig) { int i; - char *p; if (!(_statistics = shared_malloc(sizeof(struct Tstats)))) { -- 2.20.1 From fbf3e23d37800b7936656d6ff2e0b8387c1863ac Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Thu, 28 Oct 2004 03:58:51 +0000 Subject: [PATCH 02/16] fix initdata proto --- l2tpns.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l2tpns.h b/l2tpns.h index 655aaa6..8727bf4 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.22 2004-10-28 03:31:39 bodea Exp $ +// $Id: l2tpns.h,v 1.23 2004-10-28 03:58:51 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -503,7 +503,7 @@ clockt backoff(u8 try); void routeset(sessionidt, ipt ip, ipt mask, ipt gw, u8 add); void inittun(void); void initudp(void); -void initdata(int optdebug, const char *optconfig); +void initdata(int optdebug, char *optconfig); void initippool(); sessionidt sessionbyip(ipt ip); sessionidt sessionbyuser(char *username); -- 2.20.1 From d4330a0b42b3bdab11a8db06124532388615a47b Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:00:36 +0000 Subject: [PATCH 03/16] !OIE --- .cvsnotify | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .cvsnotify diff --git a/.cvsnotify b/.cvsnotify deleted file mode 100644 index 589d7f1..0000000 --- a/.cvsnotify +++ /dev/null @@ -1 +0,0 @@ -david.parrish@optusnet.com.au -- 2.20.1 From 7ecd8a42e57b170ce1f16f33465553656ef11f21 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:01:11 +0000 Subject: [PATCH 04/16] make number of throttle buckets configurable --- l2tpns.c | 16 ++++++++++------ l2tpns.h | 32 ++++++++++++++++++++++---------- tbf.c | 42 +++++------------------------------------- tbf.h | 2 +- 4 files changed, 38 insertions(+), 54 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index 3366139..1bcdf1d 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.33 2004-10-28 03:58:38 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.34 2004-10-29 04:01:11 bodea Exp $"; #include #include @@ -101,13 +101,14 @@ struct config_descriptt config_values[] = { CONFIG("save_state", save_state, BOOL), CONFIG("primary_radius", radiusserver[0], IP), CONFIG("secondary_radius", radiusserver[1], IP), - CONFIG("primary_radius_port",radiusport[0], SHORT), - CONFIG("secondary_radius_port",radiusport[1], SHORT), + CONFIG("primary_radius_port", radiusport[0], SHORT), + CONFIG("secondary_radius_port", radiusport[1], SHORT), CONFIG("radius_accounting", radius_accounting, BOOL), CONFIG("radius_secret", radiussecret, STRING), CONFIG("bind_address", bind_address, IP), CONFIG("send_garp", send_garp, BOOL), CONFIG("throttle_speed", rl_rate, UNSIGNED_LONG), + CONFIG("throttle_buckets", num_tbfs, INT), CONFIG("accounting_dir", accounting_dir, STRING), CONFIG("setuid", target_uid, INT), CONFIG("dump_speed", dump_speed, BOOL), @@ -2477,8 +2478,11 @@ void initdata(int optdebug, char *optconfig) } memset(config, 0, sizeof(struct configt)); time(&config->start_time); - config->debug = optdebug; strncpy(config->config_file, optconfig, strlen(optconfig)); + config->debug = optdebug; + config->num_tbfs = MAXTBFS; + config->rl_rate = 28; // 28kbps + if (!(tunnel = shared_malloc(sizeof(tunnelt) * MAXTUNNEL))) { log(0, 0, 0, 0, "Error doing malloc for tunnels: %s\n", strerror(errno)); @@ -2960,9 +2964,9 @@ int main(int argc, char *argv[]) initplugins(); initdata(optdebug, optconfig); - init_tbf(); - init_cli(hostname); read_config_file(); + init_tbf(config->num_tbfs); + init_cli(hostname); log(0, 0, 0, 0, "L2TPNS version " VERSION "\n"); log(0, 0, 0, 0, "Copyright (c) 2003, 2004 Optus Internet Engineering\n"); diff --git a/l2tpns.h b/l2tpns.h index 8727bf4..d362e21 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.23 2004-10-28 03:58:51 bodea Exp $ +// $Id: l2tpns.h,v 1.24 2004-10-29 04:01:11 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -43,23 +43,34 @@ #define BUSY_WAIT_TIMEOUT 3000 // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown // Constants -#include "config.h" -#ifndef PLUGINDIR -#define PLUGINDIR LIBDIR // Plugins +#ifndef ETCDIR +#define ETCDIR "/etc/l2tpns" #endif -#ifndef PLUGINCONF -#define PLUGINCONF ETCDIR // Plugin config dir +#ifndef LIBDIR +#define LIBDIR "/usr/lib/l2tpns" #endif -#ifndef DATADIR -#define DATADIR "/tmp" +#ifndef STATEDIR +#define STATEDIR "/var/lib/l2tpns" +#endif + +#ifndef PLUGINDIR +#define PLUGINDIR LIBDIR // Plugins +#endif + +#ifndef PLUGINCONF +#define PLUGINCONF ETCDIR // Plugin config dir #endif #ifndef FLASHDIR #define FLASHDIR ETCDIR #endif +#ifndef DATADIR +#define DATADIR STATEDIR +#endif + #define TUNDEVICE "/dev/net/tun" #define STATEFILE DATADIR "/state.dump" // State dump file #define CONFIGFILE FLASHDIR "/startup-config" // Configuration file @@ -408,7 +419,9 @@ struct configt ipt default_dns1, default_dns2; - unsigned long rl_rate; + unsigned long rl_rate; // throttle rate + int num_tbfs; // number of throttle buckets + int save_state; char accounting_dir[128]; ipt bind_address; @@ -448,7 +461,6 @@ struct configt char bgp_peer[2][64]; u16 bgp_peer_as[2]; #endif - char hostname[256]; // our hostname - set to gethostname() by default }; struct config_descriptt diff --git a/tbf.c b/tbf.c index 459c049..b95b7d7 100644 --- a/tbf.c +++ b/tbf.c @@ -1,13 +1,8 @@ // L2TPNS: token bucket filters -char const *cvs_id_tbf = "$Id: tbf.c,v 1.7 2004-10-28 03:26:41 bodea Exp $"; - -#define _GNU_SOURCE +char const *cvs_id_tbf = "$Id: tbf.c,v 1.8 2004-10-29 04:01:11 bodea Exp $"; #include -#include -#include - #include "l2tpns.h" #include "util.h" #include "tbf.h" @@ -19,12 +14,12 @@ static int timer_chain = -1; // Head of timer chain. static void tbf_run_queue(int tbf_id); -void init_tbf(void) +void init_tbf(int num_tbfs) { - if (!(filter_list = shared_malloc(sizeof(*filter_list) * MAXTBFS))) + if (!(filter_list = shared_malloc(sizeof(*filter_list) * num_tbfs))) return; - filter_list_size = MAXTBFS; + filter_list_size = num_tbfs; filter_list[0].sid = -1; // Reserved. } // @@ -101,13 +96,11 @@ int new_tbf(int sid, int max_credit, int rate, void (*f)(sessionidt, u8 *, int)) int i; static int p = 0; - log(3,0,0,0, "Allocating new TBF (sess %d, rate %d, helper %p)\n", sid, rate, f); + log(4,0,0,0, "Allocating new TBF (sess %d, rate %d, helper %p)\n", sid, rate, f); if (!filter_list) return 0; // Couldn't alloc memory! -// again: - for (i = 0 ; i < filter_list_size ; ++i, p = (p+1)%filter_list_size ) { if (filter_list[p].sid) continue; @@ -123,33 +116,8 @@ int new_tbf(int sid, int max_credit, int rate, void (*f)(sessionidt, u8 *, int)) return p; } -#if 0 - // All allocated filters are used! Increase the size of the allocated - // filters. - - { - int new_size = filter_list_size * 2; - tbft *new = mremap(filter_list, filter_list_size * sizeof(*new), new_size * sizeof(*new), MREMAP_MAYMOVE); - - if (new == MAP_FAILED) - { - log(0,0,0,0, "Ran out of token bucket filters and mremap failed! Sess %d will be un-throttled\n", sid); - return 0; - } - - i = filter_list_size; - filter_list_size = new_size; - filter_list = new; - } - - for (; i < filter_list_size; ++i) - filter_list[i].sid = 0; - - goto again; -#else log(0,0,0,0, "Ran out of token bucket filters! Sess %d will be un-throttled\n", sid); return 0; -#endif } // diff --git a/tbf.h b/tbf.h index 7a6df12..bad2c37 100644 --- a/tbf.h +++ b/tbf.h @@ -33,7 +33,7 @@ typedef struct { char packets[TBF_MAX_QUEUE][TBF_MAX_SIZE]; } tbft; -void init_tbf(void); +void init_tbf(int num_tbfs); int tbf_run_timer(void); int tbf_queue_packet(int tbf_id, char * data, int size); int new_tbf(int sid, int max_credit, int rate, void (*f)(sessionidt, u8 *, int)); -- 2.20.1 From db0ded520aee06ef21acbc519ea078e2463a4a96 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:01:53 +0000 Subject: [PATCH 05/16] typo --- ppp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ppp.c b/ppp.c index 0345856..c2c3379 100644 --- a/ppp.c +++ b/ppp.c @@ -1,6 +1,6 @@ // L2TPNS PPP Stuff -char const *cvs_id_ppp = "$Id: ppp.c,v 1.16 2004-09-23 04:01:36 fred_nerk Exp $"; +char const *cvs_id_ppp = "$Id: ppp.c,v 1.17 2004-10-29 04:01:53 bodea Exp $"; #include #include @@ -731,7 +731,7 @@ void processccp(tunnelidt t, sessionidt s, u8 * p, u16 l) log_hex(5, "CCP", p, l); if (l < 2 || (*p != ConfigReq && *p != TerminateReq)) { - log(1, 0, s, t, "Unexpecetd CCP request code %d\n", *p); + log(1, 0, s, t, "Unexpected CCP request code %d\n", *p); STAT(tunnel_rx_errors); return ; } -- 2.20.1 From a475f25c8ae25b7905f6e0abfef722530fcfce02 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:02:24 +0000 Subject: [PATCH 06/16] clean up paths --- Makefile | 166 ++++++++++++++++++++++++++++++------------------------- config.h | 4 -- 2 files changed, 91 insertions(+), 79 deletions(-) delete mode 100644 config.h diff --git a/Makefile b/Makefile index 8f64ef2..cfd6e16 100644 --- a/Makefile +++ b/Makefile @@ -1,112 +1,128 @@ DESTDIR = -bindir = $(DESTDIR)/usr/sbin -etcdir = $(DESTDIR)/etc/l2tpns -libdir = $(DESTDIR)/usr/lib/l2tpns +bindir = /usr/sbin +etcdir = /etc/l2tpns +libdir = /usr/lib/l2tpns +statedir = /var/lib/l2tpns + +DEFINES = +DEFINES += -DSTATISTICS +DEFINES += -DSTAT_CALLS +DEFINES += -DRINGBUFFER +DEFINES += -DBGP +DEFINES += -DLIBDIR='"$(libdir)"' +DEFINES += -DETCDIR='"$(etcdir)"' +DEFINES += -DSTATEDIR='"$(statedir)"' + +OPTIM = -g +OPTIM += -O3 +OPTIM += -funroll-loops +OPTIM += -fomit-frame-pointer +OPTIM += -finline-functions +#OPTIM += -fstrength-reduce CC = gcc -DEFINES = -DBGP -DRINGBUFFER -DSTAT_CALLS -DSTATISTICS -OPTIM = -g -O3 -funroll-loops -fomit-frame-pointer -finline-functions -CFLAGS = -Wall $(OPTIM) $(DEFINES) +LD = gcc +INCLUDES = -I. +CPPFLAGS = $(INCLUDES) $(DEFINES) +CFLAGS = -Wall $(OPTIM) LDFLAGS = -rdynamic -LIBS = -lm -INSTALL = /usr/bin/install -c +LDLIBS = -lm +INSTALL = install -c -D -o root -g root -OBJS= md5.o \ - icmp.o \ +OBJS = arp.o \ + bgp.o \ cli.o \ - l2tpns.o \ - ppp.o \ - radius.o \ - ll.o \ cluster.o \ - arp.o \ constants.o \ - ll.o \ control.o \ - util.o \ + icmp.o \ + l2tpns.o \ + ll.o \ + md5.o \ + ppp.o \ + radius.o \ tbf.o \ - bgp.o \ + util.o -PLUGINS=garden.so autothrottle.so autosnoop.so stripdomain.so -TARGETS=l2tpns nsctl generateload bounce $(PLUGINS) +PLUGINS = garden.so autothrottle.so autosnoop.so stripdomain.so +TARGETS = l2tpns nsctl generateload bounce $(PLUGINS) -all: $(TARGETS) +all: $(TARGETS) clean: - /bin/rm -f *.o *.so $(TARGETS) + rm -f *.o $(TARGETS) Makefile.tmp Makefile.bak depend: (sed -n 'p; /^## Dependencies: (autogenerated) ##/q' Makefile && \ - gcc -MM $(DEFINES) $(OBJS:.o=.c) && \ - gcc -MM $(DEFINES) $(PLUGINS:.so=.c) | sed 's/\.o/.so/') >Makefile.tmp + gcc -MM $(CPPFLAGS) $(OBJS:.o=.c) && \ + gcc -MM $(CPPFLAGS) $(PLUGINS:.so=.c) | sed 's/\.o/.so/') >Makefile.tmp mv Makefile Makefile.bak mv Makefile.tmp Makefile -# install config files only if a startup-config does not exist yet JK 20040713 -# this does not interfere when building rpms or debs and makes -# fast upgrading via make install possible - -install: all - $(INSTALL) -D -o root -g root -m 0755 l2tpns $(bindir)/l2tpns - $(INSTALL) -D -o root -g root -m 0755 nsctl $(bindir)/nsctl - @if [ -f $(etcdir)/startup-config ]; then \ - echo '***' Installing default config files in $(etcdir) as .defaults; \ - $(INSTALL) -D -o root -g root -m 0600 etc/startup-config.default $(etcdir)/startup-config.default; \ - $(INSTALL) -D -o root -g root -m 0644 etc/ip_pool.default $(etcdir)/ip_pool.default; \ - $(INSTALL) -D -o root -g root -m 0600 etc/users.default $(etcdir)/users.default; \ - else \ - echo '***' Installing default config files in $(etcdir) - remember to adjust them; \ - $(INSTALL) -D -o root -g root -m 0600 etc/startup-config.default $(etcdir)/startup-config; \ - $(INSTALL) -D -o root -g root -m 0644 etc/ip_pool.default $(etcdir)/ip_pool; \ - $(INSTALL) -D -o root -g root -m 0600 etc/users.default $(etcdir)/users; \ - fi - - for plugin in $(PLUGINS); do \ - $(INSTALL) -D -o root -g root -m 0755 $$plugin $(libdir)/$$plugin; \ - done - if [ ! -e /dev/net/tun ]; then \ - mkdir /dev/net; \ - mknod /dev/net/tun c 10 200; \ - fi - l2tpns: $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) -lcli -ldl + $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS) -lcli -ldl nsctl: nsctl.o control.o - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + $(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS) generateload: test/generateload.o - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + $(LD) $(LDFLAGS) -o $@ $^ # -lpthread bounce: test/bounce.o - $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) + $(LD) $(LDFLAGS) -o $@ $^ %.o: %.c - $(CC) -c $(CFLAGS) -o $@ $< + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< %.so: %.c - $(CC) -fPIC -shared $(CFLAGS) -o $@ $< $(LDFLAGS) $(LIBS) + $(CC) -fPIC -shared $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +# install config files only if a startup-config does not exist yet +# this does not interfere when building rpms or debs and makes +# fast upgrading via make install possible + +install: all + $(INSTALL) -m 0755 l2tpns $(DESTDIR)$(bindir)/l2tpns + $(INSTALL) -m 0755 nsctl $(DESTDIR)$(bindir)/nsctl + @if [ -f $(DESTDIR)$(etcdir)/startup-config ]; then \ + echo '***' Installing default config files in $(DESTDIR)$(etcdir) as .defaults; \ + suffix=.default; \ + else \ + echo '***' Installing default config files in $(DESTDIR)$(etcdir) - remember to adjust them; \ + suffix=; \ + fi; \ + $(INSTALL) -m 0600 etc/startup-config.default $(DESTDIR)$(etcdir)/startup-config$$suffix; \ + $(INSTALL) -m 0644 etc/ip_pool.default $(DESTDIR)$(etcdir)/ip_pool$$suffix; \ + $(INSTALL) -m 0600 etc/users.default $(DESTDIR)$(etcdir)/users$$suffix + + for plugin in $(PLUGINS); do \ + $(INSTALL) -m 0755 $$plugin $(DESTDIR)$(libdir)/$$plugin; \ + done + + if [ -z $(DESTDIR) ] && [ ! -e /dev/net/tun ]; then \ + mkdir /dev/net; \ + mknod /dev/net/tun c 10 200; \ + fi .PHONY: all clean depend ## Dependencies: (autogenerated) ## -md5.o: md5.c md5.h -icmp.o: icmp.c l2tpns.h config.h -cli.o: cli.c l2tpns.h config.h util.h cluster.h tbf.h ll.h bgp.h -l2tpns.o: l2tpns.c md5.h l2tpns.h config.h cluster.h plugin.h ll.h \ - constants.h control.h util.h tbf.h bgp.h -ppp.o: ppp.c l2tpns.h config.h constants.h plugin.h util.h tbf.h \ - cluster.h -radius.o: radius.c md5.h constants.h l2tpns.h config.h plugin.h util.h -ll.o: ll.c ll.h -cluster.o: cluster.c l2tpns.h config.h cluster.h util.h tbf.h bgp.h -arp.o: arp.c l2tpns.h config.h +arp.o: arp.c l2tpns.h +bgp.o: bgp.c l2tpns.h bgp.h util.h +cli.o: cli.c l2tpns.h util.h cluster.h tbf.h ll.h bgp.h +cluster.o: cluster.c l2tpns.h cluster.h util.h tbf.h bgp.h constants.o: constants.c constants.h -ll.o: ll.c ll.h control.o: control.c control.h -util.o: util.c l2tpns.h config.h -tbf.o: tbf.c l2tpns.h config.h util.h tbf.h -bgp.o: bgp.c l2tpns.h config.h bgp.h util.h -garden.so: garden.c l2tpns.h config.h plugin.h control.h -autothrottle.so: autothrottle.c l2tpns.h config.h plugin.h control.h -autosnoop.so: autosnoop.c l2tpns.h config.h plugin.h control.h +icmp.o: icmp.c l2tpns.h +l2tpns.o: l2tpns.c md5.h l2tpns.h cluster.h plugin.h ll.h constants.h \ + control.h util.h tbf.h bgp.h +ll.o: ll.c ll.h +md5.o: md5.c md5.h +ppp.o: ppp.c l2tpns.h constants.h plugin.h util.h tbf.h cluster.h +radius.o: radius.c md5.h constants.h l2tpns.h plugin.h util.h +tbf.o: tbf.c l2tpns.h util.h tbf.h +util.o: util.c l2tpns.h +garden.so: garden.c l2tpns.h plugin.h control.h +autothrottle.so: autothrottle.c l2tpns.h plugin.h control.h +autosnoop.so: autosnoop.c l2tpns.h plugin.h control.h +stripdomain.so: stripdomain.c l2tpns.h plugin.h diff --git a/config.h b/config.h deleted file mode 100644 index bd17966..0000000 --- a/config.h +++ /dev/null @@ -1,4 +0,0 @@ -#define LIBDIR "/usr/lib/l2tpns" -#define ETCDIR "/etc/l2tpns" -#define BINDIR "/usr/sbin" -#define DATADIR "/tmp" -- 2.20.1 From 79d49cacd9b82a73a8047d723d93b007185de4fe Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:25:40 +0000 Subject: [PATCH 07/16] sync changes --- cluster.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cluster.c b/cluster.c index df7d9ab..88ea7e3 100644 --- a/cluster.c +++ b/cluster.c @@ -1,6 +1,6 @@ // L2TPNS Clustering Stuff -char const *cvs_id_cluster = "$Id: cluster.c,v 1.12 2004-09-21 04:30:46 fred_nerk Exp $"; +char const *cvs_id_cluster = "$Id: cluster.c,v 1.13 2004-10-29 04:25:40 bodea Exp $"; #include #include @@ -115,12 +115,12 @@ int cluster_init() memcpy(&interface_addr, &ifr.ifr_addr, sizeof(interface_addr)); my_address = interface_addr.sin_addr.s_addr; - // Join multicast group. + // Join multicast group. mreq.imr_multiaddr.s_addr = config->cluster_address; mreq.imr_interface = interface_addr.sin_addr; - opt = 0; // Turn off multicast loopback. + opt = 0; // Turn off multicast loopback. setsockopt(cluster_sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt)); if (setsockopt(cluster_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) @@ -221,7 +221,7 @@ int peer_send_data(u32 peer, char * data, int size) if (!config->cluster_address) return 0; if (!peer) // Odd?? - return -1; + return -1; addr.sin_addr.s_addr = peer; addr.sin_port = htons(CLUSTERPORT); @@ -284,10 +284,10 @@ int master_forward_packet(char *data, int size, u32 addr, int port) // token bucket queue, and lets normal processing take care // of it. // -int master_throttle_packet(int tbfid, char * data, int size) +int master_throttle_packet(int tbfid, char *data, int size) { char buf[65536]; // Vast overkill. - char * p = buf; + char *p = buf; if (!config->cluster_master_address) // No election has been held yet. Just skip it. return -1; @@ -371,12 +371,12 @@ void cluster_send_ping(time_t basetime) // // Walk the session counters looking for non-zero ones to send -// to the master. We send up to 100 of them at one time. -// We examine a maximum of 2000 sessions. +// to the master. We send up to 600 of them at one time. +// We examine a maximum of 3000 sessions. // (50k max session should mean that we normally // examine the entire session table every 25 seconds). -#define MAX_B_RECS (400) +#define MAX_B_RECS (600) void master_update_counts(void) { int i, c; @@ -818,7 +818,7 @@ void cluster_heartbeat() exit(1); } - log(3,0,0,0, "Sending heartbeat #%d with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun size %d)\n", + log(3,0,0,0, "Sending heartbeat #%d with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun, size %d)\n", h.seq, config->cluster_num_changes, count, tcount, config->cluster_highest_sessionid, config->cluster_highest_tunnelid, (p-buff)); -- 2.20.1 From 1fee25f8c47762f460c901cf46c8fd9600dd68ee Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 04:34:39 +0000 Subject: [PATCH 08/16] update --- Changes | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 94794d5..563e646 100644 --- a/Changes +++ b/Changes @@ -1,12 +1,17 @@ * ? David Parrish ? - Added support for hidden AVPs by Robert Clark - l2tpns-chap-response.patch from Robert Clark -- merge l2tpns-config-hostname.patch from Robert Clark +- Merge l2tpns-config-hostname.patch from Robert Clark - l2tpns-dont-timeshift-unidirectional-traffic.patch from Robert Clark - Dump accounting data if cin OR cout is non-zero - Don't write accounting files if no accounting dir is set - Yuri - Fix checking for mmap success - Renegotiate MRU - Yuri - Take LCP ConfigReq length from the packet length field - Yuri +- Hostname set via command line not config +- Make number of throttle buckets configurable +- Shared_malloc returns NULL on failure +- Sync changes +- Unfsck 4->8 indenting change * Thu Sep 02 2004 David Parrish 2.0.2 - Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP -- 2.20.1 From 00aee129de53b0ff8c6a0e19146d663ccf72fa41 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Fri, 29 Oct 2004 05:34:27 +0000 Subject: [PATCH 09/16] add throttle_buckets --- Docs/manual.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Docs/manual.html b/Docs/manual.html index 1ac5d15..ba62c5d 100644 --- a/Docs/manual.html +++ b/Docs/manual.html @@ -257,6 +257,12 @@ the CLI, but changes will not affect currently connected users.

+

  • throttle_buckets (int)
    +Number of token buckets to allocate for throttling. Each throttled +session requires two buckets (in and out). +

    +

  • +
  • accounting_dir (string)
    If set to a directory, then every 5 minutes the current usage for every connected use will be dumped to a file in this directory. Each -- 2.20.1 From cdf7603bf41608857c450da0b8752ad2256efc7c Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Sat, 30 Oct 2004 06:58:55 +0000 Subject: [PATCH 10/16] need to init_cli before loading config --- l2tpns.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index 1bcdf1d..a08bd5c 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.34 2004-10-29 04:01:11 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.35 2004-10-30 06:58:55 bodea Exp $"; #include #include @@ -2964,9 +2964,9 @@ int main(int argc, char *argv[]) initplugins(); initdata(optdebug, optconfig); + init_cli(hostname); read_config_file(); init_tbf(config->num_tbfs); - init_cli(hostname); log(0, 0, 0, 0, "L2TPNS version " VERSION "\n"); log(0, 0, 0, 0, "Copyright (c) 2003, 2004 Optus Internet Engineering\n"); -- 2.20.1 From 060799b077f073972b2a01642e4cc5fba884c7d4 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Sat, 30 Oct 2004 07:17:41 +0000 Subject: [PATCH 11/16] merge --- l2tpns.c | 6 +++--- l2tpns.h | 15 ++------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index a08bd5c..6bd3af7 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.35 2004-10-30 06:58:55 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.36 2004-10-30 07:17:41 bodea Exp $"; #include #include @@ -2221,8 +2221,8 @@ int still_busy(void) return 1; } - // We stop waiting for radius after BUSY_WAIT_TIMEOUT 1/10th seconds - if (abs(TIME - start_busy_wait) > BUSY_WAIT_TIMEOUT) + // We stop waiting for radius after BUSY_WAIT_TIME 1/10th seconds + if (abs(TIME - start_busy_wait) > BUSY_WAIT_TIME) { log(1, 0, 0, 0, "Giving up waiting for RADIUS to be empty. Shutting down anyway.\n"); return 0; diff --git a/l2tpns.h b/l2tpns.h index d362e21..bc6938f 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.24 2004-10-29 04:01:11 bodea Exp $ +// $Id: l2tpns.h,v 1.25 2004-10-30 07:17:41 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -40,7 +40,7 @@ #define MAX_LOG_LENGTH 512 // Maximum size of log message #define ECHO_TIMEOUT 60 // Time between last packet sent and LCP ECHO generation #define IDLE_TIMEOUT 240 // Time between last packet sent and LCP ECHO generation -#define BUSY_WAIT_TIMEOUT 3000 // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown +#define BUSY_WAIT_TIME 3000 // 5 minutes in 1/10th seconds to wait for radius to cleanup on shutdown // Constants #ifndef ETCDIR @@ -497,17 +497,6 @@ void radiusretry(u16 r); u16 radiusnew(sessionidt s); void radiusclear(u16 r, sessionidt s); -// throttle.c -int throttle_session(sessionidt s, int throttle); - - -// rl.c -void init_rl(); -u16 rl_create_tbf(); -u16 rl_get_tbf(); -void rl_done_tbf(u16 t); -void rl_destroy_tbf(u16 t); - // l2tpns.c clockt now(void); -- 2.20.1 From 8e9fcdba9812d24879db6bd6f5030e7fdb2b1466 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Sat, 30 Oct 2004 07:35:00 +0000 Subject: [PATCH 12/16] slaves get new tbf indexes on becoming master anyway --- cluster.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/cluster.c b/cluster.c index 88ea7e3..8a46b04 100644 --- a/cluster.c +++ b/cluster.c @@ -1,6 +1,6 @@ // L2TPNS Clustering Stuff -char const *cvs_id_cluster = "$Id: cluster.c,v 1.13 2004-10-29 04:25:40 bodea Exp $"; +char const *cvs_id_cluster = "$Id: cluster.c,v 1.14 2004-10-30 07:35:00 bodea Exp $"; #include #include @@ -591,15 +591,8 @@ void cluster_check_master(void) session[i].tbf_in = session[i].tbf_out = 0; // Remove stale pointers from old master. throttle_session(i, session[i].throttle); -// I'm unsure about this. --mo -// It's potentially a good thing, but it could send a -// LOT of packets. -// if (session[i].throttle) -// cluster_send_session(s); // Tell the slaves about the new tbf indexes. - if (session[i].tunnel != T_FREE && i > config->cluster_highest_sessionid) config->cluster_highest_sessionid = i; - } session[last_free].next = 0; // End of chain. -- 2.20.1 From 6f73a1b071bc286a9482d37c580452188e26ac37 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Sat, 30 Oct 2004 07:35:31 +0000 Subject: [PATCH 13/16] merge --- cli.c | 25 +++++++++++++------------ garden.c | 14 +++++++------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/cli.c b/cli.c index 7ea75ed..c223b91 100644 --- a/cli.c +++ b/cli.c @@ -2,7 +2,7 @@ // vim: sw=8 ts=8 char const *cvs_name = "$Name: $"; -char const *cvs_id_cli = "$Id: cli.c,v 1.18 2004-10-28 03:31:11 bodea Exp $"; +char const *cvs_id_cli = "$Id: cli.c,v 1.19 2004-10-30 07:35:31 bodea Exp $"; #include #include @@ -566,6 +566,7 @@ int cmd_show_tunnels(struct cli_def *cli, char *command, char **argv, int argc) "IP", "State", "Sessions"); + for (i = 1; i < MAXTUNNEL; i++) { int sessions = 0; @@ -579,6 +580,7 @@ int cmd_show_tunnels(struct cli_def *cli, char *command, char **argv, int argc) states[tunnel[i].state], sessions); } + return CLI_OK; } @@ -618,7 +620,7 @@ int cmd_show_users(struct cli_def *cli, char *command, char **argv, int argc) } if (sargc > 0) - return cmd_show_session(cli, "users", sargv, sargc); + return cmd_show_session(cli, "users", sargv, sargc); return CLI_OK; } @@ -968,12 +970,9 @@ int cmd_show_plugins(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, "Plugins currently loaded:"); for (i = 0; i < MAXPLUGINS; i++) - { if (*config->plugins[i]) - { cli_print(cli, " %s", config->plugins[i]); - } - } + return CLI_OK; } @@ -996,6 +995,7 @@ int cmd_show_throttle(struct cli_def *cli, char *command, char **argv, int argc) session[i].tbf_in, session[i].tbf_out); } + return CLI_OK; } @@ -1201,7 +1201,7 @@ int cmd_snoop(struct cli_def *cli, char *command, char **argv, int argc) if (argc < 3) { - cli_print(cli, "Specify username ip port"); + cli_print(cli, "Specify username, ip and port"); return CLI_OK; } @@ -1240,7 +1240,7 @@ int cmd_no_snoop(struct cli_def *cli, char *command, char **argv, int argc) if (CLI_HELP_REQUESTED) return cli_arg_help(cli, argc > 1, - "USER", "Username of session to un-snoop", NULL); + "USER", "Username of session to unsnoop", NULL); if (!config->cluster_iam_master) { @@ -1250,7 +1250,7 @@ int cmd_no_snoop(struct cli_def *cli, char *command, char **argv, int argc) if (!argc) { - cli_print(cli, "Specify a user"); + cli_print(cli, "Specify a user to unsnoop"); return CLI_OK; } @@ -1265,6 +1265,7 @@ int cmd_no_snoop(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, "Not snooping user %s", argv[i]); cli_session_actions[s].action |= CLI_SESS_NOSNOOP; } + return CLI_OK; } @@ -1300,7 +1301,7 @@ int cmd_throttle(struct cli_def *cli, char *command, char **argv, int argc) if (argc == 0) { - cli_print(cli, "You must specify at least a username"); + cli_print(cli, "Specify a user to throttle"); return CLI_OK; } @@ -1334,7 +1335,7 @@ int cmd_no_throttle(struct cli_def *cli, char *command, char **argv, int argc) if (CLI_HELP_REQUESTED) return cli_arg_help(cli, argc > 1, - "USER", "Username of session to un-throttle", NULL); + "USER", "Username of session to unthrottle", NULL); if (!config->cluster_iam_master) { @@ -1344,7 +1345,7 @@ int cmd_no_throttle(struct cli_def *cli, char *command, char **argv, int argc) if (!argc) { - cli_print(cli, "Specify a user"); + cli_print(cli, "Specify a user to unthrottle"); return CLI_OK; } diff --git a/garden.c b/garden.c index 5e3d368..89cc78d 100644 --- a/garden.c +++ b/garden.c @@ -7,7 +7,7 @@ #include "plugin.h" #include "control.h" -char const *cvs_id = "$Id: garden.c,v 1.7 2004-06-28 02:43:13 fred_nerk Exp $"; +char const *cvs_id = "$Id: garden.c,v 1.8 2004-10-30 07:35:31 bodea Exp $"; int __plugin_api_version = 1; static struct pluginfuncs *p = 0; @@ -15,12 +15,12 @@ static struct pluginfuncs *p = 0; static int iam_master = 0; // We're all slaves! Slaves I tell you! char *up_commands[] = { - "iptables -t nat -N garden >/dev/null 2>&1", // Create a chain that all gardened users will go through + "iptables -t nat -N garden >/dev/null 2>&1", // Create a chain that all gardened users will go through "iptables -t nat -F garden", - ". " PLUGINCONF "/build-garden", // Populate with site-specific DNAT rules - "iptables -t nat -N garden_users >/dev/null 2>&1",// Empty chain, users added/removed by garden_session + ". " PLUGINCONF "/build-garden", // Populate with site-specific DNAT rules + "iptables -t nat -N garden_users >/dev/null 2>&1", // Empty chain, users added/removed by garden_session "iptables -t nat -F garden_users", - "iptables -t nat -A PREROUTING -j garden_users", // DNAT any users on the garden_users chain + "iptables -t nat -A PREROUTING -j garden_users", // DNAT any users on the garden_users chain "sysctl -w net.ipv4.ip_conntrack_max=256000 >/dev/null", // lots of entries NULL, }; @@ -149,7 +149,7 @@ int garden_session(sessiont *s, int flag) if (flag == 1) { p->log(2, 0, 0, s->tunnel, "Garden user %s (%s)\n", s->user, p->inet_toa(htonl(s->ip))); - snprintf(cmd, 2048, "iptables -t nat -A garden_users -s %s -j garden", p->inet_toa(htonl(s->ip))); + snprintf(cmd, sizeof(cmd), "iptables -t nat -A garden_users -s %s -j garden", p->inet_toa(htonl(s->ip))); p->log(3, 0, 0, s->tunnel, "%s\n", cmd); system(cmd); s->walled_garden = 1; @@ -170,7 +170,7 @@ int garden_session(sessiont *s, int flag) s->cin = s->cout = 0; s->pin = s->pout = 0; - snprintf(cmd, 2048, "iptables -t nat -D garden_users -s %s -j garden", p->inet_toa(htonl(s->ip))); + snprintf(cmd, sizeof(cmd), "iptables -t nat -D garden_users -s %s -j garden", p->inet_toa(htonl(s->ip))); p->log(3, 0, 0, s->tunnel, "%s\n", cmd); while (--count) { -- 2.20.1 From 14013054f38b44ed80237772299acbd405eb00c3 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Tue, 2 Nov 2004 04:35:03 +0000 Subject: [PATCH 14/16] - Use 2 seperate u16 values for throttle rate in/out - Defer adding radius fds to the select loop until become_master --- Changes | 2 + Makefile | 2 +- autothrottle.c | 8 +- cli.c | 190 ++++++++++++++++++++++++++---------------- cluster.c | 4 +- l2tpns.c | 220 ++++++++++++++++++++++++------------------------- l2tpns.h | 13 +-- util.c | 61 +++++++++++++- util.h | 1 + 9 files changed, 303 insertions(+), 198 deletions(-) diff --git a/Changes b/Changes index 563e646..7f3f45f 100644 --- a/Changes +++ b/Changes @@ -12,6 +12,8 @@ - Shared_malloc returns NULL on failure - Sync changes - Unfsck 4->8 indenting change +- Use 2 seperate u16 values for throttle rate in/out +- Defer adding radius fds to the select loop until become_master * Thu Sep 02 2004 David Parrish 2.0.2 - Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP diff --git a/Makefile b/Makefile index cfd6e16..d3c9bbd 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ md5.o: md5.c md5.h ppp.o: ppp.c l2tpns.h constants.h plugin.h util.h tbf.h cluster.h radius.o: radius.c md5.h constants.h l2tpns.h plugin.h util.h tbf.o: tbf.c l2tpns.h util.h tbf.h -util.o: util.c l2tpns.h +util.o: util.c l2tpns.h bgp.h garden.so: garden.c l2tpns.h plugin.h control.h autothrottle.so: autothrottle.c l2tpns.h plugin.h control.h autosnoop.so: autosnoop.c l2tpns.h plugin.h control.h diff --git a/autothrottle.c b/autothrottle.c index 118c03d..65f3ff7 100644 --- a/autothrottle.c +++ b/autothrottle.c @@ -34,13 +34,13 @@ int plugin_radius_response(struct param_radius_response *data) switch (i) { case 2: // output - data->s->throttle |= (rate & 0xFFFF); + data->s->throttle_out = rate; free(pt); p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, " Set output throttle rate %dkb/s\n", rate); return PLUGIN_RET_OK; case 3: //input - data->s->throttle |= (rate << 16); + data->s->throttle_in = rate; free(pt); p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, " Set input throttle rate %dkb/s\n", rate); return PLUGIN_RET_OK; @@ -66,12 +66,12 @@ int plugin_radius_response(struct param_radius_response *data) if (strcmp(data->value, "yes") == 0) { p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, " Throttling user\n"); - data->s->throttle = 1; + data->s->throttle_in = data->s->throttle_out = config->rl_rate; } else if (strcmp(data->value, "no") == 0) { p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, " Not throttling user\n"); - data->s->throttle = 0; + data->s->throttle_in = data->s->throttle_out = 0; } } diff --git a/cli.c b/cli.c index c223b91..e8e219f 100644 --- a/cli.c +++ b/cli.c @@ -2,7 +2,7 @@ // vim: sw=8 ts=8 char const *cvs_name = "$Name: $"; -char const *cvs_id_cli = "$Id: cli.c,v 1.19 2004-10-30 07:35:31 bodea Exp $"; +char const *cvs_id_cli = "$Id: cli.c,v 1.20 2004-11-02 04:35:03 bodea Exp $"; #include #include @@ -10,7 +10,6 @@ char const *cvs_id_cli = "$Id: cli.c,v 1.19 2004-10-30 07:35:31 bodea Exp $"; #include #include #include -#include #include #include #include @@ -39,8 +38,6 @@ extern ippoolt *ip_address_pool; extern struct Tstats *_statistics; struct cli_def *cli = NULL; int cli_quit = 0; -extern int clifd, udpfd, tunfd, snoopfd, ifrfd, cluster_sockfd; -extern int *radfds; extern struct configt *config; extern struct config_descriptt config_values[]; #ifdef RINGBUFFER @@ -237,52 +234,11 @@ void init_cli(char *hostname) void cli_do(int sockfd) { - int i; int require_auth = 1; struct sockaddr_in addr; int l = sizeof(addr); - if (fork()) return; - if (config->scheduler_fifo) - { - int ret; - struct sched_param params = {0}; - params.sched_priority = 0; - if ((ret = sched_setscheduler(0, SCHED_OTHER, ¶ms)) == 0) - { - log(3, 0, 0, 0, "Dropped FIFO scheduler\n"); - } - else - { - log(0, 0, 0, 0, "Error setting scheduler to OTHER: %s\n", strerror(errno)); - log(0, 0, 0, 0, "This is probably really really bad.\n"); - } - } - - signal(SIGPIPE, SIG_DFL); - signal(SIGCHLD, SIG_DFL); - signal(SIGHUP, SIG_DFL); - signal(SIGUSR1, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - signal(SIGKILL, SIG_DFL); - signal(SIGALRM, SIG_DFL); - signal(SIGTERM, SIG_DFL); - - // Close sockets - if (udpfd) close(udpfd); udpfd = 0; - if (tunfd) close(tunfd); tunfd = 0; - if (snoopfd) close(snoopfd); snoopfd = 0; - for (i = 0; i < config->num_radfds; i++) - if (radfds[i]) close(radfds[i]); - if (ifrfd) close(ifrfd); ifrfd = 0; - if (cluster_sockfd) close(cluster_sockfd); cluster_sockfd = 0; - if (clifd) close(clifd); clifd = 0; -#ifdef BGP - for (i = 0; i < BGP_NUM_PEERS; i++) - if (bgp_peers[i].sock != -1) - close(bgp_peers[i].sock); -#endif /* BGP */ - + if (fork_and_close()) return; if (getpeername(sockfd, (struct sockaddr *)&addr, &l) == 0) { log(3, 0, 0, 0, "Accepted connection to CLI from %s\n", inet_toa(addr.sin_addr.s_addr)); @@ -412,8 +368,18 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, " Intercepted: %s:%d", inet_toa(session[s].snoop_ip), session[s] .snoop_port); else cli_print(cli, " Intercepted: no"); - cli_print(cli, " Throttled: %s", session[s].throttle ? "YES" : "no"); + cli_print(cli, " Walled Garden: %s", session[s].walled_garden ? "YES" : "no"); + { + int t = (session[s].throttle_in || session[s].throttle_out); + cli_print(cli, " Throttled: %s%s%.0d%s%s%.0d%s%s", + t ? "YES" : "no", t ? " (" : "", + session[s].throttle_in, session[s].throttle_in ? "kbps" : t ? "-" : "", + t ? "/" : "", + session[s].throttle_out, session[s].throttle_out ? "kbps" : t ? "-" : "", + t ? ")" : ""); + } + b_in = session[s].tbf_in; b_out = session[s].tbf_out; if (b_in || b_out) @@ -454,7 +420,7 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) } // Show Summary - cli_print(cli, " %s %4s %-32s %-15s %s %s %s %10s %10s %10s %4s %-15s %s", + cli_print(cli, "%5s %4s %-32s %-15s %s %s %s %10s %10s %10s %4s %-15s %s", "SID", "TID", "Username", @@ -481,7 +447,7 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) session[i].user[0] ? session[i].user : "*", userip, (session[i].snoop_ip && session[i].snoop_port) ? "Y" : "N", - (session[i].throttle) ? "Y" : "N", + (session[i].throttle_in || session[i].throttle_out) ? "Y" : "N", (session[i].walled_garden) ? "Y" : "N", abs(time_now - (unsigned long)session[i].opened), (unsigned long)session[i].total_cout, @@ -983,17 +949,26 @@ int cmd_show_throttle(struct cli_def *cli, char *command, char **argv, int argc) if (CLI_HELP_REQUESTED) return CLI_HELP_NO_ARGS; - cli_print(cli, "Token bucket filters:"); - cli_print(cli, "%-6s %8s %-4s", "ID", "Handle", "Used"); + cli_print(cli, "%5s %4s %-32s %7s %6s %6s %6s", + "SID", + "TID", + "Username", + "Rate In", + "Out", + "TBFI", + "TBFO"); + for (i = 0; i < MAXSESSION; i++) { - if (!session[i].throttle) - continue; - - cli_print(cli, "%-6d %8d %8d", - i, - session[i].tbf_in, - session[i].tbf_out); + if (session[i].throttle_in || session[i].throttle_out) + cli_print(cli, "%5d %4d %-32s %6d %6d %6d %6d", + i, + session[i].tunnel, + session[i].user, + session[i].throttle_in, + session[i].throttle_out, + session[i].tbf_in, + session[i].tbf_out); } return CLI_OK; @@ -1275,21 +1250,42 @@ int cmd_throttle(struct cli_def *cli, char *command, char **argv, int argc) int rate_out = 0; sessionidt s; + /* + throttle USER - throttle in/out to default rate + throttle USER RATE - throttle in/out to default rate + throttle USER in RATE - throttle input only + throttle USER out RATE - throttle output only + throttle USER in RATE out RATE - throttle both + */ + if (CLI_HELP_REQUESTED) { switch (argc) { case 1: - return cli_arg_help(cli, 0, "user", "Username of session to throttle", NULL); + return cli_arg_help(cli, 0, + "USER", "Username of session to throttle", NULL); case 2: - return cli_arg_help(cli, 1, "rate", "Incoming rate in kb/s", NULL); + return cli_arg_help(cli, 1, + "RATE", "Rate in kbps (in and out)", + "in", "Select incoming rate", + "out", "Select outgoing rate", NULL); + + case 4: + return cli_arg_help(cli, 1, + "in", "Select incoming rate", + "out", "Select outgoing rate", NULL); case 3: - return cli_arg_help(cli, 1, "rate", "Outgoing rate in kb/s", NULL); + if (isdigit(argv[1][0])) + return cli_arg_help(cli, 1, NULL); + + case 5: + return cli_arg_help(cli, 0, "RATE", "Rate in kbps", NULL); default: - return cli_arg_help(cli, argc > 1, "user", "Username of session to throttle", NULL); + return cli_arg_help(cli, argc > 1, NULL); } } @@ -1305,24 +1301,71 @@ int cmd_throttle(struct cli_def *cli, char *command, char **argv, int argc) return CLI_OK; } - rate_in = rate_out = config->rl_rate; - if (argc >= 2) rate_in = atoi(argv[1]); - if (argc >= 3) rate_out = atoi(argv[2]); - if (!(s = sessionbyuser(argv[0]))) { cli_print(cli, "User %s is not connected", argv[0]); return CLI_OK; } - if (session[s].throttle) + if (argc == 1) + { + rate_in = rate_out = config->rl_rate; + } + else if (argc == 2) + { + rate_in = rate_out = atoi(argv[1]); + if (rate_in < 1) + { + cli_print(cli, "Invalid rate \"%s\"", argv[1]); + return CLI_OK; + } + } + else if (argc == 3 || argc == 5) + { + int i; + for (i = 1; i < argc - 1; i += 2) + { + int len = strlen(argv[i]); + int r = 0; + if (!strncasecmp(argv[i], "in", len)) + r = rate_in = atoi(argv[i+1]); + else if (!strncasecmp(argv[i], "out", len)) + r = rate_out = atoi(argv[i+1]); + + if (r < 1) + { + cli_print(cli, "Invalid rate specification \"%s %s\"", argv[i], argv[i+1]); + return CLI_OK; + } + } + } + else + { + cli_print(cli, "Invalid arguments"); + return CLI_OK; + } + + if ((rate_in && session[s].throttle_in) || (rate_out && session[s].throttle_out)) { cli_print(cli, "User %s already throttled, unthrottle first", argv[0]); return CLI_OK; } + cli_session_actions[s].throttle_in = cli_session_actions[s].throttle_out = -1; + if (rate_in && session[s].throttle_in != rate_in) + cli_session_actions[s].throttle_in = rate_in; + + if (rate_out && session[s].throttle_out != rate_out) + cli_session_actions[s].throttle_out = rate_out; + + if (cli_session_actions[s].throttle_in == -1 && + cli_session_actions[s].throttle_out == -1) + { + cli_print(cli, "User %s already throttled at this rate", argv[0]); + return CLI_OK; + } + cli_print(cli, "Throttling user %s", argv[0]); - cli_session_actions[s].throttle = rate_in << 16 | rate_out; cli_session_actions[s].action |= CLI_SESS_THROTTLE; return CLI_OK; @@ -1357,14 +1400,15 @@ int cmd_no_throttle(struct cli_def *cli, char *command, char **argv, int argc) continue; } - if (!session[s].throttle) + if (session[s].throttle_in || session[s].throttle_out) + { + cli_print(cli, "Unthrottling user %s", argv[i]); + cli_session_actions[s].action |= CLI_SESS_NOTHROTTLE; + } + else { cli_print(cli, "User %s not throttled", argv[i]); - continue; } - - cli_print(cli, "Unthrottling user %s", argv[i]); - cli_session_actions[s].action |= CLI_SESS_NOTHROTTLE; } return CLI_OK; diff --git a/cluster.c b/cluster.c index 8a46b04..e78ed69 100644 --- a/cluster.c +++ b/cluster.c @@ -1,6 +1,6 @@ // L2TPNS Clustering Stuff -char const *cvs_id_cluster = "$Id: cluster.c,v 1.14 2004-10-30 07:35:00 bodea Exp $"; +char const *cvs_id_cluster = "$Id: cluster.c,v 1.15 2004-11-02 04:35:03 bodea Exp $"; #include #include @@ -589,7 +589,7 @@ void cluster_check_master(void) session[i].tbf_in = session[i].tbf_out = 0; // Remove stale pointers from old master. - throttle_session(i, session[i].throttle); + throttle_session(i, session[i].throttle_in, session[i].throttle_out); if (session[i].tunnel != T_FREE && i > config->cluster_highest_sessionid) config->cluster_highest_sessionid = i; diff --git a/l2tpns.c b/l2tpns.c index 6bd3af7..c0a60a7 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.36 2004-10-30 07:17:41 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.37 2004-11-02 04:35:04 bodea Exp $"; #include #include @@ -967,65 +967,48 @@ void controladd(controlt * c, tunnelidt t, sessionidt s) // // Throttle or Unthrottle a session // -// Throttle the data folling through a session -// to be no more than 'throttle' kbit/sec each way. +// Throttle the data from/to through a session to no more than +// 'rate_in' kbit/sec in (from user) or 'rate_out' kbit/sec out (to +// user). // -int throttle_session(sessionidt s, int throttle) +// If either value is -1, the current value is retained for that +// direction. +// +void throttle_session(sessionidt s, int rate_in, int rate_out) { if (!session[s].tunnel) - return 0; // No-one home. + return; // No-one home. if (!*session[s].user) - return 0; // User not logged in + return; // User not logged in - if (throttle) + if (rate_in >= 0) { - int rate_in = throttle & 0x0000FFFF; - int rate_out = throttle >> 16; - - if (session[s].tbf_in || session[s].tbf_out) - { - if (throttle == session[s].throttle) - return 1; - - // Currently throttled but the rate is changing. - + int bytes = rate_in * 1024 / 8; // kbits to bytes + if (session[s].tbf_in) free_tbf(session[s].tbf_in); - free_tbf(session[s].tbf_out); - } - if (rate_in) session[s].tbf_in = new_tbf(s, rate_in * 1024 / 4, rate_in * 1024 / 8, send_ipin); - if (rate_out) session[s].tbf_out = new_tbf(s, rate_out * 1024 / 4, rate_out * 1024 / 8, send_ipout); - - if (throttle != session[s].throttle) - { - // Changed. Flood to slaves. - session[s].throttle = throttle; - cluster_send_session(s); - } + if (rate_in > 0) + session[s].tbf_in = new_tbf(s, bytes * 2, bytes, send_ipin); + else + session[s].tbf_in = 0; - return 1; + session[s].throttle_in = rate_in; } - // else Unthrottling. - - if (!session[s].tbf_in && !session[s].tbf_out && !session[s].throttle) - return 0; - - free_tbf(session[s].tbf_in); - session[s].tbf_in = 0; + if (rate_out >= 0) + { + int bytes = rate_out * 1024 / 8; + if (session[s].tbf_out) + free_tbf(session[s].tbf_out); - free_tbf(session[s].tbf_out); - session[s].tbf_out = 0; + if (rate_out > 0) + session[s].tbf_out = new_tbf(s, bytes * 2, bytes, send_ipin); + else + session[s].tbf_out = 0; - if (throttle != session[s].throttle) - { - // Changed. Flood to slaves. - session[s].throttle = throttle; - cluster_send_session(s); + session[s].throttle_out = rate_out; } - - return 0; } // start tidy shutdown of session @@ -1091,16 +1074,18 @@ void sessionshutdown(sessionidt s, char *reason) } else free_ip_address(s); - - if (session[s].throttle) // Unthrottle if throttled. - throttle_session(s, 0); } + + if (session[s].throttle_in || session[s].throttle_out) // Unthrottle if throttled. + throttle_session(s, 0, 0); + { // Send CDN controlt *c = controlnew(14); // sending CDN control16(c, 1, 3, 1); // result code (admin reasons - TBA make error, general error, add message control16(c, 14, s, 1); // assigned session (our end) controladd(c, session[s].tunnel, s); // send the message } + cluster_send_session(s); } @@ -1159,8 +1144,6 @@ void sessionkill(sessionidt s, char *reason) log(2, 0, s, session[s].tunnel, "Kill session %d (%s): %s\n", s, session[s].user, reason); - throttle_session(s, 0); // Force session to be un-throttle. Free'ing TBF structures. - memset(&session[s], 0, sizeof(session[s])); session[s].tunnel = T_FREE; // Mark it as free. session[s].next = sessionfree; @@ -1578,7 +1561,7 @@ void processudp(u8 * buf, int len, struct sockaddr_in *addr) case 13: // Response // Why did they send a response? We never challenge. log(2, ntohl(addr->sin_addr.s_addr), s, t, " received unexpected challenge response\n"); - break; + break; case 14: // assigned session asession = session[s].far = ntohs(*(u16 *) (b)); @@ -2141,7 +2124,14 @@ int regular_cleanups(void) a = 0; // dead, no need to check for other actions } - if (a & CLI_SESS_SNOOP) + if (a & CLI_SESS_NOSNOOP) + { + log(2, 0, s, session[s].tunnel, "Unsnooping session by CLI\n"); + session[s].snoop_ip = 0; + session[s].snoop_port = 0; + send++; + } + else if (a & CLI_SESS_SNOOP) { log(2, 0, s, session[s].tunnel, "Snooping session by CLI (to %s:%d)\n", inet_toa(cli_session_actions[s].snoop_ip), cli_session_actions[s].snoop_port); @@ -2151,27 +2141,20 @@ int regular_cleanups(void) send++; } - if (a & CLI_SESS_NOSNOOP) + if (a & CLI_SESS_NOTHROTTLE) { - log(2, 0, s, session[s].tunnel, "Unsnooping session by CLI\n"); - session[s].snoop_ip = 0; - session[s].snoop_port = 0; + log(2, 0, s, session[s].tunnel, "Un-throttling session by CLI\n"); + throttle_session(s, 0, 0); send++; } - - if (a & CLI_SESS_THROTTLE) + else if (a & CLI_SESS_THROTTLE) { log(2, 0, s, session[s].tunnel, "Throttling session by CLI (to %dkb/s up and %dkb/s down)\n", - cli_session_actions[s].throttle & 0xFFFF, - cli_session_actions[s].throttle >> 16); - - throttle_session(s, cli_session_actions[s].throttle); - } + cli_session_actions[s].throttle_in, + cli_session_actions[s].throttle_out); - if (a & CLI_SESS_NOTHROTTLE) - { - log(2, 0, s, session[s].tunnel, "Un-throttling session by CLI\n"); - throttle_session(s, 0); + throttle_session(s, cli_session_actions[s].throttle_in, cli_session_actions[s].throttle_out); + send++; } if (send) @@ -2246,11 +2229,13 @@ int still_busy(void) return 0; } +static fd_set readset; +static int readset_n = 0; + // main loop - gets packets on tun or udp and processes them void mainloop(void) { - fd_set cr; - int cn, i; + int i; u8 buf[65536]; struct timeval to; clockt next_cluster_ping = 0; // send initial ping immediately @@ -2259,29 +2244,22 @@ void mainloop(void) log(4, 0, 0, 0, "Beginning of main loop. udpfd=%d, tunfd=%d, cluster_sockfd=%d, controlfd=%d\n", udpfd, tunfd, cluster_sockfd, controlfd); - FD_ZERO(&cr); - FD_SET(udpfd, &cr); - FD_SET(tunfd, &cr); - FD_SET(controlfd, &cr); - FD_SET(clifd, &cr); - if (cluster_sockfd) FD_SET(cluster_sockfd, &cr); - cn = udpfd; - if (cn < tunfd) cn = tunfd; - if (cn < controlfd) cn = controlfd; - if (cn < clifd) cn = clifd; - if (cn < cluster_sockfd) cn = cluster_sockfd; - for (i = 0; i < config->num_radfds; i++) - { - if (!radfds[i]) continue; - FD_SET(radfds[i], &cr); - if (radfds[i] > cn) - cn = radfds[i]; - } + FD_ZERO(&readset); + FD_SET(udpfd, &readset); + FD_SET(tunfd, &readset); + FD_SET(controlfd, &readset); + FD_SET(clifd, &readset); + if (cluster_sockfd) FD_SET(cluster_sockfd, &readset); + readset_n = udpfd; + if (tunfd > readset_n) readset_n = tunfd; + if (controlfd > readset_n) readset_n = controlfd; + if (clifd > readset_n) readset_n = clifd; + if (cluster_sockfd > readset_n) readset_n = cluster_sockfd; while (!main_quit || still_busy()) { fd_set r; - int n = cn; + int n = readset_n; #ifdef BGP fd_set w; int bgp_set[BGP_NUM_PEERS]; @@ -2293,7 +2271,7 @@ void mainloop(void) update_config(); } - memcpy(&r, &cr, sizeof(fd_set)); + memcpy(&r, &readset, sizeof(fd_set)); to.tv_sec = 0; to.tv_usec = 100000; // 1/10th of a second. @@ -2325,7 +2303,8 @@ void mainloop(void) TIME = now(); if (n < 0) { - if (errno == EINTR) + if (errno == EINTR || + errno == ECHILD) // EINTR was clobbered by sigchild_handler() continue; log(0, 0, 0, 0, "Error returned from select(): %s\n", strerror(errno)); @@ -2358,9 +2337,11 @@ void mainloop(void) break; } } - for (i = 0; i < config->num_radfds; i++) - if (FD_ISSET(radfds[i], &r)) - processrad(buf, recv(radfds[i], buf, sizeof(buf), 0), i); + + if (config->cluster_iam_master) + for (i = 0; i < config->num_radfds; i++) + if (FD_ISSET(radfds[i], &r)) + processrad(buf, recv(radfds[i], buf, sizeof(buf), 0), i); if (FD_ISSET(cluster_sockfd, &r)) { @@ -2874,7 +2855,7 @@ void dump_acct_info() for (i = 0; i < MAXSESSION; i++) { - if (!session[i].opened || !session[i].ip || (!session[i].cin && !session[i].cout) || !*session[i].user || session[i].walled_garden) + if (!session[i].opened || !session[i].ip || !(session[i].cin || session[i].cout) || !*session[i].user || session[i].walled_garden) continue; if (!f) { @@ -2897,11 +2878,11 @@ void dump_acct_info() log(4, 0, 0, 0, "Dumping accounting information for %s\n", session[i].user); fprintf(f, "%s %s %d %u %u\n", - session[i].user, // username - inet_toa(htonl(session[i].ip)), // ip - (session[i].throttle) ? 2 : 1, // qos - (u32)session[i].cin, // uptxoctets - (u32)session[i].cout); // downrxoctets + session[i].user, // username + inet_toa(htonl(session[i].ip)), // ip + (session[i].throttle_in || session[i].throttle_out) ? 2 : 1, // qos + (u32)session[i].cin, // uptxoctets + (u32)session[i].cout); // downrxoctets session[i].pin = session[i].cin = 0; session[i].pout = session[i].cout = 0; @@ -3599,10 +3580,9 @@ int sessionsetup(tunnelidt t, sessionidt s) run_plugins(PLUGIN_NEW_SESSION, &data); } - // Force throttling on or off (Actually : refresh the current throttling status) - // This has the advantage of cleaning up after another throttled user who may have left - // firewall rules lying around - throttle_session(s, session[s].throttle); + // Allocate TBFs if throttled + if (session[s].throttle_in || session[s].throttle_out) + throttle_session(s, session[s].throttle_in, session[s].throttle_out); session[s].last_packet = time_now; @@ -3691,6 +3671,12 @@ int load_session(sessionidt s, sessiont *new) // for walking the sessions to forward byte counts to the master. config->cluster_highest_sessionid = s; + // TEMP: old session struct used a u32 to define the throttle + // speed for both up/down, new uses a u16 for each. Deal with + // sessions from an old master for migration. + if (new->throttle_out == 0 && new->tbf_out) + new->throttle_out = new->throttle_in; + memcpy(&session[s], new, sizeof(session[s])); // Copy over.. // Do fixups into address pool. @@ -3946,19 +3932,33 @@ tunnelidt new_tunnel() // void become_master(void) { - int s; + int s, i; run_plugins(PLUGIN_BECOME_MASTER, NULL); - for (s = 1; s <= config->cluster_highest_sessionid ; ++s) + // running a bunch of iptables commands is slow and can cause + // the master to drop tunnels on takeover--kludge around the + // problem by forking for the moment (note: race) + if (!fork_and_close()) { - if (!session[s].tunnel) // Not an in-use session. - continue; + for (s = 1; s <= config->cluster_highest_sessionid ; ++s) + { + if (!session[s].tunnel) // Not an in-use session. + continue; - run_plugins(PLUGIN_NEW_SESSION_MASTER, &session[s]); + run_plugins(PLUGIN_NEW_SESSION_MASTER, &session[s]); + } + exit(0); } -} - + // add radius fds + for (i = 0; i < config->num_radfds; i++) + { + if (!radfds[i]) continue; + FD_SET(radfds[i], &readset); + if (radfds[i] > readset_n) + readset_n = radfds[i]; + } +} int cmd_show_hist_idle(struct cli_def *cli, char *command, char **argv, int argc) { diff --git a/l2tpns.h b/l2tpns.h index bc6938f..3e7573e 100644 --- a/l2tpns.h +++ b/l2tpns.h @@ -1,5 +1,5 @@ // L2TPNS Global Stuff -// $Id: l2tpns.h,v 1.25 2004-10-30 07:17:41 bodea Exp $ +// $Id: l2tpns.h,v 1.26 2004-11-02 04:35:04 bodea Exp $ #ifndef __L2TPNS_H__ #define __L2TPNS_H__ @@ -122,7 +122,8 @@ struct cli_session_actions { char action; ipt snoop_ip; u16 snoop_port; - int throttle; + int throttle_in; + int throttle_out; }; #define CLI_SESS_KILL 0x01 @@ -172,7 +173,8 @@ typedef struct sessions u32 total_cin; // This counter is never reset while a session is open u32 total_cout; // This counter is never reset while a session is open u32 id; // session id - u32 throttle; // non-zero if this session is throttled. + u16 throttle_in; // upstream throttle rate (kbps) + u16 throttle_out; // downstream throttle rate clockt opened; // when started clockt die; // being closed, when to finally free time_t last_packet; // Last packet from the user (used for idle timeouts) @@ -419,7 +421,7 @@ struct configt ipt default_dns1, default_dns2; - unsigned long rl_rate; // throttle rate + unsigned long rl_rate; // default throttle rate int num_tbfs; // number of throttle buckets int save_state; @@ -565,7 +567,7 @@ void host_unreachable(ipt destination, u16 id, ipt source, char *packet, int pac void fix_address_pool(int sid); void rebuild_address_pool(void); void send_ipin(sessionidt s, u8 * buf, int len); -int throttle_session(sessionidt s, int throttle); +void throttle_session(sessionidt s, int rate_in, int rate_out); int load_session(sessionidt, sessiont *); void become_master(void); // We're the master; kick off any required master initializations. extern tunnelt *tunnel; @@ -597,6 +599,7 @@ extern u32 last_id; extern struct Tstats *_statistics; extern ipt my_address; extern int tun_write(u8 *data, int size); +extern int clifd; #define TIME (config->current_time) diff --git a/util.c b/util.c index 8ba99a0..572af84 100644 --- a/util.c +++ b/util.c @@ -1,15 +1,21 @@ /* Misc util functions */ -char const *cvs_id_util = "$Id: util.c,v 1.3 2004-09-02 04:18:07 fred_nerk Exp $"; - -#include "l2tpns.h" +char const *cvs_id_util = "$Id: util.c,v 1.4 2004-11-02 04:35:04 bodea Exp $"; +#include +#include +#include #include #include #include #include #include +#include "l2tpns.h" +#ifdef BGP +#include "bgp.h" +#endif + char *inet_toa(unsigned long addr) { struct in_addr in; @@ -27,3 +33,52 @@ void *shared_malloc(unsigned int size) return p; } + +extern int udpfd, tunfd, snoopfd, ifrfd, cluster_sockfd; +extern int *radfds; + +pid_t fork_and_close() +{ + pid_t pid = fork(); + int i; + + if (pid) + return pid; + + if (config->scheduler_fifo) + { + struct sched_param params = {0}; + params.sched_priority = 0; + if (sched_setscheduler(0, SCHED_OTHER, ¶ms)) + { + log(0, 0, 0, 0, "Error setting scheduler to OTHER after fork: %s\n", strerror(errno)); + log(0, 0, 0, 0, "This is probably really really bad.\n"); + } + } + + signal(SIGPIPE, SIG_DFL); + signal(SIGCHLD, SIG_DFL); + signal(SIGHUP, SIG_DFL); + signal(SIGUSR1, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGKILL, SIG_DFL); + signal(SIGALRM, SIG_DFL); + signal(SIGTERM, SIG_DFL); + + // Close sockets + if (udpfd) close(udpfd); udpfd = 0; + if (tunfd) close(tunfd); tunfd = 0; + if (snoopfd) close(snoopfd); snoopfd = 0; + for (i = 0; i < config->num_radfds; i++) + if (radfds[i]) close(radfds[i]); + if (ifrfd) close(ifrfd); ifrfd = 0; + if (cluster_sockfd) close(cluster_sockfd); cluster_sockfd = 0; + if (clifd) close(clifd); clifd = 0; +#ifdef BGP + for (i = 0; i < BGP_NUM_PEERS; i++) + if (bgp_peers[i].sock != -1) + close(bgp_peers[i].sock); +#endif /* BGP */ + + return pid; +} diff --git a/util.h b/util.h index 21c82a3..5fe9d4f 100644 --- a/util.h +++ b/util.h @@ -3,5 +3,6 @@ char *inet_toa(unsigned long addr); void *shared_malloc(unsigned int size); +pid_t fork_and_close(void); #endif /* __UTIL_H__ */ -- 2.20.1 From 8031ce79f6a83dc493b0df19f109528fad748630 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Tue, 2 Nov 2004 06:45:03 +0000 Subject: [PATCH 15/16] fix cut-n-paste error --- l2tpns.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l2tpns.c b/l2tpns.c index c0a60a7..d03ba2b 100644 --- a/l2tpns.c +++ b/l2tpns.c @@ -4,7 +4,7 @@ // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced // vim: sw=8 ts=8 -char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.37 2004-11-02 04:35:04 bodea Exp $"; +char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.38 2004-11-02 06:45:03 bodea Exp $"; #include #include @@ -1003,7 +1003,7 @@ void throttle_session(sessionidt s, int rate_in, int rate_out) free_tbf(session[s].tbf_out); if (rate_out > 0) - session[s].tbf_out = new_tbf(s, bytes * 2, bytes, send_ipin); + session[s].tbf_out = new_tbf(s, bytes * 2, bytes, send_ipout); else session[s].tbf_out = 0; -- 2.20.1 From 994c888b0b264d34363d1618c7671dc678772cc1 Mon Sep 17 00:00:00 2001 From: Brendan O'Dea Date: Tue, 2 Nov 2004 06:45:36 +0000 Subject: [PATCH 16/16] fix output format for TBFs --- cli.c | 100 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/cli.c b/cli.c index e8e219f..4c3db99 100644 --- a/cli.c +++ b/cli.c @@ -2,7 +2,7 @@ // vim: sw=8 ts=8 char const *cvs_name = "$Name: $"; -char const *cvs_id_cli = "$Id: cli.c,v 1.20 2004-11-02 04:35:03 bodea Exp $"; +char const *cvs_id_cli = "$Id: cli.c,v 1.21 2004-11-02 06:45:36 bodea Exp $"; #include #include @@ -349,30 +349,30 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) continue; } cli_print(cli, "\r\nSession %d:", s); - cli_print(cli, " User: %s", session[s].user[0] ? session[s].user : "none"); - cli_print(cli, " Calling Num: %s", session[s].calling); - cli_print(cli, " Called Num: %s", session[s].called); - cli_print(cli, " Tunnel ID: %d", session[s].tunnel); - cli_print(cli, " IP address: %s", inet_toa(htonl(session[s].ip))); - cli_print(cli, " Unique SID: %lu", session[s].unique_id); - cli_print(cli, " Idle time: %u seconds", abs(time_now - session[s].last_packet)); - cli_print(cli, " Next Recv: %u", session[s].nr); - cli_print(cli, " Next Send: %u", session[s].ns); - cli_print(cli, " Bytes In/Out: %lu/%lu", (unsigned long)session[s].total_cout, (unsigned long)session[s].total_cin); - cli_print(cli, " Pkts In/Out: %lu/%lu", (unsigned long)session[s].pout, (unsigned long)session[s].pin); - cli_print(cli, " MRU: %d", session[s].mru); - cli_print(cli, " Radius Session: %u", session[s].radius); - cli_print(cli, " Rx Speed: %lu", session[s].rx_connect_speed); - cli_print(cli, " Tx Speed: %lu", session[s].tx_connect_speed); + cli_print(cli, "\tUser:\t\t%s", session[s].user[0] ? session[s].user : "none"); + cli_print(cli, "\tCalling Num:\t%s", session[s].calling); + cli_print(cli, "\tCalled Num:\t%s", session[s].called); + cli_print(cli, "\tTunnel ID:\t%d", session[s].tunnel); + cli_print(cli, "\tIP address:\t%s", inet_toa(htonl(session[s].ip))); + cli_print(cli, "\tUnique SID:\t%lu", session[s].unique_id); + cli_print(cli, "\tIdle time:\t%u seconds", abs(time_now - session[s].last_packet)); + cli_print(cli, "\tNext Recv:\t%u", session[s].nr); + cli_print(cli, "\tNext Send:\t%u", session[s].ns); + cli_print(cli, "\tBytes In/Out:\t%lu/%lu", (unsigned long)session[s].total_cout, (unsigned long)session[s].total_cin); + cli_print(cli, "\tPkts In/Out:\t%lu/%lu", (unsigned long)session[s].pout, (unsigned long)session[s].pin); + cli_print(cli, "\tMRU:\t\t%d", session[s].mru); + cli_print(cli, "\tRadius Session:\t%u", session[s].radius); + cli_print(cli, "\tRx Speed:\t%lu", session[s].rx_connect_speed); + cli_print(cli, "\tTx Speed:\t%lu", session[s].tx_connect_speed); if (session[s].snoop_ip && session[s].snoop_port) - cli_print(cli, " Intercepted: %s:%d", inet_toa(session[s].snoop_ip), session[s] .snoop_port); + cli_print(cli, "\tIntercepted:\t%s:%d", inet_toa(session[s].snoop_ip), session[s] .snoop_port); else - cli_print(cli, " Intercepted: no"); + cli_print(cli, "\tIntercepted:\tno"); - cli_print(cli, " Walled Garden: %s", session[s].walled_garden ? "YES" : "no"); + cli_print(cli, "\tWalled Garden:\t%s", session[s].walled_garden ? "YES" : "no"); { int t = (session[s].throttle_in || session[s].throttle_out); - cli_print(cli, " Throttled: %s%s%.0d%s%s%.0d%s%s", + cli_print(cli, "\tThrottled:\t%s%s%.0d%s%s%.0d%s%s", t ? "YES" : "no", t ? " (" : "", session[s].throttle_in, session[s].throttle_in ? "kbps" : t ? "-" : "", t ? "/" : "", @@ -383,14 +383,15 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) b_in = session[s].tbf_in; b_out = session[s].tbf_out; if (b_in || b_out) - cli_print(cli, " %5s %6s %6s | %7s %7s %8s %8s %8s %8s", + cli_print(cli, "\t\t\t%5s %6s %6s | %7s %7s %8s %8s %8s %8s", "Rate", "Credit", "Queued", "ByteIn", "PackIn", "ByteSent", "PackSent", "PackDrop", "PackDelay"); if (b_in) - cli_print(cli, " TBFI#%d%1s %5d %6d %6d | %7d %7d %8d %8d %8d %8d", + cli_print(cli, "\tTBFI#%d%1s%s\t%5d %6d %6d | %7d %7d %8d %8d %8d %8d", b_in, (filter_list[b_in].next ? "*" : " "), + (b_in < 100 ? "\t" : ""), filter_list[b_in].rate * 8, filter_list[b_in].credit, filter_list[b_in].queued, @@ -402,9 +403,10 @@ int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc) filter_list[b_in].p_delayed); if (b_out) - cli_print(cli, " TBFO#%d%1s %5d %6d %6d | %7d %7d %8d %8d %8d %8d", + cli_print(cli, "\tTBFO#%d%1s%s\t%5d %6d %6d | %7d %7d %8d %8d %8d %8d", b_out, (filter_list[b_out].next ? "*" : " "), + (b_out < 100 ? "\t" : ""), filter_list[b_out].rate * 8, filter_list[b_out].credit, filter_list[b_out].queued, @@ -505,21 +507,21 @@ int cmd_show_tunnels(struct cli_def *cli, char *command, char **argv, int argc) continue; } cli_print(cli, "\r\nTunnel %d:", t); - cli_print(cli, " State: %s", states[tunnel[t].state]); - cli_print(cli, " Hostname: %s", tunnel[t].hostname[0] ? tunnel[t].hostname : "(none)"); - cli_print(cli, " Remote IP: %s", inet_toa(htonl(tunnel[t].ip))); - cli_print(cli, " Remote Port: %d", tunnel[t].port); - cli_print(cli, " Rx Window: %u", tunnel[t].window); - cli_print(cli, " Next Recv: %u", tunnel[t].nr); - cli_print(cli, " Next Send: %u", tunnel[t].ns); - cli_print(cli, " Queue Len: %u", tunnel[t].controlc); - cli_print(cli, " Last Packet Age:%u", (unsigned)(time_now - tunnel[t].last)); + cli_print(cli, "\tState:\t\t%s", states[tunnel[t].state]); + cli_print(cli, "\tHostname:\t%s", tunnel[t].hostname[0] ? tunnel[t].hostname : "(none)"); + cli_print(cli, "\tRemote IP:\t%s", inet_toa(htonl(tunnel[t].ip))); + cli_print(cli, "\tRemote Port:\t%d", tunnel[t].port); + cli_print(cli, "\tRx Window:\t%u", tunnel[t].window); + cli_print(cli, "\tNext Recv:\t%u", tunnel[t].nr); + cli_print(cli, "\tNext Send:\t%u", tunnel[t].ns); + cli_print(cli, "\tQueue Len:\t%u", tunnel[t].controlc); + cli_print(cli, "\tLast Packet Age:%u", (unsigned)(time_now - tunnel[t].last)); for (x = 0; x < MAXSESSION; x++) if (session[x].tunnel == t && session[x].opened && !session[x].die) sprintf(s, "%s%u ", s, x); - cli_print(cli, " Sessions: %s", s); + cli_print(cli, "\tSessions:\t%s", s); } return CLI_OK; } @@ -623,7 +625,7 @@ int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, "%-30s%-10s", "Counter", "Value"); cli_print(cli, "-----------------------------------------"); cli_print(cli, "%-30s%lu", "radius_retries", GET_STAT(radius_retries)); - cli_print(cli, "%-30s%lu", "arp_sent", GET_STAT(arp_sent)); + cli_print(cli, "%-30s%lu", "arp_sent", GET_STAT(arp_sent)); cli_print(cli, "%-30s%lu", "packets_snooped", GET_STAT(packets_snooped)); cli_print(cli, "%-30s%lu", "tunnel_created", GET_STAT(tunnel_created)); cli_print(cli, "%-30s%lu", "session_created", GET_STAT(session_created)); @@ -633,10 +635,10 @@ int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, "%-30s%lu", "radius_overflow", GET_STAT(radius_overflow)); cli_print(cli, "%-30s%lu", "tunnel_overflow", GET_STAT(tunnel_overflow)); cli_print(cli, "%-30s%lu", "session_overflow", GET_STAT(session_overflow)); - cli_print(cli, "%-30s%lu", "ip_allocated", GET_STAT(ip_allocated)); - cli_print(cli, "%-30s%lu", "ip_freed", GET_STAT(ip_freed)); + cli_print(cli, "%-30s%lu", "ip_allocated", GET_STAT(ip_allocated)); + cli_print(cli, "%-30s%lu", "ip_freed", GET_STAT(ip_freed)); cli_print(cli, "%-30s%lu", "cluster_forwarded", GET_STAT(c_forwarded)); - cli_print(cli, "%-30s%lu", "recv_forward", GET_STAT(recv_forward)); + cli_print(cli, "%-30s%lu", "recv_forward", GET_STAT(recv_forward)); #ifdef STATISTICS @@ -652,20 +654,20 @@ int cmd_show_counters(struct cli_def *cli, char *command, char **argv, int argc) cli_print(cli, "%-30s%lu", "call_processipin", GET_STAT(call_processipin)); cli_print(cli, "%-30s%lu", "call_processccp", GET_STAT(call_processccp)); cli_print(cli, "%-30s%lu", "call_processrad", GET_STAT(call_processrad)); - cli_print(cli, "%-30s%lu", "call_sendarp", GET_STAT(call_sendarp)); - cli_print(cli, "%-30s%lu", "call_sendipcp", GET_STAT(call_sendipcp)); - cli_print(cli, "%-30s%lu", "call_sendchap", GET_STAT(call_sendchap)); + cli_print(cli, "%-30s%lu", "call_sendarp", GET_STAT(call_sendarp)); + cli_print(cli, "%-30s%lu", "call_sendipcp", GET_STAT(call_sendipcp)); + cli_print(cli, "%-30s%lu", "call_sendchap", GET_STAT(call_sendchap)); cli_print(cli, "%-30s%lu", "call_sessionbyip", GET_STAT(call_sessionbyip)); - cli_print(cli, "%-30s%lu", "call_sessionbyuser", GET_STAT(call_sessionbyuser)); + cli_print(cli, "%-30s%lu", "call_sessionbyuser", GET_STAT(call_sessionbyuser)); cli_print(cli, "%-30s%lu", "call_tunnelsend", GET_STAT(call_tunnelsend)); cli_print(cli, "%-30s%lu", "call_tunnelkill", GET_STAT(call_tunnelkill)); - cli_print(cli, "%-30s%lu", "call_tunnelshutdown", GET_STAT(call_tunnelshutdown)); + cli_print(cli, "%-30s%lu", "call_tunnelshutdown", GET_STAT(call_tunnelshutdown)); cli_print(cli, "%-30s%lu", "call_sessionkill", GET_STAT(call_sessionkill)); - cli_print(cli, "%-30s%lu", "call_sessionshutdown", GET_STAT(call_sessionshutdown)); + cli_print(cli, "%-30s%lu", "call_sessionshutdown", GET_STAT(call_sessionshutdown)); cli_print(cli, "%-30s%lu", "call_sessionsetup", GET_STAT(call_sessionsetup)); - cli_print(cli, "%-30s%lu", "call_assign_ip_address",GET_STAT(call_assign_ip_address)); - cli_print(cli, "%-30s%lu", "call_free_ip_address", GET_STAT(call_free_ip_address)); - cli_print(cli, "%-30s%lu", "call_dump_acct_info", GET_STAT(call_dump_acct_info)); + cli_print(cli, "%-30s%lu", "call_assign_ip_address", GET_STAT(call_assign_ip_address)); + cli_print(cli, "%-30s%lu", "call_free_ip_address", GET_STAT(call_free_ip_address)); + cli_print(cli, "%-30s%lu", "call_dump_acct_info", GET_STAT(call_dump_acct_info)); cli_print(cli, "%-30s%lu", "call_radiussend", GET_STAT(call_radiussend)); cli_print(cli, "%-30s%lu", "call_radiusretry", GET_STAT(call_radiusretry)); #endif @@ -775,7 +777,7 @@ int cmd_show_pool(struct cli_def *cli, char *command, char **argv, int argc) if (!ip_address_pool[i].address) continue; if (ip_address_pool[i].assigned) { - cli_print(cli, "%-15s Y %8d %s", + cli_print(cli, "%-15s\tY %8d %s", inet_toa(htonl(ip_address_pool[i].address)), ip_address_pool[i].session, session[ip_address_pool[i].session].user); used++; @@ -783,11 +785,11 @@ int cmd_show_pool(struct cli_def *cli, char *command, char **argv, int argc) else { if (ip_address_pool[i].last) - cli_print(cli, "%-15s N %8s [%s] %ds", + cli_print(cli, "%-15s\tN %8s [%s] %ds", inet_toa(htonl(ip_address_pool[i].address)), "", ip_address_pool[i].user, time_now - ip_address_pool[i].last); else if (show_all) - cli_print(cli, "%-15s N", inet_toa(htonl(ip_address_pool[i].address))); + cli_print(cli, "%-15s\tN", inet_toa(htonl(ip_address_pool[i].address))); free++; } -- 2.20.1