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); }
/** * @stb_bitmask: bitmask of STB port(s) * e.g. bit0 = P0, bit1 = P1, etc. */ static void initialize_Vlan(int stb_bitmask) { int wans_lan_vid = 3, wanscap_wanlan = get_wans_dualwan() & (WANSCAP_WAN | WANSCAP_LAN); int wanscap_lan = get_wans_dualwan() & WANSCAP_LAN; int wans_lanport = nvram_get_int("wans_lanport"); int sw_mode = nvram_get_int("sw_mode"); if (sw_mode == SW_MODE_AP || sw_mode == SW_MODE_REPEATER) wanscap_lan = 0; if (wanscap_lan && (wans_lanport < 0 || wans_lanport > 4)) { _dprintf("%s: invalid wans_lanport %d!\n", __func__, wans_lanport); wanscap_lan = 0; wanscap_wanlan &= ~WANSCAP_LAN; } build_wan_lan_mask(0); stb_bitmask = convert_n56u_to_qca_bitmask(stb_bitmask); lan_mask &= ~stb_bitmask; wan_mask |= stb_bitmask; _dprintf("%s: LAN/WAN/WANS_LAN portmask %08x/%08x/%08x\n", __func__, lan_mask, wan_mask, wans_lan_mask); if(wans_lan_mask & stb_bitmask) // avoid using a port for two functions. { wanscap_lan = 0; wanscap_wanlan &= ~WANSCAP_LAN; } if (wanscap_lan && (!(get_wans_dualwan() & WANSCAP_WAN)) && !(!nvram_match("switch_wantag", "none") && !nvram_match("switch_wantag", ""))) { wans_lan_vid = 2; } reset_qca_switch(); // LAN #if (defined(PLAC56) || defined(PLAC66U)) qca8337_vlan_set(1, 1, 0, (lan_mask | CPU_PORT_LAN_MASK | (1U << RGMII_PORT)), (lan_mask | CPU_PORT_LAN_MASK | (1U << RGMII_PORT))); #else qca8337_vlan_set(1, 1, 0, (lan_mask | CPU_PORT_LAN_MASK), (lan_mask | CPU_PORT_LAN_MASK)); #endif // DUALWAN if (wanscap_lan) { qca8337_vlan_set(wans_lan_vid, wans_lan_vid, 0, (wans_lan_mask | CPU_PORT_WAN_MASK), wans_lan_mask); if(wans_lan_vid == 3) eval("swconfig", "dev", MII_IFNAME, "set", "enable_vlan", "1"); // enable vlan } eval("swconfig", "dev", MII_IFNAME, "set", "apply"); }
/** * Configure LAN/WAN partition base on generic IPTV type. * @type: * 0: Default. * 1: LAN1 * 2: LAN2 * 3: LAN3 * 4: LAN4 * 5: LAN1+LAN2 * 6: LAN3+LAN4 */ static void config_qca8337_LANWANPartition(int type) { int wanscap_wanlan = get_wans_dualwan() & (WANSCAP_WAN | WANSCAP_LAN); int wanscap_lan = wanscap_wanlan & WANSCAP_LAN; int wans_lanport = nvram_get_int("wans_lanport"); int sw_mode = nvram_get_int("sw_mode"); if (sw_mode == SW_MODE_AP || sw_mode == SW_MODE_REPEATER) wanscap_lan = 0; if (wanscap_lan && (wans_lanport < 0 || wans_lanport > 4)) { _dprintf("%s: invalid wans_lanport %d!\n", __func__, wans_lanport); wanscap_lan = 0; wanscap_wanlan &= ~WANSCAP_LAN; } build_wan_lan_mask(type); _dprintf("%s: LAN/WAN/WANS_LAN portmask %08x/%08x/%08x\n", __func__, lan_mask, wan_mask, wans_lan_mask); reset_qca_switch(); // LAN #if defined(PLN12) qca8337_vlan_set(1, 1, 0, (lan_mask | CPU_PORT_LAN_MASK), lan_mask); #elif (defined(PLAC56) || defined(PLAC66U)) qca8337_vlan_set(1, 1, 0, (lan_mask | CPU_PORT_LAN_MASK | (1U << RGMII_PORT)), lan_mask | (1U << RGMII_PORT)); #else /* RT-AC55U || 4G-AC55U */ qca8337_vlan_set(1, 1, 0, (lan_mask | CPU_PORT_LAN_MASK), (lan_mask | CPU_PORT_LAN_MASK)); #endif // WAN & DUALWAN if (sw_mode == SW_MODE_ROUTER) { switch (wanscap_wanlan) { case WANSCAP_WAN | WANSCAP_LAN: qca8337_vlan_set(2, 2, 0, (wan_mask | CPU_PORT_WAN_MASK), wan_mask); qca8337_vlan_set(3, 3, 0, (wans_lan_mask | CPU_PORT_WAN_MASK), wans_lan_mask); eval("swconfig", "dev", MII_IFNAME, "set", "enable_vlan", "1"); // enable vlan break; case WANSCAP_LAN: qca8337_vlan_set(2, 2, 0, (wans_lan_mask | CPU_PORT_WAN_MASK), (wans_lan_mask | CPU_PORT_WAN_MASK)); break; case WANSCAP_WAN: #if (defined(PLN12) || defined(PLAC56) || defined(PLAC66U)) qca8337_vlan_set(2, 2, 0, (wan_mask | CPU_PORT_WAN_MASK), wan_mask); eval("swconfig", "dev", MII_IFNAME, "set", "enable_vlan", "1"); // enable vlan #else /* RT-AC55U || 4G-AC55U */ qca8337_vlan_set(2, 2, 0, (wan_mask | CPU_PORT_WAN_MASK), (wan_mask | CPU_PORT_WAN_MASK)); #endif break; default: _dprintf("%s: Unknown WANSCAP %x\n", __func__, wanscap_wanlan); } } #if (defined(PLN12) || defined(PLAC56) || defined(PLAC66U)) else eval("swconfig", "dev", MII_IFNAME, "set", "enable_vlan", "1"); // enable vlan #endif eval("swconfig", "dev", MII_IFNAME, "set", "apply"); // apply changes }
static int wanmii_need_vlan_tag(void) { int dualwan = get_wans_dualwan(); if(!(dualwan & WANSCAP_WAN)) // none or one port for WAN return 0; if(dualwan & WANSCAP_LAN) // dual port for WAN return 1; if(!nvram_match("switch_wantag", "none") && !nvram_match("switch_wantag", "")) // has IPTV ISP setting (which has vlan id) return 1; return 0; }
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 }