xref: /plan9-contrib/rc/bin/ipv6on (revision 588d0145e19f8596f2f4442d05dd8a9eda147983)
1e47528f3SDavid du Colombier#!/bin/rc
2*588d0145SDavid du Colombier# ipv6on [netdir ndbfile] - configure an interface for ipv6.
3*588d0145SDavid du Colombier#	use ipv6 address from ndb if present,
4*588d0145SDavid du Colombier#	else do stateless address autoconfiguration (SLAAC).
5e47528f3SDavid du Colombierif (! ~ $#* 0 2 3) {
6*588d0145SDavid du Colombier	echo usage: $0 '[netdir ndbfile [obs-gw-v4-name]]' >[1=2]
7e47528f3SDavid du Colombier	exit usage
8e47528f3SDavid du Colombier}
9e47528f3SDavid du Colombierrfork e
10*588d0145SDavid du Colombierfn ipq {			# attr val rattr
11*588d0145SDavid du Colombier	ndb/ipquery $* | sed 's/^[a-z0-9]+=//'
12*588d0145SDavid du Colombier}
13*588d0145SDavid du Colombier
14e47528f3SDavid du Colombierif (~ $#* 0) {
15e47528f3SDavid du Colombier	netdir=/net
16e47528f3SDavid du Colombier	ndbf=/lib/ndb/local
17e47528f3SDavid du Colombier}
18e47528f3SDavid du Colombierif not {
19e47528f3SDavid du Colombier	netdir=$1
20e47528f3SDavid du Colombier	ndbf=$2
21e47528f3SDavid du Colombier}
22e47528f3SDavid du Colombierif (~ $netdir /net) {
23e47528f3SDavid du Colombier	xsfx=()
24e47528f3SDavid du Colombier	xdir=()
25e47528f3SDavid du Colombier}
26e47528f3SDavid du Colombierif not {
27e47528f3SDavid du Colombier	xsfx=(-x `{echo $netdir | sed 's;^/net;;'})
28e47528f3SDavid du Colombier	xdir=(-x $netdir)
29e47528f3SDavid du Colombier}
30e47528f3SDavid du Colombier
31edc15dd6SDavid du Colombierfn nonnil {		# variable
32edc15dd6SDavid du Colombier	if (~ $#$1 0) {
333853f77fSDavid du Colombier		echo ipv6on: no ip for $1 >[1=2]
34e47528f3SDavid du Colombier		exit no-ip
35e47528f3SDavid du Colombier	}
36edc15dd6SDavid du Colombier	if (! ~ $#$1 1) {
373853f77fSDavid du Colombier		echo ipv6on: multiple ips for $1 >[1=2]
38edc15dd6SDavid du Colombier		exit multiple-ips
39edc15dd6SDavid du Colombier	}
40e47528f3SDavid du Colombier}
41e47528f3SDavid du Colombier
42e47528f3SDavid du Colombier#
435c88beaeSDavid du Colombier# configure v6 for link-local addresses (fe80::) & multicast (ff02::).
44*588d0145SDavid du Colombier# accept router advertisements, which will contain a default route.
45e47528f3SDavid du Colombier#
46e47528f3SDavid du Colombierif (! ip/ipconfig -6 $xdir ether $netdir/ether?)
47e47528f3SDavid du Colombier	exit 'ipconfig -6 failed'
487ef45392SDavid du Colombierip/ipconfig $xdir ether $netdir/ether? ra6 recvra 1
49e47528f3SDavid du Colombier
50*588d0145SDavid du Colombier# lookup any v6 address for me in ndb, else use slaac
51*588d0145SDavid du Colombiermyeth=`{cat $netdir/ether?/addr}
52*588d0145SDavid du Colombiermev6=`{ndb/query -f $ndbf ether $myeth ipv6}
53*588d0145SDavid du Colombierif (~ $#mev6 0 || ~ $mev6 '')
54e47528f3SDavid du Colombier	mev6=`{ndb/query -f $ndbf sys $sysname ipv6}
55*588d0145SDavid du Colombierif (~ $#mev6 0 || ~ $mev6 '') {
56*588d0145SDavid du Colombier	# slaac: could perhaps get prefix from above RA
57*588d0145SDavid du Colombier	ipnet=`{ipq ether $myeth ipnet}
58*588d0145SDavid du Colombier	if (~ $#ipnet 0 || ~ $ipnet '')
59*588d0145SDavid du Colombier		ipnet=`{ipq sys $sysname ipnet}
60*588d0145SDavid du Colombier	nonnil ipnet
61*588d0145SDavid du Colombier	v6pfx=`{ipq ipnet $ipnet ipv6pfx}
62*588d0145SDavid du Colombier	nonnil v6pfx
63*588d0145SDavid du Colombier	mev6=`{ip/linklocal $myeth | sed 's/^fe80:/'$v6pfx'/'}
64e47528f3SDavid du Colombier}
65edc15dd6SDavid du Colombiernonnil mev6
66*588d0145SDavid du Colombier
67e47528f3SDavid du Colombier#
68e47528f3SDavid du Colombier# configure my global v6 addresses
69e47528f3SDavid du Colombier#
70*588d0145SDavid du Colombierv6mask=`{ipq ip $mev6 ipmask}
715c88beaeSDavid du Colombierip/ipconfig $xdir ether $netdir/ether?	add $mev6 $v6mask
72e47528f3SDavid du Colombierip/ipconfig $xdir loopback /dev/null	add $mev6 /128
73