]> git.ipfire.org Git - people/ms/network.git/blobdiff - src/functions/functions.ipv4
hostapd: Dump config file in debug mode
[people/ms/network.git] / src / functions / functions.ipv4
index d22b25f6c00ddddd38abec9dfe3c8b73282126ac..eafbe227874334db765dc909421aed439806292a 100644 (file)
 IP_SUPPORTED_PROTOCOLS="${IP_SUPPORTED_PROTOCOLS} ipv4"
 
 ipv4_is_valid() {
-       ipcalc --ipv4 -c $@ >/dev/null 2>&1
+       local address=${1}
 
-       case "$?" in
-               0)
-                       return ${EXIT_OK}
-                       ;;
-               *)
-                       return ${EXIT_ERROR}
-                       ;;
-       esac
+       local prefix=$(ip_get_prefix ${address})
+       address=$(ip_split_prefix ${address})
+
+       # If prefix is set, we check if it is correct
+       if isset prefix; then
+               # Must be numeric
+               isinteger prefix || return ${EXIT_FALSE}
+
+               # Must be 32 if present
+               [ ${prefix} -eq 32 ] || return ${EXIT_FALSE}
+       fi
+
+       inetcalc -4 -c ${address} && return ${EXIT_TRUE} || return ${EXIT_FALSE}
 }
 
 ipv4_prefix_is_valid() {
        local prefix=${1}
 
-       isset prefix || return ${EXIT_FALSE}
+       # Check if prefix is a number
+       isinteger prefix || return ${EXIT_FALSE}
 
        [ ${prefix} -le  0 ] && return ${EXIT_FALSE}
        [ ${prefix} -gt 32 ] && return ${EXIT_FALSE}
@@ -45,6 +51,15 @@ ipv4_prefix_is_valid() {
        return ${EXIT_TRUE}
 }
 
+ipv4_net_is_valid() {
+       local net="${1}"
+
+       local prefix="$(ip_get_prefix "${net}")"
+       local addr="$(ip_split_prefix "${net}")"
+
+       ipv4_prefix_is_valid "${prefix}" && ipv4_is_valid "${addr}"
+}
+
 ipv4_netmask_is_valid() {
        local netmask="${1}"
 
@@ -84,56 +99,13 @@ ipv4_update_neighbours() {
        ( sleep 2; arping -q -U -c 1 -I ${device} ${address} ) >/dev/null 2>&1 </dev/null &
 }
 
-ipv4_get_netaddress() {
-       local address=${1}
-       assert isset address
-
-       local prefix=$(ip_get_prefix ${address})
-       isset prefix || prefix="32"
-
-       # Assume host-only address if no prefix has been given.
-       if [ "${prefix}" = "32" ]; then
-               echo "${address}/${prefix}"
-               return ${EXIT_OK}
-       fi
-
-       local NETWORK
-       eval $(ipcalc --network ${address})
-       assert isset NETWORK
-
-       echo "${NETWORK}/${prefix}"
-       return ${EXIT_OK}
-}
-
-ipv4_get_prefix() {
-       local address=${1}
-       local broadcast=${2}
-
-       assert isset address
-       assert isset broadcast
-
-       local PREFIX
-       eval $(ipcalc --prefix ${address} ${broadcast})
-       assert isset PREFIX
-
-       echo "${PREFIX}"
-       return ${EXIT_OK}
-}
+ipv4_calculate_prefix() {
+       assert [ $# -eq 2 ]
 
-ipv4_get_netmask() {
-       local address=${1}
-       assert isset address
-
-       # Add prefix if none given.
-       local prefix=$(ip_get_prefix ${address})
-       isset prefix || address="${address}/32"
+       local address="${1}"
+       local broadcast="${2}"
 
-       local NETMASK
-       eval $(ipcalc --netmask ${address})
-       assert isset NETMASK
-
-       print "${NETMASK}"
-       return ${EXIT_OK}
+       inetcalc -4 -p "${address}" "${broadcast}"
 }
 
 ipv4_flush_device() {
@@ -153,21 +125,114 @@ ipv4_flush_device() {
 }
 
 ipv4_prefix2netmask() {
-       local prefix=${1}
-       shift
-
-       assert isinteger prefix
-
-       # XXX this function is a stub
+       local prefix="${1}"
 
        case "${prefix}" in
+               32)
+                       echo "255.255.255.255"
+                       ;;
+               31)
+                       echo "255.255.255.254"
+                       ;;
+               30)
+                       echo "255.255.255.252"
+                       ;;
+               29)
+                       echo "255.255.255.248"
+                       ;;
+               28)
+                       echo "255.255.255.240"
+                       ;;
+               27)
+                       echo "255.255.255.224"
+                       ;;
+               26)
+                       echo "255.255.255.192"
+                       ;;
+               25)
+                       echo "255.255.255.128"
+                       ;;
                24)
                        echo "255.255.255.0"
                        ;;
+               23)
+                       echo "255.255.254.0"
+                       ;;
+               22)
+                       echo "255.255.252.0"
+                       ;;
+               21)
+                       echo "255.255.248.0"
+                       ;;
+               20)
+                       echo "255.255.240.0"
+                       ;;
+               19)
+                       echo "255.255.224.0"
+                       ;;
+               18)
+                       echo "255.255.192.0"
+                       ;;
+               17)
+                       echo "255.255.128.0"
+                       ;;
+               16)
+                       echo "255.255.0.0"
+                       ;;
+               15)
+                       echo "255.254.0.0"
+                       ;;
+               14)
+                       echo "255.252.0.0"
+                       ;;
+               13)
+                       echo "255.248.0.0"
+                       ;;
+               12)
+                       echo "255.240.0.0"
+                       ;;
+               11)
+                       echo "255.224.0.0"
+                       ;;
+               10)
+                       echo "255.192.0.0"
+                       ;;
+               9)
+                       echo "255.128.0.0"
+                       ;;
+               8)
+                       echo "255.0.0.0"
+                       ;;
+               7)
+                       echo "254.0.0.0"
+                       ;;
+               6)
+                       echo "252.0.0.0"
+                       ;;
+               5)
+                       echo "248.0.0.0"
+                       ;;
+               4)
+                       echo "240.0.0.0"
+                       ;;
+               3)
+                       echo "224.0.0.0"
+                       ;;
+               2)
+                       echo "192.0.0.0"
+                       ;;
+               1)
+                       echo "128.0.0.0"
+                       ;;
+               0)
+                       echo "0.0.0.0"
+                       ;;
                *)
-                       assert false NOT IMPLEMENTED
+                       return ${EXIT_ERROR}
                        ;;
        esac
+
+       return ${EXIT_OK}
 }
 
 ipv4_netmask2prefix() {
@@ -195,55 +260,11 @@ ipv4_netmask2prefix() {
 }
 
 ipv4_get_network() {
-       local network=$(ipv4_get_network_encoded $@)
-
-       ipv4_decode ${network}
-}
-
-ipv4_get_network_encoded() {
-       local net=${1}
-
-       local prefix=$(ip_get_prefix ${net})
-       isset prefix || prefix=32
-
-       local mask=0
-       if [ ${prefix} -ne 0 ]; then
-               mask=$(( -1 << $(( 32 - ${prefix} )) ))
-       fi
-
-       local addr=$(ip_split_prefix ${net})
-       addr=$(ipv4_encode ${addr})
-
-       print "%d" $(( ${addr} & ${mask} ))
+       ip_get_network "$@"
 }
 
 ipv4_get_broadcast() {
-       local broadcast=$(ipv4_get_broadcast_encoded $@)
-
-       ipv4_decode ${broadcast}
-}
-
-ipv4_get_broadcast_encoded() {
-       local net=${1}
-
-       local prefix=$(ip_get_prefix ${net})
-       assert isset prefix
-
-       prefix=$(( 32 - ${prefix} ))
-
-       local netmask=0
-       local broadcast=-1
-       if [ ${prefix} -eq 32 ]; then
-               :
-       else
-               netmask=$(( -1 << ${prefix} ))
-               broadcast=$(( $(( 1 << ${prefix} )) - 1))
-       fi
-
-       local addr=$(ip_split_prefix ${net})
-       addr=$(ipv4_encode ${addr})
-
-       print "%d" $(( $(( ${addr} & ${netmask} )) | ${broadcast} ))
+       inetcalc -4 -b "$@" && return ${EXIT_OK} || return ${EXIT_ERROR}
 }
 
 ipv4_encode() {
@@ -284,21 +305,27 @@ ipv4_addr_eq() {
 }
 
 ipv4_addr_gt() {
-       local addr1=${1}
-       assert isset addr1
-
-       local addr2=${2}
-       assert isset addr2
+       assert [ $# -eq 2 ]
 
-       local addr
-       for addr in addr1 addr2; do
-               printf -v ${addr} "%s" "$(ip_encode ${!addr})"
-       done
+       local addr1="${1}"
+       local addr2="${2}"
 
-       [[ ${addr1} -gt ${addr2} ]] \
+       inetcalc -4 -g "${addr1}" "${addr2}" \
                && return ${EXIT_TRUE} || return ${EXIT_FALSE}
 }
 
+ipv4_addr_ge() {
+       ipv4_addr_eq "$@" || ipv4_addr_gt "$@"
+}
+
+ipv4_addr_lt() {
+       ! ipv4_addr_eq "$@" && ! ipv4_addr_gt "$@"
+}
+
+ipv4_addr_le() {
+       ipv4_addr_eq "$@" || ! ipv4_addr_gt "$@"
+}
+
 ipv4_range() {
        local range=${1}
 
@@ -353,7 +380,9 @@ ipv4_range_explicit() {
                        ;;
                *.*.*.*/*)
                        first=$(ipv4_get_network ${range})
+                       first="$(ip_split_prefix "${first}")"
                        last=$(ipv4_get_broadcast ${range})
+                       last="$(ip_split_prefix "${last}")"
                        ;;
        esac