8 declare -a arguments=( ${@} )
12 ###############################################################################
16 ###############################################################################
18 # Tables (from SmartGatewayTablesOffset):
19 # +-----------------+-----------------+---------------+
20 # | sgwsrvtun table | egressif tables | sgwtun tables |
21 # +-----------------+-----------------+---------------+
22 # Example: 90 91 92 93 94 ...
25 # Rules (from SmartGatewayRulesOffset):
26 # +-----------------------+---------------------+-----------------+-----------------+---------------+
27 # | egressif bypass rules | olsrif bypass rules | sgwsrvtun rule | egressif rules | sgwtun rules |
28 # +-----------------------+---------------------+-----------------+-----------------+---------------+
29 # Example: 84 85 86 87 88 89 90 91 92 93 94 ...
32 ###############################################################################
36 ###############################################################################
38 declare IPVERSION_4="ipv4"
39 declare IPVERSION_6="ipv6"
41 declare MODE_GENERIC="generic"
42 declare MODE_OLSRIF="olsrif"
43 declare MODE_SGWSRVTUN="sgwsrvtun"
44 declare MODE_EGRESSIF="egressif"
45 declare MODE_SGWTUN="sgwtun"
47 declare ADDMODE_ADD="add"
48 declare ADDMODE_DEL="del"
50 declare -i MODE_GENERIC_ARGC=0
51 declare -i MODE_OLSRIF_ARGC=2
52 declare -i MODE_EGRESSIF_ARGC=4
53 declare -i MODE_SGWSRVTUN_ARGC=3
54 declare -i MODE_SGWTUN_ARGC=3
57 ###############################################################################
61 ###############################################################################
65 echo "The script was called as:"
66 echo " $script ${arguments[@]:-}"
69 echo " $script ipVersion mode addMode ifName tableNr ruleNr bypassRuleNr"
70 echo " - ipVersion : $IPVERSION_4 or $IPVERSION_6"
71 echo " - mode : $MODE_GENERIC, $MODE_OLSRIF, $MODE_EGRESSIF, $MODE_SGWSRVTUN or $MODE_SGWTUN"
72 echo " - addMode : $ADDMODE_ADD or $ADDMODE_DEL"
73 echo " - ifName : the interface name , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
74 echo " - tableNr : the routing table number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
75 echo " - ruleNr : the ip rule number , only relevant for modes $MODE_EGRESSIF, $MODE_SGWSRVTUN, $MODE_SGWTUN"
76 echo " - bypassRuleNr: the bypass ip rule number, only relevant for mode $MODE_EGRESSIF, $MODE_OLSRIF"
81 while [ $# -gt 0 ]; do
82 if [ $firstLine -eq 1 ]; then
93 ###############################################################################
97 ###############################################################################
100 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
101 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" OUTPUT -m conntrack ! --ctstate NEW -j CONNMARK --restore-mark
105 local interfaceName="$1"
106 local bypassRuleNr="$2"
108 "$IP" $IP_ARGS rule "$ADDMODE_IP" iif "$interfaceName" table main priority "$bypassRuleNr"
111 function egressif() {
112 local interfaceName="$1"
115 local bypassRuleNr="$4"
117 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
118 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" INPUT -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
119 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
120 "$IP" $IP_ARGS rule "$ADDMODE_IP" iif "$interfaceName" table main priority "$bypassRuleNr"
123 function sgwsrvtun() {
124 local interfaceName="$1"
128 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" PREROUTING -m conntrack --ctstate NEW -i "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
129 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
133 local interfaceName="$1"
137 "$IPTABLES" $IPTABLES_ARGS -t mangle "$ADDMODE_IPTABLES" POSTROUTING -m conntrack --ctstate NEW -o "$interfaceName" -j CONNMARK --set-mark "$ruleNr"
138 "$IP" $IP_ARGS rule "$ADDMODE_IP" fwmark "$ruleNr" table "$tableNr" priority "$ruleNr"
142 ###############################################################################
146 ###############################################################################
148 # we always need 3 arguments, check it
149 if [ $argc -lt 3 ]; then
150 error "Need at least 3 arguments"
155 # get first 3 arguments
162 # check IP version argument
163 if [ ! "$ipVersion" = "$IPVERSION_4" ] && \
164 [ ! "$ipVersion" = "$IPVERSION_6" ]; then
165 error "Illegal IP version"
170 # check mode argument
171 if [ ! "$mode" = "$MODE_GENERIC" ] && \
172 [ ! "$mode" = "$MODE_OLSRIF" ] && \
173 [ ! "$mode" = "$MODE_SGWSRVTUN" ] && \
174 [ ! "$mode" = "$MODE_EGRESSIF" ] && \
175 [ ! "$mode" = "$MODE_SGWTUN" ]; then
181 # check addMode argument
182 if [ ! "$addMode" = "$ADDMODE_ADD" ] && \
183 [ ! "$addMode" = "$ADDMODE_DEL" ]; then
184 error "Illegal addMode"
189 # check argument count for all modes
190 if ([ "$mode" = "$MODE_GENERIC" ] && [ $argc -lt $MODE_GENERIC_ARGC ]) || \
191 ([ "$mode" = "$MODE_OLSRIF" ] && [ $argc -lt $MODE_OLSRIF_ARGC ]) || \
192 ([ "$mode" = "$MODE_EGRESSIF" ] && [ $argc -lt $MODE_EGRESSIF_ARGC ]) || \
193 ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -lt $MODE_SGWSRVTUN_ARGC ]) || \
194 ([ "$mode" = "$MODE_SGWTUN" ] && [ $argc -lt $MODE_SGWTUN_ARGC ]); then
195 if [ $argc -eq 0 ]; then
196 error "Not enough arguments arguments ($argc) for mode $mode"
198 error "Not enough arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
204 # check argument count for all modes
205 if ([ "$mode" = "$MODE_GENERIC" ] && [ $argc -gt $MODE_GENERIC_ARGC ]) || \
206 ([ "$mode" = "$MODE_OLSRIF" ] && [ $argc -gt $MODE_OLSRIF_ARGC ]) || \
207 ([ "$mode" = "$MODE_EGRESSIF" ] && [ $argc -gt $MODE_EGRESSIF_ARGC ]) || \
208 ([ "$mode" = "$MODE_SGWSRVTUN" ] && [ $argc -gt $MODE_SGWSRVTUN_ARGC ]) || \
209 ([ "$mode" = "$MODE_SGWTUN" ] && [ $argc -gt $MODE_SGWTUN_ARGC ]); then
210 if [ $argc -eq 0 ]; then
211 error "Too many arguments arguments ($argc) for mode $mode"
213 error "Too many arguments arguments ($argc) for mode $mode" "Arguments: ${@}"
219 # process ipVersion argument
220 declare IPTABLES="iptables"
221 declare IPTABLES_ARGS=""
224 if [ "$ipVersion" = "$IPVERSION_6" ]; then
231 # process addMode argument
232 declare ADDMODE_IPTABLES="-D"
233 declare ADDMODE_IP="delete"
234 if [ "$addMode" = "$ADDMODE_ADD" ]; then
235 # first call the delete mode to remove any left-over rules
237 "$mode" "${@}" 2> /dev/null
240 ADDMODE_IPTABLES="-I"