# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[ -z "${gbmc_br_from_ra_lib-}" ] || return

source /usr/share/network/lib.sh || exit

gbmc_br_from_ra_init=
gbmc_br_from_ra_mac=
declare -A gbmc_br_from_ra_pfxs=()
declare -A gbmc_br_from_ra_prev_addrs=()

gbmc_br_from_ra_update() {
  [ -n "$gbmc_br_from_ra_init" -a -n "$gbmc_br_from_ra_mac" ] || return

  local pfx
  for pfx in "${!gbmc_br_from_ra_pfxs[@]}"; do
    local cidr
    if ! cidr="$(ip_pfx_to_cidr "$pfx")"; then
      unset 'gbmc_br_from_ra_pfxs[$pfx]'
      continue
    fi
    if (( cidr == 80 )); then
      local sfx
      if ! sfx="$(mac_to_eui48 "$gbmc_br_from_ra_mac")"; then
        unset 'gbmc_br_from_ra_pfxs[$pfx]'
        continue
      fi
      local addr
      if ! addr="$(ip_pfx_concat "$pfx" "$sfx")"; then
        unset 'gbmc_br_from_ra_pfxs[$pfx]'
        continue
      fi
    else
      unset 'gbmc_br_from_ra_pfxs[$pfx]'
      continue
    fi
    local valid="${gbmc_br_from_ra_pfxs["$pfx"]}"
    if (( valid > 0 )); then
      if [ -z "${gbmc_br_from_ra_prev_addrs["$addr"]-}" ]; then
        echo "gBMC Bridge RA Addr Add: $addr" >&2
        gbmc_br_from_ra_prev_addrs["$addr"]=1
      fi
      ip addr replace "$addr" dev gbmcbr noprefixroute
    else
      if [ -n "${gbmc_br_from_ra_prev_addrs["$addr"]-}" ]; then
        echo "gBMC Bridge RA Addr Del: $addr" >&2
        unset 'gbmc_br_from_ra_prev_addrs[$addr]'
      fi
      ip addr del "$addr" dev gbmcbr
      unset 'gbmc_br_from_ra_pfxs[$pfx]'
    fi
  done
}

gbmc_br_from_ra_hook() {
  if [ "$change" = 'init' ]; then
    gbmc_br_from_ra_init=1
    gbmc_br_from_ra_update
  elif [[ "$change" == 'route' && "$route" != *' via '* ]] &&
       [[ "$route" =~ ^(.* dev gbmcbr proto ra .*)( +expires +([^ ]+)sec).*$ ]]; then
    pfx="${route%% *}"
    if [ "$action" = 'add' ]; then
      gbmc_br_from_ra_pfxs["$pfx"]="${BASH_REMATCH[3]}"
      gbmc_br_from_ra_update
    elif [ "$action" = 'del' ]; then
      gbmc_br_from_ra_pfxs["$pfx"]=0
      gbmc_br_from_ra_update
    fi
  elif [ "$change" = 'link' -a "$intf" = 'gbmcbr' ]; then
    rdisc6 -m gbmcbr -r 1 -w 100 >/dev/null 2>&1
    if [ "$action" = 'add' -a "$mac" != "$gbmc_br_from_ra_mac" ]; then
      gbmc_br_from_ra_mac="$mac"
      gbmc_br_from_ra_update
    fi
    if [ "$action" = 'del' -a "$mac" = "$gbmc_br_from_ra_mac" ]; then
      gbmc_br_from_ra_mac=
      gbmc_br_from_ra_update
    fi
  fi
}

GBMC_IP_MONITOR_HOOKS+=(gbmc_br_from_ra_hook)

gbmc_br_from_ra_lib=1
