29eca9119b391b201d9e1ebba1872f09eb30ef09
[olsrd.git] / files / sgw_policy_routing_setup.sh
1 #!/bin/bash
2
3 set -e
4 set -u
5
6
7 ###############################################################################
8 #
9 # OVERVIEW
10 #
11 ###############################################################################
12
13 # Tables (from SmartGatewayTablesOffset):
14 #                                               +-----------------+-----------------+---------------+
15 #                                               | sgwsrvtun table | egressif tables | sgwtun tables |
16 #                                               +-----------------+-----------------+---------------+
17 # Example:                                              90               91 92            93 94 ...
18 #
19 #
20 # Rules (from SmartGatewayRulesOffset):
21 # +-----------------------+---------------------+-----------------+-----------------+---------------+
22 # | egressif bypass rules | olsrif bypass rules | sgwsrvtun rule  | egressif rules  | sgwtun rules  |
23 # +-----------------------+---------------------+-----------------+-----------------+---------------+
24 # Example:  84 85               86 87 88 89             90               91 92            93 94 ...
25
26
27 ###############################################################################
28 #
29 # SETTINGS
30 #
31 ###############################################################################
32
33 declare IPVERSION_4="ipv4"
34 declare IPVERSION_6="ipv6"
35
36 declare MODE_GENERIC="generic"
37 declare MODE_OLSRIF="olsrif"
38 declare MODE_SGWSRVTUN="sgwsrvtun"
39 declare MODE_EGRESSIF="egressif"
40 declare MODE_SGWTUN="sgwtun"
41
42 declare ADDMODE_ADD="add"
43 declare ADDMODE_DEL="del"
44
45 declare -i MODE_GENERIC_ARGC=0
46 declare -i MODE_OLSRIF_ARGC=2
47 declare -i MODE_EGRESSIF_ARGC=4
48 declare -i MODE_SGWSRVTUN_ARGC=3
49 declare -i MODE_SGWTUN_ARGC=3
50
51
52 ###############################################################################
53 #
54 # HELPER FUNCTIONS
55 #
56 ###############################################################################
57
58 function usage() {
59   echo ""
60   echo "The script was called as:"
61   echo "  $script ${arguments[@]:-}"
62   echo ""
63   echo "Usage:"
64   echo "  $script ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
65   echo "    - ipVersion   : $IPVERSION_4 or $IPVERSION_6"
66   echo "    - mode        : $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
67   echo "    - addMode     : $ADDMODE_ADD or $ADDMODE_DEL"
68   echo "    - ifName      : the interface name       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
69   echo "    - tableNr     : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
70   echo "    - ruleNr      : the ip rule number       , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
71   echo "    - bypassRuleNr: the bypass ip rule number, only relevant for mode  $MODE_EGRESSIF, $MODE_OLSRIF"
72 }
73
74 function error() {
75   local -i firstLine=1
76   while [ $# -gt 0 ]; do
77     if [ $firstLine -eq 1 ]; then
78       echo "Error: $1"
79     else
80       echo "       $1"
81     fi
82     firstLine=0
83     shift 1
84   done
85 }
86
87
88 ###############################################################################
89 #
90 # MODE FUNCTIONS
91 #
92 ###############################################################################
93
94 function generic() {
95   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
96   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT      -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
97 }
98
99 function olsrif() {
100   local interfaceName="$1"
101   local bypassRuleNr="$2"
102
103   "$IP"       $IP_ARGS        rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
104 }
105
106 function egressif() {
107   local interfaceName="$1"
108   local tableNr="$2"
109   local ruleNr="$3"
110   local bypassRuleNr="$4"
111
112   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
113   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT       -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
114   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr"        table "$tableNr" priority "$ruleNr"
115   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" iif    "$interfaceName" table main       priority "$bypassRuleNr"
116 }
117
118 function sgwsrvtun() {
119   local interfaceName="$1"
120   local tableNr="$2"
121   local ruleNr="$3"
122
123   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING  -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
124   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
125 }
126
127 function sgwtun() {
128   local interfaceName="$1"
129   local tableNr="$2"
130   local ruleNr="$3"
131
132   "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
133   "$IP"       $IP_ARGS       rule      "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
134 }
135
136
137 ###############################################################################
138 #
139 # MAIN
140 #
141 ###############################################################################
142
143 declare script="$0"
144 declare -a arguments=( ${@} )
145 declare -i argc=$#
146
147 # we always need 3 arguments, check it
148 if [ $argc -lt 3 ]; then
149   error "Need at least 3 arguments"
150   usage
151   exit 1
152 fi
153
154 # get first 3 arguments
155 declare ipVersion=$1
156 declare mode="$2"
157 declare addMode="$3"
158 shift 3
159 argc=$#
160
161 # check IP version argument
162 if [ ! "$ipVersion" = "$IPVERSION_4" ] && \
163    [ ! "$ipVersion" = "$IPVERSION_6" ]; then
164   error "Illegal IP version"
165   usage
166   exit 1
167 fi
168
169 # check mode argument
170 if [ ! "$mode" = "$MODE_GENERIC" ] && \
171    [ ! "$mode" = "$MODE_OLSRIF" ] && \
172    [ ! "$mode" = "$MODE_SGWSRVTUN" ] && \
173    [ ! "$mode" = "$MODE_EGRESSIF" ] && \
174    [ ! "$mode" = "$MODE_SGWTUN" ]; then
175   error "Illegal mode"
176   usage
177   exit 1
178 fi
179
180 # check addMode argument
181 if [ ! "$addMode" = "$ADDMODE_ADD" ] && \
182    [ ! "$addMode" = "$ADDMODE_DEL" ]; then
183   error "Illegal addMode"
184   usage
185   exit 1
186 fi
187
188 # check argument count for all modes
189 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -lt $MODE_GENERIC_ARGC   ]) || \
190    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -lt $MODE_OLSRIF_ARGC    ]) || \
191    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -lt $MODE_EGRESSIF_ARGC  ]) || \
192    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
193    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -lt $MODE_SGWTUN_ARGC    ]); then
194   if [ $argc -eq 0 ]; then
195     error "Not enough arguments arguments ($argc) for mode $mode"
196   else
197     error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
198   fi
199   usage
200   exit 1
201 fi
202
203 # check argument count for all modes
204 if ([ "$mode" = "$MODE_GENERIC" ]   && [ $argc -gt $MODE_GENERIC_ARGC   ]) || \
205    ([ "$mode" = "$MODE_OLSRIF" ]    && [ $argc -gt $MODE_OLSRIF_ARGC    ]) || \
206    ([ "$mode" = "$MODE_EGRESSIF"  ] && [ $argc -gt $MODE_EGRESSIF_ARGC  ]) || \
207    ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
208    ([ "$mode" = "$MODE_SGWTUN"  ]   && [ $argc -gt $MODE_SGWTUN_ARGC    ]); then
209   if [ $argc -eq 0 ]; then
210     error "Too many arguments arguments ($argc) for mode $mode"
211   else
212     error "Too many arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
213   fi
214   usage
215   exit 1
216 fi
217
218 # process ipVersion argument
219 declare IPTABLES="iptables"
220 declare IPTABLES_ARGS=""
221 declare IP="ip"
222 declare IP_ARGS="-4"
223 if [ "$ipVersion" = "$IPVERSION_6" ]; then
224   IPTABLES="ip6tables"
225   IPTABLES_ARGS=""
226   IP="ip"
227   IP_ARGS="-6"
228 fi
229
230 # process addMode argument
231 declare ADDMODE_IPTABLES="-D"
232 declare ADDMODE_IP="delete"
233 if [ "$addMode" = "$ADDMODE_ADD" ]; then
234   # first call the delete mode to remove any left-over rules
235   set +e
236   "$mode" "${@}" 2> /dev/null
237   set -e
238
239   ADDMODE_IPTABLES="-I"
240   ADDMODE_IP="add"
241 fi
242
243 # call the mode
244 "$mode" "${@}"