3 ### TrIPE interface initialization script
4 ### suitable for Linux; other operating systems probably want something
7 ###----- Licensing notica ---------------------------------------------------
9 ### Redistribution, modification and use of this file is permitted without
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.
18 ## Import compile-time configuration.
20 : ${tripectl=$bindir/tripectl}
21 PATH=/usr/bin:/usr/sbin:/bin:/sbin:$bindir
24 ## Determine whether we have IPv6 support.
25 if [ -d /proc/sys/net/ipv6 ]; then have6=t; else have6=nil; fi
27 ###--------------------------------------------------------------------------
34 tripectl warn tripe-ifup command-failed rc=$rc "$*"
39 ###--------------------------------------------------------------------------
40 ### Collect arguments.
42 ## Collect the simple arguments.
44 echo >&2 "usage: $0 PEER IFNAME ADDR..."; exit 1
46 peer=$1 ifname=$2 family=$3; shift 3
48 ## Parse the address family.
50 INET,1) addr=$1 port=4070 ;;
51 INET,2) addr=$1 port=$2 ;;
52 INET,*) echo >&2 "$0: bad INET address"; exit 1 ;;
53 *) echo >&2 "$0: unknown address family $family"; exit 1 ;;
56 ###--------------------------------------------------------------------------
57 ### Set the interface name.
59 case "${P_IFNAME+set}" in
61 try ip link set "$ifname" name "$P_IFNAME"
63 $tripectl setifname "$peer" "$ifname"
67 ###--------------------------------------------------------------------------
68 ### Configure the link.
70 ## Split local addresses into v4 and v6 lists.
74 *:*) l6addr=${l6addr+$l6addr }$a ;;
75 *) l4addr=${l4addr+$l4addr }$a ;;
79 ## Determine the remote v4 and v6 addresses. We only allow one remote
80 ## address for each: others can be added as routes.
89 ## Configure the first v4 address as point-to-point; add the others as plain
93 case $#,${r4addr+set} in
95 try ip addr add "$1" peer "$r4addr" dev "$ifname"
101 try ip addr add "$a" dev "$ifname"
105 ## IPv6 point-to-point links seem broken in Linux. Attach the local and
106 ## remote addresses by hand.
112 ## If we're configured to set IPv6 addresses then we should ensure that
113 ## they're going to work, even if the default setting for new interfaces
114 ## is to disable IPv6.
115 try sysctl -q net.ipv6.conf."$ifname".disable_ipv6=0
117 ## Now add the source and destination addresses.
119 try ip addr add "$a" dev "$ifname"
125 ###--------------------------------------------------------------------------
126 ### Bring the interface up.
128 case $haveaddr4,$haveaddr6 in
132 case "${P_MTU+set}" in
136 pathmtu=$(pathmtu "$addr")
137 mtu=$(expr "$pathmtu" - 29 - $A_BULK_OVERHEAD)
140 try ip link set dev "$ifname" up mtu "$mtu"
144 ###--------------------------------------------------------------------------
145 ### Set the peer IPv6 address if any.
147 ## IPv6 point-to-point links seem broken in Linux. Attach the local and
148 ## remote addresses by hand.
150 case $have6,$#,${r6addr+set} in
152 try ip route add $r6addr proto static dev "$ifname"
156 ###--------------------------------------------------------------------------
159 ## Split the routes into v4 and v6 lists.
163 *:*) route6=${route6+$route6 }$p ;;
164 *) route4=${route4+$route4 }$p ;;
168 ## Add the v4 routes.
170 case $haveaddr4,$# in
173 try ip route add $p proto static via "$r4addr"
178 ## Add the v6 routes.
180 case $haveaddr6,$# in
183 try ip route add $p proto static via "${r6addr%/*}"
188 ###--------------------------------------------------------------------------
189 ### Maybe invoke a follow-on script.
191 case "${P_IFUPEXTRA+set}" in
197 ###--------------------------------------------------------------------------
198 ### Issue a notification that we've won.
201 t) $tripectl notify tripe-ifup configured "$peer" ;;
202 nil) $tripectl notify tripe-ifup configured "$peer" failed ;;
205 ###----- That's all, folks --------------------------------------------------