#!/bin/rc
# ipv6on [netdir ndbfile [gwv4]] - configure an interface for ipv6,
#	once ipv4 is configured.
if (! ~ $#* 0 2 3) {
	echo usage: $0 '[netdir ndbfile [gw-v4-name]]' >[1=2]
	exit usage
}
rfork e
if (~ $#* 0) {
	netdir=/net
	ndbf=/lib/ndb/local
	#gw=`{ndb/ipquery sys $sysname ipgw | sed 's/ipgw=//'}
}
if not {
	netdir=$1
	ndbf=$2
}
gw=`{awk '$4 ~ /4/ && $5 ~ /none/{print $3}' $netdir/iproute}


if (~ $netdir /net) {
	xsfx=()
	xdir=()
}
if not {
	xsfx=(-x `{echo $netdir | sed 's;^/net;;'})
	xdir=(-x $netdir)
}

fn nonnil {		# variable
	if (~ $#$1 0) {
		echo no ip for $1
		exit no-ip
	}
	if (! ~ $#$1 1) {
		echo multiple ips for $1
		exit multiple-ips
	}
}

#
# configure v6 for link-local addresses (fe80::) & multicast (ff02::)
#
netether=`{ls -d $netdir/ether*}
netether=$netether(1)
if (! ip/ipconfig -6 $xdir ether $netether)
	exit 'ipconfig -6 failed'
ip/ipconfig $xdir ether $netether ra6 recvra 1

# for testing
mylnk=`{ip/linklocal `{cat $netether/addr}}
nonnil mylnk

mev6=`{ndb/query -f $ndbf sys $sysname ipv6}
if (~ $#mev6 0 || ~ $mev6 '')
	mev6=`{ndb/query -mf $ndbf sys $sysname ip | grep :}
if(~ $#mev6 0 || ~ $mev6 ''){
	# I am not registered to /lib/ndb/local
	# How to get my global IPv6 prefix?
	# probably RA resolve this problem
	# RA takes time, so we don't have the info at the moment
	#v6pr=`{awk '$4 ~ /6i/{print $1}' $netdir/iproute | sed 's/::$/:/'}
	#ifid=`{echo $mylnk | sed 's/^fe80:://'}
	#mev6=$v6pr:$ifid	# can be buggy if $ifid begins with 0:
	mev6=$mylnk
}
nonnil mev6

if (~ $#gw 1) {
	if (~ $gw [0-9]*.[0-9]*.[0-9]*.[0-9]*)
		gwv4 = $gw
	if (~ $#gwv4 0 || ~ $gwv4 '')		# assume namev6 and name
		gwv4=`{ndb/query -f $ndbf sys $gw ip}
	gwv6=`{ndb/query -f $ndbf sys $gw ipv6}

	if (! ~ $#gwv4 0) {
		# echo ping gw $gwv4...
		# load arp cache with gw mac
		ip/ping -qn 3 $netdir/icmp!$gwv4 >/dev/null >[2=1] &
		sleep 1					# wait for ping

		gweth=`{grep '* '^$gwv4^' ' $netdir/arp | awk '{print $4}' }
	}
}

#
# configure my global or link v6 addresses
#
ip/ipconfig $xdir ether $netether	add $mev6 /64
ip/ipconfig $xdir loopback /dev/null	add $mev6 /128

nonnil gweth

if (~ $#gwv6 0 || ~ $gwv6 '')
	gwv6=`{ip/linklocal $gweth}
nonnil gwv6
#
# add default v6 route to v6 addr of v4 gw
#
echo add :: /0 $gwv6 >$netdir/iproute	# need not be link-local

exit ''