#!/bin/sh
# SUBSYSTEM, ACTION, DEVPATH, and FIRMWARE are all provided by the kernel
# when this script is started.
exec >/dev/kmsg 2>&1

. /etc/utils.sh


INTERFACE_RESET_PATH=/tmp/interface
mkdir -p "$INTERFACE_RESET_PATH"


get_random_mac() {
  echo -n $(get_mac_addr_for_interface "$1" | cut -c1-8)
  randomdata 0 3 | hexdump -e '3/1 ":%02x"'
}

create_client_interface() {
  local interface="$1"
  local wlan_mac=$(cat /sys/class/net/"$interface"/address)
  local mac=$(mac_addr_increment "$wlan_mac" 1)
  local client_interface=$(echo "$interface" | sed s/^wlan/wcli/)
  if ! interface_exists "$client_interface"; then
    if is_quantenna_interface "$interface"; then
      echo "add $client_interface 2" >/sys/class/net/quantenna/vlan
      mac=$(get_locally_administered_mac_addr "$mac")
    else
      local phy=$(find_phy_for_interface "$interface")
      iw phy "$phy" interface add "$client_interface" type station
    fi
    ip link set dev "$client_interface" address "$mac"
  fi
  # Disable IPv6 autoconfiguration of the interface, which breaks gftests.
  # accept_ra means "Accept Router Advertisements, and autoconfigure this
  # interface with received data."; disabling this prevents the problematic
  # autoconfiguration of routes.
  # TODO(rofrankel):  Find a way not to need to disable this, e.g. by making it
  # so that autoconfigured br0 routes have a lower metric than wcli* routes.
  echo 0 >"/proc/sys/net/ipv6/conf/$client_interface/accept_ra"
}

load_firmware() {
  echo "Trying firmware '$1'" &&
  [ -r "$1" ] &&
  echo 1 >/sys/$DEVPATH/loading &&
  cat "$1" >/sys/$DEVPATH/data &&
  echo 0 >/sys/$DEVPATH/loading &&
  echo "  ...loaded firmware '$1'"
}

set_mac_address()
{
  local interface="$1"
  # Set the mac address from values in hnvram.
  if is-windcharger; then
    case "$interface" in
      wan0)
        set_mac_from_hnvram wan0 MAC_ADDR1
        ;;
      lan0)
        set_mac_from_hnvram lan0 MAC_ADDR2
	;;
    esac
  fi
  case "$interface" in
    wlan0)
      set_mac_from_hnvram wlan0 MAC_ADDR_WIFI
      ;;
    wlan1)
      set_mac_from_hnvram wlan1 MAC_ADDR_WIFI2
      ;;
  esac
}

create_secondary_interface() {
  local interface="$1"
  local suffix="$2"
  local mac=$(get_random_mac "$interface")
  local secondary_interface="${interface}${suffix}"

  if ! interface_exists "$secondary_interface"; then
    if is_quantenna_interface "$interface"; then
      echo "add $secondary_interface 4" >/sys/class/net/quantenna/vlan
      mac=$(get_locally_administered_mac_addr "$mac")
    else
      local phy=$(find_phy_for_interface "$interface")
      iw phy "$phy" interface add "$secondary_interface" type managed
    fi
    ip link set dev "$secondary_interface" address "$mac"
    brctl addif br1 "$secondary_interface"
  fi
}


network_add() {
  interface="$1"
  set_mac_address "$interface"
  touch "$INTERFACE_RESET_PATH/$interface"
  # At boot or device reset, a net add event is delivered for the primary
  # interface. Use this event to create a client interface, which is
  # created in user space unlike the primary interface.
  if startswith "$interface" "wlan"; then
    if is-wireless-client; then
      create_client_interface "$interface"
    fi
  fi
  if is-network-box && startswith "$interface" wlan && ! contains "$interface" _portal; then
    create_secondary_interface "$interface" _portal
  fi
}

case "$SUBSYSTEM-$ACTION" in
  input-add)
    # BlueZ: adjust repeat speed on remotes
    if [ -c "/dev/$DEVNAME" ]; then
      echo "hotplug: setting autorepeat on $DEVNAME"
      input-repeat -f "/dev/$DEVNAME" -d 600
      # Allow user to access input device
      chmod 666 "/dev/$DEVNAME"
    fi
    ;;

  bluetooth-add)
    # BlueZ: Configure hci0 interface link mode
    hcidev=${DEVPATH##*/}
    if [ "$hcidev" = "hci0" ]; then
      echo "hotplug: configuring $hcidev"
      hciconfig "$hcidev" lm ACCEPT,MASTER
    fi
    ;;

  hidraw-add)
    if [ -c "/dev/$DEVNAME" ]; then
      echo "Trying gfrm100-rcu-audio for $DEVNAME"
      # Allow user to access input device
      chmod 666 "/dev/$DEVNAME"
      # gfrm100-rcu-audio will exit if not a GFRM100 or daemonize itself
      # if it is, so we run it in the foreground. The timeout is for
      # safety to not hang the hotplug script, just in case.
      timeout 5 setuid appclient:video gfrm100-rcu-audio "/dev/$DEVNAME" 2>&1 | logos "gfrm100_audio"
    fi
    ;;

  firmware-add)
    echo "hotplug: sys=$SUBSYSTEM act=$ACTION fw=$FIRMWARE dev=$DEVPATH"
    register_experiment RwFirmware
    if experiment RwFirmware; then
      load_firmware "/rw/firmware/$FIRMWARE" ||
      load_firmware "/rw/firmware/$(basename "$FIRMWARE")"
    else
      false  # fall back
    fi ||
    load_firmware "/lib/firmware/$FIRMWARE" ||
    echo -1 >"/sys/$DEVPATH/loading"
    ;;

  net-add)
    echo "hotplug: net-add if=$INTERFACE act=$ACTION"
    network_add "$INTERFACE"
    ;;
esac

# DirectFB apps listen for an AF_UNIX message for hotplug events, which
# dfb_input_hotplug sends using the ACTION and DEVPATH in the environment.
if [ "$SUBSYSTEM" = "input" ] && [ "$ACTION" = "add" -o "$ACTION" = "remove" ]; then
  for dir in /usr/local/bin/directfb/* ; do
    if [ -d "$dir" ]; then
      export PATH="$PATH":"$dir"
    fi
  done
  if runnable dfb_input_hotplug; then
    dfb_input_hotplug
  fi
fi
