aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2011-12-12 18:48:11 -0800
committerRobin H. Johnson <robbat2@gentoo.org>2011-12-12 19:20:39 -0800
commit2569eb644e6e8e010a44a693e7dfa86e73c0d750 (patch)
tree41d43ad6a9f2ae0c724339d3969967a5340143f5
parentdd45506a40f3332cef96cc8ca7e258561a200ec0 (diff)
net/ifconfig, net/iproute2: admin/oper state check functions
Provide consistent methods using iproute2/ifconfig to check operational and administrative up/down state of interfaces. This is not the same as ethtool's "Link detected" field, which is the state of the layer 2 medium. TODO: How to check operational state in BSD? Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
-rw-r--r--net/ifconfig.sh.BSD.in20
-rw-r--r--net/ifconfig.sh.Linux.in23
-rw-r--r--net/iproute2.sh23
3 files changed, 66 insertions, 0 deletions
diff --git a/net/ifconfig.sh.BSD.in b/net/ifconfig.sh.BSD.in
index 15c8fb8e..c7e98a28 100644
--- a/net/ifconfig.sh.BSD.in
+++ b/net/ifconfig.sh.BSD.in
@@ -242,3 +242,23 @@ ifconfig_post_start()
eend 0
fi
}
+
+# Is the interface administratively/operationally up?
+# The 'UP' status in ifconfig is the administrative status
+# Operational state does not seem to be available in BSD?
+# 0: up
+# 1: down
+# 2: invalid arguments
+is_admin_up()
+{
+ local iface="$1"
+ [ -z "$iface" ] && iface="$IFACE"
+ ifconfig "${iface}" | \
+ sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
+}
+
+is_oper_up()
+{
+ eerror "TODO: is_oper_up not available on BSD"
+ return 2
+}
diff --git a/net/ifconfig.sh.Linux.in b/net/ifconfig.sh.Linux.in
index dcbd6286..1ac0dd52 100644
--- a/net/ifconfig.sh.Linux.in
+++ b/net/ifconfig.sh.Linux.in
@@ -297,3 +297,26 @@ ifconfig_post_stop()
iptunnel del "${IFACE}"
eend $?
}
+
+# Is the interface administratively/operationally up?
+# The 'UP' status in ifconfig/iproute2 is the administrative status
+# Operational state is available in iproute2 output as 'state UP', or the
+# operstate sysfs variable.
+# 0: up
+# 1: down
+# 2: invalid arguments
+is_admin_up()
+{
+ local iface="$1"
+ [ -z "$iface" ] && iface="$IFACE"
+ ifconfig "${iface}" | \
+ sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
+}
+
+is_oper_up()
+{
+ local iface="$1"
+ [ -z "$iface" ] && iface="$IFACE"
+ read state </sys/class/net/"${iface}"/operstate
+ [ "x$state" = "up" ]
+}
diff --git a/net/iproute2.sh b/net/iproute2.sh
index 214841e4..e177c6d9 100644
--- a/net/iproute2.sh
+++ b/net/iproute2.sh
@@ -327,3 +327,26 @@ iproute2_post_stop()
fi
fi
}
+
+# Is the interface administratively/operationally up?
+# The 'UP' status in ifconfig/iproute2 is the administrative status
+# Operational state is available in iproute2 output as 'state UP', or the
+# operstate sysfs variable.
+# 0: up
+# 1: down
+# 2: invalid arguments
+is_admin_up()
+{
+ local iface="$1"
+ [ -z "$iface" ] && iface="$IFACE"
+ ip link show dev $iface | \
+ sed -n '1,1{ /[<,]UP[,>]/{ q 0 }}; q 1; '
+}
+
+is_oper_up()
+{
+ local iface="$1"
+ [ -z "$iface" ] && iface="$IFACE"
+ read state </sys/class/net/"${iface}"/operstate
+ [ "x$state" = "up" ]
+}