#!/bin/sh
#
# Andrei.Ryjov@yahoo.com  Fri Dec  7 19:28:22 MET 2001
#
# Jumpstart's auto-revarp does not work for secondary interfaces,
# when these interfaces are down by rcS runtime
#
# Up and revarp whatever has already got the carrier
#
[ -z "$SI_CONFIG_DIR" ] && SI_CONFIG_DIR=/tmp/install_config
[ -z "$SID" ] && SID=$SI_CONFIG_DIR
[ XVarsAreSet = XYes ] || . $SID/Scripts/Misc/!Includes/Subroutines
[ XSubrIsRead = XYes ] || SetJVars

JMASKS=$SI_CONFIG_DIR/etc/netmasks
NDD=/usr/sbin/ndd
IFLIST=""

# MYADDR, PRIMARY_IFC, PRIMARY_NET are set by SetVars sh include
# and inherited from parent ($SI_CONFIG_DIR/Scripts/Begin/Std, usually)

[ x$PRIMARY_IFC = x ] && FindNetInfo
[ x$PRIMARY_IFC = x ] && StartShell ====== FindNetInfo =====

#
# Yes, we duplicate some rcS's functionality here
#
for j in `ifconfig -a | egrep ': flags=.* mtu .*' | grep -v '^lo0:' | cut -d: -f1` ; do
  #
  # We presume that whatever is a digit, is part of a number (device instance)
  # and everything else is a driver name. But we double-check it, of course
  #
  DRV=`echo $j | sed 's/[0-9]*//g'`
  NUM=`echo $j | sed "s/$DRV//g"`

  [ -h /dev/$DRV   -a   -c /dev/$DRV ] || {
    echo "
	WARNING:
	    Could not find a device driver for interface $DRV instance $NUM
    "
    continue
  }

  OLD_IP=`ifconfig ${DRV}${NUM} | grep inet  | awk '{print $2}'`
  OLD_MC=`ifconfig ${DRV}${NUM} | grep ether | awk '{print $2}'`
  [ x$OLD_IP = x$MYADDR ] && {
    #
    # Correct the mask on primary interface (!)
    # First, make sure ROOT_SERVER is mounted through PRIMARY_IFC
    # As this happens in a very beginning of Jumpstart
    # (no much use of /cdrom yet), ROOT_SERVER must be the Ipkts leader
    #
    ROOT_SERVER=`mount | awk '/^\/ on / {print $3}' | cut -d: -f1`
    MOST_USED_IFC=`netstat -in | awk '!/dres/&&!/^lo0/ {print $5" "$1}' | sort -n | tail -1 | awk '{print $2}'`
    [ "$MOST_USED_IFC" != "$PRIMARY_IFC" ] && {
      echo "
	WARNING:
	  $MOST_USED_IFC Ipkts is higher than on $PRIMARY_IFC
	  Shall not risk to change the netmask on either

      "
      continue
    }

    HMASK=`get_netmask $ROOT_SERVER`
    [ -z "$HMASK" ] && {
      echo "
	WARNING:
	  Failed to get netmask from $ROOT_SERVER
	  Skipping $PRIMARY_IFC netmask control
      "
    }

    OLD_HMASK=`ifconfig $PRIMARY_IFC | grep netmask | awk '{print $4}'`

    [ "$HMASK" = "$OLD_HMASK" ] && {
      echo "
	NOTICE:
	  $PRIMARY_IFC mask was correct - no change
      "
      continue
    }

    echo "
      NOTICE:
	Changing the mask of $PRIMARY_IFC

	    $OLD_HMASK ==> $HMASK

    "

    ifconfig $PRIMARY_IFC netmask 0x$HMASK broadcast +
    continue

  }

  [ "$OLD_IP" != 0.0.0.0 ] && continue
  echo Checking carrier on network interface ${DRV}${NUM} "... \c"
  #
  # ndd link_status only works from second time, and
  # only if interface is up
  #
  $NDD -set /dev/$DRV instance $NUM || continue

  sleep 2  ;    ifconfig ${DRV}${NUM} down
  sleep 2  ;    ifconfig ${DRV}${NUM} unplumb
  sleep 2  ;    ifconfig ${DRV}${NUM} plumb
  sleep 2  ;    ifconfig ${DRV}${NUM} -trailers up
  sleep 4  ;
  echo
  LINK_STATUS=`$NDD -get /dev/$DRV link_status`
  echo $LINK_STATUS | egrep -s '^[01]$' || continue

  echo RevARPing network interface ${DRV}${NUM} "... \c"

  [ $LINK_STATUS -eq 1 ] && {
    #
    # Try to rewarp 3 times, for lasy switches
    #
    for i in 1 2 ; do
      echo
      sleep 3
      ifconfig ${DRV}${NUM} auto-revarp
      NEW_IP=`ifconfig ${DRV}${NUM} | grep inet | awk '{print $2}'`
      [ "$NEW_IP" != 0.0.0.0 ] && break
      echo Re-Trying  ${DRV}${NUM} "... \c"
      sleep 2  ;    ifconfig ${DRV}${NUM} down
      sleep 2  ;    ifconfig ${DRV}${NUM} unplumb
      sleep 2  ;    ifconfig ${DRV}${NUM} plumb
      sleep 2  ;    ifconfig ${DRV}${NUM} -trailers up
    done
  }

  NEW_IP=`ifconfig ${DRV}${NUM} | grep inet | awk '{print $2}'`
  [ "$NEW_IP" != "$OLD_IP" ] && {
    /sbin/ifconfig ${DRV}${NUM} inet $NEW_IP netmask + broadcast +
    HMASK=`ifconfig ${DRV}${NUM} | grep netmask | awk '{print $4}'`
    Net=`netstat -in | awk "/^${DRV}${NUM}/"'{print $3}'`
    cat $JMASKS | egrep "^$Net" | while read net mask stuff ; do
      [ ! -z "$mask" ] && ifconfig ${DRV}${NUM} inet $NEW_IP netmask $mask broadcast +
    done
    HMASK=`ifconfig ${DRV}${NUM} | grep netmask   | awk '{print $4}'`
    BCAST=`ifconfig ${DRV}${NUM} | grep broadcast | awk '{print $6}'`

    echo inet $NEW_IP netmask $HMASK broadcast $BCAST
	 inet $NEW_IP netmask $HMASK broadcast $BCAST
  }
done

# echo Check Link Status - Just ping, OK ; Start_Shell $0

