#!/bin/bash

# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

echo "Configuring for backchannel and test network devices"

testif=eth_test
wlanifs=wlan1,wlan2,managed0,managed1
modemif=pseudomodem0p
tapif=faketap0
test_devices="${testif},${tapif},${wlanifs},${modemif}"

# Prevent shill from taking control of the backchannel and test network devices.
ORIG_CONF=${ROOT_FS_DIR}/etc/init/shill.conf
TEMP_CONF=${ORIG_CONF}.tmp
sed -e "s@SHILL_TEST_DEVICES=\"\"@SHILL_TEST_DEVICES=\"${test_devices}\"@" \
    -e "s@SHILL_ACCEPT_HOSTNAME_FROM=@SHILL_ACCEPT_HOSTNAME_FROM=\"pseudoethernet0\"@" \
    ${ORIG_CONF} > ${TEMP_CONF}
mv -f ${TEMP_CONF} ${ORIG_CONF}

# Arrange to run dhclient on the backchannel device but without
# installing the default route, and stashing said route away for later
# installation as a host route.
cat > ${ROOT_FS_DIR}/etc/udev/rules.d/50-backchannel-network.rules <<EOF
KERNEL=="eth*", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/sbin/backchannel-setup %k"
KERNEL=="${testif}", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="kill \$(cat /run/dhclient-%k.pid)"
EOF

cat > ${ROOT_FS_DIR}/sbin/backchannel-setup <<EOF
#!/bin/sh

testif=${testif}

if [ ! -f /mnt/stateful_partition/etc/enable_backchannel_network ]; then
    # This mechanism has to be explicitly enabled on the device.
    exit
fi

if [ -f /run/dhclient-\${testif}.pid ]; then
    # Something else is already going on - perhaps a second
    # USB Ethernet device has been inserted. Let's not mess with it.
    exit
fi

if [ "\$1" != "\${testif}" ]; then
    initctl stop shill
    # \$1 is the current name of the backchannel device. Swap it with testif.
    if ifconfig \${testif} > /dev/null 2>&1; then
        orig_mac=\$(ifconfig \${testif} | awk '/HWaddr/ {print \$5}')
        ifconfig \${testif} down # must be down for nameif to work
        nameif eth_tmp \${orig_mac}
    fi
    bdev_mac=\$(ifconfig \$1 | awk '/HWaddr/ {print \$5}')
    ifconfig \$1 down # must be down for nameif to work
    nameif \${testif} \${bdev_mac}
    if [ -n "\${orig_mac}" ]; then
        nameif \$1 \${orig_mac}
    fi
    initctl start shill
fi

# Bring up the backchannel interface
dhclient -q -pf /run/dhclient-\${testif}.pid \\
            -lf /run/dhclient-\${testif}.leases \\
            -cf /etc/dhclient-backchannel.conf \\
            -sf /sbin/dhclient-backchannel-script \\
         \${testif}
EOF

chmod +x ${ROOT_FS_DIR}/sbin/backchannel-setup

cat > ${ROOT_FS_DIR}/etc/dhclient-backchannel.conf <<EOF
request subnet-mask, broadcast-address, routers;
EOF

cat > ${ROOT_FS_DIR}/sbin/dhclient-backchannel-script <<EOF
#!/bin/sh

if [ -n "\$new_broadcast_address" ]; then
    new_broadcast_arg="broadcast \$new_broadcast_address"
fi
if [ -n "\$new_subnet_mask" ]; then
    new_subnet_arg="netmask \$new_subnet_mask"
fi


case "\$reason" in
    MEDIUM|ARPCHECK|ARPSEND)
        # Do nothing
        ;;
    PREINIT)
        # The DHCP client is requesting that an interface be
        # configured as required in order to send packets prior to
        # receiving an actual address. - dhclient-script(8)

        ifconfig \$interface inet 0 up

        # We need to give the kernel some time to get the interface up.
        sleep 1
        ;;

    BOUND|RENEW|REBIND|REBOOT|TIMEOUT)
        if [ -n "\$old_ip_address" -a \
             "\$old_ip_address" != "\$new_ip_address" ]; then
            # IP address changed. Bringing down the interface will delete all routes,
            # and clear the ARP cache.
            ifconfig \$interface inet 0

        fi

        if [ -z "\$old_ip_address" -o "\$old_ip_address" != "\$new_ip_address" -o \
            "\$reason" = "BOUND" -o "\$reason" = "REBOOT" ]; then

            ifconfig \$interface inet \$new_ip_address \$new_subnet_arg \
                \$new_broadcast_arg \$mtu_arg

            # Since this script is for the backchannel testing interface,
            # we don't set the default route from here, but we do stash
            # it for possible later use in setting up a host route.
            cp /dev/null /run/dhclient-\${interface}.routers
            for router in \$new_routers; do
                echo \$router >> /run/dhclient-\${interface}.routers
            done
        fi
        ;;

    EXPIRE|FAIL|RELEASE|STOP)
        if [ -n "\$old_ip_address" ]; then
            # Shut down interface, which will delete routes and clear arp cache.
            ifconfig \$interface inet 0
        fi
        ;;
esac
EOF

chmod +x ${ROOT_FS_DIR}/sbin/dhclient-backchannel-script
