Commit | Line | Data |
---|---|---|
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 | ||
16 | set -e | |
17 | ||
90b20d79 | 18 | ## Import compile-time configuration. |
a62f8e8a MW |
19 | : ${bindir=@bindir@} |
20 | : ${tripectl=$bindir/tripectl} | |
21 | PATH=/usr/bin:/usr/sbin:/bin:/sbin:$bindir | |
22 | export PATH TRIPEDIR | |
23 | ||
90b20d79 MW |
24 | ## Determine whether we have IPv6 support. |
25 | if [ -d /proc/sys/net/ipv6 ]; then have6=t; else have6=nil; fi | |
26 | ||
a62f8e8a | 27 | ###-------------------------------------------------------------------------- |
49bfe6a2 MW |
28 | ### Error handling. |
29 | ||
30 | win=t | |
31 | try () { | |
32 | if "$@"; then :; else | |
33 | rc=$? | |
34 | tripectl warn tripe-ifup command-failed rc=$rc "$*" | |
35 | win=nil | |
36 | fi | |
37 | } | |
38 | ||
39 | ###-------------------------------------------------------------------------- | |
a62f8e8a MW |
40 | ### Collect arguments. |
41 | ||
42 | ## Collect the simple arguments. | |
43 | if [ $# -lt 3 ]; then | |
44 | echo >&2 "usage: $0 PEER IFNAME ADDR..."; exit 1 | |
45 | fi | |
46 | peer=$1 ifname=$2 family=$3; shift 3 | |
47 | ||
48 | ## Parse the address family. | |
49 | case "$family,$#" in | |
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 ;; | |
54 | esac | |
55 | ||
56 | ###-------------------------------------------------------------------------- | |
57 | ### Set the interface name. | |
58 | ||
59 | case "${P_IFNAME+set}" in | |
60 | set) | |
49bfe6a2 | 61 | try ip link set "$ifname" name "$P_IFNAME" |
a62f8e8a MW |
62 | ifname=$P_IFNAME |
63 | $tripectl setifname "$peer" "$ifname" | |
64 | ;; | |
65 | esac | |
66 | ||
67 | ###-------------------------------------------------------------------------- | |
baa631c5 | 68 | ### Configure the link. |
a62f8e8a | 69 | |
90b20d79 MW |
70 | ## Split local addresses into v4 and v6 lists. |
71 | unset l4addr l6addr | |
72 | for a in $P_LADDR; do | |
73 | case "$a" in | |
74 | *:*) l6addr=${l6addr+$l6addr }$a ;; | |
75 | *) l4addr=${l4addr+$l4addr }$a ;; | |
76 | esac | |
77 | done | |
78 | ||
79 | ## Determine the remote v4 and v6 addresses. We only allow one remote | |
80 | ## address for each: others can be added as routes. | |
81 | unset r4addr r6addr | |
82 | for a in $P_RADDR; do | |
83 | case "$a" in | |
84 | *:*) r6addr=$a ;; | |
85 | *) r4addr=$a ;; | |
86 | esac | |
87 | done | |
88 | ||
89 | ## Configure the first v4 address as point-to-point; add the others as plain | |
90 | ## addresses. | |
91 | haveaddr4=nil | |
92 | set -- $l4addr | |
93 | case $#,${r4addr+set} in | |
94 | [1-9]*,set) | |
49bfe6a2 | 95 | try ip addr add "$1" peer "$r4addr" dev "$ifname" |
90b20d79 MW |
96 | haveaddr4=t |
97 | shift | |
98 | ;; | |
99 | esac | |
100 | for a in "$@"; do | |
49bfe6a2 | 101 | try ip addr add "$a" dev "$ifname" |
90b20d79 MW |
102 | haveaddr4=t |
103 | done | |
104 | ||
105 | ## IPv6 point-to-point links seem broken in Linux. Attach the local and | |
106 | ## remote addresses by hand. | |
107 | haveaddr6=nil | |
108 | set -- $l6addr | |
109 | case $have6,$# in | |
110 | t,[1-9]*) | |
152a2182 MW |
111 | |
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 | |
116 | ||
117 | ## Now add the source and destination addresses. | |
90b20d79 | 118 | for a in "$@"; do |
49bfe6a2 | 119 | try ip addr add "$a" dev "$ifname" |
90b20d79 MW |
120 | haveaddr6=t |
121 | done | |
122 | case ${r6addr+set} in | |
49bfe6a2 | 123 | set) try ip route add $r6addr proto static dev "$ifname" ;; |
a62f8e8a | 124 | esac |
a62f8e8a MW |
125 | ;; |
126 | esac | |
127 | ||
128 | ###-------------------------------------------------------------------------- | |
f5d185e4 MW |
129 | ### Bring the interface up. |
130 | ||
131 | case $haveaddr4,$haveaddr6 in | |
132 | nil,nil) | |
133 | ;; | |
134 | *) | |
135 | case "${P_MTU+set}" in | |
136 | set) | |
137 | mtu=$P_MTU;; | |
138 | *) | |
139 | pathmtu=$(pathmtu "$addr") | |
a93aacce | 140 | mtu=$(expr "$pathmtu" - 29 - $A_BULK_OVERHEAD) |
f5d185e4 MW |
141 | ;; |
142 | esac | |
49bfe6a2 | 143 | try ip link set dev "$ifname" up mtu "$mtu" |
f5d185e4 MW |
144 | ;; |
145 | esac | |
146 | ||
147 | ###-------------------------------------------------------------------------- | |
a62f8e8a MW |
148 | ### Set up routing. |
149 | ||
90b20d79 MW |
150 | ## Split the routes into v4 and v6 lists. |
151 | unset route4 route6 | |
152 | for p in $P_NETS; do | |
153 | case "$p" in | |
154 | *:*) route6=${route6+$route6 }$p ;; | |
155 | *) route4=${route4+$route4 }$p ;; | |
156 | esac | |
157 | done | |
158 | ||
159 | ## Add the v4 routes. | |
160 | set -- $route4 | |
161 | case $haveaddr4,$# in | |
162 | t,[1-9]*) | |
163 | for p in "$@"; do | |
49bfe6a2 | 164 | try ip route add $p proto static via "$r4addr" |
90b20d79 MW |
165 | done |
166 | ;; | |
167 | esac | |
168 | ||
169 | ## Add the v6 routes. | |
170 | set -- $route6 | |
171 | case $haveaddr6,$# in | |
172 | t,[1-9]*) | |
173 | for p in "$@"; do | |
49bfe6a2 | 174 | try ip route add $p proto static via "${r6addr%/*}" |
a62f8e8a MW |
175 | done |
176 | ;; | |
177 | esac | |
178 | ||
179 | ###-------------------------------------------------------------------------- | |
180 | ### Maybe invoke a follow-on script. | |
181 | ||
182 | case "${P_IFUPEXTRA+set}" in | |
183 | set) | |
184 | eval "$P_IFUPEXTRA" | |
185 | ;; | |
186 | esac | |
187 | ||
188 | ###-------------------------------------------------------------------------- | |
189 | ### Issue a notification that we've won. | |
190 | ||
49bfe6a2 MW |
191 | case $win in |
192 | t) $tripectl notify tripe-ifup configured "$peer" ;; | |
193 | nil) $tripectl notify tripe-ifup configured "$peer" failed ;; | |
194 | esac | |
a62f8e8a MW |
195 | |
196 | ###----- That's all, folks -------------------------------------------------- |