# #
###############################################################################
-function devicify() {
+function devicify() {
local device=${1}
+ assert isset device
+
if device_exists ${device}; then
echo "${device}"
return ${EXIT_OK}
function macify() {
local device=${1}
+ assert isset device
+
if mac_is_valid ${device}; then
echo "${device}"
return ${EXIT_OK}
# Check if the device bonded in a bonding device
function device_is_bonded() {
- local dev
- for dev in /sys/class/net/*; do
- # Skip crappy files
- [ -d "${dev}" ] || continue
-
- # Continue if not a bonding device
- device_is_bonding "${dev##*/}" || continue
-
- if grep -q "\<${1}\>" ${dev}/bonding/slaves; then
- return 0
- fi
- done
+ local device=${1}
- return 1
+ [ -d "${SYS_CLASS_NET}/${device}/master" ]
}
# Check if the device is a bridge
[ -d "/sys/class/net/${1}/bridge" ]
}
+function device_is_bridge_attached() {
+ local device=${1}
+
+ [ -d "${SYS_CLASS_NET}/${device}/brport" ]
+}
+
# Check if the device is a virtual device
function device_is_virtual() {
local device=${1}
# Check if the device has virtual devices
function device_has_virtuals() {
+ local device=${1}
+
+ if device_is_virtual ${device}; then
+ return 1
+ fi
+
if [ ! -e "/proc/net/vlan/config" ]; then
return 1
fi
grep -q "${1}$" /proc/net/vlan/config
}
-function device_is_vlan() { # XXX Compat function
- log DEBUG "Deprecated function device_is_vlan() was used."
-
- device_is_virtual $@
-}
-
# Check if the device is a ppp device
function device_is_ppp() {
local device=${1}
function device_get_type() {
local device=$(devicify ${1})
- if device_is_vlan ${device}; then
+ if device_is_virtual ${device}; then
echo "vlan"
elif device_is_bonding ${device}; then
fi
}
+function device_get_status() {
+ local device=${1}
+
+ assert isset device
+
+ local status=${STATUS_UNKNOWN}
+
+ if ! device_has_carrier ${device}; then
+ status=${STATUS_NOCARRIER}
+ elif device_is_up ${device}; then
+ status=${STATUS_UP}
+ elif device_is_down ${device}; then
+ status=${STATUS_DOWN}
+ fi
+
+ assert isset status
+
+ echo "${status}"
+}
+
function device_get_address() {
local device=${1}
}
function device_set_address() {
- device_set_mac $@
+ local device=${1}
+ local addr=${2}
+
+ if ! device_exists ${device}; then
+ error "Device '${device}' does not exist."
+ return ${EXIT_ERROR}
+ fi
+
+ log INFO "Setting address of '${device}' to '${addr}' - was $(device_get_address ${device})."
+
+ local up
+ if device_is_up ${device}; then
+ device_set_down ${device}
+ up=1
+ fi
+
+ ip link set ${device} address ${addr}
+ local ret=$?
+
+ if [ "${up}" = "1" ]; then
+ device_set_up ${device}
+ fi
+
+ if [ "${ret}" != "0" ]; then
+ error_log "Could not set address '${addr}' on device '${device}'."
+ fi
+
+ return ${ret}
}
-function devices_get_all() {
+function device_get() {
local device
+ local devices
+
for device in ${SYS_CLASS_NET}/*; do
- echo "$(basename ${device})"
- done | sort
+ device=$(basename ${device})
+
+ # bonding_masters is no device
+ [ "${device}" = "bonding_masters" ] && continue
+
+ devices="${devices} ${device}"
+ done
+
+ echo ${devices}
+ return ${EXIT_OK}
+}
+
+function devices_get_all() {
+ device_get
}
# Check if a device has a cable plugged in
[ "$(<${SYS_CLASS_NET}/${device}/carrier)" = "1" ]
}
-# Check if the device is free
-function device_is_free() {
+function device_is_promisc() {
local device=${1}
- device_is_used ${device} && \
- return ${EXIT_ERROR}
+ ip link show ${device} | grep -qE "<.*PROMISC.*>"
+}
- return ${EXIT_OK}
+# Check if the device is free
+function device_is_free() {
+ ! device_is_used $@
}
# Check if the device is used
function device_is_used() {
local device=$(devicify ${1})
- device_has_vlans ${device} && \
- return ${EXIT_ERROR}
+ device_has_virtuals ${device} && \
+ return ${EXIT_OK}
device_is_bonded ${device} && \
- return ${EXIT_ERROR}
+ return ${EXIT_OK}
+ device_is_bridge_attached ${device} && \
+ return ${EXIT_OK}
- return ${EXIT_OK}
+ return ${EXIT_ERROR}
}
# XXX to be removed I think
echo "${destination}"
}
-# Should be renamed to device_set_name at some time
-function device_rename() {
+function device_hash() {
+ local device=${1}
+
+ # Get mac address of device and remove all colons (:)
+ # that will result in a hash.
+ device=$(macify ${device})
+
+ echo "${device//:/}"
+}
+
+# Give the device a new name
+function device_set_name() {
local source=$1
local destination=$(device_get_free ${2})
fi
}
-function device_hash() {
- local device=${1}
-
- macify ${device} | tr -d ':'
-}
-
-# Give the device a new name
-function device_set_name() {
- device_rename $@
-}
-
# Set device up
function device_set_up() {
local device=$(devicify ${1})
+ # Silently fail if device was not found
+ [ -z "${device}" ] && return ${EXIT_ERROR}
+
# Do nothing if device is already up
device_is_up ${device} && return ${EXIT_OK}
- log DEBUG "Setting up device $@"
+ device_set_parent_up ${device}
+
+ log DEBUG "Setting up device '${device}'"
+
ip link set ${device} up
}
+function device_set_parent_up() {
+ local device=${1}
+ local parent
+
+ if device_is_virtual ${device}; then
+ parent=$(virtual_get_parent ${device})
+
+ device_is_up ${parent} && return ${EXIT_OK}
+
+ log DEBUG "Setting up parent device '${parent}' of '${device}'"
+
+ device_set_up ${parent}
+ return $?
+ fi
+
+ return ${EXIT_OK}
+}
+
# Set device down
function device_set_down() {
local device=$(devicify ${1})
- # Do nothing if device is not up
- device_is_up ${device} || return ${EXIT_OK}
+ local ret=${EXIT_OK}
+
+ if device_is_up ${device}; then
+ log DEBUG "Tearing down device '${device}'"
- log DEBUG "Tearing down device $@"
- ip link set ${device} down
+ ip link set ${device} down
+ ret=$?
+ fi
+
+ device_set_parent_down ${device}
+
+ return ${ret}
}
-# Set new address to a device
-function device_set_mac() {
- local port=${1}
- local mac=${2}
+function device_set_parent_down() {
+ local device=${1}
+ local parent
- local up
- if device_is_up ${port}; then
- device_set_down ${port}
- up=1
- fi
+ if device_is_virtual ${device}; then
+ parent=$(virtual_get_parent ${device})
- ip link set ${port} address ${mac}
- local ret=$?
+ device_is_up ${parent} || return ${EXIT_OK}
- if [ "${up}" = "1" ]; then
- device_set_up ${port}
- fi
+ if device_is_free ${parent}; then
+ log DEBUG "Tearing down parent device '${parent}' of '${device}'"
- return ${ret}
+ device_set_down ${parent}
+ fi
+ fi
+
+ return ${EXIT_OK}
}
function device_get_mtu() {
return ${EXIT_ERROR}
fi
- cat ${SYS_CLASS_NET}/${device}/mtu
+ echo $(<${SYS_CLASS_NET}/${device}/mtu)
}
# Set mtu to a device
function device_set_mtu() {
- local port=${1}
+ local device=${1}
local mtu=${2}
+ if ! device_exists ${device}; then
+ error "Device '${device}' does not exist."
+ return ${EXIT_ERROR}
+ fi
+
+ local oldmtu=$(device_get_mtu ${device})
+
+ if [ "${oldmtu}" = "${mtu}" ]; then
+ # No need to set mtu.
+ return ${EXIT_OK}
+ fi
+
+ log INFO "Setting mtu of '${device}' to '${mtu}' - was ${oldmtu}."
+
local up
- if device_is_up ${port}; then
- device_set_down ${port}
+ if device_is_up ${device}; then
+ device_set_down ${device}
up=1
fi
- ip link set ${port} mtu ${mtu}
+ ip link set ${device} mtu ${mtu}
local ret=$?
if [ "${up}" = "1" ]; then
- device_set_up ${port}
+ device_set_up ${device}
+ fi
+
+ if [ "${ret}" != "0" ]; then
+ error_log "Could not set mtu '${mtu}' on device '${device}'."
fi
return ${ret}
function device_discover() {
local device=${1}
+ log INFO "Running discovery process on device '${device}'."
+
local hook
- for hook in $(hooks_get_all); do
- hook_exec ${hook} discover ${device}
+ for hook in $(hook_zone_get_all); do
+ hook_zone_exec ${hook} discover ${device}
done
}
-function device_create_virtual() {
- log WARN "Called deprecated function device_create_virtual"
- device_virtual_create $@
-}
-
-function device_virtual_create() {
- local port=$(devicify ${1})
- local vid=${2}
- local mac=${3}
- local newport=${port}v${vid}
-
- if [ -z "${mac}" ]; then
- mac=$(mac_generate)
- fi
-
- # Bring up the parent device
- # XXX Do we need this here?
- #device_set_up ${port}
-
- vconfig set_name_type DEV_PLUS_VID_NO_PAD >/dev/null
- vconfig add ${port} ${vid} >/dev/null
- [ $? -ne 0 ] && return ${EXIT_ERROR}
-
- # The device is expected to be named like ${port}.${vid}
- # and will be renamed to the virtual schema
- device_set_name ${port}.${vid} ${newport}
-
- # Setting new mac address
- device_set_address ${newport} ${mac}
-
- # Bring up the new device
- device_set_up ${newport}
-
- log DEBUG "Created virtual device ${newport} (${mac})"
- return ${EXIT_OK}
-}
-
-function device_virtual_remove() {
- local device=$(devicify ${1})
-
- device_set_down ${device}
-
- vconfig rem ${device} >/dev/null
- [ $? -ne 0 ] && return ${EXIT_ERROR}
-
- log DEBUG "Removed virtual device ${device}"
- return ${EXIT_OK}
-}
-
-function device_bonding_create() {
+function device_has_ipv4() {
local device=${1}
- local mac=${2}
-
- [ -z "${mac}" ] && mac=$(mac_generate)
-
- echo "+${device}" > /sys/class/net/bonding_masters
- device_set_mac ${mac}
- device_set_up ${device}
-}
+ local addr=${2}
-function device_bonding_remove() {
- local device=$(devicify ${1})
+ if ! device_exists ${device}; then
+ error "Device '${device}' does not exist."
+ return ${EXIT_ERROR}
+ fi
- device_set_down ${device}
- echo "-${device}" > /sys/class/net/bonding_masters
+ ip addr show ${device} | grep -q -e "inet " -e "${addr}"
}
-function bonding_set_mode() {
+function device_has_ipv6() {
local device=${1}
- local mode=${2}
-
- echo "${mode}" > /sys/class/net/${device}/bonding/mode
-}
-
-function bonding_enslave_device() {
- local device=$(devicify ${1})
- local slave=$(devicify ${2})
-
- device_set_down ${slave}
- echo "+${slave}" > /sys/class/net/${device}/bonding/slaves
-}
-
-function bridge_attach_device() {
- local bridge=${1}
- local device=${2}
-
- if ! device_exists ${bridge}; then
- error "Bridge '${bridge}' does not exist."
- return ${EXIT_ERROR}
- fi
+ local addr=${2}
if ! device_exists ${device}; then
error "Device '${device}' does not exist."
return ${EXIT_ERROR}
fi
- # XXX device_set_up ${device} # Do we need this here?
+ local prefix=${addr##*/}
+ addr=$(ipv6_implode ${addr%%/*})
+
+ if [ -n "${prefix}" ]; then
+ addr="${addr}/${prefix}"
+ fi
- brctl addif ${bridge} ${device}
+ ip addr show ${device} | grep -q "inet6 ${addr}"
}
-function bridge_detach_device() {
- local bridge=${1}
- local device=${2}
+function __device_get_file() {
+ local device=${1}
+ local file=${2}
- if ! device_exists ${bridge}; then
- error "Bridge '${bridge}' does not exist."
- return ${EXIT_ERROR}
- fi
+ assert isset device
+ assert isset file
- if ! device_exists ${device}; then
- error "Device '${device}' does not exist."
- return ${EXIT_ERROR}
- fi
+ cat ${SYS_CLASS_NET}/${device}/${file}
+}
- brctl delif ${zone} ${device}
+function device_get_rx_bytes() {
+ local device=${1}
- device_set_down ${device}
+ __device_get_file ${device} statistics/rx_bytes
}
-function bridge_is_forwarding() {
- local seconds=45
- local zone=${1}
+function device_get_tx_bytes() {
+ local device=${1}
- bridge_has_carrier ${zone} || return ${EXIT_ERROR}
+ __device_get_file ${device} statistics/tx_bytes
+}
- local device
- while [ ${seconds} -gt 0 ]; do
- for device in ${SYS_CLASS_NET}/${zone}/brif/*; do
- [ -e "${device}/state" ] || continue
- if [ "$(<${device}/state)" = "3" ]; then
- return ${EXIT_OK}
- fi
- done
- sleep 1
- seconds=$((${seconds} - 1))
- done
+function device_get_rx_packets() {
+ local device=${1}
- return ${EXIT_ERROR}
+ __device_get_file ${device} statistics/rx_packets
}
-function bridge_has_carrier() {
- local zone=${1}
-
- local has_carrier=${EXIT_ERROR}
+function device_get_tx_packets() {
+ local device=${1}
- local device
- for device in ${SYS_CLASS_NET}/${zone}/brif/*; do
- device=$(basename ${device})
- device_exists ${device} || continue
+ __device_get_file ${device} statistics/tx_packets
+}
- device_has_carrier ${device} && has_carrier=${EXIT_OK}
- done
+function device_get_rx_errors() {
+ local device=${1}
- return ${has_carrier}
+ __device_get_file ${device} statistics/rx_errors
}
-function device_has_ipv4() {
+function device_get_tx_errors() {
local device=${1}
- local addr=${2}
- if ! device_exists ${device}; then
- error "Device '${device}' does not exist."
- return ${EXIT_ERROR}
- fi
-
- ip addr show ${device} | grep -q -e "inet " -e "${addr}"
+ __device_get_file ${device} statistics/tx_errors
}