ncsid: Import from gBMC

This is the initial code drop from gBMC.

Google-Bug-Id: 179618516
Upstream: 1e71af914bc8c54d8b91d0a1cf377e2696713c2f
Change-Id: Ic653e8271dacd205e04f2bc713071ef2ec5936a4
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/ncsid/src/update_static_neighbors.sh b/ncsid/src/update_static_neighbors.sh
new file mode 100644
index 0000000..711ae4b
--- /dev/null
+++ b/ncsid/src/update_static_neighbors.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+source "$(dirname "${BASH_SOURCE[0]}")"/ncsid_lib.sh
+
+UpdateNeighbor() {
+  local netdev="$1"
+  local service="$2"
+  local object="$3"
+
+  eval "$(GetNeighbor "$service" "$object" | JSONToVars)" || return $?
+  local new_mac
+  if ! new_mac="$(DetermineNeighbor "$netdev" "$IPAddress")"; then
+    echo "Faild to find $IPAddress" >&2
+    return 10
+  fi
+  new_mac=$(normalize_mac "$new_mac") || return
+  if [ "$new_mac" != "$(normalize_mac "$MACAddress")" ]; then
+    echo "Updating $IPAddress: $MACAddress -> $new_mac" >&2
+    SuppressTerm
+    local rc=0
+    DeleteObject "$service" "$object" && \
+      AddNeighbor "$service" "$netdev" "$IPAddress" "$new_mac" || \
+      rc=$?
+    UnsuppressTerm
+    return $rc
+  fi
+}
+
+UpdateNeighbors() {
+  local netdev="$1"
+
+  local entry
+  while read entry; do
+    eval "$(echo "$entry" | JSONToVars)"
+    RunInterruptibleBg UpdateNeighbor "$netdev" "$service" "$object"
+  done < <(GetNeighborObjects "$netdev" 2>/dev/null)
+  WaitInterruptibleBg
+}
+
+Main() {
+  set -o nounset
+  set -o errexit
+  set -o pipefail
+
+  InitTerm
+  UpdateNeighbors "$@"
+}
+
+return 0 2>/dev/null
+Main "$@"