#!/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}\"@" \
    ${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
