From 2fd5a890f87a5bcfb365398e70580c3d33e2c44a Mon Sep 17 00:00:00 2001 From: Vicente Date: Tue, 15 Oct 2013 17:36:45 +0200 Subject: [PATCH] BW Limiter: Restore BW limiter broken. WNDR3700 v3 Netgear included. Firewall: typos and corrections for ipv6. init.c : RT-AC56U start up add. --- release/src/router/rc/Makefile | 2 +- release/src/router/rc/buttons.c | 5 + release/src/router/rc/dhcp.c | 1 + release/src/router/rc/firewall.c | 29 +-- release/src/router/rc/init.c | 97 +++++++++- release/src/router/rc/network.c | 27 ++- release/src/router/rc/qos.c | 9 +- release/src/router/rc/qoslimit.c | 377 --------------------------------------- release/src/router/rc/rc.c | 4 - release/src/router/rc/rc.h | 6 +- release/src/router/rc/services.c | 70 ++++---- release/src/router/rc/wan.c | 13 +- 12 files changed, 163 insertions(+), 477 deletions(-) delete mode 100644 release/src/router/rc/qoslimit.c diff --git a/release/src/router/rc/Makefile b/release/src/router/rc/Makefile index 41fac09eae..ae92acfd06 100644 --- a/release/src/router/rc/Makefile +++ b/release/src/router/rc/Makefile @@ -15,7 +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 += arpbind.o -OBJS += qoslimit.o +OBJS += new_qoslimit.o OBJS += blink_5g.o ifeq ($(TCONFIG_USB),y) diff --git a/release/src/router/rc/buttons.c b/release/src/router/rc/buttons.c index 276e9cc751..0858cb69a5 100644 --- a/release/src/router/rc/buttons.c +++ b/release/src/router/rc/buttons.c @@ -182,6 +182,11 @@ int buttons_main(int argc, char *argv[]) ses_mask = 1 << 0; ses_led = LED_AOSS; break; + case MODEL_WNDR3700v3: + reset_mask = 1 << 3; + ses_mask = 1 << 2; + ses_led = LED_AOSS; + break; case MODEL_F7D3301: case MODEL_F7D3302: case MODEL_F7D4301: diff --git a/release/src/router/rc/dhcp.c b/release/src/router/rc/dhcp.c index c0b1e9271b..a847b058a5 100644 --- a/release/src/router/rc/dhcp.c +++ b/release/src/router/rc/dhcp.c @@ -457,6 +457,7 @@ int dhcp6c_state_main(int argc, char **argv) } // (re)start dnsmasq and httpd + start_dnsmasq(); start_httpd(); TRACE_PT("ipv6_get_dns=%s\n", nvram_safe_get("ipv6_get_dns")); diff --git a/release/src/router/rc/firewall.c b/release/src/router/rc/firewall.c index 9599a1611f..63ca01e5a6 100644 --- a/release/src/router/rc/firewall.c +++ b/release/src/router/rc/firewall.c @@ -1208,12 +1208,12 @@ static void filter_forward(void) sprintf(lanN_ifname2, "lan%s_ifname", bridge2); if (strncmp(nvram_safe_get(lanN_ifname2), "br", 2) == 0) { - ip46t_write("-A FORWARD -i %s -o %s -j DROP\n", - nvram_safe_get(lanN_ifname), - nvram_safe_get(lanN_ifname2)); + ipt_write("-A FORWARD -i %s -o %s -j DROP\n", + nvram_safe_get(lanN_ifname), + nvram_safe_get(lanN_ifname2)); } } -// ipt_write("-A FORWARD -i %s -j %s\n", nvram_safe_get(lanN_ifname), chain_out_accept); +// ip46t_write("-A FORWARD -i %s -j %s\n", nvram_safe_get(lanN_ifname), chain_out_accept); } } #endif @@ -1229,7 +1229,8 @@ static void filter_forward(void) #ifdef TCONFIG_IPV6 // Filter out invalid WAN->WAN connections if (*wan6face) - ip6t_write("-A FORWARD -o %s ! -i %s -j %s\n", wan6face, lanface, chain_in_drop); +// ip6t_write("-A FORWARD -o %s ! -i %s -j %s\n", wan6face, lanface, chain_in_drop); //shibby - we cant drop connections from WAN to LAN1-3 + ip6t_write("-A FORWARD -o %s -i %s -j %s\n", wan6face, wan6face, chain_in_drop); //shibby - drop connection from WAN -> WAN only #ifdef LINUX26 modprobe("xt_length"); @@ -1270,29 +1271,13 @@ static void filter_forward(void) sprintf(lanN_ifname, "lan%s_ifname", bridge); if (strncmp(nvram_safe_get(lanN_ifname), "br", 2) == 0) { - ipt_write("-A FORWARD -i %s -j %s\n", nvram_safe_get(lanN_ifname), chain_out_accept); + ip46t_write("-A FORWARD -i %s -j %s\n", nvram_safe_get(lanN_ifname), chain_out_accept); } } #else ipt_write("-A FORWARD -i %s -j %s\n", lanface, chain_out_accept); #endif -// #ifdef TCONFIG_VLAN -/* for (i = 0; i < wanfaces.count; ++i) { - if (*(wanfaces.iface[i].name)) { - ipt_write("-A FORWARD -i %s -o %s -j %s\n", lanface, wanfaces.iface[i].name, chain_out_accept); - if (strcmp(lan1face,"")!=0) - ipt_write("-A FORWARD -i %s -o %s -j %s\n", lan1face, wanfaces.iface[i].name, chain_out_accept); - if (strcmp(lan2face,"")!=0) - ipt_write("-A FORWARD -i %s -o %s -j %s\n", lan2face, wanfaces.iface[i].name, chain_out_accept); - if (strcmp(lan3face,"")!=0) - ipt_write("-A FORWARD -i %s -o %s -j %s\n", lan3face, wanfaces.iface[i].name, chain_out_accept); - } - } -*/ -// #else -// ipt_write("-A FORWARD -i %s -j %s\n", lanface, chain_out_accept); -// #endif #ifdef TCONFIG_IPV6 //IPv6 forward LAN->WAN accept diff --git a/release/src/router/rc/init.c b/release/src/router/rc/init.c index 32c3659ead..e452d0caf8 100644 --- a/release/src/router/rc/init.c +++ b/release/src/router/rc/init.c @@ -469,6 +469,7 @@ static int init_vlan_ports(void) case MODEL_RTN15U: case MODEL_E3200: case MODEL_E4200: + case MODEL_WNDR3700v3: dirty |= check_nv("vlan1ports", "0 1 2 3 8*"); dirty |= check_nv("vlan2ports", "4 8"); break; @@ -577,6 +578,11 @@ static void check_bootnv(void) case MODEL_WNR2000v2: dirty |= check_nv("ledbh5", "8"); break; + case MODEL_WNDR3700v3: + dirty |= check_nv("boardflags", "0x00001310"); + dirty |= check_nv("vlan2hwname", "et0"); + dirty |= check_nv("reset_gpio", "3"); + break; case MODEL_WRT320N: dirty |= check_nv("reset_gpio", "5"); dirty |= check_nv("ledbh0", "136"); @@ -1188,6 +1194,66 @@ static int init_nvram(void) nvram_unset("vlan0ports"); } break; +/* + case MODEL_RTAC56U: + mfr = "Asus"; + name = "RT-AC56U"; + features = SUP_SES | SUP_80211N | SUP_1000ET | SUP_80211AC; + nvram_set("vlan1hwname", "et0"); + nvram_set("vlan2hwname", "et0"); + nvram_set("lan_ifname", "br0"); + nvram_set("0:ledbh3", "0x87"); // since 163.42 // + nvram_set("1:ledbh10", "0x87"); + nvram_set("landevs", "vlan1 wl0 wl1"); + nvram_set("wl_ifnames", "eth1 eth2"); + nvram_set("wl0_vifnames", "wl0.1 wl0.2 wl0.3"); + nvram_set("wl1_vifnames", "wl1.1 wl1.2 wl1.3"); + nvram_set_int("pwr_usb_gpio", 9|GPIO_ACTIVE_LOW); + nvram_set_int("pwr_usb_gpio2", 10|GPIO_ACTIVE_LOW); // Use at the first shipment of RT-AC56U. + nvram_set_int("led_usb_gpio", 14|GPIO_ACTIVE_LOW); // change led gpio(usb2/usb3) to sync the outer case + nvram_set_int("led_wan_gpio", 1|GPIO_ACTIVE_LOW); + nvram_set_int("led_lan_gpio", 2|GPIO_ACTIVE_LOW); + nvram_set_int("led_pwr_gpio", 3|GPIO_ACTIVE_LOW); + nvram_set_int("led_wps_gpio", 3|GPIO_ACTIVE_LOW); + nvram_set_int("led_all_gpio", 4|GPIO_ACTIVE_LOW); // actually, this is high active, and will power off all led when active; to fake LOW_ACTIVE to sync boardapi + nvram_set_int("led_5g_gpio", 6|GPIO_ACTIVE_LOW); // 4352's fake led 5g + nvram_set_int("led_usb3_gpio", 0|GPIO_ACTIVE_LOW); // change led gpio(usb2/usb3) to sync the outer case + nvram_set_int("btn_wps_gpio", 15|GPIO_ACTIVE_LOW); + nvram_set_int("btn_rst_gpio", 11|GPIO_ACTIVE_LOW); +#ifdef RTCONFIG_WIFI_TOG_BTN + nvram_set_int("btn_wltog_gpio", 7|GPIO_ACTIVE_LOW); +#endif +#ifdef RTCONFIG_TURBO + nvram_set_int("btn_turbo_gpio", 5); +#endif + +#ifdef RTCONFIG_XHCIMODE + nvram_set("xhci_ports", "1-1"); + nvram_set("ehci_ports", "2-1 2-2"); + nvram_set("ohci_ports", "3-1 3-2"); +#else + if(nvram_get_int("usb_usb3") == 1){ + nvram_set("xhci_ports", "1-1"); + nvram_set("ehci_ports", "2-1 2-2"); + nvram_set("ohci_ports", "3-1 3-2"); + } + else{ + nvram_unset("xhci_ports"); + nvram_set("ehci_ports", "1-1 1-2"); + nvram_set("ohci_ports", "2-1 2-2"); + } +#endif + + if(!nvram_get("ct_max")) + nvram_set("ct_max", "300000"); + add_rc_support("mssid 2.4G 5G update usbX2"); + add_rc_support("switchctrl"); // broadcom: for jumbo frame only + add_rc_support("manual_stb"); + add_rc_support("pwrctrl"); + add_rc_support("WIFI_LOGO"); + add_rc_support("nandflash"); + break; +*/ case MODEL_RTN66U: mfr = "Asus"; #ifdef CONFIG_BCMWL6 @@ -1231,13 +1297,6 @@ static int init_nvram(void) inc_mac(s, +1); nvram_set("wl1_hwaddr", s); -// nvram_set("wl0_phytype", "h"); -// nvram_set("wl0_phytypes", "h"); -// nvram_set("wl1_phytype", "h"); // "h" for now. For 80Mhz should be "v" -// nvram_set("wl1_phytypes", "h"); // "h" for now. For 80Mhz should be "v" -// nvram_set("wl1_unit" ,"1"); - - // bcm4360ac_defaults nvram_set("pci/2/1/aa2g", "0"); nvram_set("pci/2/1/aa5g", "7"); @@ -1323,10 +1382,11 @@ static int init_nvram(void) nvram_set("pci/2/1/ledbh3", "11"); nvram_set("pci/2/1/ledbh10", "7"); - //force EU country for eth2 - nvram_set("pci/2/1/ccode", "EU"); + //force USA country for eth2 + nvram_set("pci/2/1/ccode", "US"); } break; + case MODEL_W1800R: mfr = "Tenda"; name = "W1800R"; //id, board, rev same as N66 @@ -1480,6 +1540,25 @@ static int init_nvram(void) nvram_set("wl_ifname", "eth1"); } break; + case MODEL_WNDR3700v3: + mfr = "Netgear"; + name = "WNDR3700 v3"; + features = SUP_SES | SUP_80211N | SUP_1000ET; +#ifdef TCONFIG_USB + nvram_set("usb_uhci", "-1"); +#endif + if (!nvram_match("t_fix1", (char *)name)) { + nvram_set("sromrev", "8"); + nvram_set("lan_ifnames", "vlan1 eth1 eth2"); + nvram_set("landevs", "vlan1 wl0 wl1"); + nvram_set("wan_ifnameX", "vlan2"); + nvram_set("wl_ifname", "eth1"); + nvram_set("wl_ifname", "eth2"); + nvram_set("boardflags", "0x00001310"); //needed to enable USB + nvram_set("wandevs", "et0"); + nvram_set("t_fix1", name); + } + break; case MODEL_F7D3301: case MODEL_F7D3302: case MODEL_F7D4301: diff --git a/release/src/router/rc/network.c b/release/src/router/rc/network.c index 0c9193e92b..4815b18ab4 100644 --- a/release/src/router/rc/network.c +++ b/release/src/router/rc/network.c @@ -686,16 +686,16 @@ void enable_ipv6(int enable) if ((dir = opendir("/proc/sys/net/ipv6/conf")) != NULL) { while ((dirent = readdir(dir)) != NULL) { - if (strcmp("vlan1", dirent->d_name) && - strcmp("eth0", dirent->d_name) && - strcmp("all", dirent->d_name) && - strcmp("eth1", dirent->d_name)) - { - - sprintf(s, "/proc/sys/net/ipv6/conf/%s/disable_ipv6", dirent->d_name); - f_write_string(s, enable ? "0" : "1", 0, 0); + if (strcmp("vlan1", dirent->d_name) && + strcmp("eth0", dirent->d_name) && + strcmp("all", dirent->d_name) && + strcmp("eth1", dirent->d_name)) + { + + sprintf(s, "/proc/sys/net/ipv6/conf/%s/disable_ipv6", dirent->d_name); + f_write_string(s, enable ? "0" : "1", 0, 0); + } } - } closedir(dir); } } @@ -740,7 +740,7 @@ void start_lan(void) #endif check_afterburner(); #ifdef TCONFIG_IPV6 - enable_ipv6(ipv6_enabled()); //tell Kernel to disable/enable IPv6 for most interfaces + enable_ipv6(ipv6_enabled()); //tell Kernel to disable/enable IPv6 for most interfaces #endif vlan0tag = nvram_get_int("vlan0tag"); @@ -861,7 +861,7 @@ void start_lan(void) } if ((nvram_get_int("wan_islan")) && (br==0) && - ((get_wan_proto() == WP_DISABLED) || (get_wan_proto() == WP_PPP3G) || (sta))) { + ((get_wan_proto() == WP_DISABLED) || (sta))) { ifname = nvram_get("wan_ifnameX"); if (ifconfig(ifname, IFUP, NULL, NULL) == 0) eval("brctl", "addif", lan_ifname, ifname); @@ -1041,8 +1041,8 @@ void do_static_routes(int add) char *modem_ipaddr; if ( (nvram_match("wan_proto", "pppoe") || nvram_match("wan_proto", "dhcp") || nvram_match("wan_proto", "static") ) - && (modem_ipaddr = nvram_safe_get("modem_ipaddr")) && *modem_ipaddr && !nvram_match("modem_ipaddr","0.0.0.0") - && (!foreach_wif(1, NULL, is_sta)) ) { + && (modem_ipaddr = nvram_safe_get("modem_ipaddr")) && *modem_ipaddr && !nvram_match("modem_ipaddr","0.0.0.0") + && (!foreach_wif(1, NULL, is_sta)) ) { char ip[16]; char *end = rindex(modem_ipaddr,'.')+1; unsigned char c = atoi(end); @@ -1052,7 +1052,6 @@ void do_static_routes(int add) eval("ip", "addr", add ?"add":"del", ip, "peer", modem_ipaddr, "dev", iface); } - } void hotplug_net(void) diff --git a/release/src/router/rc/qos.c b/release/src/router/rc/qos.c index 839aa3ec11..6285a62efe 100644 --- a/release/src/router/rc/qos.c +++ b/release/src/router/rc/qos.c @@ -471,7 +471,7 @@ void start_qos(void) else s[0] = 0; x = (i + 1) * 10; - if (overhead == 0) { + if (overhead == 0) { fprintf(f, "# egress %d: %u-%u%%\n" "\t$TCA parent 1:1 classid 1:%d htb rate %ukbit %s %s prio %d quantum %u\n" @@ -491,7 +491,7 @@ void start_qos(void) x, calc(bw, rate), s, burst_leaf, i+1, mtu, overhead, x, x, x, i + 1, x); - } + } } free(buf); @@ -689,7 +689,10 @@ void start_qos(void) calc(incomingBandwidthInKilobitsPerSecond, ceil); // burst rate (2% of the classes' rate) - don't know if we should use this - +//Commented out KDB 20130531 - produces compiler warning about being unused! +// unsigned int burstRateInBitsPerSecond = +// (rateInKilobitsPerSecond * 1000) / 50; + r2q = 10; if ((incomingBandwidthInKilobitsPerSecond * 1000) / (8 * r2q) < mtu) { diff --git a/release/src/router/rc/qoslimit.c b/release/src/router/rc/qoslimit.c deleted file mode 100644 index 90c965d65a..0000000000 --- a/release/src/router/rc/qoslimit.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - - Tomato Firmware - Copyright (C) 2006-2008 Jonathan Zarate - Copyright (C) 2011 Deon 'PrinceAMD' Thomas - rate limit & connection limit by conanxu -*/ - -#include "rc.h" - -#include -static const char *qoslimitfn = "/etc/qoslimit"; - -/*int chain -1 = MANGLE -2 = NAT -*/ - -#define IP_ADDRESS 0 -#define MAC_ADDRESS 1 -#define IP_RANGE 2 - -void address_checker (int * address_type, char *ipaddr_old, char *ipaddr) -{ - char * second_part, *last_dot; - int length_to_minus, length_to_dot; - - second_part = strchr(ipaddr_old, '-'); - if (second_part != NULL) { - /* ip range */ - *address_type = IP_RANGE; - if (strchr(second_part+1, '.') != NULL) { - /* long notation */ - strcpy (ipaddr, ipaddr_old); - } - else { - /* short notation */ - last_dot = strrchr(ipaddr_old, '.'); - length_to_minus = second_part - ipaddr_old; - length_to_dot = last_dot- ipaddr_old; - strncpy(ipaddr, ipaddr_old, length_to_minus + 1); - strncpy(ipaddr + length_to_minus + 1, ipaddr, length_to_dot + 1); - strcpy(ipaddr + length_to_minus + length_to_dot + 2, second_part +1); - } - } - else { - /* mac address of ipaddres */ - if (strlen(ipaddr_old) != 17) { - /* IP_ADDRESS */ - *address_type = IP_ADDRESS; - } - else { - /* MAC ADDRESS */ - *address_type = MAC_ADDRESS; - } - strcpy (ipaddr, ipaddr_old); - } -} - -void ipt_qoslimit(int chain) -{ - char *buf; - char *g; - char *p; - char *ibw,*obw;//bandwidth - char seq[4];//mark number - int iSeq = 10; - char *ipaddr_old; - char ipaddr[30];//ip address - char *dlrate,*dlceil;//guaranteed rate & maximum rate for download - char *ulrate,*ulceil;//guaranteed rate & maximum rate for upload - char *priority;//priority - char *lanipaddr; //lan ip address - char *lanmask; //lan netmask - char *tcplimit,*udplimit;//tcp connection limit & udp packets per second - char *laninface; // lan interface - int priority_num; - int i, address_type; - - //qosl is enabled? - if (!nvram_get_int("qosl_enable")) return; - - //read qos1rules from nvram - g = buf = strdup(nvram_safe_get("qosl_rules")); - - ibw = nvram_safe_get("qos_ibw"); // Read from QOS setting - KRP - obw = nvram_safe_get("qos_obw"); // Read from QOS setting - KRP - - lanipaddr = nvram_safe_get("lan_ipaddr"); - lanmask = nvram_safe_get("lan_netmask"); - laninface = nvram_safe_get("lan_ifname"); - - - //MANGLE - if (chain == 1) - { - ipt_write( - "-A PREROUTING -j IMQ -i %s --todev 1\n" - "-A POSTROUTING -j IMQ -o %s --todev 2\n" - ,laninface,laninface); - } - - while (g) { - /* - ipaddr_old")) == NULL) break; - i = vstrsep(p, "<", &ipaddr_old, &dlrate, &dlceil, &ulrate, &ulceil, &priority, &tcplimit, &udplimit); - if (i!=8) continue; - - priority_num = atoi(priority); - if ((priority_num < 0) || (priority_num > 5)) continue; - - if (!strcmp(ipaddr_old,"")) continue; - - address_checker (&address_type, ipaddr_old, ipaddr); - sprintf(seq,"%d",iSeq); - iSeq++; - - if (!strcmp(dlceil,"")) strcpy(dlceil, dlrate); - if (strcmp(dlrate,"") && strcmp(dlceil, "")) { - if(chain == 1) { - switch (address_type) - { - case IP_ADDRESS: - ipt_write( - "-A POSTROUTING ! -s %s/%s -d %s -j MARK --set-mark %s\n" - ,lanipaddr,lanmask,ipaddr,seq); - break; - case MAC_ADDRESS: - break; - case IP_RANGE: - ipt_write( - "-A POSTROUTING ! -s %s/%s -m iprange --dst-range %s -j MARK --set-mark %s\n" - ,lanipaddr,lanmask,ipaddr,seq); - break; - } - } - } - - if (!strcmp(ulceil,"")) strcpy(ulceil, ulrate); - if (strcmp(ulrate,"") && strcmp(ulceil, "")) { - if (chain == 1) { - switch (address_type) - { - case IP_ADDRESS: - ipt_write( - "-A PREROUTING -s %s ! -d %s/%s -j MARK --set-mark %s\n" - ,ipaddr,lanipaddr,lanmask,seq); - break; - case MAC_ADDRESS: - ipt_write( - "-A PREROUTING -m mac --mac-source %s ! -d %s/%s -j MARK --set-mark %s\n" - ,ipaddr,lanipaddr,lanmask,seq); - break; - case IP_RANGE: - ipt_write( - "-A PREROUTING -m iprange --src-range %s ! -d %s/%s -j MARK --set-mark %s\n" - ,ipaddr,lanipaddr,lanmask,seq); - break; - } - } - } - - if(atoi(tcplimit) > 0){ - if (chain == 2) { - switch (address_type) - { - case IP_ADDRESS: - ipt_write( - "-A PREROUTING -s %s -p tcp --syn -m connlimit --connlimit-above %s -j DROP\n" - ,ipaddr,tcplimit); - break; - case MAC_ADDRESS: - ipt_write( - "-A PREROUTING -m mac --mac-source %s -p tcp --syn -m connlimit --connlimit-above %s -j DROP\n" - ,ipaddr,tcplimit); - break; - case IP_RANGE: - ipt_write( - "-A PREROUTING -m iprange --src-range %s -p tcp --syn -m connlimit --connlimit-above %s -j DROP\n" - ,ipaddr,tcplimit); - break; - } - } - } - if(atoi(udplimit) > 0){ - if (chain == 2) { - switch (address_type) - { - case IP_ADDRESS: - ipt_write( - "-A PREROUTING -s %s -p udp -m limit --limit %s/sec -j ACCEPT\n" - ,ipaddr,udplimit); - break; - case MAC_ADDRESS: - ipt_write( - "-A PREROUTING -m mac --mac-source %s -p udp -m limit --limit %s/sec -j ACCEPT\n" - ,ipaddr,udplimit); - break; - case IP_RANGE: - ipt_write( - "-A PREROUTING -m iprange --src-range %s -p udp -m limit --limit %s/sec -j ACCEPT\n" - ,ipaddr,udplimit); - break; - } - } - } - } - free(buf); -} - -// read nvram into files -void start_qoslimit(void) -{ - FILE *tc; - char *buf; - char *g; - char *p; - char *ibw,*obw;//bandwidth - char seq[4];//mark number - int iSeq = 10; - char *ipaddr_old; - char ipaddr[30];//ip address - char *dlrate,*dlceil;//guaranteed rate & maximum rate for download - char *ulrate,*ulceil;//guaranteed rate & maximum rate for upload - char *priority;//priority - char *lanipaddr; //lan ip address - char *lanmask; //lan netmask - char *tcplimit,*udplimit;//tcp connection limit & udp packets per second - int priority_num; - int i, address_type; - int s[6]; - - //qosl is enabled? - if (!nvram_get_int("qosl_enable")) return; - - //read qosl rules from nvram - g = buf = strdup(nvram_safe_get("qosl_rules")); - - ibw = nvram_safe_get("qos_ibw"); // Read from QOS setting - KRP - obw = nvram_safe_get("qos_obw"); // Read from QOS setting - KRP - - lanipaddr = nvram_safe_get("lan_ipaddr"); - lanmask = nvram_safe_get("lan_netmask"); - - if ((tc = fopen(qoslimitfn, "w")) == NULL) return; - - fprintf(tc, - "#!/bin/sh\n" - "ip link set imq1 up\n" - "ip link set imq2 up\n" - "\n" - "tc qdisc del dev imq1 root 2>/dev/null\n" - "tc qdisc del dev imq2 root 2>/dev/null\n" - "tc qdisc del dev br0 root 2>/dev/null\n" //fix me [why should mac get filter here??] - "\n" - "TCAM=\"tc class add dev br0\"\n" //fix me - "TFAM=\"tc filter add dev br0\"\n" //fix me - "TQAM=\"tc qdisc add dev br0\"\n" //fix me - "\n" - "TCA=\"tc class add dev imq2\"\n" - "TFA=\"tc filter add dev imq2\"\n" - "TQA=\"tc qdisc add dev imq2\"\n" - "\n" - "SFQ=\"sfq perturb 10\"\n" - "\n" - "TCAU=\"tc class add dev imq1\"\n" - "TFAU=\"tc filter add dev imq1\"\n" - "TQAU=\"tc qdisc add dev imq1\"\n" - "\n" - "tc qdisc add dev imq2 root handle 1: htb\n" - "tc class add dev imq2 parent 1: classid 1:1 htb rate %skbit\n" - "\n" - "tc qdisc add dev br0 root handle 1: htb\n" - "tc class add dev br0 parent 1: classid 1:1 htb rate %skbit\n" - "\n" - "tc qdisc add dev imq1 root handle 1: htb\n" - "tc class add dev imq1 parent 1: classid 1:1 htb rate %skbit\n" - "\n" - ,ibw,ibw,obw - ); - - while (g) { - /* - ipaddr_old")) == NULL) break; - i = vstrsep(p, "<", &ipaddr_old, &dlrate, &dlceil, &ulrate, &ulceil, &priority, &tcplimit, &udplimit); - if (i!=8) continue; - priority_num = atoi(priority); - if ((priority_num < 0) || (priority_num > 5)) continue; - if (!strcmp(ipaddr_old,"")) continue; - - address_checker(&address_type, ipaddr_old, ipaddr); - sprintf(seq,"%d",iSeq); - iSeq++; - if (!strcmp(dlceil,"")) strcpy(dlceil, dlrate); - if (strcmp(dlrate,"") && strcmp(dlceil, "")) { - if (address_type != MAC_ADDRESS) { - fprintf(tc, - "$TCA parent 1:1 classid 1:%s htb rate %skbit ceil %skbit prio %s\n" - "$TQA parent 1:%s handle %s: $SFQ\n" - "$TFA parent 1:0 prio %s protocol ip handle %s fw flowid 1:%s\n" - "\n" - ,seq,dlrate,dlceil,priority - ,seq,seq - ,priority,seq,seq); - } - else if (address_type == MAC_ADDRESS ) { - sscanf(ipaddr, "%02X:%02X:%02X:%02X:%02X:%02X",&s[0],&s[1],&s[2],&s[3],&s[4],&s[5]); - - fprintf(tc, - "$TCAM parent 1:1 classid 1:%s htb rate %skbit ceil %skbit prio %s\n" - "$TQAM parent 1:%s handle %s: $SFQ\n" - "$TFAM parent 1:0 protocol ip prio %s u32 match u16 0x0800 0xFFFF at -2 match u32 0x%02X%02X%02X%02X 0xFFFFFFFF at -12 match u16 0x%02X%02X 0xFFFF at -14 flowid 1:%s\n" - "\n" - ,seq,dlrate,dlceil,priority - ,seq,seq - ,priority,s[2],s[3],s[4],s[5],s[0],s[1],seq); - } - } - - if (!strcmp(ulceil,"")) strcpy(ulceil, dlrate); - if (strcmp(ulrate,"") && strcmp(ulceil, "")) { - fprintf(tc, - "$TCAU parent 1:1 classid 1:%s htb rate %skbit ceil %skbit prio %s\n" - "$TQAU parent 1:%s handle %s: $SFQ\n" - "$TFAU parent 1:0 prio %s protocol ip handle %s fw flowid 1:%s\n" - "\n" - ,seq,ulrate,ulceil,priority - ,seq,seq - ,priority,seq,seq); - } - } - free(buf); - - fclose(tc); - chmod(qoslimitfn, 0700); - - //fake start - eval((char *)qoslimitfn, "start"); -} - -void stop_qoslimit(void) -{ - FILE *f; - char *s = "/tmp/stop_qoslimittc.sh"; - - if ((f = fopen(s, "w")) == NULL) return; - - fprintf(f, - "#!/bin/sh\n" - "tc qdisc del dev imq2 root\n" - "tc qdisc del dev imq1 root\n" - "tc qdisc del dev br0 root\n" //fix me - "ip link set imq1 down\n" - "ip link set imq2 down\n" //take imq's down - Toastman - - "\n" - ); - - fclose(f); - chmod(s, 0700); - //fake stop - eval((char *)s, "stop"); -} -/* - -PREROUTING (mn) ----> x ----> FORWARD (f) ----> + ----> POSTROUTING (n) - QD | ^ - | | - v | - INPUT (f) OUTPUT (mnf) - - -*/ diff --git a/release/src/router/rc/rc.c b/release/src/router/rc/rc.c index f3cacb8275..055e00ce5d 100644 --- a/release/src/router/rc/rc.c +++ b/release/src/router/rc/rc.c @@ -86,10 +86,6 @@ static const applets_t applets[] = { { "rc", rc_main }, { "ip-up", ipup_main }, { "ip-down", ipdown_main }, -#ifdef TCONFIG_IPV6 - { "ipv6-up", ip6up_main }, - { "ipv6-down", ip6down_main }, -#endif { "ppp_event", pppevent_main }, { "hotplug", hotplug_main }, { "redial", redial_main }, diff --git a/release/src/router/rc/rc.h b/release/src/router/rc/rc.h index ea6293d0c5..d0185ee88f 100644 --- a/release/src/router/rc/rc.h +++ b/release/src/router/rc/rc.h @@ -489,10 +489,10 @@ static inline void stop_vpn_eas() { } #define write_vpn_resolv(f) (0) #endif -// qoslimit.c +// new_qoslimit.c extern void ipt_qoslimit(int chain); -extern void start_qoslimit(void); -extern void stop_qoslimit(void); +extern void new_qoslimit_start(void); +extern void new_qoslimit_stop(void); // arpbind.c extern void start_arpbind(void); diff --git a/release/src/router/rc/services.c b/release/src/router/rc/services.c index f764bd1cfc..bc072767a6 100644 --- a/release/src/router/rc/services.c +++ b/release/src/router/rc/services.c @@ -86,11 +86,7 @@ void start_dnsmasq() int do_dns; int do_dhcpd_hosts; -#ifdef TCONFIG_IPV6 - char *prefix, *ipv6, *mtu; - int do_6to4, do_6rd; - int service; -#endif + TRACE_PT("begin\n"); @@ -168,6 +164,7 @@ void start_dnsmasq() if (n & 2) fprintf(f, "quiet-dhcp6\n"); if (n & 4) fprintf(f, "quiet-ra\n"); } + // dhcp do_dhcpd_hosts=0; char lanN_proto[] = "lanXX_proto"; @@ -353,14 +350,11 @@ void start_dnsmasq() } if ((do_dhcpd_hosts > 0) && (*mac != 0) && (strcmp(mac, "00:00:00:00:00:00") != 0)) { - char static_dhcp_lease[32]; - strcpy(static_dhcp_lease, ""); - if (nvram_get_int("dhcpd_slt") != 0) - sprintf(static_dhcp_lease, ",%s", sdhcp_lease); - if (df) - fprintf(df, "%s,%s%s\n", mac, ip, static_dhcp_lease); - else - fprintf(f, "dhcp-host=%s,%s%s\n", mac, ip, static_dhcp_lease); + if (nvram_get_int("dhcpd_slt") == 0) { + fprintf(f, "dhcp-host=%s,%s\n", mac, ip); + } else { + fprintf(f, "dhcp-host=%s,%s,%s\n", mac, ip, sdhcp_lease); + } } } @@ -392,29 +386,16 @@ void start_dnsmasq() #endif #ifdef TCONFIG_IPV6 - if (ipv6_enabled() && nvram_get_int("ipv6_radvd")) { - service = get_ipv6_service(); - do_6to4 = (service == IPV6_ANYCAST_6TO4); - do_6rd = (service == IPV6_6RD || service == IPV6_6RD_DHCP); - mtu = NULL; +// if (!(*prefix)) prefix = "::"; +// ipv6 = (char *)ipv6_router_address(NULL); +// fprintf(f, "enable-ra\ndhcp-range=tag:br0,%s, slaac, ra-names, 64\n", prefix); +// fprintf(fp, "dhcp-range=lan,::,constructor:%s,ra-stateless,ra-names,%d,%d\n", +// fprintf(f, "enable-ra\ndhcp-range=lan,::1, ::FFFF:FFFF, constructor:%s, ra-names, %d, %s\n", - switch (service) { - case IPV6_NATIVE_DHCP: - case IPV6_ANYCAST_6TO4: - case IPV6_6IN4: - case IPV6_6RD: - case IPV6_6RD_DHCP: - mtu = (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480"; - // fall through - default: - prefix = do_6to4 ? "0:0:0:1::" : nvram_safe_get("ipv6_prefix"); - break; - } - if (!(*prefix)) prefix = "::"; -// ipv6 = (char *)ipv6_router_address(NULL); - - fprintf(f, "enable-ra\ndhcp-range=tag:br0,%s, slaac, ra-names, 64\n", prefix); + if (ipv6_enabled() && nvram_get_int("ipv6_radvd")) { + fprintf(f, "enable-ra\ndhcp-range=::1, ::FFFF:FFFF, constructor:%s, ra-names, %d, %s\n", + nvram_safe_get("lan_ifname"), 64, "12h"); } #endif @@ -461,6 +442,7 @@ void start_dnsmasq() #endif } #endif + } void stop_dnsmasq(void) @@ -777,7 +759,7 @@ void start_ipv6(void) int service; service = get_ipv6_service(); - enable_ip_forward(); + enable_ip6_forward(); // Check if turned on switch (service) { @@ -932,7 +914,6 @@ void start_upnp(void) } #endif - fappend(f, "/jffs/upnpconfig.custom"); fappend(f, "/etc/upnp/config.custom"); fprintf(f, "%s\n", nvram_safe_get("upnp_custom")); fprintf(f, "\ndeny 0-65535 0.0.0.0/0 0-65535\n"); @@ -1300,7 +1281,8 @@ void start_igmp_proxy(void) "quickleave\n" "phyint %s upstream\n" "\taltnet %s\n", - nvram_safe_get("wan_ifname"), +// "phyint %s downstream ratelimit 0\n", + get_wanface(), nvram_get("multicast_altnet") ? : "0.0.0.0/0"); // nvram_safe_get("lan_ifname")); @@ -2209,6 +2191,16 @@ void start_services(void) #ifdef TCONFIG_PPTPD start_pptpd(); #endif + +#ifdef TCONFIG_IPV6 + /* note: starting radvd here might be too early in case of + * DHCPv6 or 6to4 because we won't have received a prefix and + * so it will disable advertisements. To restart them, we have + * to send radvd a SIGHUP, or restart it. + */ + start_dnsmasq(); +#endif + restart_nas_services(1, 1); // !!TB - Samba, FTP and Media Server #ifdef TCONFIG_SNMP @@ -2364,14 +2356,14 @@ TOP: if (strcmp(service, "qoslimit") == 0) { if (action & A_STOP) { - stop_qoslimit(); + new_qoslimit_stop(); } #ifdef TCONFIG_NOCAT stop_splashd(); #endif stop_firewall(); start_firewall(); // always restarted if (action & A_START) { - start_qoslimit(); + new_qoslimit_start(); } #ifdef TCONFIG_NOCAT start_splashd(); diff --git a/release/src/router/rc/wan.c b/release/src/router/rc/wan.c index 5d5dc2e847..170a972fa9 100644 --- a/release/src/router/rc/wan.c +++ b/release/src/router/rc/wan.c @@ -684,7 +684,7 @@ void start_wan(int mode) TRACE_PT("begin\n"); sysinfo(&si); - f_write(wan_connecting, &si.uptime, sizeof(si.uptime), 0, 0); + f_write(wan_connecting, NULL, 0, 0, 0); // @@ -754,7 +754,7 @@ void start_wan(int mode) } else { mtu = nvram_get_int("wan_mtu"); - if (mtu > max) mtu = max; + if (!(nvram_get_int("jumbo_frame_enable")) && (mtu > max)) mtu = max; else if (mtu < 576) mtu = 576; } sprintf(buf, "%d", mtu); @@ -974,7 +974,6 @@ void start_wan_done(char *wan_ifname) start_dnsmasq(); start_firewall(); start_qos(); - start_qoslimit(); start_arpbind(); @@ -1051,7 +1050,9 @@ void start_wan_done(char *wan_ifname) #endif unlink(wan_connecting); - start_qoslimit(); //!! RAF + + new_qoslimit_start(); //!! RAF + TRACE_PT("end\n"); } @@ -1069,7 +1070,9 @@ void stop_wan(void) start_dnsmasq(); #endif stop_arpbind(); - stop_qoslimit(); //!! RAF + + new_qoslimit_stop(); //!! RAF + stop_qos(); stop_upnp(); //!!TB - moved from stop_services() stop_firewall(); -- 2.11.4.GIT