0001
0002
0003
0004 speeds_arr_get()
0005 {
0006 cmd='/ETHTOOL_LINK_MODE_[^[:space:]]*_BIT[[:space:]]+=[[:space:]]+/ \
0007 {sub(/,$/, "") \
0008 sub(/ETHTOOL_LINK_MODE_/,"") \
0009 sub(/_BIT/,"") \
0010 sub(/_Full/,"/Full") \
0011 sub(/_Half/,"/Half");\
0012 print "["$1"]="$3}'
0013
0014 awk "${cmd}" /usr/include/linux/ethtool.h
0015 }
0016
0017 ethtool_set()
0018 {
0019 local cmd="$@"
0020 local out=$(ethtool -s $cmd 2>&1 | wc -l)
0021
0022 check_err $out "error in configuration. $cmd"
0023 }
0024
0025 dev_linkmodes_params_get()
0026 {
0027 local dev=$1; shift
0028 local adver=$1; shift
0029 local -a linkmodes_params
0030 local param_count
0031 local arr
0032
0033 if (($adver)); then
0034 mode="Advertised link modes"
0035 else
0036 mode="Supported link modes"
0037 fi
0038
0039 local -a dev_linkmodes=($(dev_speeds_get $dev 1 $adver))
0040 for ((i=0; i<${
0041 linkmodes_params[$i]=$(echo -e "${dev_linkmodes[$i]}" | \
0042
0043 sed -e 's/[^0-9]/ /g' | \
0044
0045 tr -s ' ')
0046
0047 param_count=$(echo "${linkmodes_params[$i]}" | wc -w)
0048 if [[ $param_count -eq 1 ]]; then
0049 linkmodes_params[$i]="${linkmodes_params[$i]} 1"
0050 elif [[ $param_count -ge 3 ]]; then
0051 arr=(${linkmodes_params[$i]})
0052
0053 linkmodes_params[$i]=$(echo "${arr[@]:0:2}")
0054 fi
0055 done
0056 echo ${linkmodes_params[@]}
0057 }
0058
0059 dev_speeds_get()
0060 {
0061 local dev=$1; shift
0062 local with_mode=$1; shift
0063 local adver=$1; shift
0064 local speeds_str
0065
0066 if (($adver)); then
0067 mode="Advertised link modes"
0068 else
0069 mode="Supported link modes"
0070 fi
0071
0072 speeds_str=$(ethtool "$dev" | \
0073
0074 sed -n '/'"$mode"':/,$p' | \
0075
0076
0077 sed -n '2,${/^[\t][^ \t]/q};p' | \
0078
0079 cut -d':' -f2)
0080
0081 local -a speeds_arr=($speeds_str)
0082 if [[ $with_mode -eq 0 ]]; then
0083 for ((i=0; i<${
0084 speeds_arr[$i]=${speeds_arr[$i]%base*}
0085 done
0086 fi
0087 echo ${speeds_arr[@]}
0088 }
0089
0090 common_speeds_get()
0091 {
0092 dev1=$1; shift
0093 dev2=$1; shift
0094 with_mode=$1; shift
0095 adver=$1; shift
0096
0097 local -a dev1_speeds=($(dev_speeds_get $dev1 $with_mode $adver))
0098 local -a dev2_speeds=($(dev_speeds_get $dev2 $with_mode $adver))
0099
0100 comm -12 \
0101 <(printf '%s\n' "${dev1_speeds[@]}" | sort -u) \
0102 <(printf '%s\n' "${dev2_speeds[@]}" | sort -u)
0103 }
0104
0105 different_speeds_get()
0106 {
0107 local dev1=$1; shift
0108 local dev2=$1; shift
0109 local with_mode=$1; shift
0110 local adver=$1; shift
0111
0112 local -a speeds_arr
0113
0114 speeds_arr=($(common_speeds_get $dev1 $dev2 $with_mode $adver))
0115 if [[ ${
0116 check_err 1 "cannot check different speeds. There are not enough speeds"
0117 fi
0118
0119 echo ${speeds_arr[0]} ${speeds_arr[1]}
0120 }