From 7aff58efe6e12ed26df03ae8fe2daa08b7acd21d Mon Sep 17 00:00:00 2001 From: Augusto Bott Date: Mon, 5 Sep 2011 05:41:55 -0300 Subject: [PATCH] Static ARP binding * Added "static ARP" flag on nvram variable dhcpd_static (www/basic-static.asp) * New option "Ignore DHCP requests from unknown devices" (www/advanced-dhcpdns.asp) * Updated nvram/defaults.c, httpd/tomato.c and www/tools-wol.asp to handle changes (new format, max length, defaults, etc...) * Implementation quite similar to static ARP binding on Teaman-BWM --- release/src/router/httpd/tomato.c | 3 +- release/src/router/nvram/defaults.c | 2 + release/src/router/rc/Makefile | 1 + release/src/router/rc/arpbind.c | 46 ++++++++ release/src/router/rc/init.c | 1 + release/src/router/rc/rc.h | 4 + release/src/router/rc/services.c | 29 ++++- release/src/router/www/advanced-dhcpdns.asp | 64 +++++++++-- release/src/router/www/basic-static.asp | 164 +++++++++++++++++----------- release/src/router/www/bwm-common.js | 2 +- release/src/router/www/tomato.js | 2 +- release/src/router/www/tools-wol.asp | 2 +- 12 files changed, 243 insertions(+), 77 deletions(-) create mode 100644 release/src/router/rc/arpbind.c diff --git a/release/src/router/httpd/tomato.c b/release/src/router/httpd/tomato.c index 0636bd857c..c40a1bca53 100644 --- a/release/src/router/httpd/tomato.c +++ b/release/src/router/httpd/tomato.c @@ -511,7 +511,7 @@ static const nvset_t nvset_list[] = { { "ntp_kiss", V_LENGTH(0, 255) }, // basic-static - { "dhcpd_static", V_LENGTH(0, 106*101)}, // 106 (max chars per entry) x 100 entries + { "dhcpd_static", V_LENGTH(0, 105*141)}, // 105 (max chars per entry) x 140 entries // basic-ddns { "ddnsx0", V_LENGTH(0, 2048) }, @@ -685,6 +685,7 @@ static const nvset_t nvset_list[] = { { "dhcpc_custom", V_LENGTH(0, 80) }, { "dns_norebind", V_01 }, { "dnsmasq_custom", V_TEXT(0, 2048) }, + { "dhcpd_static_only", V_01 }, // { "dnsmasq_norw", V_01 }, // advanced-firewall diff --git a/release/src/router/nvram/defaults.c b/release/src/router/nvram/defaults.c index 6487aa0c94..42221f1163 100644 --- a/release/src/router/nvram/defaults.c +++ b/release/src/router/nvram/defaults.c @@ -411,6 +411,7 @@ const defaults_t defaults[] = { { "dhcpc_custom", "" }, { "dns_norebind", "1" }, { "dnsmasq_custom", "" }, + { "dhcpd_static_only", "0" }, // { "dnsmasq_norw", "0" }, // advanced-firewall @@ -569,6 +570,7 @@ const defaults_t defaults[] = { { "cstats_data", "" }, { "cstats_colors", "" }, { "cstats_exclude", "" }, + { "cstats_include", "192.168.1.0" }, { "cstats_sshut", "1" }, { "cstats_bak", "0" }, diff --git a/release/src/router/rc/Makefile b/release/src/router/rc/Makefile index 01f36e4815..0d7fb6288e 100644 --- a/release/src/router/rc/Makefile +++ b/release/src/router/rc/Makefile @@ -15,6 +15,7 @@ OBJS += firewall.o ppp.o telssh.o wnas.o OBJS += listen.o redial.o led.o qos.o forward.o misc.o mtd.o OBJS += buttons.o restrict.o gpio.o sched.o OBJS += account.o +OBJS += arpbind.o # heartbeat.o ifeq ($(TCONFIG_USB),y) diff --git a/release/src/router/rc/arpbind.c b/release/src/router/rc/arpbind.c new file mode 100644 index 0000000000..4400de8444 --- /dev/null +++ b/release/src/router/rc/arpbind.c @@ -0,0 +1,46 @@ +#include "rc.h" + +void start_arpbind(void) { + + char *nvp, *nv, *b; + const char *ipaddr, *macaddr; + const char *name, *bind; + + nvp = nv = strdup(nvram_safe_get("dhcpd_static")); + if (!nv) return; + +// clear arp table first + stop_arpbind(); + + while ((b = strsep(&nvp, ">")) != NULL) { + /* + macaddranotherhwaddr = 53 w/ delim + // PREVIOUS/OLD FORMAT: + // 00:aa:bb:cc:dd:ee<123 = 73 w/ delim // 00:aa:bb:cc:dd:ee<123.123.123.123 = 85 w/ delim - // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123 = 106 w/ delim + // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123 = 103 w/ delim + + // NEW FORMAT (+static ARP binding flag after hostname): + // 00:aa:bb:cc:dd:ee<123 = 75 w/ delim + // 00:aa:bb:cc:dd:ee<123.123.123.123 = 87 w/ delim + // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123 = 105 w/ delim + p = nvram_safe_get("dhcpd_static"); while ((e = strchr(p, '>')) != NULL) { n = (e - p); - if (n > 105) { + if (n > 104) { p = e + 1; continue; } @@ -306,6 +317,10 @@ void start_dnsmasq() name = e + 1; + if ((e = strchr(name, '<')) != NULL) { + *e = 0; + } + if ((hf) && (*name != 0)) { fprintf(hf, "%s %s\n", ip, name); } @@ -1970,6 +1985,12 @@ TOP: goto CLEAR; } + if (strcmp(service, "arpbind") == 0) { + if (action & A_STOP) stop_arpbind(); + if (action & A_START) start_arpbind(); + goto CLEAR; + } + if (strcmp(service, "qos") == 0) { if (action & A_STOP) { stop_qos(); @@ -2216,12 +2237,14 @@ TOP: stop_dnsmasq(); stop_nas(); stop_wan(); + stop_arpbind(); stop_lan(); stop_vlan(); } if (action & A_START) { start_vlan(); start_lan(); + start_arpbind(); start_wan(BOOT); start_nas(); start_dnsmasq(); diff --git a/release/src/router/www/advanced-dhcpdns.asp b/release/src/router/www/advanced-dhcpdns.asp index cacd81b643..92aa529ffa 100644 --- a/release/src/router/www/advanced-dhcpdns.asp +++ b/release/src/router/www/advanced-dhcpdns.asp @@ -13,7 +13,7 @@ [<% ident(); %>] Advanced: DHCP / DNS - +<% css(); %> @@ -29,7 +29,7 @@ textarea { - +