blob: 97849554a49b44d834e71cf4a56bc6d848e03069 [file] [log] [blame]
#!/bin/sh
. /etc/utils.sh
redistribute_irqs()
{
if is-storage-box; then
# Storage Box serves MoCA and Ethernet simultaneously,
# so we move them to different CPUs.
# TV Box mostly uses MoCA *or* Ethernet, and keeps
# CPU1 free to handle the video interrupts.
mocacpu=1
eth0cpu=2
else
mocacpu=2
eth0cpu=2
fi
wifi_irq=
if grep BCM7425 /proc/cpuinfo >/dev/null; then
echo 1 >/proc/irq/62/smp_affinity
echo $eth0cpu >/proc/irq/18/smp_affinity
echo $eth0cpu >/proc/irq/19/smp_affinity
echo $mocacpu >/proc/irq/20/smp_affinity
echo $mocacpu >/proc/irq/21/smp_affinity
echo $mocacpu >/proc/irq/31/smp_affinity
wifi_irq=34
elif grep BCM7429 /proc/cpuinfo >/dev/null; then
echo 1 >/proc/irq/52/smp_affinity
echo $eth0cpu >/proc/irq/16/smp_affinity
echo $eth0cpu >/proc/irq/17/smp_affinity
echo $mocacpu >/proc/irq/18/smp_affinity
echo $mocacpu >/proc/irq/19/smp_affinity
echo $mocacpu >/proc/irq/28/smp_affinity
wifi_irq=57
fi
if has_wifi && is-tv-box && [ ! -z ${wifi_irq} ]; then
# Partial fix for "micro-stuttering" seen in video playback.
# Wifi driver needs to be on cpu1 and video on cpu0 so that wifi
# can't lock out scheduling of the video player.
echo "forcing wifi onto cpu1"
echo 2 >/proc/irq/${wifi_irq}/smp_affinity
fi
}
case "$1" in
start)
# TODO(apenwarr): remove this once all devices use 'moca0' as the name.
if [ -e /sys/class/net/moca0 ]; then
# GFRG200
mocaifc=moca0
else
# GFMS100/GFHD100/GFHD200
mocaifc=eth1
fi
[ -e /usr/lib/modules/bmoca.ko ] && insmod /usr/lib/modules/bmoca.ko
# if the file exists and it isn't empty
if [ -s /config/tcp_congestion_control ]; then
algorithm=$(cat /config/tcp_congestion_control)
echo "Registering congestion control algorithm $algorithm"
sysctl net.ipv4.tcp_congestion_control=$algorithm
fi
# create a default resolv.conf and /etc/hosts in case DHCP doesn't.
# (this is always true if using nfsroot).
# 8.8.8.8 and 8.8.4.4 are well-known Google public DNS servers
# that can be used from anywhere, so it makes a good place to start.
# DHCP will just overwrite this file when it's ready to go.
if [ ! -r /etc/resolv.conf ]; then
#TODO(apenwarr): add IPv6 DNS once our uClibc can handle it.
(echo 'nameserver 8.8.8.8';
echo 'nameserver 8.8.4.4') >/etc/resolv.conf
fi
if [ ! -r /etc/hosts ]; then
echo "127.0.0.1 localhost $(hostname)" >/etc/hosts
fi
# Configure dhclient with the right hostname etc.
setup-dhclient
# configure loopback
ifup lo
echo -n "Creating bridge... "
brctl addbr br0 || exit 1
brctl setfd br0 1
brctl stp br0 on
# Storage and network boxes should have higher precedence (lower value)
# when choosing the root of the spanning tree.
# The default in Linux is 0x8000.
if is-network-box; then
brctl setbridgeprio br0 0x7980
elif is-storage-box; then
brctl setbridgeprio br0 0x7990
fi
[ -e /sys/class/net/eth0/address ] && \
ip link set br0 address \
$(cat /sys/class/net/eth0/address)
echo "done"
ip link set br0 up
ip link set br0 up # kernel 3.2.26 bug: fails the first time
# VLAN tag for MoCA interface
ip link add link $mocaifc name $mocaifc.0 type vlan id 0
# SO_PRIORITY -> 802.1p mapping
for prio in 0 1 2 3 4 5 6 7; do
vconfig set_egress_map $mocaifc.0 $prio $prio >/dev/null 2>&1
done
echo "Adding interfaces... "
# Move any existing network info from primary network interfaces to
# the bridge.
for x in \
/sys/class/net/[ea]th[0-9] \
/sys/class/net/lan[0-9] \
/sys/class/net/moca[0-9]; do
x=${x#/sys/class/net/}
echo "Adding interface $x..."
ip link set $x up &&
ip -o -f inet addr show $x |
while read a b c ip d brd junk; do
ip addr add $ip broadcast $brd dev br0
done &&
if [ $x = $mocaifc ]; then
x=$mocaifc.0
fi &&
brctl addif br0 $x &&
ip -o -f inet route list dev $x |
while read dst routeinfo; do
if [ "$dst" = "default" ]; then
echo "Moving route '$dst' from $x to br0" &&
ip route del dev $x $dst $routeinfo &&
ip route add dev br0 $dst $routeinfo
fi
done &&
ip -o -f inet addr show $x |
while read a b c ip junk; do
ip addr del $ip dev $x
done
done
kernopt ip |
while IFS=: read ip serverip gatewayip netmask hostname ifc junk; do
# $ip should be already setup by simpleramfs.
# TODO(apenwarr): simpleramfs should set up $gatewayip too.
# But right now its included networking commands are too limited.
if [ -n "$gatewayip" ]; then
echo "IP: adding default gateway '$gatewayip'"
ip route add default via "$gatewayip"
fi
done
echo "Bringing up the bridge..."
ifup br0
echo "distribute IRQ handling between cores"
redistribute_irqs
if [ -e /dev/bmoca0 ]; then
echo "starting moca..."
babysit 30 runmoca 2>&1 | logos mocad &
fi
if [ -e /sys/class/net/wan0 ]; then
echo "Bringing up the WAN port..."
ifup wan0
sysctl net.ipv4.conf.all.forwarding=1
sysctl net.ipv6.conf.all.forwarding=1
fi
# Enable hardware offloads, do this at the end to avoid
# invalid access caused by powered down core
ethtool -K eth0 rx on tx on sg on gso on gro on
ethtool -K $mocaifc rx on tx on sg on gso on gro on
;;
stop)
if [ ! -e /tmp/NFS ]; then
if [ -e /sys/class/net/wan0 ]; then
echo "Shutting down the WAN port..."
ifdown wan0
fi
for x in $(ls /sys/class/net); do
if [ -n /sys/class/net/$x/bridge ]; then
ifdown $x
echo "Shutting down $x interface"
fi
if [ -e /sys/class/net/$x/device ]; then
brctl delif br0 $x
fi
done
ifdown br0
# Kill mocad and mocactl
if [ -e /dev/bmoca0 ]; then
echo -n "mocacfg kill"
pkillwait mocad
fi
fi
[ -e /sys/class/net/br0 ] && brctl delbr br0
;;
restart|reload)
"$0" stop
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac