Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/ifwatchd ifwatchd: Check link state if no media is ...
details: https://anonhg.NetBSD.org/src/rev/20f89b2eecc6
branches: trunk
changeset: 976410:20f89b2eecc6
user: roy <roy%NetBSD.org@localhost>
date: Wed Sep 23 02:32:04 2020 +0000
description:
ifwatchd: Check link state if no media is supported on initial ups.
We can check this via SIOCGIFDATA and ifi_link_state.
diffstat:
usr.sbin/ifwatchd/ifwatchd.c | 49 ++++++++++++++++++++++++++++++++++---------
1 files changed, 38 insertions(+), 11 deletions(-)
diffs (74 lines):
diff -r 66e1411b0692 -r 20f89b2eecc6 usr.sbin/ifwatchd/ifwatchd.c
--- a/usr.sbin/ifwatchd/ifwatchd.c Wed Sep 23 02:09:18 2020 +0000
+++ b/usr.sbin/ifwatchd/ifwatchd.c Wed Sep 23 02:32:04 2020 +0000
@@ -1,6 +1,6 @@
-/* $NetBSD: ifwatchd.c,v 1.43 2018/03/07 10:06:41 roy Exp $ */
+/* $NetBSD: ifwatchd.c,v 1.44 2020/09/23 02:32:04 roy Exp $ */
#include <sys/cdefs.h>
-__RCSID("$NetBSD: ifwatchd.c,v 1.43 2018/03/07 10:06:41 roy Exp $");
+__RCSID("$NetBSD: ifwatchd.c,v 1.44 2020/09/23 02:32:04 roy Exp $");
/*-
* Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
@@ -536,6 +536,40 @@
return NULL;
}
+static bool
+has_carrier(int s, const char *ifname)
+{
+ struct ifmediareq ifmr = { .ifm_status = 0 };
+
+ strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name));
+ if (ioctl(s, SIOCGIFMEDIA, &ifmr) == -1) {
+ struct ifdatareq ifdr = { .ifdr_data.ifi_link_state = 0 };
+
+ strlcpy(ifdr.ifdr_name, ifname, sizeof(ifdr.ifdr_name));
+ if (ioctl(s, SIOCGIFDATA, &ifdr) == -1) {
+ /* Should not be possible. */
+ return false;
+ }
+ if (ifdr.ifdr_data.ifi_link_state == LINK_STATE_UP)
+ return true;
+ else
+ return false;
+ }
+
+ if (!(ifmr.ifm_status & IFM_AVALID)) {
+ /*
+ * Interface doesn't report media-valid status.
+ * assume ok.
+ */
+ return true;
+ }
+
+ if (ifmr.ifm_status & IFM_ACTIVE)
+ return true;
+ else
+ return false;
+}
+
static void
run_initial_ups(void)
{
@@ -568,18 +602,11 @@
if (ifa == NULL)
continue;
if (ifa->sa_family == AF_LINK) {
- struct ifmediareq ifmr;
-
- memset(&ifmr, 0, sizeof(ifmr));
- strncpy(ifmr.ifm_name, ifd->ifname,
- sizeof(ifmr.ifm_name));
- if (ioctl(s, SIOCGIFMEDIA, &ifmr) != -1
- && (ifmr.ifm_status & IFM_AVALID)
- && (ifmr.ifm_status & IFM_ACTIVE)) {
+ if (has_carrier(s, ifd->ifname) == 0) {
invoke_script(ifd->ifname, CARRIER, NULL, NULL);
ifd->last_carrier_status =
LINK_STATE_UP;
- }
+ }
continue;
}
aflag = check_addrflags(ifa->sa_family, p->ifa_addrflags);
Home |
Main Index |
Thread Index |
Old Index