#!/bin/ksh
#
#ident	"@(#)nic_check.sh	1.5	04/12/08 SMI"
#
# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
##############################################
#This script is to detect whether it's multiport NIC configured if there is
#more than one interface  on system. It's based on MAC address and physical 
#path name in /etc/path_to_inst to judge a multiport NIC.
#############################################

if_conf_file="/etc/path_to_inst"
if_tmp_file="/etc/if_tmp"

if_no=`/usr/sbin/ifconfig -a4u | grep IPv4 | grep -v 'lo0' | wc -l`
if=`/usr/sbin/ifconfig -a4u | grep IPv4 | grep -v 'lo0' | cut -d: -f1`


if [ $if_no -eq 0 ]
then
	#no interface
	exit 10
elif [ $if_no -eq 1 ]
then
	#single port
	exit 11
elif [ $if_no -eq 2 ]
then
	#may be dual port 
	if_1=`echo $if | cut -d' ' -f1`
	if_2=`echo $if | cut -d' ' -f2`
	if [ "$if_1" = "$if_2" ] #logical interface existed
	then
		#handle as multi nic		
		exit 99
	else
		if_1_ip=`/usr/sbin/ifconfig $if_1 | grep inet | cut -d' ' -f2`	
		if_2_ip=`/usr/sbin/ifconfig $if_2 | grep inet | cut -d' ' -f2`	
	fi
	if_1_base=`echo $if_1 | sed -e "s/[0-9]*$//"`
	if_1_inst=`echo $if_1 | sed -e "s/^.*[^0-9]//"`
	if_2_base=`echo $if_2 | sed -e "s/[0-9]*$//"`
	if_2_inst=`echo $if_2 | sed -e "s/^.*[^0-9]//"`
	if [ "$if_2_base" = "$if_1_base" ] # with same instance name
	then
		if_1_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_1 | grep ether | cut -d' ' -f2`
		if_2_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_2 | grep ether | cut -d' ' -f2`
		if_1_mac_temp='0x'
		if_2_mac_temp='0x'
		for i in 1 2 3 4 5 6
		do
			if_1_len=`expr \`echo $if_1_mac | cut -d':' -f$i\` : '.*'`
			if_2_len=`expr \`echo $if_2_mac | cut -d':' -f$i\` : '.*'`
			if [ $if_1_len = 1 ]
			then
				if_1_mac_temp=$if_1_mac_temp'0'`echo $if_1_mac | cut -d':' -f$i`
			else
				if_1_mac_temp=$if_1_mac_temp`echo $if_1_mac | cut -d':' -f$i`
			fi
			if [ $if_2_len = 1 ]
			then
				if_2_mac_temp=$if_2_mac_temp'0'`echo $if_2_mac | cut -d':' -f$i`
			else
				if_2_mac_temp=$if_2_mac_temp`echo $if_2_mac | cut -d':' -f$i`
			fi
		done

		if [ $(($if_2_mac_temp-$if_1_mac_temp)) = 1 ] || [ $(($if_2_mac_temp-$if_1_mac_temp)) = -1 ]
		then
			#dual port
			exit 12
		fi

		IFS_ORG=$IFS
		IFS='
'
		for i in ` grep $if_2_base $if_conf_file`
		do
			if [ `echo $i | cut -d' ' -f2` = $if_1_inst ]
			then
				if_1_path=`echo $i | cut -d' ' -f1`
			elif [ `echo $i | cut -d' ' -f2` = $if_2_inst ]
			then
				if_2_path=`echo $i | cut -d' ' -f1`
			fi
		done
		IFS=$IFS_ORG
		if_1_path_len=`expr $if_1_path : '.*'`
		if_2_path_len=`expr $if_2_path : '.*'`
		if [ $if_1_path_len -lt $if_2_path_len ]
		then
			if_1_path_len=`expr $if_1_path_len - 2`
			if [ "`echo $if_1_path | cut -c2-$if_1_path_len`" \
= "`echo $if_2_path | cut -c2-$if_1_path_len`" ]
			then
				#dual port
				exit 12
			else
				#handle as multi  NICs
				exit 99
			fi
		else
			if_2_path_len=`expr $if_2_path_len - 2`
			if [ "`echo $if_1_path | cut -c2-$if_2_path_len`" \
= "`echo $if_2_path | cut -c2-$if_2_path_len`" ]
			then
				#dual port
				exit 12
			else
				#handle as multi  NICs
				exit 99
			fi
		fi
	else
		#handle as multi NICs
		exit 99
	fi
elif [ $if_no -eq 4 ]
then
	#may be quad port
	if_1=`echo $if | cut -d' ' -f1`
	if_2=`echo $if | cut -d' ' -f2`
	if_3=`echo $if | cut -d' ' -f3`
	if_4=`echo $if | cut -d' ' -f4`
	if [ $if_1 = $if_2 ] || [ $if_2 = $if_3 ] || [ $if_3 = $if_4 ] #logical interface existed
	then
		#handle as multi nic		
		exit 99
	else
		if_1_ip=`/usr/sbin/ifconfig $if_1 | grep inet | cut -d' ' -f2`	
		if_2_ip=`/usr/sbin/ifconfig $if_2 | grep inet | cut -d' ' -f2`	
		if_3_ip=`/usr/sbin/ifconfig $if_3 | grep inet | cut -d' ' -f2`	
		if_4_ip=`/usr/sbin/ifconfig $if_4 | grep inet | cut -d' ' -f2`	
	fi
	if_1_base=`echo $if_1 | sed -e "s/[0-9]*$//"`
	if_1_inst=`echo $if_1 | sed -e "s/^.*[^0-9]//"`
	if_2_base=`echo $if_2 | sed -e "s/[0-9]*$//"`
	if_2_inst=`echo $if_2 | sed -e "s/^.*[^0-9]//"`
	if_3_base=`echo $if_3 | sed -e "s/[0-9]*$//"`
	if_3_inst=`echo $if_3 | sed -e "s/^.*[^0-9]//"`
	if_4_base=`echo $if_4 | sed -e "s/[0-9]*$//"`
	if_4_inst=`echo $if_4 | sed -e "s/^.*[^0-9]//"`
	if [ "$if_1_base" = "$if_2_base" ] &&  [ "$if_2_base" = "$if_3_base" ] && [ "$if_3_base" = "$if_4_base" ] # with same instance name
	then
                if_1_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_1 | grep ether | cut -d' ' -f2`
                if_2_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_2 | grep ether | cut -d' ' -f2`
                if_3_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_3 | grep ether | cut -d' ' -f2`
                if_4_mac=`rsh -l root \`hostname\` /usr/sbin/ifconfig $if_4 | grep ether | cut -d' ' -f2`
                if_1_mac_temp='0x'
                if_2_mac_temp='0x'
                if_3_mac_temp='0x'
                if_4_mac_temp='0x'
                for i in 1 2 3 4 5 6
                do
                        if_1_len=`expr \`echo $if_1_mac | cut -d':' -f$i\` : '.*'`
                        if_2_len=`expr \`echo $if_2_mac | cut -d':' -f$i\` : '.*'`
                        if_3_len=`expr \`echo $if_3_mac | cut -d':' -f$i\` : '.*'`
                        if_4_len=`expr \`echo $if_4_mac | cut -d':' -f$i\` : '.*'`
                        if [ $if_1_len = 1 ]
                        then
                                if_1_mac_temp=$if_1_mac_temp'0'`echo $if_1_mac | cut -d':' -f$i`
                        else
                                if_1_mac_temp=$if_1_mac_temp`echo $if_1_mac | cut -d':' -f$i`
                        fi
                        if [ $if_2_len = 1 ]
                        then
                                if_2_mac_temp=$if_2_mac_temp'0'`echo $if_2_mac | cut -d':' -f$i`
                        else
                                if_2_mac_temp=$if_2_mac_temp`echo $if_2_mac | cut -d':' -f$i`
                        fi
                        if [ $if_3_len = 1 ]
                        then
                                if_3_mac_temp=$if_3_mac_temp'0'`echo $if_3_mac | cut -d':' -f$i`
                        else
                                if_3_mac_temp=$if_3_mac_temp`echo $if_3_mac | cut -d':' -f$i`
                        fi
                        if [ $if_4_len = 1 ]
                        then
                                if_4_mac_temp=$if_4_mac_temp'0'`echo $if_4_mac | cut -d':' -f$i`
                        else
                                if_4_mac_temp=$if_4_mac_temp`echo $if_4_mac | cut -d':' -f$i`
                        fi
                done
		sort_temp=`echo "$if_4_mac_temp $if_3_mac_temp $if_2_mac_temp $if_1_mac_temp" | tr ' ' '\n' | sort | tr '\n' ' '`
		if_1_mac_temp=`echo $sort_temp | cut -d' ' -f1`
		if_2_mac_temp=`echo $sort_temp | cut -d' ' -f2`
		if_3_mac_temp=`echo $sort_temp | cut -d' ' -f3`
		if_4_mac_temp=`echo $sort_temp | cut -d' ' -f4`

		if [ $(($if_2_mac_temp-$if_1_mac_temp)) = 1 ] && [ $(($if_3_mac_temp-$if_2_mac_temp)) = 1 ] && [ $(($if_4_mac_temp-$if_3_mac_temp)) = 1 ]  
		then
			#quad port
			exit 14
		fi
			
		IFS_ORG=$IFS
		IFS='
'
		for i in `grep $if_1_base $if_conf_file`
		do
			if [ `echo $i | cut -d' ' -f2` = $if_1_inst ]
			then
				if_1_path=`echo $i | cut -d' ' -f1`
			elif [ `echo $i | cut -d' ' -f2` = $if_2_inst ]
			then
				if_2_path=`echo $i | cut -d' ' -f1`
			elif [ `echo $i | cut -d' ' -f2` = $if_3_inst ]
			then
				if_3_path=`echo $i | cut -d' ' -f1`
			elif [ `echo $i | cut -d' ' -f2` = $if_4_inst ]
			then
				if_4_path=`echo $i | cut -d' ' -f1`
			else
				echo "" #do nothing
			fi
		done
		IFS=$IFS_ORG
		if_1_path_len=`expr $if_1_path : '.*'`
		if_2_path_len=`expr $if_2_path : '.*'`
		if_3_path_len=`expr $if_3_path : '.*'`
		if_4_path_len=`expr $if_4_path : '.*'`
		min_len=`echo "$if_1_path_len $if_2_path_len $if_3_path_len $if_4_path_len" | tr ' ' '\n' | sort | head -1`
		min_len=`expr $min_len - 2`
		if_1_cmp="`echo $if_1_path | cut -c2-$min_len`"
		if_2_cmp="`echo $if_2_path | cut -c2-$min_len`"
		if_3_cmp="`echo $if_3_path | cut -c2-$min_len`"
		if_4_cmp="`echo $if_4_path | cut -c2-$min_len`"
		if [ \( "$if_1_cmp" = "$if_2_cmp" \) ] && [ \( "$if_2_cmp" = "$if_3_cmp" \) ] && [ \( "$if_3_cmp" = "$if_4_cmp" \) ]
		then
			#quad port
			exit 14
		else
			#handle as multi  NICs
			exit 99
		fi
	else
		#handle as multi NICs
		exit 99
	fi
else
	#multi nic configured 
	exit 99
fi
