# #
###############################################################################
-device_list() {
- local devices
+declare -A DEVICE_LINK_SPEEDS=(
+ [10BaseT-Half]=0x1
+ [10BaseT-Full]=0x2
+ [100BaseT-Half]=0x4
+ [100BaseT-Full]=0x8
+ [1000BaseT-Half]=0x10
+ [1000BaseT-Full]=0x20
+ [10000BaseT-Full]=0x1000
+)
+device_list() {
# Add all interfaces
local device
for device in $(list_directory ${SYS_CLASS_NET}); do
- list_append_one devices "${device}"
+ if device_exists "${device}"; then
+ print "${device}"
+ fi
done
- # Add all PHYs
- list_append devices $(phy_list)
+ # List all PHYs
+ phy_list
- # Add all serial devices
- list_append devices $(serial_list)
-
- # Return a sorted result
- list_sort ${devices}
+ # List all serial devices
+ serial_list
}
# Check if the device exists
print "$(<${path})"
}
+device_get_driver() {
+ local device="${1}"
+ assert isset device
+
+ get_driver_from_path "${SYS_CLASS_NET}/${device}/device/driver/module"
+}
+
# Check if the device is a bonding device
device_is_bonding() {
[ -d "/sys/class/net/${1}/bonding" ]
done < ${PROC_NET_VLAN_CONFIG}
}
+__device_type_matches() {
+ local device="${1}"
+ local type="${2}"
+
+ local _type="$(__device_get_file "${device}" "type")"
+
+ if [ "${type}" = "${_type}" ]; then
+ return ${EXIT_TRUE}
+ fi
+
+ return ${EXIT_FALSE}
+}
+
# Check if the device is a ppp device
device_is_ppp() {
- local device=${1}
-
- local type=$(__device_get_file ${device} type)
+ local device="${1}"
+ assert isset device
- [ "${type}" = "512" ] && return ${EXIT_OK} || return ${EXIT_ERROR}
+ __device_type_matches "${device}" 512
}
# Check if the device is a pointopoint device.
}
device_is_vti() {
- local device=${1}
-
- local type=$(__device_get_file ${device} type)
+ local device="${1}"
+ assert isset device
- [ "${type}" = "768" ] && return ${EXIT_OK} || return ${EXIT_ERROR}
+ __device_type_matches "${device}" 768
}
device_is_vti6() {
- local device=${1}
-
- local type=$(__device_get_file ${device} type)
+ local device="${1}"
+ assert isset device
- [ "${type}" = "769" ] && return ${EXIT_OK} || return ${EXIT_ERROR}
+ __device_type_matches "${device}" 769
}
device_get_phy() {
__device_get_file ${device} statistics/tx_errors
}
+device_advertise_link_speeds() {
+ local device="${1}"
+ shift
+
+ assert isset device
+
+ # Advertised modes in hex
+ local advertise=0
+
+ local mode
+ for mode in $@; do
+ local m="${DEVICE_LINK_SPEEDS[${mode}]}"
+ if isset m; then
+ advertise="$(( advertise | m ))"
+ fi
+ done
+
+ # If nothing was selected, we reset and enable everything
+ if [ ${advertise} -eq 0 ]; then
+ advertise=0xffffff
+ fi
+
+ # Enable auto-negotiation
+ cmd_quiet ethtool --change "${device}" autoneg on
+
+ # Set advertised link speeds
+ if ! cmd_quiet ethtool --change "${device}" advertise "0x$(hex "${advertise}")"; then
+ log ERROR "Could not set link modes of ${device}: $@"
+ return ${EXIT_ERROR}
+ fi
+
+ log DEBUG "Set device link modes of ${device} to $@"
+ return ${EXIT_ERROR}
+}
+
device_get_speed() {
local device=${1}
print "${device}"
return ${EXIT_OK}
}
+
+device_get_by_mac_address() {
+ local mac=${1}
+
+ assert isset mac
+
+ local device
+
+ for device in $(device_list); do
+ if [ "${mac}" = "$(device_get_address ${device})" ]; then
+ print "${device}"
+ return ${EXIT_OK}
+ fi
+ done
+
+ # We could not found a port to the given mac address so we return exit error
+ return ${EXIT_ERROR}
+}