How to use VLAN base on ETH to separate multiple PDN
========================================
Here we take 1803 as example, the host PC system tested in this paper is Ubuntu 5.4.0-6Ubuntu 1~16.04.12.
Here we explains both the IPv4 and IPv6, you can ignore the IPv6 part if deploy the IPv4 only.

1, PIPE mode
1) Diag
	default PDN:
		"serial_client"
		AT+ZGDCONT=1,IPV4V6,CMNET
		AT+ZGACT=1,1
	PDN2:
		AT*ZGDCONT=2,IPV4V6,CMWAP,1
		AT+ZGACT=1,2
	PDN3:
		AT*ZGDCONT=3,IPV4V6,GPRS,1
		AT+ZGACT=1,3

	Query the dial results with command "AT+CGCONTRDP", you will get some information like this:

		+CGCONTRDP: 1,5,"cmnet.mnc002.mcc460.gprs","10.83.56.210","","211.138.180.2","211.138.180.3","","",0,0

		+CGCONTRDP: 1,5,"cmnet.mnc002.mcc460.gprs","254.128.0.0.0.0.0.0.64.146.26.57.99.145.79.134","","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.1","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.2","","",0,0

		+CGCONTRDP: 2,6,"cmnet.mnc002.mcc460.gprs","10.83.152.65","","211.138.180.2","211.138.180.3","","",0,0

		+CGCONTRDP: 2,6,"cmnet.mnc002.mcc460.gprs","254.128.0.0.0.0.0.0.147.189.59.114.229.84.73.203","","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.1","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.2","","",0,0

		+CGCONTRDP: 3,7,"cmnet.mnc002.mcc460.gprs","10.83.223.9","","211.138.180.2","211.138.180.3","","",0,0

		+CGCONTRDP: 3,7,"cmnet.mnc002.mcc460.gprs","254.128.0.0.0.0.0.0.119.145.137.164.221.238.176.216","","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.1","36.9.128.48.32.0.0.0.0.0.0.0.0.0.0.2","","",0,0

	As listed above , "10.83.56.210" is the IPv4 address of PDN1 and same for the others.

2) Configure /etc/config/network
	Add the following configuration to "/etc/config/network":
	LAN4 is used to login to WebUI or connect module with fixed IP addresses.
	
		config switch
			option name 'switch0'
			option reset '1'
			option enable_vlan '1'

		config interface 'lan2'
			option ifname 'eth0.100'
			option type 'bridge'
			option bridge_empty '1'
			option proto 'static'
			option ipaddr '10.83.152.190'
			option netmask '255.255.255.0'
			option ip6assign '60'

		config interface 'lan3'
			option ifname 'eth0.200'
			option type 'bridge'
			option bridge_empty '1'
			option proto 'static'
			option ipaddr '10.83.223.246'
			option netmask '255.255.255.0'
			option ip6assign '60'
			
		config interface 'lan4'
			option ifname 'eth0.300'
			option type 'bridge'
			option bridge_empty '1'
			option proto 'static'
			option ipaddr '192.168.1.1'
			option netmask '255.255.255.0'
			option ip6assign '60'

	eth0.100 and eth0.200 represent VLAN100 and VLAN200, "option ipaddr" is the ip address of PDN, 
	but the last bit requires an xor operation.
	Then execute "/etc/init.d/network reload" to apply the configuration.

3) Configure /etc/config/dhcp
	Add the following configuration to "/etc/config/dhcp":

		config dhcp 'lan2'
			option interface 'lan2'
			option leasetime '2h'
			option dhcpv6 'server'
			option ra 'relay'
			option ndp 'relay'
			option start '65'
			option limit '0'
			list dhcp_option '3,10.83.152.190'
			list dhcp_option '1,255.255.255.0'
			list dhcp_option '6,211.138.180.3,211.138.180.2'
			list dns '2409:8030:2000::1'
			list dns '2409:8030:2000::2'

		config dhcp 'lan3'
			option interface 'lan3'
			option leasetime '2h'
			option dhcpv6 'server'
			option ra 'relay'
			option ndp 'relay'
			option start '9'
			option limit '0'
			list dhcp_option '3,10.83.223.246'
			list dhcp_option '1,255.255.255.0'
			list dhcp_option '6,211.138.180.3,211.138.180.2'
			list dns '2409:8030:2000::1'
			list dns '2409:8030:2000::2'
			
		config dhcp 'lan4'
			option interface 'lan4'
			option start '192.168.1.100'
			option end '192.168.1.249'
			option limit '150'
			option leasetime '43200'
			option dhcpv6 'server'
			option ra 'relay'
			option ndp 'relay'
			
	"option start" is the offset from the PDN address of the underlying interface to calculate the minimum address that may be leased to clients.
	Then execute "/etc/init.d/dnsmasq reload" to apply the configuration.

4) Bind the virtual LAN to PDN
	Query the local IPv6 address for eth0:
		Query the local IPv6 address for eth0:
		ifconfig br-lan(*) | grep "inet6 addr" | awk '{print $3}'
		For example, you will get the local IPv6 address for br-lan,
		"fe80::30e1:7fff:febc:a4e1/64"

	Configure virtual LAN:	
		"echo 192.168.0.1 > eth0/ipaddr"
		"echo fe80::30e1:7fff:febc:a4e1 > eth0/ll6addr"
		"echo 1 > eth0/up"
		"echo 1 > eth0/up6"

		"echo 192.168.100.1 > eth0.100/ipaddr"
		"echo <br-lan2 local ipv6 addr> > eth0.100/ll6addr"
		"echo 1 > eth0.100/up"
		"echo 1 > eth0.100/up6"

		"echo 192.168.200.1 > eth0.200/ipaddr"
		"echo <br-lan3 local ipv6 addr> > eth0.200/ll6addr"
		"echo 1 > eth0.200/up"
		"echo 1 > eth0.200/up6"
		
		"echo 192.168.1.1 > eth0.300/ipaddr"
		"echo 1 > eth0.300/up"

	Bind the virtual LAN to PDN
		"echo eth0 > ccinet0/combineif"
		"echo eth0.100 > ccinet1/combineif"
		"echo eth0.200 > ccinet2/combineif"
	Now the ccinet1 serves as VLAN100 and ccinet2 as VLAN200, ccinet0 has no vlan.

5)  Configuration in Ubuntu16.04
	Add virtual network card:
		"vconfig add eno1 100"
		"vconfig add eno1 200"
		"vconfig add eno1 300"

	Get IP address through DHCP:
		"dhcpcd eno1"
		"dhcpcd eno1.100"
		"dhcpcd eno1.200"
		"dhcpcd eno1.200 -4"
		
	# ifconfig
		eno1      Link encap:Ethernet  HWaddr fc:4d:d4:47:76:7c  
				  inet addr:10.83.56.210  Bcast:10.83.56.255  Mask:255.255.255.0
				  inet6 addr: 2409:8930:265:340e:eaad:ceec:7eee:30ca/64 Scope:Global
				  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
				  RX packets:8382 errors:0 dropped:0 overruns:0 frame:0
				  TX packets:7057 errors:0 dropped:0 overruns:0 carrier:0
				  collisions:0 txqueuelen:1000 
				  RX bytes:2229048 (2.2 MB)  TX bytes:941209 (941.2 KB)
				  Interrupt:20 Memory:f7c00000-f7c20000 

		eno1.100  Link encap:Ethernet  HWaddr fc:4d:d4:47:76:7c  
				  inet addr:10.83.152.65  Bcast:10.83.152.255  Mask:255.255.255.0
				  inet6 addr: 2409:8930:265:3582:9561:16:150:31fc/64 Scope:Global
				  inet6 addr: 2409:8930:265:3582:884b:4cd7:ec22:1a8a/64 Scope:Global
				  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
				  RX packets:321 errors:0 dropped:0 overruns:0 frame:0
				  TX packets:982 errors:0 dropped:0 overruns:0 carrier:0
				  collisions:0 txqueuelen:1000 
				  RX bytes:42395 (42.3 KB)  TX bytes:136625 (136.6 KB)

		eno1.200  Link encap:Ethernet  HWaddr fc:4d:d4:47:76:7c  
				  inet addr:10.83.223.9  Bcast:10.83.223.255  Mask:255.255.255.0
				  inet6 addr: 2409:8930:265:372a:3d07:6ef3:72e1:fb32/64 Scope:Global
				  inet6 addr: fe80::9e83:97a5:fce9:f67b/64 Scope:Link
				  inet6 addr: 2409:8930:265:372a:e040:801d:d009:6860/64 Scope:Global
				  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
				  RX packets:291 errors:0 dropped:0 overruns:0 frame:0
				  TX packets:662 errors:0 dropped:0 overruns:0 carrier:0
				  collisions:0 txqueuelen:1000 
				  RX bytes:37415 (37.4 KB)  TX bytes:94854 (94.8 KB)

		eno1.300  Link encap:Ethernet  HWaddr fc:4d:d4:47:76:7c  
				  inet addr:192.168.1.244  Bcast:192.168.1.255  Mask:255.255.255.0
				  UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
				  RX packets:2336 errors:0 dropped:0 overruns:0 frame:0
				  TX packets:2453 errors:0 dropped:0 overruns:0 carrier:0
				  collisions:0 txqueuelen:1000 
				  RX bytes:277235 (277.2 KB)  TX bytes:313953 (313.9 KB)

		# route
		Kernel IP routing table
		Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
		default         10.83.56.45     0.0.0.0         UG    202    0        0 eno1
		default         10.83.152.190   0.0.0.0         UG    203    0        0 eno1.100
		default         10.83.223.246   0.0.0.0         UG    204    0        0 eno1.200
		default         192.168.1.1     0.0.0.0         UG    205    0        0 eno1.300
		10.83.56.0      *               255.255.255.0   U     202    0        0 eno1
		10.83.152.0     *               255.255.255.0   U     203    0        0 eno1.100
		10.83.223.0     *               255.255.255.0   U     204    0        0 eno1.200
		192.168.1.0     *               255.255.255.0   U     205    0        0 eno1.300

6) Test in Ubuntu16.04

		# ping www.sohu.com -I eno1
		PING fshyd.a.sohu.com (162.14.132.217) from 10.83.56.210 eno1: 56(84) bytes of data.
		64 bytes from 162.14.132.217: icmp_seq=1 ttl=247 time=44.4 ms
		64 bytes from 162.14.132.217: icmp_seq=2 ttl=247 time=44.9 ms

		# route del default gw 10.83.56.45
		# ping www.sohu.com -I eno1.100
		PING fshyd.a.sohu.com (162.14.132.217) from 10.83.152.65 eno1.100: 56(84) bytes of data.
		64 bytes from 162.14.132.217: icmp_seq=1 ttl=247 time=29.4 ms
		64 bytes from 162.14.132.217: icmp_seq=2 ttl=247 time=27.1 ms

		# route del default gw 10.83.152.190
		# ping www.sohu.com -I eno1.200
		PING fshyd.a.sohu.com (162.14.132.217) from 10.83.223.9 eno1.200: 56(84) bytes of data.
		64 bytes from 162.14.132.217: icmp_seq=1 ttl=54 time=54.6 ms
		64 bytes from 162.14.132.217: icmp_seq=2 ttl=54 time=43.0 ms

		# ping 192.168.1.1
		PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
		64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.93 ms
		64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.11 ms

		# ping6 www.sohu.com -I eno1
		PING www.sohu.com(2402:4e00:4010:1::20) from 2409:8930:265:340e:eaad:ceec:7eee:30ca eno1: 56 data bytes
		64 bytes from 2402:4e00:4010:1::20: icmp_seq=2 ttl=50 time=63.9 ms
		64 bytes from 2402:4e00:4010:1::20: icmp_seq=3 ttl=50 time=42.7 ms

		# ping6 www.sohu.com -I eno1.100
		PING www.sohu.com(2402:4e00:4010:1::21) from 2409:8930:265:3582:9561:16:150:31fc eno1.100: 56 data bytes
		64 bytes from 2402:4e00:4010:1::21: icmp_seq=1 ttl=50 time=29.7 ms
		64 bytes from 2402:4e00:4010:1::21: icmp_seq=2 ttl=50 time=38.3 ms

		# ping6 www.sohu.com -I eno1.200
		PING www.sohu.com(2402:4e00:4010:1::25) from 2409:8930:265:372a:e040:801d:d009:6860 eno1.200: 56 data bytes
		64 bytes from 2402:4e00:4010:1::25: icmp_seq=1 ttl=50 time=52.9 ms
		64 bytes from 2402:4e00:4010:1::25: icmp_seq=2 ttl=50 time=47.1 ms

7) Note
	If you disconnect the eth, you may need to follow the above steps to reconfigure after reconnect.
