#!/bin/sh -f

# This Bourne Shell Script performs the SNMP Get/GetNext funtionality
# for the Broadcom Advanced Server Pack (BASP) teaming and load 
# balancing of Broadcom BCM570x series Gigabit Network Interface Cards.
# The SNMP objects supported here include the BASP configuration and
# statistics information. 

PATH=$path:/bin:/usr/bin:/usr/ucb

BASE=".1.3.6.1.4.1.4413.1.2"
REQ="$2"

# determine if this is a config or stat object.
if [ $REQ = $BASE.1 ]; then
  CBASE=$BASE.1
else
  if [ $REQ = $BASE.2 ]; then
    SBASE=$BASE.2
  else
    CFG_STATS="`echo $2 | awk 'BEGIN { FS = "." } { print $(11) }'`"

    TEAM_PHY_VIR="`echo $2 | awk 'BEGIN { FS = "." } { print $(12) }'`"
    PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
  fi
fi

if [ "$1" = "-s" ]; then
  echo $* >> /tmp/snmpstats.log
  exit 0
fi


# now get the table index.
if [ $REQ = $PLACE ]; then
  INDEX=1
else
  INDEX="`echo $2 | awk 'BEGIN { FS = "." } { print $(NF-1) }'`"
fi


TOTTEAMS=`ls /proc/net/basp | wc -w`
TOTTEAMS=`expr $TOTTEAMS - 1`

# get the total numbers of virtual & physical adapters.
NUMFILES=`ls /proc/net/basp`
TOTVIRS=0
TOTPHYS=0
for i in $NUMFILES
do
  if [ $i = 'trap' ]; then
    continue
  fi

  VIRS=`grep "virtual" /proc/net/basp/$i | awk '{ print $6 }'`
  TOTVIRS=`expr $TOTVIRS + $VIRS`

  PHYS=`grep "physical" /proc/net/basp/$i | awk '{ print $6 }'`
  TOTPHYS=`expr $TOTPHYS + $PHYS`
done
   

# servicing GetNext call
if [ "$1" = "-n" ]; then
      case "$REQ" in
      $PLACE)      		
	    RET=$PLACE.1 ;;
      $PLACE.1)    		
	    RET=$PLACE.2.1.1
	    INDEX=1 ;;

      $PLACE.2.$INDEX.1)	
	    RET=$PLACE.2.$INDEX.2 ;;

      $PLACE.2.$INDEX.2)	
	    RET=$PLACE.2.$INDEX.3 ;;

      $PLACE.2.$INDEX.3)    	
	    RET=$PLACE.2.$INDEX.4 ;;

      $PLACE.2.$INDEX.4)    	
	    if [ $CFG_STATS = 1 -a $TEAM_PHY_VIR = 3 ]; then
	      if [ $INDEX -lt $TOTVIRS ]; then
		# next index
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.$INDEX.1
	      else
 	        # next table
		TEAM_PHY_VIR=1
		let CFG_STATS=$CFG_STATS+1
		INDEX=1
		PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.1
	      fi	
	    else    
		RET=$PLACE.2.$INDEX.5
	    fi ;;

      $PLACE.2.$INDEX.5)    	
	    if [ $CFG_STATS = 1 -a $TEAM_PHY_VIR = 2 ]; then
	      if [ $INDEX -lt $TOTPHYS ]; then
		# next index
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.$INDEX.1
	      else
 	        # next table
		let TEAM_PHY_VIR=$TEAM_PHY_VIR+1
		PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
		INDEX=1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.1
	      fi	
	    else    
		RET=$PLACE.2.$INDEX.6
	    fi ;;

      $PLACE.2.$INDEX.6) 
	    if [ $CFG_STATS = 1 -a $TEAM_PHY_VIR = 1 ]; then 
	      if [ $INDEX -lt $TOTTEAMS ]; then
		# next index
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.$INDEX.1
	      else
 	        # next table
		let TEAM_PHY_VIR=$TEAM_PHY_VIR+1
		PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
		INDEX=1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.1
	      fi	
	    elif [ $CFG_STATS = 2 -a $TEAM_PHY_VIR = 3 ]; then 
	      if [ $INDEX -lt $TOTVIRS ]; then
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.$INDEX.1
	      # next table
	      else
	        # this is the end of BASP Config Status MIB.
		exit 0
	      fi	
	    else    
		RET=$PLACE.2.$INDEX.7
	    fi ;;

      $PLACE.2.$INDEX.7)    
	    if [ $CFG_STATS = 2 -a $TEAM_PHY_VIR = 2 ]; then
	      if [ $INDEX -lt $TOTPHYS ]; then
		# next index
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.2.$INDEX.1
	      else
 	        # next table
		let TEAM_PHY_VIR=$TEAM_PHY_VIR+1
		PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
		INDEX=1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.1
	      fi	
	    else    
		RET=$PLACE.2.$INDEX.8
	    fi ;;

      $PLACE.2.$INDEX.8)    	
	    RET=$PLACE.2.$INDEX.9 ;;

      $PLACE.2.$INDEX.9)
	    if [ $CFG_STATS = 2 -a $TEAM_PHY_VIR = 1 ]; then
	      if [ $INDEX -lt $TOTTEAMS ]; then
		# next index
		let INDEX=$INDEX+1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.$INDEX.1
	      else
 	        # next table
		let TEAM_PHY_VIR=$TEAM_PHY_VIR+1
		PLACE=$BASE.$CFG_STATS.$TEAM_PHY_VIR
		INDEX=1
		RET=$BASE.$CFG_STATS.$TEAM_PHY_VIR.1
	      fi	
	    else    
		RET=$PLACE.2.$INDEX.10
	    fi ;;
      *)         	 
      exit 0 ;;
      esac
else
  case "$REQ" in
    $PLACE)    
    exit 0 ;;
    *)         
    RET=$REQ ;;
  esac
fi



# get the correct line offset in each file for the
# virtual and physical adapters.
NUM=0
for i in $NUMFILES
do
  if [ $i = 'trap' ]; then
    continue
  fi

  if [ $TEAM_PHY_VIR = 2 ]; then
    PHYS=`grep "physical" /proc/net/basp/$i | awk '{ print $6 }'`
    if [ $INDEX -gt $NUM ]; then
	FINDEX=`expr $INDEX - $NUM`
	NUM=`expr $NUM + $PHYS`
	FILEOPN=$i
    fi	
  else 
    if [ $TEAM_PHY_VIR = 3 ]; then
      VIRS=`grep "virtual" /proc/net/basp/$i | awk '{ print $6 }'`
      if [ $INDEX -gt $NUM ]; then
	FINDEX=`expr $INDEX - $NUM`
	NUM=`expr $NUM + $VIRS`
	FILEOPN=$i
      fi
    else     # team index
      let NUM=$NUM+1
      if [ $NUM = $INDEX ]; then
        FILEOPN=$i	
      fi
    fi 
  fi
done  

echo $RET

# c o n f i g   o b j e c t.
if [ $CFG_STATS = 1 ]; then
# look for team config object.
if [ $TEAM_PHY_VIR = 1 -a $INDEX -le $TOTTEAMS ]; then 
    case "$RET" in
    $PLACE.1)            echo "integer"; echo $TOTTEAMS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "string"; grep  "name" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "integer"; grep "type" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "string"; grep "address" /proc/net/basp/$FILEOPN | awk '{ print $4 }'; exit 0 ;;
    $PLACE.2.$INDEX.5)	 echo "integer"; grep "physical" /proc/net/basp/$FILEOPN | awk '{ print $6 }'; exit 0 ;;
    $PLACE.2.$INDEX.6)	 echo "integer"; grep "virtual" /proc/net/basp/$FILEOPN | awk '{ print $6 }'; exit 0 ;;
    *) 
    esac
fi

# look for physical adapter config object.
if [ $TEAM_PHY_VIR = 2 -a $INDEX -le $TOTPHYS ]; then 
    case "$RET" in
    $PLACE.1)  	         echo "integer"; echo $TOTPHYS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "integer"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $1 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "string"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $2 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "integer"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { if ($4 == "LB") print "100"; else print "101" }'; exit 0 ;;
    $PLACE.2.$INDEX.5)	 echo "string"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $3 }'; exit 0 ;;
    *) 
    esac
fi

# look for virtual adapter config object.
if [ $TEAM_PHY_VIR = 3 -a $INDEX -le $TOTVIRS ]; then 
    case "$RET" in
    $PLACE.1)  	         echo "integer"; echo $TOTVIRS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "integer"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $1 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "string"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $2 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "integer"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $4 }'; exit 0 ;;
    *) 
    esac
fi

# e n d   o f  c o n f i g   o b j e c t
fi

# s t a t i s t i c s   o b j e c t.

if [ $CFG_STATS = 2 ]; then

# look for team stats object.
if [ $TEAM_PHY_VIR = 1 -a $INDEX -le $TOTTEAMS ]; then 
    case "$RET" in
    $PLACE.1)            echo "integer"; echo $TOTTEAMS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "string" ; grep  "name" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "integer"; grep "physical" /proc/net/basp/$FILEOPN | awk '{ print $6 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "integer"; grep "virtual" /proc/net/basp/$FILEOPN | awk '{ print $6 }'; exit 0 ;;
    $PLACE.2.$INDEX.5)	 echo "counter"; grep "statistics" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.6)	 echo "counter"; grep "statistics" /proc/net/basp/$FILEOPN | awk '{ print $4 }'; exit 0 ;;
    $PLACE.2.$INDEX.7)	 echo "counter"; grep "statistics" /proc/net/basp/$FILEOPN | awk '{ print $6 }'; exit 0 ;;
    $PLACE.2.$INDEX.8)	 echo "counter"; grep "statistics" /proc/net/basp/$FILEOPN | awk '{ print $11 }'; exit 0 ;;
    $PLACE.2.$INDEX.9)	 echo "counter"; grep "statistics" /proc/net/basp/$FILEOPN | awk '{ print $9 }'; exit 0 ;;
    *) 
    esac
fi

# look for physical adapter stats object.
if [ $TEAM_PHY_VIR = 2 -a $INDEX -le $TOTPHYS ]; then 
    case "$RET" in
    $PLACE.1)  	         echo "integer"; echo $TOTPHYS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "integer"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $1 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "string"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{  for (i=0;i<'$FINDEX'-1;i++) getline } { print $2 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "counter"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $7 }'; exit 0 ;;
    $PLACE.2.$INDEX.5)	 echo "counter"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $8 }'; exit 0 ;;
    $PLACE.2.$INDEX.6)	 echo "counter"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $10 }'; exit 0 ;;
    $PLACE.2.$INDEX.7)	 echo "counter"; grep -A $FINDEX "physical" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $11 }'; exit 0 ;;
    *) 
    esac
fi

# look for virtual adapter stats object.
if [ $TEAM_PHY_VIR = 3 -a $INDEX -le $TOTVIRS ]; then 
    case "$RET" in
    $PLACE.1)  	         echo "integer"; echo $TOTVIRS; exit 0 ;;
    $PLACE.2.$INDEX.1)	 echo "integer"; grep "id:" /proc/net/basp/$FILEOPN | awk '{ print $3 }'; exit 0 ;;
    $PLACE.2.$INDEX.2)	 echo "integer"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $1 }'; exit 0 ;;
    $PLACE.2.$INDEX.3)	 echo "string"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $2 }'; exit 0 ;;
    $PLACE.2.$INDEX.4)	 echo "counter"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $7 }'; exit 0 ;;
    $PLACE.2.$INDEX.5)	 echo "counter"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $6 }'; exit 0 ;;
    $PLACE.2.$INDEX.6)	 echo "counter"; grep -A $FINDEX "virtual" /proc/net/basp/$FILEOPN | grep '#' -v | awk '{ for (i=0;i<'$FINDEX'-1;i++) getline } { print $8 }'; exit 0 ;;
    *) 
    esac
fi

# e n d   o f   s t a t s   o b j e c t
fi

exit 0;

