static void build_wan_lan_mask(int stb) { int i, unit; int wanscap_lan = get_wans_dualwan() & WANSCAP_LAN; int wans_lanport = nvram_get_int("wans_lanport"); int sw_mode = nvram_get_int("sw_mode"); char prefix[8], nvram_ports[20]; if (sw_mode == SW_MODE_AP || sw_mode == SW_MODE_REPEATER) wanscap_lan = 0; if (stb == 100 && (sw_mode == SW_MODE_AP || __mediabridge_mode(sw_mode))) stb = 7; /* Don't create WAN port. */ #if 0 /* TODO: no WAN port */ if ((get_wans_dualwan() & (WANSCAP_LAN | WANSCAP_WAN)) == 0) stb = 7; // no WAN? #endif if (wanscap_lan && (wans_lanport < 0 || wans_lanport > 4)) { _dprintf("%s: invalid wans_lanport %d!\n", __func__, wans_lanport); wanscap_lan = 0; } lan_mask = wan_mask = wans_lan_mask = 0; for (i = 0; i < NR_WANLAN_PORT; ++i) { switch (lan_wan_partition[stb][i]) { case 0: wan_mask |= 1U << lan_id_to_port_nr(i); break; case 1: lan_mask |= 1U << lan_id_to_port_nr(i); break; default: _dprintf("%s: Unknown LAN/WAN port definition. (stb %d i %d val %d)\n", __func__, stb, i, lan_wan_partition[stb][i]); } } //DUALWAN if (wanscap_lan) { wans_lan_mask = 1U << lan_id_to_port_nr(wans_lanport); lan_mask &= ~wans_lan_mask; } for (unit = WAN_UNIT_FIRST; unit < WAN_UNIT_MAX; ++unit) { sprintf(prefix, "%d", unit); sprintf(nvram_ports, "wan%sports_mask", (unit == WAN_UNIT_FIRST)?"":prefix); if (get_dualwan_by_unit(unit) == WANS_DUALWAN_IF_WAN) { nvram_set_int(nvram_ports, wan_mask); } else if (get_dualwan_by_unit(unit) == WANS_DUALWAN_IF_LAN) { nvram_set_int(nvram_ports, wans_lan_mask); } else nvram_unset(nvram_ports); } nvram_set_int("lanports_mask", lan_mask); }
static void notify_nvram_changed(int signo){ int unit; #ifdef RTCONFIG_DUALWAN for(unit = WAN_UNIT_FIRST; unit < WAN_UNIT_MAX; ++unit){ if(get_dualwan_by_unit(unit) == WANS_DUALWAN_IF_USB){ link_wan[unit] = is_usb_modem_ready(); break; } } if(unit == WAN_UNIT_MAX) csprintf("# wanduck: nvram changed: Don't enable the USB line!\n"); else #else unit = WAN_UNIT_SECOND; link_wan[unit] = is_usb_modem_ready(); #endif csprintf("# wanduck: nvram changed: x_Setting=%d, link_modem=%d.\n", !isFirstUse, link_wan[unit]); }
int init_dualwan(int argc, char *argv[]) { int unit = 0; int caps; int if_id; char wan_if[10]; caps = get_wans_dualwan(); if ( (caps & WANSCAP_WAN) && (caps & WANSCAP_LAN)) nvram_set("wandevs", WANDEVS_DUAL); else nvram_set("wandevs", WANDEVS_SING); set_lan_phy(LANIF_ETH); if (!(caps & WANSCAP_2G)) add_lan_phy(LANIF_2G); #ifdef RTCONFIG_HAS_5G if (!(caps & WANSCAP_5G)) add_lan_phy(LANIF_5G); #endif if (nvram_get("wans_dualwan")) { set_wan_phy(""); for(unit = WAN_UNIT_FIRST; unit < WAN_UNIT_MAX; ++unit) { if_id = get_dualwan_by_unit(unit); if (if_id == WANS_DUALWAN_IF_LAN) { if (caps & WANSCAP_WAN) add_wan_phy(WANIF_WAN1); else add_wan_phy(WANIF_ETH); } else if (if_id == WANS_DUALWAN_IF_2G) add_wan_phy(LANIF_2G); #ifdef RTCONFIG_HAS_5G else if (if_id == WANS_DUALWAN_IF_5G) add_wan_phy(LANIF_5G); #endif else if (if_id == WANS_DUALWAN_IF_WAN) { /* tag by IPTV */ if (nvram_get("switch_wantag") && !nvram_match("switch_wantag", "") && !nvram_match("switch_wantag", "none")) { if (!nvram_match("switch_wan0tagid", "")) { sprintf(wan_if, "vlan%s", nvram_safe_get("switch_wan0tagid")); add_wan_phy(wan_if); } else add_wan_phy(WANIF_ETH); } else if (caps &WANSCAP_LAN) add_wan_phy(WANIF_WAN0); else add_wan_phy(WANIF_ETH); } #ifdef RTCONFIG_USB_MODEM else if (if_id == WANS_DUALWAN_IF_USB) add_wan_phy(WANIF_USB); #endif } } #ifdef RTCONFIG_USB_MODEM else nvram_set("wan_ifnames", WANIF_ETH_USB); #endif }