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