blob: 7f9f2cfbaaa22beb5dd39d8d226b95e040f11744 [file] [log] [blame]
#!/bin/sh
# Copyright 2018 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.
# Backchannel control script - sets up and tears down backchannel network
# interfaces. Backchannel interfaces are hidden from flimflam and will never be
# the default route.
#
# A backchannel interface can also be used to simulate a cellular
# modem used by fake-cromo if the new interface name is set to
# pseudo-modem0
#
readonly DEFAULT_NEW_IFNAME=eth_test
usage() {
cat <<EOF
Usage: $0 <command> [args...]
setup <iface> [new_iface_name] Set <iface> as backchannel device
teardown <iface> [new_iface_name] Return backchannel device to normal
reach <ip> <gw> [new_iface_name] Route <ip> via gateway <gw>
EOF
}
ipaddr_with_subnet_mask() {
ip addr show "$1" | awk '/inet / { print $2 }'
}
# We need to down the interface (and therefore stop shill ) across the
# invocation of `ip link set <old_ifname> name <new_ifname>`.
renameif() {
local old_ifname="$1"
local new_ifname="$2"
initctl stop shill
ip link set "${old_ifname}" down
ip link set "${old_ifname}" name "${new_ifname}"
ip link set "${new_ifname}" up
initctl start shill
}
setup() {
local old_ifname="$1"
local new_ifname="${2:-${DEFAULT_NEW_IFNAME}}"
local old_ip
old_ip="$(ipaddr_with_subnet_mask "${old_ifname}")"
renameif "${old_ifname}" "${new_ifname}"
ip addr add "${old_ip}" dev "${new_ifname}"
}
teardown() {
local old_ifname="$1"
local new_ifname="${2:-${DEFAULT_NEW_IFNAME}}"
renameif "${new_ifname}" "${old_ifname}"
}
reach() {
local ip="$1"
local gw="$2"
local new_ifname="${3:-${DEFAULT_NEW_IFNAME}}"
ip route add "${ip}" via "${gw}" dev "${new_ifname}"
}
backchannel() {
local command="$1"
case "${command}" in
setup|teardown|reach)
"$@"
;;
*)
usage
exit 1
;;
esac
}
backchannel "$@"