summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2020-09-22 21:53:13 +0100
committerRoy Marples <roy@marples.name>2020-09-22 21:53:13 +0100
commit12b2bece4e61c821c5921253796654179dccb640 (patch)
treeaa022374a1368a479ba90149b1eb0b9e70a2f3c8 /src/if-bsd.c
parent0ede9e5419b798ae5ed183ca7da7986b8d4419bd (diff)
downloaddhcpcd-12b2bece4e61c821c5921253796654179dccb640.tar.xz
BSD: Use SIOCGIFDATA if no media support and no ifa_data
Hopefully this nails link state once and for all on BSD.
Diffstat (limited to 'src/if-bsd.c')
-rw-r--r--src/if-bsd.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/if-bsd.c b/src/if-bsd.c
index 1dacf20c..c7be22fe 100644
--- a/src/if-bsd.c
+++ b/src/if-bsd.c
@@ -359,8 +359,8 @@ if_ignore(struct dhcpcd_ctx *ctx, const char *ifname)
#endif
}
-int
-if_carrier(struct interface *ifp)
+static int
+if_carrier0(struct interface *ifp)
{
struct ifmediareq ifmr = { .ifm_status = 0 };
@@ -379,9 +379,33 @@ if_carrier(struct interface *ifp)
}
int
+if_carrier(struct interface *ifp)
+{
+ int carrier = if_carrier0(ifp);
+ struct ifdatareq ifdr = { .ifdr_data.ifi_link_state = 0 };
+ struct if_data *ifdata;
+
+ if (carrier != LINK_UNKNOWN)
+ return carrier;
+
+ strlcpy(ifdr.ifdr_name, ifp->name, sizeof(ifdr.ifdr_name));
+ if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFDATA, &ifdr) == -1)
+ return LINK_UNKNOWN;
+
+ ifdata = &ifdr.ifdr_data;
+ switch (ifdata->ifi_link_state) {
+ case LINK_STATE_DOWN:
+ return LINK_DOWN;
+ case LINK_STATE_UP:
+ return LINK_UP;
+ }
+ return LINK_UNKNOWN;
+}
+
+int
if_carrier_ifadata(struct interface *ifp, void *ifadata)
{
- int carrier = if_carrier(ifp);
+ int carrier = if_carrier0(ifp);
struct if_data *ifdata;
if (carrier != LINK_UNKNOWN || ifadata == NULL)