示例#1
0
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);
}
示例#2
0
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]);
}
示例#3
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
}