chiark / gitweb /
Merge branches 'mdw/knock' and 'mdw/ipv6' into bleeding
[tripe] / svc / tripe-ifup.in
CommitLineData
a62f8e8a
MW
1#! /bin/sh
2###
3### TrIPE interface initialization script
4### suitable for Linux; other operating systems probably want something
5### similar
6
7###----- Licensing notica ---------------------------------------------------
8###
9### Redistribution, modification and use of this file is permitted without
10### limitation.
11###
12### This file is distributed in the hope that it will be useful,
13### but WITHOUT ANY WARRANTY; without even the implied warranty of
14### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
16set -e
17
90b20d79 18## Import compile-time configuration.
a62f8e8a
MW
19: ${bindir=@bindir@}
20: ${tripectl=$bindir/tripectl}
21PATH=/usr/bin:/usr/sbin:/bin:/sbin:$bindir
22export PATH TRIPEDIR
23
90b20d79
MW
24## Determine whether we have IPv6 support.
25if [ -d /proc/sys/net/ipv6 ]; then have6=t; else have6=nil; fi
26
49bfe6a2
MW
27###--------------------------------------------------------------------------
28### Error handling.
29
30win=t
31try () {
32 if "$@"; then :; else
33 rc=$?
34 tripectl warn tripe-ifup command-failed rc=$rc "$*"
35 win=nil
36 fi
37}
38
a62f8e8a
MW
39###--------------------------------------------------------------------------
40### Collect arguments.
41
42## Collect the simple arguments.
43if [ $# -lt 3 ]; then
44 echo >&2 "usage: $0 PEER IFNAME ADDR..."; exit 1
45fi
46peer=$1 ifname=$2 family=$3; shift 3
47
48## Parse the address family.
47828bd9
MW
49case "$family" in
50 INET) ipsz=20 ;;
51 INET6) ipsz=40 ;;
52 *) echo >&2 "$0: unknown address family $family"; exit 1 ;;
53esac
a62f8e8a 54case "$family,$#" in
47828bd9
MW
55 INET,1 | INET6,1) addr=$1 port=4070 ;;
56 INET,2 | INET6,2) addr=$1 port=$2 ;;
57 INET,* | INET6,*) echo >&2 "$0: bad $family address"; exit 1 ;;
58 *) echo >&2 "$0: unknown address family $family"; exit 1 ;;
a62f8e8a
MW
59esac
60
61###--------------------------------------------------------------------------
62### Set the interface name.
63
64case "${P_IFNAME+set}" in
65 set)
49bfe6a2 66 try ip link set "$ifname" name "$P_IFNAME"
a62f8e8a
MW
67 ifname=$P_IFNAME
68 $tripectl setifname "$peer" "$ifname"
69 ;;
70esac
71
72###--------------------------------------------------------------------------
baa631c5 73### Configure the link.
a62f8e8a 74
90b20d79
MW
75## Split local addresses into v4 and v6 lists.
76unset l4addr l6addr
77for a in $P_LADDR; do
78 case "$a" in
79 *:*) l6addr=${l6addr+$l6addr }$a ;;
80 *) l4addr=${l4addr+$l4addr }$a ;;
81 esac
82done
83
84## Determine the remote v4 and v6 addresses. We only allow one remote
85## address for each: others can be added as routes.
86unset r4addr r6addr
87for a in $P_RADDR; do
88 case "$a" in
89 *:*) r6addr=$a ;;
90 *) r4addr=$a ;;
91 esac
92done
93
94## Configure the first v4 address as point-to-point; add the others as plain
95## addresses.
96haveaddr4=nil
97set -- $l4addr
98case $#,${r4addr+set} in
99 [1-9]*,set)
49bfe6a2 100 try ip addr add "$1" peer "$r4addr" dev "$ifname"
90b20d79
MW
101 haveaddr4=t
102 shift
103 ;;
104esac
105for a in "$@"; do
49bfe6a2 106 try ip addr add "$a" dev "$ifname"
90b20d79
MW
107 haveaddr4=t
108done
109
110## IPv6 point-to-point links seem broken in Linux. Attach the local and
111## remote addresses by hand.
112haveaddr6=nil
113set -- $l6addr
114case $have6,$# in
115 t,[1-9]*)
152a2182
MW
116
117 ## If we're configured to set IPv6 addresses then we should ensure that
118 ## they're going to work, even if the default setting for new interfaces
119 ## is to disable IPv6.
120 try sysctl -q net.ipv6.conf."$ifname".disable_ipv6=0
121
122 ## Now add the source and destination addresses.
90b20d79 123 for a in "$@"; do
49bfe6a2 124 try ip addr add "$a" dev "$ifname"
90b20d79
MW
125 haveaddr6=t
126 done
127 case ${r6addr+set} in
49bfe6a2 128 set) try ip route add $r6addr proto static dev "$ifname" ;;
a62f8e8a 129 esac
a62f8e8a
MW
130 ;;
131esac
132
f5d185e4
MW
133###--------------------------------------------------------------------------
134### Bring the interface up.
135
136case $haveaddr4,$haveaddr6 in
137 nil,nil)
138 ;;
139 *)
140 case "${P_MTU+set}" in
141 set)
142 mtu=$P_MTU;;
143 *)
144 pathmtu=$(pathmtu "$addr")
47828bd9 145 mtu=$(( $pathmtu - $ipsz - 9 - $A_BULK_OVERHEAD ))
f5d185e4
MW
146 ;;
147 esac
49bfe6a2 148 try ip link set dev "$ifname" up mtu "$mtu"
f5d185e4
MW
149 ;;
150esac
151
a62f8e8a
MW
152###--------------------------------------------------------------------------
153### Set up routing.
154
90b20d79
MW
155## Split the routes into v4 and v6 lists.
156unset route4 route6
157for p in $P_NETS; do
158 case "$p" in
159 *:*) route6=${route6+$route6 }$p ;;
160 *) route4=${route4+$route4 }$p ;;
161 esac
162done
163
164## Add the v4 routes.
165set -- $route4
166case $haveaddr4,$# in
167 t,[1-9]*)
168 for p in "$@"; do
49bfe6a2 169 try ip route add $p proto static via "$r4addr"
90b20d79
MW
170 done
171 ;;
172esac
173
174## Add the v6 routes.
175set -- $route6
176case $haveaddr6,$# in
177 t,[1-9]*)
178 for p in "$@"; do
49bfe6a2 179 try ip route add $p proto static via "${r6addr%/*}"
a62f8e8a
MW
180 done
181 ;;
182esac
183
184###--------------------------------------------------------------------------
185### Maybe invoke a follow-on script.
186
187case "${P_IFUPEXTRA+set}" in
188 set)
189 eval "$P_IFUPEXTRA"
190 ;;
191esac
192
193###--------------------------------------------------------------------------
194### Issue a notification that we've won.
195
49bfe6a2
MW
196case $win in
197 t) $tripectl notify tripe-ifup configured "$peer" ;;
198 nil) $tripectl notify tripe-ifup configured "$peer" failed ;;
199esac
a62f8e8a
MW
200
201###----- That's all, folks --------------------------------------------------