Ejemplo n.º 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);
}
Ejemplo n.º 2
0
/**
 * @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");
}
Ejemplo n.º 3
0
/**
 * 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
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
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
}