diff options
| author | Roy Marples <roy@marples.name> | 2020-09-22 21:53:13 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-09-22 21:53:13 +0100 |
| commit | 12b2bece4e61c821c5921253796654179dccb640 (patch) | |
| tree | aa022374a1368a479ba90149b1eb0b9e70a2f3c8 /src/if-bsd.c | |
| parent | 0ede9e5419b798ae5ed183ca7da7986b8d4419bd (diff) | |
| download | dhcpcd-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.c | 30 |
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) |
