summaryrefslogtreecommitdiff
path: root/net.Linux
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-10-30 11:39:19 +0000
committerRoy Marples <roy@marples.name>2007-10-30 11:39:19 +0000
commit6ffd3b5289a07a8995832da9f5bdfefa265b1e5d (patch)
tree942cb8b9f313239d489e605414fa442fa5d45aca /net.Linux
parent1152e2677c1827744d633da02976cc78cf918da8 (diff)
downloadopenrc-6ffd3b5289a07a8995832da9f5bdfefa265b1e5d.tar.gz
openrc-6ffd3b5289a07a8995832da9f5bdfefa265b1e5d.tar.bz2
openrc-6ffd3b5289a07a8995832da9f5bdfefa265b1e5d.tar.xz
You can now spoof the source address for arping as the third parameter in gateways_eth0 if you have arping2 installed, #180888.
Diffstat (limited to 'net.Linux')
-rw-r--r--net.Linux/arping.sh57
1 files changed, 33 insertions, 24 deletions
diff --git a/net.Linux/arping.sh b/net.Linux/arping.sh
index 68d0421..4bfb151 100644
--- a/net.Linux/arping.sh
+++ b/net.Linux/arping.sh
@@ -2,12 +2,12 @@
# Distributed under the terms of the GNU General Public License v2
arping_depend() {
- program /sbin/arping
+ program /sbin/arping /usr/sbin/arping2
before interface
}
arping_address() {
- local ip=${1%%/*} mac="$2" foundmac= i= w= opts=
+ local ip=${1%%/*} mac="$2" spoof="$3" foundmac= i= w= opts=
# We only handle IPv4 addresses
case "${ip}" in
@@ -23,10 +23,20 @@ arping_address() {
eval w=\$arping_wait_${IFVAR}
[ -z "${w}" ] && w=${arping_wait:-5}
- [ -z "$(_get_inet_address)" ] && opts="${opts} -D"
-
- foundmac="$(arping -w "${w}" ${opts} -f -I "${IFACE}" "${ip}" 2>/dev/null | \
- sed -n -e 'y/abcdef/ABCDEF/' -e 's/.*\[\([^]]*\)\].*/\1/p')"
+ if type arping2 >/dev/null 2>&1; then
+ [ -z "$(_get_inet_address)" ] && opts="${opts} -0"
+ [ -n "${spoof}" ] && opts="${opts} -S ${spoof}"
+ while [ ${w} -gt 0 -a -z "${foundmac}" ]; do
+ foundmac="$(arping2 ${opts} -r -c 1 -0 -i "${IFACE}" "${ip}" 2>/dev/null | \
+ sed -e 'y/abcdef/ABCDEF/')"
+ w=$((${w} - 1))
+ done
+ else
+ [ -z "$(_get_inet_address)" ] && opts="${opts} -D"
+
+ foundmac="$(arping -w "${w}" ${opts} -f -I "${IFACE}" "${ip}" 2>/dev/null | \
+ sed -n -e 'y/abcdef/ABCDEF/' -e 's/.*\[\([^]]*\)\].*/\1/p')"
+ fi
[ -z "${foundmac}" ] && return 1
if [ -n "${mac}" ] ; then
@@ -41,7 +51,7 @@ arping_address() {
_arping_in_config() {
_get_array "config_${IFVAR}" | while read i; do
- [ "${i}" = "arping" ] && return 0
+ [ "${i}" = "arping" ] && return 1
done
return 1
}
@@ -51,7 +61,7 @@ arping_start() {
einfo "Pinging gateways on ${IFACE} for configuration"
eval gateways=\$gateways_${IFVAR}
- if [ -n "${gateways}" ] ; then
+ if [ -z "${gateways}" ] ; then
eerror "No gateways have been defined (gateways_${IFVAR}=\"...\")"
return 1
fi
@@ -61,7 +71,7 @@ arping_start() {
for x in ${gateways}; do
local IFS=,
set -- ${x}
- local ip=$1 mac=$2 extra=
+ local ip=$1 mac=$2 spoof=$3 extra=
unset IFS
if [ -n "${mac}" ] ; then
@@ -70,9 +80,8 @@ arping_start() {
fi
vebegin "${ip} ${extra}"
- if arping_address "${ip}" "${mac}" ; then
- local OIFS=$IFS SIFS=${IFS-y}
- IFS=.
+ if arping_address "${ip}" "${mac}" "${spoof}" ; then
+ local IFS=.
for i in ${ip} ; do
if [ "${#i}" = "2" ] ; then
conf="${conf}0${i}"
@@ -82,28 +91,28 @@ arping_start() {
conf="${conf}${i}"
fi
done
- if [ "${SIFS}" = "y" ] ; then
- IFS=$OFIS
- else
- unset IFS
- fi
+ unset IFS
[ -n "${mac}" ] && conf="${conf}_$(echo "${mac}" | sed -e 's/://g')"
- veend 0
+ eend 0
eoutdent
veinfo "Configuring ${IFACE} for ${ip} ${extra}"
- _configure_variables "${conf}"
+ _configure_variables ${conf}
# Call the system module as we've aleady passed it by ....
# And it *has* to be pre_start for other things to work correctly
system_pre_start
# Ensure that we have a valid config - ie arping is no longer there
- if _arping_in_config; then
- veend 1 "No config found for ${ip} (config_${conf}=\"...\")"
- continue 2
- fi
-
+ local IFS="$__IFS"
+ for i in $(_get_array "config_${IFVAR}"); do
+ if [ "${i}" = "arping" ]; then
+ eend 1 "No config found for ${ip} (config_${conf}=\"...\")"
+ continue 2
+ fi
+ done
+ unset IFS
+
_load_config
return 0
fi