From: Michael Tremer Date: Sat, 31 Jul 2010 10:55:15 +0000 (+0200) Subject: network: Improve IPV4 support. X-Git-Tag: 001~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05c234a8e9650a26a50b6bbd01a5c748eb145ac3;p=network.git network: Improve IPV4 support. Add support for duplicate IP addresses in network. Announce new address to neighbours. --- diff --git a/functions.ipv4 b/functions.ipv4 new file mode 100644 index 00000000..04b49a68 --- /dev/null +++ b/functions.ipv4 @@ -0,0 +1,76 @@ +#!/bin/bash +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2010 Michael Tremer & Christian Schmidt # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### + +function ipv4_split_prefix() { + ip_split_prefix $@ +} + +function ipv4_is_valid() { + local address=${1} + + assert isset address + + # Cut the /24 if there is one given + address=$(ipv4_split_prefix ${address}) + + local IFS="." + local octet + local count + for octet in ${address}; do + if [ ${octet} -ge 0 ] && [ ${octet} -le 255 ]; then + count=$(( ${count} + 1 )) + continue + fi + + # If we get here the address was not valid + break + done + + if [ ${count} -eq 4 ]; then + return ${EXIT_OK} + fi + + return ${EXIT_ERROR} +} + +function ipv4_detect_duplicate() { + local device=${1} + local address=${2} + + assert isset address + assert isset device + assert device_exists ${device} + + if ! arping -q -c 2 -w 3 -D -I ${device} ${address}; then + log DEBUG "Detected duplicate address '${address}' on device '${device}'." + return ${EXIT_ERROR} + fi + + return ${EXIT_OK} +} + +function ipv4_update_neighbours() { + local device=${1} + local address=${2} + + arping -q -A -c 1 -I ${device} ${address} + ( sleep 2; arping -q -U -c 1 -I ${device} ${address} ) >/dev/null 2>&1