mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	Merge pull request #1654 from WelterRocks/develop
Added support for BPI-R1
This commit is contained in:
		
						commit
						c37e34f163
					
				
					 5 changed files with 569 additions and 0 deletions
				
			
		
							
								
								
									
										96
									
								
								build.sh
									
										
									
									
									
								
							
							
						
						
									
										96
									
								
								build.sh
									
										
									
									
									
								
							|  | @ -49,6 +49,8 @@ CUSTOM_FEED_URL="${CUSTOM_FEED_URL}" | |||
| 
 | ||||
| OMR_OPENWRT=${OMR_OPENWRT:-default} | ||||
| 
 | ||||
| OMR_FORCE_DSA=${OMR_FORCE_DSA:-0} | ||||
| 
 | ||||
| if [ ! -f "$OMR_TARGET_CONFIG" ]; then | ||||
| 	echo "Target $OMR_TARGET not found !" | ||||
| 	#exit 1 | ||||
|  | @ -64,6 +66,8 @@ elif [ "$OMR_TARGET" = "wrt3200acm" ]; then | |||
| 	OMR_REAL_TARGET="arm_cortex-a9_vfpv3" | ||||
| elif [ "$OMR_TARGET" = "wrt32x" ]; then | ||||
| 	OMR_REAL_TARGET="arm_cortex-a9_vfpv3" | ||||
| elif [ "$OMR_TARGET" = "bpi-r1" ]; then | ||||
| 	OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4" | ||||
| elif [ "$OMR_TARGET" = "bpi-r2" ]; then | ||||
| 	OMR_REAL_TARGET="arm_cortex-a7_neon-vfpv4" | ||||
| elif [ "$OMR_TARGET" = "bpi-r64" ]; then | ||||
|  | @ -200,6 +204,98 @@ if [ "$OMR_PACKAGES" = "mini" ]; then | |||
| 	echo "CONFIG_PACKAGE_${OMR_DIST}-mini=y" >> "$OMR_TARGET/source/.config" | ||||
| fi | ||||
| 
 | ||||
| if [ "$OMR_TARGET" = "bpi-r1" -a "$OMR_OPENWRT" = "master" ]; then | ||||
| 	# We disable mc in master, because it leads to unknown compilation errors on bpi-r1 target | ||||
| 	# No time to check this, now, cause i am focused on make this target work | ||||
| 	# Maybe someone can do this later	 | ||||
| 	echo -n "Disabling error causing midnight commander (mc) package..." | ||||
| 	sed -i "s/CONFIG_PACKAGE_mc=y/# CONFIG_PACKAGE_mc is not set/" "$OMR_TARGET/source/.config" | ||||
| 	sed -i "s/CONFIG_MC_EDITOR=y/# CONFIG_MC_EDITOR is not set/" "$OMR_TARGET/source/.config" | ||||
| 	sed -i "s/CONFIG_MC_SUBSHELL=y/# CONFIG_MC_SUBSHELL is not set/" "$OMR_TARGET/source/.config" | ||||
| 	sed -i "s/CONFIG_MC_CHARSET=y/# CONFIG_MC_CHARSET is not set/" "$OMR_TARGET/source/.config" | ||||
| 	sed -i "s/CONFIG_MC_VFS=y/# CONFIG_MC_VFS is not set/" "$OMR_TARGET/source/.config"	 | ||||
| 	echo "done" | ||||
| 
 | ||||
| 	# 2021-03-05 Oliver Welter <oliver@welter.rocks> | ||||
| fi | ||||
| 
 | ||||
| if [ "$OMR_TARGET" = "bpi-r1" ]; then | ||||
| 	# Check kernel version | ||||
| 	if [ "$OMR_KERNEL" != "5.4" ]; then | ||||
| 		echo "Sorry, but for now kernel 5.4 is the only supported one." | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 	 | ||||
| 	# Remove the 310-Revert-ARM-dts-sun7i-Add-BCM53125-switch-nodes-to-th patch | ||||
| 	echo -n "Removing unwanted patches from kernel $OMR_KERNEL..." | ||||
| 	rm -f "$OMR_TARGET/source/target/linux/sunxi/patches-$OMR_KERNEL/310-Revert-ARM-dts-sun7i-Add-BCM53125-switch-nodes-to-th.patch" >/dev/null 2>&1 | ||||
| 	echo "done" | ||||
| 	 | ||||
| 	if [ "$OMR_FORCE_DSA" = "1" ]; then  | ||||
| 		# Remove support for swconfig | ||||
| 		echo -n "Removing swconfig support from openwrt config..." | ||||
| 		for i in DEFAULT_swconfig PACKAGE_swconfig PACKAGE_kmod-swconfig; do | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/.config" | ||||
| 		done | ||||
| 		echo "done" | ||||
| 		echo -n "Removing B53 swconfig support from kernel $OMR_KERNEL..." | ||||
| 		for i in SWCONFIG_B53 SWCONFIG_B53_PHY_DRIVER SWCONFIG_LEDS LED_TRIGGER_PHY SWCONFIG_B53_PHY_FIXUP SWCONFIG_B53_SPI_DRIVER SWCONFIG_B53_MMAP_DRIVER SWCONFIG_B53_SRAB_DRIVER; do | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/target/linux/sunxi/config-$OMR_KERNEL" | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" | ||||
| 		done | ||||
| 		echo "done" | ||||
| 
 | ||||
| 		# Add support for distributed switch architecture | ||||
| 		echo -n "Adding B53 DSA support to kernel $OMR_KERNEL..."		 | ||||
| 		for i in B53 B53_MDIO_DRIVER BRIDGE_VLAN_FILTERING MDIO_BUS_MUX_MULTIPLEXER NET_DSA NET_DSA_TAG_8021Q NET_DSA_TAG_BRCM NET_DSA_TAG_BRCM_PREPEND; do | ||||
| 			check_sunxi_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/config-$OMR_KERNEL" || true` | ||||
| 			check_cortexa7_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" || true` | ||||
| 			 | ||||
| 			[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_${i}=y" >> "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" | ||||
| 		done | ||||
| 		echo "done" | ||||
| 
 | ||||
| 		# Create DSA port map file (will be filled on first boot, by uci-defaults and tells the system, that it is in DSA mode) | ||||
| 		touch "$OMR_TARGET/source/target/linux/sunxi/base-files/etc/dsa.map" | ||||
| 		 | ||||
| 		# Remove the b53 hack in preinit | ||||
| 		rm -f "$OMR_TARGET/source/target/linux/sunxi/base-files/lib/preinit/03_b53_hack.sh" | ||||
| 	else | ||||
| 		# Remove ip-bridge | ||||
| 		echo -n "Removing ip-bridge support from openwrt config..." | ||||
| 		for i in PACKAGE_ip-bridge; do | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/.config" | ||||
| 		done | ||||
| 		echo "done" | ||||
| 
 | ||||
| 		# Remove swconfig parts | ||||
| 		echo -n "Removing unneeded B53 swconfig parts from kernel $OMR_KERNEL..." | ||||
| 		for i in SWCONFIG_B53_PHY_FIXUP SWCONFIG_B53_SPI_DRIVER SWCONFIG_B53_MMAP_DRIVER SWCONFIG_B53_SRAB_DRIVER; do | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/target/linux/sunxi/config-$OMR_KERNEL" | ||||
| 			sed -i "s/CONFIG_${i}/# CONFIG_${i} is not set/" "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" | ||||
| 		done | ||||
| 		echo "done" | ||||
| 	fi | ||||
| 		 | ||||
| 	# Add led support | ||||
| 	echo -n "Adding LED TRIGGER support to kernel $OMR_KERNEL..." | ||||
| 	if [ "$OMR_FORCE_DSA" != "1" ]; then | ||||
| 		for i in SWCONFIG_LEDS LED_TRIGGER_PHY; do | ||||
| 			check_sunxi_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/config-$OMR_KERNEL" || true` | ||||
| 			check_cortexa7_config=`grep "CONFIG_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" || true` | ||||
| 
 | ||||
| 			[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_${i}=y" >> "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" | ||||
| 		done | ||||
| 	fi | ||||
| 	for i in TIMER ONESHOT DISK MTD HEARTBEAT BACKLIGHT CPU ACTIVITY GPIO DEFAULT_ON TRANSIENT CAMERA PANIC NETDEV PATTERN AUDIO; do | ||||
| 		check_sunxi_config=`grep "CONFIG_LEDS_TRIGGER_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/config-$OMR_KERNEL" || true` | ||||
| 		check_cortexa7_config=`grep "CONFIG_LEDS_TRIGGER_${i}=y" "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" || true` | ||||
| 
 | ||||
| 		[ "$check_sunxi_config" = "" -a "$check_cortexa7_config" = "" ] && echo "CONFIG_LEDS_TRIGGER_${i}=y" >> "$OMR_TARGET/source/target/linux/sunxi/cortexa7/config-$OMR_KERNEL" | ||||
| 	done | ||||
| 	echo "done"	 | ||||
| fi | ||||
| 
 | ||||
| cd "$OMR_TARGET/source" | ||||
| 
 | ||||
| #if [ "$OMR_UEFI" = "yes" ] && [ "$OMR_TARGET" = "x86_64" ]; then  | ||||
|  |  | |||
							
								
								
									
										59
									
								
								config-bpi-r1
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								config-bpi-r1
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | |||
| CONFIG_TARGET_BOARD="sunxi" | ||||
| CONFIG_TARGET_sunxi=y | ||||
| CONFIG_TARGET_sunxi_cortexa7=y | ||||
| CONFIG_TARGET_sunxi_cortexa7_DEVICE_lamobo_lamobo-r1=y | ||||
| CONFIG_TARGET_SUBTARGET="cortexa7" | ||||
| CONFIG_TARGET_PROFILE="DEVICE_lamobo_lamobo-r1" | ||||
| CONFIG_TARGET_ROOTFS_EXT4FS=y | ||||
| CONFIG_TARGET_ROOTFS_SQUASHFS=y | ||||
| CONFIG_PACKAGE_u-boot-Lamobo_R1=y | ||||
| CONFIG_PACKAGE_uboot-envtools=y | ||||
| CONFIG_PACKAGE_attr=y | ||||
| CONFIG_PACKAGE_f2fs-tools=y | ||||
| CONFIG_PACKAGE_f2fsck=y | ||||
| CONFIG_PACKAGE_mkf2fs=y | ||||
| CONFIG_PACKAGE_rtl8188eu-firmware=y | ||||
| CONFIG_PACKAGE_ath9k-htc-firmware=y | ||||
| CONFIG_PACKAGE_mt7601u-firmware=y | ||||
| CONFIG_PACKAGE_rt2800-usb-firmware=y | ||||
| CONFIG_PACKAGE_rtl8192cu-firmware=y | ||||
| CONFIG_PACKAGE_rtl8192su-firmware=y | ||||
| CONFIG_PACKAGE_kmod-switch-bcm53xx=y | ||||
| CONFIG_PACKAGE_kmod-switch-bcm53xx-mdio=y | ||||
| CONFIG_PACKAGE_ip-bridge=y | ||||
| CONFIG_PACKAGE_swconfig=y | ||||
| CONFIG_PACKAGE_kmod-swconfig=y | ||||
| CONFIG_PACKAGE_kmod-ste10xp=y | ||||
| CONFIG_PACKAGE_kmod-can-bcm=y | ||||
| CONFIG_PACKAGE_kmod-ata-sunxi=y | ||||
| CONFIG_PACKAGE_kmod-rtl8192cu=y | ||||
| CONFIG_PACKAGE_kmod-ath9k-common=y | ||||
| CONFIG_PACKAGE_kmod-ath9k-htc=y | ||||
| CONFIG_PACKAGE_kmod-net-rtl8192su=y | ||||
| CONFIG_PACKAGE_kmod-rtl8192c-common=y | ||||
| CONFIG_PACKAGE_kmod-rtl8192cu=y | ||||
| CONFIG_PACKAGE_kmod-rtl8xxxu=y | ||||
| CONFIG_PACKAGE_kmod-sunxi-ir=y | ||||
| CONFIG_PACKAGE_kmod-sound-soc-sunxi=y | ||||
| CONFIG_PACKAGE_kmod-rtlwifi-usb=y | ||||
| CONFIG_PACKAGE_kmod-rtlwifi=y | ||||
| CONFIG_PACKAGE_kmod-scsi-core=y | ||||
| CONFIG_PACKAGE_kmod-slhc=y | ||||
| CONFIG_PACKAGE_kmod-usb-core=y | ||||
| CONFIG_PACKAGE_kmod-leds-gpio=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-activity=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-gpio=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-oneshot=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-transient=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-disk=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-mtd=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-heartbeat=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-backlight=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-cpu=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-panic=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-netdev=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-pattern=y | ||||
| CONFIG_PACKAGE_kmod-ledtrig-audio=y | ||||
| CONFIG_PACKAGE_kmod-ipt-led=y | ||||
| CONFIG_PACKAGE_kmod-usb-ledtrig-usbport=y | ||||
| CONFIG_KERNEL_ARM_MODULE_PLTS=y | ||||
							
								
								
									
										9
									
								
								contributors/welterrocks.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								contributors/welterrocks.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| 2021-03-05 | ||||
| 
 | ||||
| I hereby agree to the terms of the "OpenMPTCProuter Individual Contributor License Agreement", with MD5 checksum bc827a07eb93611d793ddb7c75083c00. | ||||
| 
 | ||||
| I furthermore declare that I am authorized and able to make this agreement and sign this declaration. | ||||
| 
 | ||||
| Signed, | ||||
| 
 | ||||
| Oliver Welter https://github.com/welterrocks | ||||
|  | @ -0,0 +1,55 @@ | |||
| if [ -f "/etc/dsa.map" ]; then | ||||
| echo 'ports="0 1 2 3 4 8" | ||||
| port_3="wan" | ||||
| port_4="lan1" | ||||
| port_0="lan2" | ||||
| port_1="lan3" | ||||
| port_2="lan4" | ||||
| port_8="eth0" | ||||
| port_3_name="lan" | ||||
| port_4_name="wan1" | ||||
| port_0_name="wan2" | ||||
| port_1_name="wan3" | ||||
| port_2_name="wan4" | ||||
| port_8_name="cpu" | ||||
| port_cpu="8" | ||||
| ' > /etc/dsa.map | ||||
| /sbin/swconfig-wrapper.sh setup-wrapper | ||||
| fi | ||||
| 
 | ||||
| uci delete network.@switch_vlan[0] | ||||
| uci delete network.@switch_vlan[1] | ||||
| 
 | ||||
| uci add network switch_vlan | ||||
| uci set network.@switch_vlan[0].vlan=10 | ||||
| uci set network.@switch_vlan[0].ports="8t 3" | ||||
| uci set network.@switch_vlan[0].device="switch0" | ||||
| 
 | ||||
| uci add network switch_vlan | ||||
| uci set network.@switch_vlan[1].vlan=11 | ||||
| uci set network.@switch_vlan[1].ports="8t 4" | ||||
| uci set network.@switch_vlan[1].device="switch0" | ||||
| 
 | ||||
| uci add network switch_vlan | ||||
| uci set network.@switch_vlan[2].vlan=12 | ||||
| uci set network.@switch_vlan[2].ports="8t 0" | ||||
| uci set network.@switch_vlan[2].device="switch0" | ||||
| 
 | ||||
| uci add network switch_vlan | ||||
| uci set network.@switch_vlan[3].vlan=13 | ||||
| uci set network.@switch_vlan[3].ports="8t 1" | ||||
| uci set network.@switch_vlan[3].device="switch0" | ||||
| 
 | ||||
| uci add network switch_vlan | ||||
| uci set network.@switch_vlan[4].vlan=14 | ||||
| uci set network.@switch_vlan[4].ports="8t 2" | ||||
| uci set network.@switch_vlan[4].device="switch0" | ||||
| 
 | ||||
| uci set network.lan.ifname="eth0.10" | ||||
| uci set network.wan1.ifname="eth0.11" | ||||
| uci set network.wan2.ifname="eth0.12" | ||||
| uci set network.wan3.ifname="eth0.13" | ||||
| uci set network.wan4.ifname="eth0.14" | ||||
| 
 | ||||
| uci commit | ||||
| exit 0 | ||||
							
								
								
									
										350
									
								
								root/target/linux/sunxi/base-files/sbin/swconfig-wrapper.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										350
									
								
								root/target/linux/sunxi/base-files/sbin/swconfig-wrapper.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,350 @@ | |||
| #!/bin/sh | ||||
| # swconfig wrapper for BPI-R1 switch in DSA enabled environment | ||||
| # Copyright (c) 2021 Oliver Welter <oliver@welter.rocks> | ||||
| 
 | ||||
| SWCONFIG="/sbin/swconfig" | ||||
| SWCONFIG_REAL="$SWCONFIG.real" | ||||
| SWCONFIG_DSA="$SWCONFIG.dsa" | ||||
| SWCONFIG_WRAPPER="$SWCONFIG-wrapper.sh" | ||||
| SWCONFIG_LINK=`readlink $SWCONFIG` | ||||
| 
 | ||||
| DSA_MAP="/etc/dsa.map" | ||||
| DSA_MODE=0 | ||||
| 
 | ||||
| UCI="/sbin/uci" | ||||
| GREP="/bin/grep" | ||||
| CUT="/usr/bin/cut" | ||||
| AWK="/usr/bin/awk" | ||||
| IP="/sbin/ip" | ||||
| 
 | ||||
| SWITCHNULL="switch0" | ||||
| 
 | ||||
| [ -f "$DSA_MAP" ] && DSA_MODE=1 | ||||
| 
 | ||||
| if [ "$1" = "setup-wrapper" ]; then | ||||
| 	if [ "$SWCONFIG_LINK" = "$SWCONFIG_WRAPPER" ]; then | ||||
| 		echo "Already linked to wrapper" >/dev/stderr | ||||
| 		exit 1 | ||||
| 	elif [ -x "$SWCONFIG" ]; then		 | ||||
| 		mv $SWCONFIG $SWCONFIG_REAL && \ | ||||
| 		ln -sf $SWCONFIG_WRAPPER $SWCONFIG && \ | ||||
| 		exit 0 || exit $? | ||||
| 	else | ||||
| 		echo "Unable to find swconfig binary" >/dev/stderr | ||||
| 		exit 2 | ||||
| 	fi | ||||
| elif [ "$DSA_MODE" = 0 ]; then | ||||
| 	if [ "$1" = "" ]; then | ||||
| 		$SWCONFIG_REAL && exit 0 || exit $? | ||||
| 	elif [ "$2" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 && exit 0 || exit $? | ||||
| 	elif [ "$3" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 $2 && exit 0 || exit $? | ||||
| 	elif [ "$4" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 $2 $3 && exit 0 || exit $? | ||||
| 	elif [ "$5" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 $2 $3 $4 && exit 0 || exit $? | ||||
| 	elif [ "$6" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 $2 $3 $4 $5 && exit 0 || exit $? | ||||
| 	elif [ "$7" = "" ]; then | ||||
| 		$SWCONFIG_REAL $1 $2 $3 $4 $5 $6 && exit 0 || exit $? | ||||
| 	else | ||||
| 		exit 255 | ||||
| 	fi | ||||
| fi | ||||
| 
 | ||||
| . $DSA_MAP | ||||
| 
 | ||||
|  get_interface_by_portlist() { | ||||
| 	local ports="$1" | ||||
| 	 | ||||
| 	for port in $ports; do | ||||
| 		port_id=`echo $port | $CUT -d "t" -f1` | ||||
| 		port_tagged=`echo $port | $GREP "t" >/dev/null 2>&1 && echo 1 || echo 0` | ||||
| 		interface=`eval echo "\${port_$port_id}"` | ||||
| 		name=`eval echo "\${port_name_$port_id}"` | ||||
| 		 | ||||
| 		echo "$port_id:$port_tagged:$interface:$name" | ||||
| 	done	 | ||||
| } | ||||
| 
 | ||||
| swconfig_usage() { | ||||
| 	echo "WARNING: swconfig runs in DSA wrapper mode" | ||||
| 	$SWCONFIG_REAL && exit 0 || exit $? | ||||
| } | ||||
| 
 | ||||
| swconfig_port_get() { | ||||
| 	local port="$1" | ||||
| 	local key="$2" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_vlan_get() { | ||||
| 	local vlan="$1" | ||||
| 	local key="$2" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_get() { | ||||
| 	local key="$1" | ||||
| 	 | ||||
| 	case $key in | ||||
| 		reset|reset_mib|apply) | ||||
| 			# This is ignored, but leads to exit code 0 to not confuse the networking scripts | ||||
| 			return 0 | ||||
| 		;; | ||||
| 		*) | ||||
| 			echo "Unknown key $key for device" >/dev/stderr | ||||
| 			return 1 | ||||
| 		;; | ||||
| 	esac | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_port_set() { | ||||
| 	local port="$1" | ||||
| 	local key="$2" | ||||
| 	local val="$3" | ||||
| 
 | ||||
| 	case $key in | ||||
| 		*) | ||||
| 			echo "Unknown key $key for port" >/dev/stderr | ||||
| 			return 1 | ||||
| 		;; | ||||
| 	esac | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_vlan_set() { | ||||
| 	local vlan="$1" | ||||
| 	local key="$2" | ||||
| 	local val="$3" | ||||
| 
 | ||||
| 	case $key in | ||||
| 		*) | ||||
| 			echo "Unknown key $key for vlan" >/dev/stderr | ||||
| 			return 1 | ||||
| 		;; | ||||
| 	esac | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_set() { | ||||
| 	local key="$1" | ||||
| 	local val="$2" | ||||
| 
 | ||||
| 	case $key in | ||||
| 		reset|reset_mib|apply) | ||||
| 			# This is ignored, but leads to exit code 0 to not confuse the networking scripts | ||||
| 			return 0 | ||||
| 		;; | ||||
| 		*) | ||||
| 			echo "Unknown key $key for device" >/dev/stderr | ||||
| 			return 1 | ||||
| 		;; | ||||
| 	esac | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_port_load() { | ||||
| 	local port="$1" | ||||
| 	local config="$2" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_vlan_load() { | ||||
| 	local vlan="$1" | ||||
| 	local config="$2" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_load() { | ||||
| 	local config="$1" | ||||
| 	 | ||||
| 	# This is the part, where the magic happens. | ||||
| 	# Due to its structure, swconfig gets the configuration to use by itself. | ||||
| 	# At this point, we use uci to fetch the configuration for the vlans to setup. | ||||
| 	 | ||||
| 	[ "$config" != "network" ] && return 1 | ||||
| 	 | ||||
| 	# Set the CPU port | ||||
| 	local CPUPORT=`eval echo "\${port_$port_cpu}"` | ||||
| 	 | ||||
| 	# Bring up the CPU port | ||||
| 	$IP link set $CPUPORT up | ||||
| 	 | ||||
| 	for section in `$UCI show $config | $GREP "=switch_vlan" | $CUT -d "=" -f1`; do | ||||
| 		section_id=`$UCI show $section | $GREP "=switch_vlan" | $CUT -d "=" -f1 | $CUT -d "." -f2` | ||||
| 		 | ||||
| 		vlan=`$UCI show $config.$section_id.vlan | $CUT -d "=" -f2 | $CUT -d "'" -f2` | ||||
| 		ports=`$UCI show $config.$section_id.ports | $CUT -d "=" -f2 | $CUT -d "'" -f2` | ||||
| 		device=`$UCI show $config.$section_id.device | $CUT -d "=" -f2 | $CUT -d "'" -f2` | ||||
| 		 | ||||
| 		[ "$device" != "$SWITCHNULL" ] && continue | ||||
| 		 | ||||
| 		for iface in `get_interface_by_portlist $ports`; do | ||||
| 			port_id=`echo $iface | $CUT -d ":" -f1` | ||||
| 			 | ||||
| 			# We just want the CPU ports here | ||||
| 			[ "$port_id" != "$port_cpu" ] && continue | ||||
| 			 | ||||
| 			port_tagged=`echo $iface | $CUT -d ":" -f2` | ||||
| 			interface=`echo $iface | $CUT -d ":" -f3` | ||||
| 			name=`echo $iface | $CUT -d ":" -f4` | ||||
| 			 | ||||
| 			# At this point, we have all we need. | ||||
| 			if [ "$port_tagged" = 1 ]; then | ||||
| 				# Tag the traffic on CPU port as master interface | ||||
| 				$IP link add link $interface name $interface.$vlan type vlan id $vlan | ||||
| 			 | ||||
| 				# Bring up the master interface before the slaves | ||||
| 				$IP link set $interface.$vlan up | ||||
| 			fi | ||||
| 		done | ||||
| 
 | ||||
| 		for iface in `get_interface_by_portlist $ports`; do | ||||
| 			port_id=`echo $iface | $CUT -d ":" -f1` | ||||
| 			 | ||||
| 			# We just want the slave ports here | ||||
| 			[ "$port_id" = "$port_cpu" ] && continue | ||||
| 			 | ||||
| 			port_tagged=`echo $iface | $CUT -d ":" -f2` | ||||
| 			interface=`echo $iface | $CUT -d ":" -f3` | ||||
| 			name=`echo $iface | $CUT -d ":" -f4` | ||||
| 			 | ||||
| 			if [ "$port_tagged" = 1 ]; then | ||||
| 				interface="$interface.$vlan" | ||||
| 			fi | ||||
| 			 | ||||
| 			# Bring up the slave interface | ||||
| 			$IP link set $interface up | ||||
| 
 | ||||
| 			# Create the bridge | ||||
| 			$IP link add name $name type bridge | ||||
| 			 | ||||
| 			# Set VLAN filtering and PVID | ||||
| 			$IP link set dev $name type bridge vlan_filtering 1 vlan_default_pvid $vlan | ||||
| 		done | ||||
| 
 | ||||
| 		for iface in `get_interface_by_portlist $ports`; do | ||||
| 			port_id=`echo $iface | $CUT -d ":" -f1`			 | ||||
| 			port_tagged=`echo $iface | $CUT -d ":" -f2` | ||||
| 			interface=`echo $iface | $CUT -d ":" -f3` | ||||
| 			name=`echo $iface | $CUT -d ":" -f4` | ||||
| 			 | ||||
| 			if [ "$port_tagged" = 1 ]; then | ||||
| 				interface="$interface.$vlan" | ||||
| 			fi | ||||
| 			 | ||||
| 			# Add port to its corresponding bridge | ||||
| 			$IP link set dev $interface master $name | ||||
| 		done | ||||
| 	done | ||||
| 
 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_port_show() { | ||||
| 	local port="$1" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_vlan_show() { | ||||
| 	local vlan="$1" | ||||
| 	 | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| swconfig_show() { | ||||
| 	return 0 | ||||
| } | ||||
| 
 | ||||
| case $1 in | ||||
| 	dev) | ||||
| 		device="$2" | ||||
| 		mode="$3" | ||||
| 		op="$5" | ||||
| 		 | ||||
| 		key="$6" | ||||
| 		val="$7" | ||||
| 		 | ||||
| 		port="" | ||||
| 		vlan="" | ||||
| 		 | ||||
| 		case $3 in | ||||
| 			port) | ||||
| 				port="$4" | ||||
| 			;; | ||||
| 			vlan) | ||||
| 				vlan="$4" | ||||
| 			;; | ||||
| 			*) | ||||
| 				mode="switch" | ||||
| 				op="$3" | ||||
| 				key="$4" | ||||
| 				val="$5" | ||||
| 			;; | ||||
| 		esac | ||||
| 		 | ||||
| 		case $op in | ||||
| 			help) | ||||
| 				$SWCONFIG_REAL $1 $2 $3 $4 && exit 0 || exit $? | ||||
| 			;; | ||||
| 			set) | ||||
| 				if [ "$mode" = "port" ]; then | ||||
| 					swconfig_port_set $port $key $val && exit 0 || exit $? | ||||
| 				elif [ "$mode" = "vlan" ]; then | ||||
| 					swconfig_vlan_set $vlan $key $val && exit 0 || exit $? | ||||
| 				else | ||||
| 					swconfig_set $key $val && exit 0 || exit $? | ||||
| 				fi | ||||
| 			;; | ||||
| 			get) | ||||
| 				if [ "$mode" = "port" ]; then | ||||
| 					swconfig_port_get $port $key && exit 0 || exit $? | ||||
| 				elif [ "$mode" = "vlan" ]; then | ||||
| 					swconfig_vlan_get $vlan $key && exit 0 || exit $? | ||||
| 				else | ||||
| 					swconfig_get $key && exit 0 || exit $? | ||||
| 				fi | ||||
| 			;; | ||||
| 			load) | ||||
| 				if [ "$mode" = "port" ]; then | ||||
| 					swconfig_port_load $port $key && exit 0 || exit $? | ||||
| 				elif [ "$mode" = "vlan" ]; then | ||||
| 					swconfig_vlan_load $vlan $key && exit 0 || exit $? | ||||
| 				else | ||||
| 					swconfig_load $key && exit 0 || exit $? | ||||
| 				fi | ||||
| 			;; | ||||
| 			show) | ||||
| 				if [ "$mode" = "port" ]; then | ||||
| 					swconfig_port_show $port && exit 0 || exit $? | ||||
| 				elif [ "$mode" = "vlan" ]; then | ||||
| 					swconfig_vlan_show $vlan && exit 0 || exit $? | ||||
| 				else | ||||
| 					swconfig_show && exit 0 || exit $? | ||||
| 				fi | ||||
| 			;; | ||||
| 			*) | ||||
| 				swconfig_usage | ||||
| 			;; | ||||
| 		esac | ||||
| 	;; | ||||
| 	list) | ||||
| 		echo $SWITCHNULL | ||||
| 		exit 0 | ||||
| 	;; | ||||
| 	*) | ||||
| 		swconfig_usage | ||||
| 	;; | ||||
| esac | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue