#!/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 network device"

testif=eth_test

# Prevent flimflam from taking control of the backchannel network device.
ORIG_CONF=${ROOT_FS_DIR}/etc/init/flimflam.conf
TEMP_CONF=${ORIG_CONF}.tmp
sed "s,/usr/sbin/flimflamd,/usr/sbin/flimflamd -I ${testif}," ${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 /var/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 /var/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 flimflam
    # \$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 flimflam
fi

# Bring up the backchannel interface
dhclient -q -pf /var/run/dhclient-\${testif}.pid \\
            -lf /var/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 /var/run/dhclient-\${interface}.routers
            for router in \$new_routers; do
                echo \$router >> /var/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
