925b343a65
- updated zfcpconf.sh script from dracut - added device-mapper support into zipl (#546280) - added missing check and print NSS name in case an NSS has been IPLed (#546297) - added device_cio_free script and its symlinks - added qualified return codes and further error handling in znetconf (#548487)
1216 lines
28 KiB
Diff
1216 lines
28 KiB
Diff
From 4725dd1a67185ab4296674fcd3b2cf17f2b1cf21 Mon Sep 17 00:00:00 2001
|
|
From: =?utf-8?q?Dan=20Hor=C3=A1k?= <dan@danny.cz>
|
|
Date: Thu, 17 Dec 2009 17:08:22 +0100
|
|
Subject: [PATCH] qualified return codes and further error handling in znetconf
|
|
|
|
Description: znetconf: qualified return codes and further error handling
|
|
Symptom: always returned 1 in case errors
|
|
Problem: wrapper tools not able to generate qualified error msgs
|
|
Solution: return codes
|
|
---
|
|
zconf/znetconf | 324 ++++++++++++++++++++++++++++++++----------------------
|
|
zconf/znetconf.8 | 219 +++++++++++++++++++++++++++++++------
|
|
2 files changed, 375 insertions(+), 168 deletions(-)
|
|
|
|
diff --git a/zconf/znetconf b/zconf/znetconf
|
|
index 4edf6fb..873124a 100755
|
|
--- a/zconf/znetconf
|
|
+++ b/zconf/znetconf
|
|
@@ -2,14 +2,58 @@
|
|
#
|
|
# znetconf - list and configure network devices
|
|
#
|
|
-# Tool for the automatic and semi-automatic configuration of network devices
|
|
+# Tool for the automatic and semi-automatic configuration of network devices
|
|
# from ccw devices, including network device option handling and network
|
|
# device removal.
|
|
#
|
|
-# Copyright IBM Corp. 2009
|
|
+# Copyright IBM Corp. 2009
|
|
# Author(s): Einar Lueck <elelueck@de.ibm.com>
|
|
# Steffen Maier <maier@de.ibm.com>
|
|
#
|
|
+# 9 Could not group devices
|
|
+readonly RC_COULD_NOT_GROUP_DEVICES=9
|
|
+# 10 Could not set device online
|
|
+readonly RC_COULD_NOT_SET_DEV_ONLINE=10
|
|
+# 11 Could not set device offline
|
|
+readonly RC_COULD_NOT_SET_DEV_OFFLINE=11
|
|
+# 12 Invalid attribute value pair
|
|
+readonly RC_INVALID_ATTRIBUTE_VALUE_PAIR=12
|
|
+# 13 Missing component (broken installation)
|
|
+readonly RC_BROKEN_INSTALLATION=13
|
|
+# 14 Missing device ID
|
|
+readonly RC_MISSING_DEVICE_ID=14
|
|
+# 15 Invalid device ID format
|
|
+readonly RC_INVALID_DEVICE_ID_FORMAT=15
|
|
+# 16 Driver name expected
|
|
+readonly RC_DRIVER_NAME_EXPECTED=16
|
|
+# 17 Unknown driver
|
|
+readonly RC_UNKNOWN_DRIVER=17
|
|
+# 18 Missing attribute value pair for -o|--option
|
|
+readonly RC_MISSING_ATTRIBUTE_VALUE_PAIR=18
|
|
+# 19 Invalid argument
|
|
+readonly RC_INVALID_ARGUMENT=19
|
|
+# 20 Too much arguments
|
|
+readonly RC_TOO_MUCH_ARGUMENTS=20
|
|
+# 21 No configuration found for device ID
|
|
+readonly RC_NO_CONFIG_FOUND_FOR_DEV=21
|
|
+# 22 Device is not configured
|
|
+readonly RC_DEVICE_NOT_CONFIGURED=22
|
|
+# 23 Could not ungroup device
|
|
+readonly RC_COULD_NOT_UNGROUP_DEVICE=23
|
|
+# 24 At least one option could not be configured
|
|
+readonly RC_OPTION_NOT_CONFIGURED=24
|
|
+# 25 Missing value for attribute
|
|
+readonly RC_MISSING_VALUE=25
|
|
+# 26 Device does not exist
|
|
+readonly RC_DEVICE_DOES_NOT_EXIST=26
|
|
+# 27 Device already in use
|
|
+readonly RC_DEVICE_ALREADY_IN_USE=27
|
|
+# 28 Net device did not come online
|
|
+readonly RC_NET_DEVICE_NOT_ONLINE=28
|
|
+# 29 Some devices could not be added or failed
|
|
+readonly RC_SOME_DEVICES_FAILED=29
|
|
+# 99 internal error, this should never happen
|
|
+readonly RC_INTERNAL_ERROR=99
|
|
|
|
#==============================================================================
|
|
# constants
|
|
@@ -29,6 +73,7 @@ else
|
|
fi
|
|
SYSFSDIR=$(cat /proc/mounts|awk '$3=="sysfs"{print $2; exit}')
|
|
CCWGROUPBUS_DIR=$SYSFSDIR/bus/ccwgroup
|
|
+CCWDEV_DIR=$SYSFSDIR/bus/ccw/devices
|
|
CCWGROUPBUS_DEVICEDIR=$CCWGROUPBUS_DIR/devices
|
|
CCWGROUPBUS_DRIVERDIR=$CCWGROUPBUS_DIR/drivers
|
|
DEVNOSEP=","
|
|
@@ -290,15 +335,14 @@ function lookup_layer()
|
|
#==============================================================================
|
|
|
|
#
|
|
-# group_device
|
|
+# group_device
|
|
# $1: ccwdevid[;ccwdevid][;ccwdevid]
|
|
# $2: ccwgroupdevid
|
|
# $3: driver
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-# 1 group file not found
|
|
-# 2 grouping failed
|
|
-#
|
|
+# RC_COULD_NOT_GROUP_DEVICES
|
|
+#
|
|
function group_device()
|
|
{
|
|
local DEVICES=$1
|
|
@@ -307,13 +351,13 @@ function group_device()
|
|
local GROUPFILE=$CCWGROUPBUS_DRIVERDIR/$DRIVER/group
|
|
local CTCMGROUPFILE=$CCWGROUPBUS_DRIVERDIR/ctcm/group
|
|
local CTCGROUPFILE=$CCWGROUPBUS_DRIVERDIR/ctc/group
|
|
-
|
|
+
|
|
# check if group file exists
|
|
- if [ ! -e $GROUPFILE ]
|
|
+ if [ ! -e $GROUPFILE ]
|
|
then
|
|
# try to load driver
|
|
if ! modprobe $DRIVER &> /dev/null
|
|
- then
|
|
+ then
|
|
if [ $DRIVER = "ctc" ]
|
|
then
|
|
# check if ctcm driver exists
|
|
@@ -329,7 +373,7 @@ function group_device()
|
|
GROUPFILE=$CTCGROUPFILE
|
|
fi
|
|
fi
|
|
- fi
|
|
+ fi
|
|
fi
|
|
if [ -e $GROUPFILE ]
|
|
then
|
|
@@ -340,13 +384,13 @@ function group_device()
|
|
*)
|
|
print_error "Could not group devices" \
|
|
"$DEVICES"
|
|
- return 2
|
|
+ return $RC_COULD_NOT_GROUP_DEVICES
|
|
;;
|
|
esac
|
|
else
|
|
print_error "$GROUPFILE does not exist"
|
|
-
|
|
- return 1
|
|
+
|
|
+ return $RC_COULD_NOT_GROUP_DEVICES
|
|
fi
|
|
return 0
|
|
}
|
|
@@ -354,14 +398,13 @@ function group_device()
|
|
#==============================================================================
|
|
|
|
#
|
|
-# ungroup_device
|
|
+# ungroup_device
|
|
# $1: ccwgroupdevid
|
|
# $2: network device name (just for display purposes)
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-# 1 group file not found
|
|
-# 2 ungrouping failed
|
|
-#
|
|
+# RC_COULD_NOT_UNGROUP_DEVICE
|
|
+#
|
|
function ungroup_device()
|
|
{
|
|
local TARGET_DEVID="$1"
|
|
@@ -378,12 +421,12 @@ function ungroup_device()
|
|
;;
|
|
*)
|
|
print_error "Failed to ungroup $TARGET_DEVID"
|
|
- return 2
|
|
+ return $RC_COULD_NOT_UNGROUP_DEVICE
|
|
;;
|
|
esac
|
|
else
|
|
print_error "$DEVICE_UNGROUPFILE does not exist."
|
|
- return 1
|
|
+ return $RC_COULD_NOT_UNGROUP_DEVICE
|
|
fi
|
|
return 0
|
|
}
|
|
@@ -393,12 +436,12 @@ function ungroup_device()
|
|
#
|
|
# try_read_netdevname
|
|
# $1: ccwgroupdevno
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
# 1 failed. giving up after retries
|
|
# stdout
|
|
# in case of success: device name
|
|
-#
|
|
+#
|
|
function try_read_netdevname()
|
|
{
|
|
local CCWGROUPDEVNO="$1"
|
|
@@ -406,7 +449,7 @@ function try_read_netdevname()
|
|
local NET_SUBDIR="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/net/"
|
|
local IF_NAME=""
|
|
local rc=1
|
|
-
|
|
+
|
|
# check if interface file containing the name exists
|
|
if [ -e "$IF_NAME_FILE" ]
|
|
then
|
|
@@ -417,7 +460,7 @@ function try_read_netdevname()
|
|
IF_NAME=$(ls $NET_SUBDIR)
|
|
else
|
|
# if the file does not exist
|
|
- local LINKNAME=$(find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*)
|
|
+ local LINKNAME=$(find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*)
|
|
if [[ ! -z $LINKNAME ]]
|
|
then
|
|
IF_NAME=$(readlink $LINKNAME)
|
|
@@ -434,10 +477,10 @@ function try_read_netdevname()
|
|
#
|
|
# wait_for_net_device
|
|
# $1: ccwgroupdevno
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
# 1 failed. giving up after retries
|
|
-#
|
|
+#
|
|
function wait_for_net_device()
|
|
{
|
|
local CCWGROUPDEVNO="$1"
|
|
@@ -447,7 +490,7 @@ function wait_for_net_device()
|
|
local IF_NAME=""
|
|
local CMD_FINDNETLINK="find $CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO/ -type l -name net*"
|
|
local LINKNAME=""
|
|
-
|
|
+
|
|
# polling loop to wait for net device to become available
|
|
if [ -e $UDEVSETTLE ]
|
|
then
|
|
@@ -460,7 +503,7 @@ function wait_for_net_device()
|
|
fi
|
|
while [[ -z "$IF_NAME" ]] && [[ retries -lt MAX_RETRIES ]]
|
|
do
|
|
- sleep 1
|
|
+ sleep 1
|
|
retries=$retries+1
|
|
IF_NAME=$(try_read_netdevname $CCWGROUPDEVNO)
|
|
done
|
|
@@ -468,8 +511,8 @@ function wait_for_net_device()
|
|
then
|
|
echo "Successfully configured device $CCWGROUPDEVNO ($IF_NAME)"
|
|
else
|
|
- print_error "Failed to make $CCWGROUPDEVNO online."
|
|
- return 1
|
|
+ print_error "Failed to make $CCWGROUPDEVNO online."
|
|
+ return 1
|
|
fi
|
|
}
|
|
|
|
@@ -479,11 +522,11 @@ function wait_for_net_device()
|
|
# switch_device
|
|
# $1: ccwgroupdevno
|
|
# $2: 1|0 (online|offline)
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
# 1 command to make device online/offline returned error
|
|
# 2 online file does not exist
|
|
-#
|
|
+#
|
|
function switch_device()
|
|
{
|
|
local CCWGROUPDEVNO="$1"
|
|
@@ -491,7 +534,7 @@ function switch_device()
|
|
local DEVICE_DIRECTORY="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVNO"
|
|
local ONLINE_FILE="$DEVICE_DIRECTORY/online"
|
|
local STATESTR="online"
|
|
-
|
|
+
|
|
if [ $SWITCHVALUE -eq 0 ]
|
|
then
|
|
STATESTR="offline"
|
|
@@ -513,7 +556,7 @@ function switch_device()
|
|
print_error "$ONLINE_FILE does not exist."
|
|
return 2
|
|
fi
|
|
-
|
|
+
|
|
return 0
|
|
}
|
|
|
|
@@ -524,12 +567,12 @@ function switch_device()
|
|
# $1: ccwgroupdevid
|
|
# $2: option_name
|
|
# $3: option_value
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
# 1 option not allowed to be set (e.g. online)
|
|
# 2 unknown option
|
|
# 3 configuration failed
|
|
-#
|
|
+#
|
|
function configure_ccwgroupdev_option()
|
|
{
|
|
local CCWGROUPDEVID="$1"
|
|
@@ -539,10 +582,10 @@ function configure_ccwgroupdev_option()
|
|
# filter some attributes away
|
|
if [ "$OPTION_NAME" == "online" ]
|
|
then
|
|
- print_error "Ignoring option $OPTION_NAME=$OPTION_VALUE"
|
|
+ print_error "Ignoring option $OPTION_NAME=$OPTION_VALUE"
|
|
return 1
|
|
fi
|
|
-
|
|
+
|
|
# check if attribute exists
|
|
local ATTRFILE="$CCWGROUPBUS_DEVICEDIR/$CCWGROUPDEVID/$OPTION_NAME"
|
|
if [ -f $ATTRFILE ]
|
|
@@ -574,13 +617,13 @@ function configure_ccwgroupdev_option()
|
|
# $4: opt_count
|
|
# $5..$(5+opt_count): opt_name_array
|
|
# $5+opt_count..5+2*opt_count: opt_value_array
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-# 1 grouping failed
|
|
-# 2 failed to make device online
|
|
-# 3 net device did not become available
|
|
-# 4 device online but some option could not be set
|
|
-#
|
|
+# RC_COULD_NOT_GROUP_DEVICES
|
|
+# RC_COULD_NOT_SET_DEV_ONLINE
|
|
+# RC_NET_DEVICE_NOT_ONLINE
|
|
+# RC_OPTION_NOT_CONFIGURED
|
|
+#
|
|
function add_net_device()
|
|
{
|
|
local DEVICES="$1"
|
|
@@ -591,10 +634,9 @@ function add_net_device()
|
|
local OPT_NAME_ARRAY=("${RAW[@]:4:$OPT_COUNT}")
|
|
local OPT_VALUE_ARRAY=("${RAW[@]:$[4 + $OPT_COUNT]:$OPT_COUNT}")
|
|
|
|
- group_device $DEVICES $CCWGROUPDEVID $DRIVER
|
|
- if [ $? -ne 0 ]
|
|
+ if ! group_device $DEVICES $CCWGROUPDEVID $DRIVER
|
|
then
|
|
- return 1
|
|
+ return $?
|
|
fi
|
|
|
|
local i=0
|
|
@@ -602,9 +644,8 @@ function add_net_device()
|
|
local HAS_LAYER2_OPTION=0
|
|
while [ $i -lt $OPT_COUNT ]
|
|
do
|
|
- configure_ccwgroupdev_option $CCWGROUPDEVID \
|
|
+ if ! configure_ccwgroupdev_option $CCWGROUPDEVID \
|
|
${OPT_NAME_ARRAY[$i]} ${OPT_VALUE_ARRAY[$i]}
|
|
- if [ $? -ne 0 ]
|
|
then
|
|
SOMEOPTION_FAILED=1
|
|
fi
|
|
@@ -628,22 +669,20 @@ function add_net_device()
|
|
"layer2" "$LAYER2"
|
|
fi
|
|
fi
|
|
-
|
|
- switch_device $CCWGROUPDEVNO 1
|
|
- if [ $? -ne 0 ]
|
|
+
|
|
+ if ! switch_device $CCWGROUPDEVNO 1
|
|
then
|
|
- return 2
|
|
+ return $RC_COULD_NOT_SET_DEV_ONLINE
|
|
fi
|
|
|
|
- wait_for_net_device $CCWGROUPDEVNO
|
|
- if [ $? -ne 0 ]
|
|
+ if ! wait_for_net_device $CCWGROUPDEVNO
|
|
then
|
|
- return 3
|
|
+ return $RC_NET_DEVICE_NOT_ONLINE
|
|
fi
|
|
|
|
if [ $SOMEOPTION_FAILED -ne 0 ]
|
|
then
|
|
- return 4
|
|
+ return $RC_OPTION_NOT_CONFIGURED
|
|
fi
|
|
|
|
return 0
|
|
@@ -655,26 +694,24 @@ function add_net_device()
|
|
# remove_net_device
|
|
# $1: ccwgroupdevid
|
|
# $2: network interface name (just for display purposes)
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-# 1 making device offline failed
|
|
-# 2 ungrouping device failed
|
|
-#
|
|
+# RC_COULD_NOT_SET_DEV_OFFLINE
|
|
+# RC_COULD_NOT_UNGROUP_DEVICE
|
|
+#
|
|
function remove_net_device()
|
|
{
|
|
local DEVICE_TO_REMOVE="$1"
|
|
local DEVNAME="$2"
|
|
|
|
- switch_device $DEVICE_TO_REMOVE 0
|
|
- if [ $? -ne 0 ]
|
|
+ if ! switch_device $DEVICE_TO_REMOVE 0
|
|
then
|
|
- return 1
|
|
+ return $RC_COULD_NOT_SET_DEV_OFFLINE
|
|
fi
|
|
|
|
- ungroup_device $DEVICE_TO_REMOVE $DEVNAME
|
|
- if [ $? -ne 0 ]
|
|
+ if ! ungroup_device $DEVICE_TO_REMOVE $DEVNAME
|
|
then
|
|
- return 2
|
|
+ return $RC_COULD_NOT_UNGROUP_DEVICE
|
|
fi
|
|
return 0
|
|
}
|
|
@@ -684,9 +721,9 @@ function remove_net_device()
|
|
#
|
|
# list_configured
|
|
# $1 supress_header
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-#
|
|
+#
|
|
function list_configured()
|
|
{
|
|
supress_header=0
|
|
@@ -723,11 +760,11 @@ function list_configured()
|
|
|
|
# read all links and parse driver, device name and ccw device
|
|
# bus-ids
|
|
- ls -l $d/ | grep '^l' |
|
|
- {
|
|
+ ls -l $d/ | grep '^l' |
|
|
+ {
|
|
|
|
- while read line
|
|
- do
|
|
+ while read line
|
|
+ do
|
|
local LINKNAME=${line// ->*/""}
|
|
LINKNAME=${LINKNAME##* }
|
|
if [ "$LINKNAME" = "driver" ]
|
|
@@ -742,14 +779,14 @@ function list_configured()
|
|
then
|
|
DEVNAME=${line##* -> */}
|
|
fi
|
|
- done
|
|
+ done
|
|
|
|
local CUTYPE=""
|
|
if [ -e $d/cdev0/cutype ]
|
|
then
|
|
read CUTYPE < $d/cdev0/cutype
|
|
fi
|
|
-
|
|
+
|
|
read ONLINE < $d/online
|
|
if [ $ONLINE -eq 1 ]
|
|
then
|
|
@@ -795,15 +832,15 @@ function print_list_unconf_header()
|
|
|
|
#
|
|
# list_unconfigured
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
-#
|
|
+#
|
|
function list_unconfigured()
|
|
{
|
|
local PRINTED_HEADLINES=0
|
|
local LIST_FORMATSTR="%-26.26s %-7.7s %-14.14s %5.5s %-4.4s \n"
|
|
print_scanning_4_nwdevices
|
|
-
|
|
+
|
|
$LSZNET_CALL |
|
|
{
|
|
while read no cutype chp devtype devdrv devname chlist cardtype
|
|
@@ -824,29 +861,29 @@ function list_unconfigured()
|
|
#
|
|
# store_option
|
|
# $1: attribute=value
|
|
-# returns
|
|
+# returns
|
|
# 0 success
|
|
# 1 attribute starts with a - / or is invalid
|
|
# 2 missing value
|
|
-#
|
|
+#
|
|
function store_option()
|
|
{
|
|
local OPTIONSTRING="$1"
|
|
|
|
# ensure that there is no option intepreted as an
|
|
- # attribute value pair
|
|
+ # attribute value pair
|
|
[[ "$OPTIONSTRING" =~ ^- ]]
|
|
case $? in
|
|
0)
|
|
print_error "$OPTIONSTRING is not a valid attribute" \
|
|
- "value pair"
|
|
+ "value pair"
|
|
exit 1
|
|
;;
|
|
1)
|
|
# option considered ok
|
|
;;
|
|
2)
|
|
- print_error "Internal error"
|
|
+ print_error "Internal error"
|
|
exit 1
|
|
esac
|
|
|
|
@@ -874,17 +911,17 @@ function store_option()
|
|
#
|
|
# is_complete_ccwdevbusid
|
|
# $1: possibly correct ccw device bus id
|
|
-# returns
|
|
+# returns
|
|
# 0 if the given string is a correctly formatted ccw device bus id
|
|
# 1 else
|
|
-#
|
|
+#
|
|
function is_complete_ccwdevbusid()
|
|
{
|
|
local DEV="$1"
|
|
[[ "$DEV" =~ $FORMAT_FULLDEVNO ]]
|
|
- case $? in
|
|
+ case $? in
|
|
0)
|
|
- return 0
|
|
+ return 0
|
|
;;
|
|
1)
|
|
return 1
|
|
@@ -902,41 +939,41 @@ function is_complete_ccwdevbusid()
|
|
#
|
|
# is_partial_ccwdevbusid
|
|
# $1: possibly correct partial ccw device bus id
|
|
-# returns
|
|
+# returns
|
|
# 0 if the given string is a correctly formatted partial ccw device
|
|
# bus id
|
|
# 1 else
|
|
-#
|
|
+#
|
|
function is_partial_ccwdevbusid()
|
|
{
|
|
local DEV="$1"
|
|
[[ "$DEV" =~ $FORMAT_PARTDEVNO ]]
|
|
case $? in
|
|
0)
|
|
- return 0
|
|
+ return 0
|
|
;;
|
|
1)
|
|
- return 1
|
|
+ return 1
|
|
;;
|
|
2)
|
|
print_error "Internal error"
|
|
exit 1
|
|
;;
|
|
esac
|
|
-}
|
|
+}
|
|
|
|
#==============================================================================
|
|
|
|
#
|
|
# is_ccwdevbusid_list
|
|
# $1: possibly correct list of ccw device bus ids
|
|
-# returns
|
|
+# returns
|
|
# 0 if the given string is a correctly formatted list of ccw device
|
|
# bus ids
|
|
# 1 else
|
|
-#
|
|
+#
|
|
function is_ccwdevbusid_list()
|
|
-{
|
|
+{
|
|
local DEVLIST="$1"
|
|
[[ "$DEVLIST" =~ $FORMAT_DEVLIST ]]
|
|
case $? in
|
|
@@ -959,13 +996,13 @@ function is_ccwdevbusid_list()
|
|
#
|
|
# is_shortccwdevbusid_list
|
|
# $1: possibly correct list of short ccw device bus ids
|
|
-# returns
|
|
+# returns
|
|
# 0 if the given string is a correctly formatted list of short ccw device
|
|
# bus ids
|
|
# 1 else
|
|
-#
|
|
+#
|
|
function is_shortccwdevbusid_list()
|
|
-{
|
|
+{
|
|
local DEVLIST="$1"
|
|
[[ "$DEVLIST" =~ $FORMAT_SHORTDEVLIST ]]
|
|
case $? in
|
|
@@ -987,14 +1024,14 @@ function is_shortccwdevbusid_list()
|
|
#
|
|
# is_supported_driver
|
|
# $1: possibly supported driver
|
|
-# returns
|
|
-# 0 if the given string denotes a supported driver
|
|
+# returns
|
|
+# 0 if the given string denotes a supported driver
|
|
# 1 else
|
|
-#
|
|
+#
|
|
function is_supported_driver()
|
|
{
|
|
local DRIVER="$1"
|
|
- [[ "$DRIVER" =~ "^(qeth|lcs|ctc|ctcm)$" ]]
|
|
+ [[ "$DRIVER" =~ "^(qeth|lcs|ctc|ctcm)$" ]]
|
|
case $? in
|
|
0)
|
|
return 0
|
|
@@ -1081,7 +1118,7 @@ DEVICE_TO_REMOVE=""
|
|
DO_REMOVEALL=0
|
|
NONINTERACTIVE=0
|
|
EXCEPT=""
|
|
-if [ $# -gt 0 ]
|
|
+if [ $# -gt 0 ]
|
|
then
|
|
while [ $# -gt 0 ]
|
|
do
|
|
@@ -1092,7 +1129,7 @@ then
|
|
;;
|
|
-v|--version)
|
|
print_version
|
|
- exit 0
|
|
+ exit 0
|
|
;;
|
|
-A|--add-all)
|
|
DO_ADDALL=1
|
|
@@ -1103,15 +1140,15 @@ then
|
|
if [ $# -lt 1 ]
|
|
then
|
|
print_error "Device ID expected"
|
|
- exit 1
|
|
+ exit $RC_MISSING_DEVICE_ID
|
|
fi
|
|
|
|
- # get parameter expected to be a
|
|
- # ccw device bus id
|
|
+ # get parameter expected to be a
|
|
+ # ccw device bus id
|
|
DEVICE_TO_ADD="$1"
|
|
shift
|
|
|
|
- # check syntax of ccw device bus id
|
|
+ # check syntax of ccw device bus id
|
|
if is_complete_ccwdevbusid "$DEVICE_TO_ADD" ||
|
|
is_ccwdevbusid_list "$DEVICE_TO_ADD"
|
|
then
|
|
@@ -1127,9 +1164,9 @@ then
|
|
DO_ADD=1
|
|
else
|
|
print_error "Invalid device ID format" \
|
|
- "$DEVICE_TO_ADD"
|
|
-
|
|
- exit 1
|
|
+ "$DEVICE_TO_ADD"
|
|
+
|
|
+ exit $RC_INVALID_DEVICE_ID_FORMAT
|
|
fi
|
|
|
|
;;
|
|
@@ -1142,18 +1179,18 @@ then
|
|
if [ $# -lt 1 ]
|
|
then
|
|
print_error "Driver name expected"
|
|
- exit 1
|
|
+ exit $RC_DRIVER_NAME_EXPECTED
|
|
fi
|
|
|
|
# ensure driver is supported
|
|
DRIVER="$1"
|
|
shift
|
|
if [ "$DRIVER" != "" ] && \
|
|
- ! is_supported_driver "$DRIVER"
|
|
+ ! is_supported_driver "$DRIVER"
|
|
then
|
|
# unknown driver
|
|
print_error "Unknown driver $DRIVER"
|
|
- exit 1
|
|
+ exit $RC_UNKNOWN_DRIVER
|
|
fi
|
|
;;
|
|
-o|--option)
|
|
@@ -1164,7 +1201,7 @@ then
|
|
print_error "Missing attrtibute" \
|
|
"value pair for -o|--" \
|
|
"option"
|
|
- exit 1
|
|
+ exit $RC_MISSING_ATTRIBUTE_VALUE_PAIR
|
|
fi
|
|
|
|
# get option string
|
|
@@ -1174,26 +1211,26 @@ then
|
|
# store option
|
|
if ! store_option $OPTIONSTRING
|
|
then
|
|
- exit $?
|
|
+ exit $RC_INVALID_ATTRIBUTE_VALUE_PAIR
|
|
fi
|
|
;;
|
|
-r|--remove)
|
|
DO_REMOVE=1
|
|
shift
|
|
-
|
|
+
|
|
# ensure there is a further parameter
|
|
if [ $# -lt 1 ]
|
|
then
|
|
print_error "Expecting <device_bus_id>"\
|
|
"of device to be removed"
|
|
- exit 1
|
|
+ exit $RC_MISSING_ATTRIBUTE_VALUE_PAIR
|
|
fi
|
|
|
|
# get device to be removed
|
|
DEVICE_TO_REMOVE="$1"
|
|
shift
|
|
-
|
|
- # validate it is a
|
|
+
|
|
+ # validate it is a
|
|
# ccw dev bus id (short or long)
|
|
if is_partial_ccwdevbusid "$DEVICE_TO_REMOVE"
|
|
then
|
|
@@ -1203,7 +1240,7 @@ then
|
|
then
|
|
print_error "Invalid device ID format" \
|
|
"$DEVICE_TO_REMOVE"
|
|
- exit 1
|
|
+ exit $RC_INVALID_DEVICE_ID_FORMAT
|
|
fi
|
|
;;
|
|
-R|--remove-all)
|
|
@@ -1219,7 +1256,7 @@ then
|
|
then
|
|
print_error "<device_bus_id> missing"\
|
|
"for -e|--except"
|
|
- exit 1
|
|
+ exit $RC_MISSING_DEVICE_ID
|
|
fi
|
|
|
|
# get device to be removed
|
|
@@ -1236,7 +1273,7 @@ then
|
|
then
|
|
print_error "Invalid device ID format" \
|
|
"$EXCEPT_DEVNO"
|
|
- exit 1
|
|
+ exit $RC_INVALID_DEVICE_ID_FORMAT
|
|
fi
|
|
|
|
# create a filter statement
|
|
@@ -1258,7 +1295,7 @@ then
|
|
*)
|
|
echo "$CMD: Invalid option $1"
|
|
echo "Try '$CMD --help' for more information."
|
|
- exit 1
|
|
+ exit $RC_INVALID_ARGUMENT
|
|
;;
|
|
esac
|
|
done
|
|
@@ -1271,7 +1308,7 @@ if [ $(($DO_ADD + $DO_ADDALL + $DO_LIST_UNCONFIGURED + $DO_LIST_CONFIGURED + \
|
|
then
|
|
print_error "Too much arguments"
|
|
echo "Try '$CMD --help' for more information."
|
|
- exit 1
|
|
+ exit $RC_TOO_MUCH_ARGUMENTS
|
|
fi
|
|
|
|
# react to parsed options
|
|
@@ -1290,12 +1327,31 @@ then
|
|
then
|
|
print_error "No configuration found for device ID" \
|
|
"$DEVICE_TO_ADD"
|
|
- exit 1
|
|
+ exit $RC_NO_CONFIG_FOUND_FOR_DEV
|
|
fi
|
|
else
|
|
- # define set of device numbers to be used
|
|
+ # define set of device numbers to be used
|
|
DEVICES="$DEVICE_TO_ADD"
|
|
-
|
|
+
|
|
+ # ensure none of the CCW devices is already in use
|
|
+ CCW_DEVS=${DEVICES//,/ }
|
|
+ for CCW_DEVNO in $CCW_DEVS
|
|
+ do
|
|
+ CCW_DEV_ONLINEFILE="$CCWDEV_DIR/$CCW_DEVNO/online"
|
|
+ if [ ! -e $CCW_DEV_ONLINEFILE ]
|
|
+ then
|
|
+ print_error "Device $CCW_DEVNO does not exist"
|
|
+ exit $RC_DEVICE_DOES_NOT_EXIST
|
|
+ fi
|
|
+
|
|
+ read CCW_DEV_ONLINE < $CCW_DEV_ONLINEFILE
|
|
+ if [ "$CCW_DEV_ONLINE" == "1" ]
|
|
+ then
|
|
+ print_error "$CCW_DEVNO is already in use"
|
|
+ exit $RC_DEVICE_ALREADY_IN_USE
|
|
+ fi
|
|
+ done
|
|
+
|
|
# try to find a driver for the given set of device numbers
|
|
CANDIDATE=$($LSZNET_CALL|
|
|
awk "\$7~/${DEVICE_TO_ADD//,// && \$7~/}/ {print \$5}")
|
|
@@ -1305,7 +1361,7 @@ then
|
|
# compute the expected group device number
|
|
CCWGROUPDEVNO=${DEVICES%%,*}
|
|
|
|
- # check whether an appropriate driver was determined automatically or
|
|
+ # check whether an appropriate driver was determined automatically or
|
|
# not, if not, one has to be given by the user via -d
|
|
if [ "$DRIVER" == "" ]
|
|
then
|
|
@@ -1345,7 +1401,7 @@ then
|
|
$ATTRIBUTE_COUNT "${ATTRIBUTE_NAME[@]}" \
|
|
"${ATTRIBUTE_VALUE[@]}"
|
|
then
|
|
- ADDALL_RC=1
|
|
+ ADDALL_RC=$RC_SOME_DEVICES_FAILED
|
|
fi
|
|
done
|
|
exit "$ADDALL_RC"
|
|
@@ -1363,9 +1419,9 @@ then
|
|
if [[ -z "$CCWGROUPDEVID_TO_REMOVE" ]]
|
|
then
|
|
print_error "$DEVICE_TO_REMOVE is not a configured device"
|
|
- exit 1
|
|
+ exit $RC_DEVICE_NOT_CONFIGURED
|
|
fi
|
|
-
|
|
+
|
|
echo "Remove network device $CCWGROUPDEVID_TO_REMOVE" \
|
|
"($CCWDEVBUSIDS_TO_REMOVE)?"
|
|
echo "Warning: this may affect network connectivity!"
|
|
@@ -1403,7 +1459,7 @@ then
|
|
fi
|
|
if [ $DO_LIST_UNCONFIGURED -eq 1 ]
|
|
then
|
|
- list_unconfigured
|
|
+ list_unconfigured
|
|
exit 0
|
|
fi
|
|
if [ $DO_LIST_CONFIGURED -eq 1 ]
|
|
diff --git a/zconf/znetconf.8 b/zconf/znetconf.8
|
|
index 3af8565..a6da42c 100644
|
|
--- a/zconf/znetconf.8
|
|
+++ b/zconf/znetconf.8
|
|
@@ -1,6 +1,6 @@
|
|
.TH ZNETCONF 8 "Mar 2009" "s390-tools"
|
|
|
|
-.SH NAME
|
|
+.SH NAME
|
|
znetconf \- list and configure network devices for System z network adapters
|
|
|
|
.SH SYNOPSIS
|
|
@@ -8,10 +8,10 @@ znetconf \- list and configure network devices for System z network adapters
|
|
.B [-h|--help] [-v|--version]
|
|
.br
|
|
|
|
-.br
|
|
-.B znetconf -u | -c
|
|
.br
|
|
-.B znetconf -a <device_bus_id>[,...]{2} [-o <ATTR>=<VALUE>]+ [-d <DRIVER>]
|
|
+.B znetconf -u | -c
|
|
+.br
|
|
+.B znetconf -a <device_bus_id>[,...]{2} [-o <ATTR>=<VALUE>]+ [-d <DRIVER>]
|
|
.br
|
|
.B znetconf -A [-o <ATTR>=<VALUE>]+ [-d <DRIVER>] [-e <device_bus_id>]+
|
|
.br
|
|
@@ -27,12 +27,12 @@ Based on these lists, it automatically adds or removes network devices.
|
|
For automatic configuration, znetconf builds a channel command word
|
|
(CCW) group device from sensed CCW devices, configures any specified
|
|
option through the sensed network device driver and sets the new
|
|
-network device online.
|
|
+network device online.
|
|
.P
|
|
During automatic removal, znetconf sets the device offline and removes it.
|
|
Be aware that removing all network devices leads to the
|
|
-complete loss of network connectivity. So a terminal session (e.g. 3270)
|
|
-might be required to restore.
|
|
+complete loss of network connectivity. So a terminal session (e.g. 3270)
|
|
+might be required to restore.
|
|
|
|
.SH OPTIONS
|
|
.TP 8
|
|
@@ -43,30 +43,30 @@ Print help text.
|
|
.BR -v | --version
|
|
Print the version of the s390-tools package and the znetconf command.
|
|
|
|
-.TP
|
|
-.BR -u | --unconfigured
|
|
+.TP
|
|
+.BR -u | --unconfigured
|
|
List potential network devices that are not yet configured.
|
|
For each device, the following data is provided:
|
|
.RS
|
|
.TP 4
|
|
-*
|
|
-Device IDs (device bus bus-IDs) of the CCW devices constituting the network
|
|
+*
|
|
+Device IDs (device bus bus-IDs) of the CCW devices constituting the network
|
|
device
|
|
.TP
|
|
-*
|
|
+*
|
|
Type of control unit (e.g. 1731/01)
|
|
.TP
|
|
-*
|
|
+*
|
|
Network card type (e.g. OSA (QDIO))
|
|
.TP
|
|
*
|
|
-Channel path identifier (CHPID)
|
|
+Channel path identifier (CHPID)
|
|
.TP
|
|
*
|
|
Device driver (qeth, lcs, ctc, ctcm)
|
|
.RE
|
|
-.TP
|
|
-.BR -c | --configured
|
|
+.TP
|
|
+.BR -c | --configured
|
|
List configured network devices. For each device, the following data is
|
|
provided:
|
|
.RS
|
|
@@ -104,7 +104,7 @@ device_bus_id can be any of the device
|
|
IDs listed as part of the potential network device list (argument
|
|
.BR -u ")."
|
|
For example, if znetconf
|
|
-.BR -u
|
|
+.BR -u
|
|
lists 0.0.f503,0.0.f504,0.0.f505 for a potential network device, device_bus_id
|
|
may be 0.0.f503 or 0.0.f504 or 0.0.f505.
|
|
If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
|
|
@@ -115,11 +115,11 @@ If attribute value pairs are given with
|
|
.BR -o ", "
|
|
these pairs are configured for the created network device. The
|
|
device is then set online regardless of whether the given attribute value pairs
|
|
-were applied successfully.
|
|
+were applied successfully.
|
|
.br
|
|
Finally, the corresponding network interface name (e.g. eth1) is displayed.
|
|
.br
|
|
-If more then one device_bus_id is given, the given set of devices is configured as a network device. znetconf tries to sense the required device driver
|
|
+If more then one device_bus_id is given, the given set of devices is configured as a network device. znetconf tries to sense the required device driver
|
|
automatically. If the device driver cannot be sensed, you must specify it with
|
|
-d.
|
|
.BR -d "."
|
|
@@ -145,7 +145,7 @@ znetconf continues with the next remaining potential network device.
|
|
|
|
.TP
|
|
.BR -r | --remove " <device_bus_id> [-n | --non-interactive]"
|
|
-Remove the network device identified by device_bus_id. device_bus_id is one of
|
|
+Remove the network device identified by device_bus_id. device_bus_id is one of
|
|
the device IDs of the network device. They are listed as part of znetconf
|
|
.BR -c "."
|
|
znetconf sets the device offline and removes it. If
|
|
@@ -164,21 +164,105 @@ with
|
|
.TP
|
|
\fB<ATTR>\fR
|
|
Specify a device option. The option must match a sysfs attribute for the device
|
|
-to be configured.
|
|
+to be configured. For a detailed description of the semantics of sysfs
|
|
+attributes please refer to the Device Drivers, Features, and Commands book for
|
|
+Linux on System z. The attributes are:
|
|
+
|
|
+.RS
|
|
+.B qeth
|
|
+.br
|
|
+broadcast_mode
|
|
+.br
|
|
+buffer_count
|
|
+.br
|
|
+canonical_macaddr
|
|
+.br
|
|
+checksumming
|
|
+.br
|
|
+fake_broadcast
|
|
+.br
|
|
+ipa_takeover/add4
|
|
+.br
|
|
+ipa_takeover/add6
|
|
+.br
|
|
+ipa_takeover/del4
|
|
+.br
|
|
+ipa_takeover/del6
|
|
+.br
|
|
+ipa_takeover/enable
|
|
+.br
|
|
+ipa_takeover/invert4
|
|
+.br
|
|
+ipa_takeover/invert6
|
|
+.br
|
|
+isolation
|
|
+.br
|
|
+large_send
|
|
+.br
|
|
+layer2
|
|
+.br
|
|
+performance_stats
|
|
+.br
|
|
+portname
|
|
+.br
|
|
+portno
|
|
+.br
|
|
+priority_queueing
|
|
+.br
|
|
+route4
|
|
+.br
|
|
+route6
|
|
+.br
|
|
+rxip/add4
|
|
+.br
|
|
+rxip/add6
|
|
+.br
|
|
+rxip/del4
|
|
+.br
|
|
+rxip/del6
|
|
+.br
|
|
+vipa/add4
|
|
+.br
|
|
+vipa/add6
|
|
+.br
|
|
+vipa/del4
|
|
+.br
|
|
+vipa/del
|
|
+.RE
|
|
+
|
|
+.RS
|
|
+.B ctc(m)
|
|
+.br
|
|
+buffer
|
|
+.br
|
|
+loglevel
|
|
+.br
|
|
+protocol
|
|
+.br
|
|
+stats
|
|
+.RE
|
|
+
|
|
+.RS
|
|
+.B lcs
|
|
+.br
|
|
+portno
|
|
+.br
|
|
+lancmd_timeout
|
|
+.RE
|
|
|
|
.TP
|
|
-\fB<device_bus_id>\fR
|
|
+\fB<device_bus_id>\fR
|
|
Specify the device bus-ID of a CCW device. Device bus-IDs have the form
|
|
([A-Fa-f0-9].[A-Fa-f0-9].)[A-Fa-f0-9]{4}.
|
|
|
|
-If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
|
|
+If a device bus-ID begins with 0.0., you can abbreviate it to the final 4
|
|
hexadecimal digits.
|
|
|
|
For example, you can abbreviate 0.0.f503 to f503.
|
|
|
|
.TP
|
|
\fB<DRIVER>\fR
|
|
-Specify the device driver for the device. Valid values are qeth, lcs, ctc, or
|
|
+Specify the device driver for the device. Valid values are qeth, lcs, ctc, or
|
|
ctcm.
|
|
|
|
.SH EXAMPLES
|
|
@@ -242,9 +326,9 @@ Shows the list of potential network devices. Example output:
|
|
Device IDs Type Card Type CHPID Drv.
|
|
.br
|
|
--------------------------------------------------------
|
|
-0.0.f500,0.0.f501,0.0.f502 1731/01 OSA (QDIO) 00 qeth
|
|
+0.0.f500,0.0.f501,0.0.f502 1731/01 OSA (QDIO) 00 qeth
|
|
.br
|
|
-0.0.f503,0.0.f504,0.0.f505 1731/01 OSA (QDIO) 01 qeth
|
|
+0.0.f503,0.0.f504,0.0.f505 1731/01 OSA (QDIO) 01 qeth
|
|
.RE
|
|
.P
|
|
\fBznetconf -a 0.0.f503\fR
|
|
@@ -258,13 +342,13 @@ lists the new network device.
|
|
.P
|
|
\fBznetconf -a f503\fR
|
|
.RS
|
|
-This command is equivalent to \fBznetconf -a 0.0.f503\fR.
|
|
+This command is equivalent to \fBznetconf -a 0.0.f503\fR.
|
|
.RE
|
|
.P
|
|
\fBznetconf -a f503 -o layer2=0 -o portname=myname\fR
|
|
.RS
|
|
-Adds the potential network device
|
|
-with 0.0.f503 as one of its device bus-IDs
|
|
+Adds the potential network device
|
|
+with 0.0.f503 as one of its device bus-IDs
|
|
and configures the options layer2 with value 0 and
|
|
portname with myname.
|
|
.RE
|
|
@@ -288,9 +372,9 @@ Device IDs Type Card Type CHPID Drv. Name State
|
|
|
|
\fBznetconf -r 0.0.f503\fR
|
|
.RS
|
|
-Removes the network device with 0.0.f503 as one of its device bus-IDs.
|
|
+Removes the network device with 0.0.f503 as one of its device bus-IDs.
|
|
You can only remove configured devices as listed by znetconf
|
|
-.BR -c "."
|
|
+.BR -c "."
|
|
After successfully running this command the corresponding device appears in the
|
|
list of potential network devices as listed by znetconf
|
|
.BR -u "."
|
|
@@ -303,9 +387,76 @@ This command is equivalent to \fBznetconf -r 0.0.f503\fR.
|
|
.P
|
|
|
|
.SH DIAGNOSTICS
|
|
-If znetconf runs successfully, the exit status is 0. In case of errors, 1 is
|
|
-returned.
|
|
-
|
|
+If znetconf runs successfully, the exit status is 0. In case of errors, the following codes are returned:
|
|
+.TP
|
|
+.BR 0
|
|
+success
|
|
+.TP
|
|
+.BR 9
|
|
+could not group devices
|
|
+.TP
|
|
+.BR 10
|
|
+could not set device online
|
|
+.TP
|
|
+.BR 11
|
|
+could not set device offline
|
|
+.TP
|
|
+.BR 12
|
|
+invalid attribute value pair
|
|
+.TP
|
|
+.BR 13
|
|
+missing component (broken installation)
|
|
+.TP
|
|
+.BR 14
|
|
+missing device ID
|
|
+.TP
|
|
+.BR 15
|
|
+invalid device ID format
|
|
+.TP
|
|
+.BR 16
|
|
+driver name expected
|
|
+.TP
|
|
+.BR 17
|
|
+unknown driver
|
|
+.TP
|
|
+.BR 18
|
|
+missing attribute value pair for -o|--option
|
|
+.TP
|
|
+.BR 19
|
|
+invalid argument
|
|
+.TP
|
|
+.BR 20
|
|
+too much arguments
|
|
+.TP
|
|
+.BR 21
|
|
+no configuration found for device ID
|
|
+.TP
|
|
+.BR 22
|
|
+device is not configured
|
|
+.TP
|
|
+.BR 23
|
|
+could not ungroup device
|
|
+.TP
|
|
+.BR 24
|
|
+at least one option could not be configured
|
|
+.TP
|
|
+.BR 25
|
|
+missing value for attribute
|
|
+.TP
|
|
+.BR 26
|
|
+device does not exist
|
|
+.TP
|
|
+.BR 27
|
|
+device already in use
|
|
+.TP
|
|
+.BR 28
|
|
+net device did not come online
|
|
+.TP
|
|
+.BR 29
|
|
+some devices could not be added or failed
|
|
+.TP
|
|
+.BR 99
|
|
+internal znetconf bug
|
|
.SH AUTHOR
|
|
.nf
|
|
This man-page was written by Einar Lueck <elelueck@de.ibm.com>.
|
|
--
|
|
1.6.3.3
|
|
|