ifconfig(8): show parent device for USB Ethernet interfaces

Report net.ue.<unit>.%parent as "parent interface", consistent with
wlan(4):

  # ifconfig ue0
  ue0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
          ether 00:00:5e:00:53:2a
          inet 192.0.2.10/24 broadcast 192.0.2.255
          parent interface: ure0
          media: Ethernet autoselect (2500Base-T <full-duplex>)
          status: active

Reviewed by:	aokblast
MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
Differential Revision:	https://reviews.freebsd.org/D59060
This commit is contained in:
Li-Wen Hsu committed 2026-09-28 03:31:12 +08:00
1 parent 16a284b1cd
commit ef27f78469
2 files changed
+66

No files matched your search

+4
View File
@@ -43,6 +43,10 @@ SRCS+= ifieee80211.c # SIOC[GS]IEEE80211 support
LIBADD+= 80211
.endif
.if ${MK_USB} != "no"
SRCS+= ifue.c
.endif
SRCS+= carp.c # SIOC[GS]VH support
SRCS+= ifgroup.c # ...
.if ${MK_PF} != "no"
+62
View File
@@ -0,0 +1,62 @@
/*
* Copyright (c) 2026 The FreeBSD Foundation
*
* SPDX-License-Identifier: BSD-2-Clause
*
* This software was developed by Li-Wen Hsu <lwhsu@FreeBSD.org>
* under sponsorship from the FreeBSD Foundation.
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include "ifconfig.h"
#define UE_DRIVER_NAME "ue"
static void
ue_status(if_ctx *ctx)
{
char mibname[32]; /* "net.ue.<unit>.%parent" */
char parent[IFNAMSIZ];
char *drivername;
size_t parentlen;
u_int unit;
char c;
/* Use the orig name so it keeps working after interface renaming. */
if (ifconfig_get_orig_name(lifh, ctx->ifname, &drivername) != 0)
return;
if (sscanf(drivername, UE_DRIVER_NAME "%u%c", &unit, &c) != 1)
goto out;
if (snprintf(mibname, sizeof(mibname),
"net." UE_DRIVER_NAME ".%u.%%parent", unit) >= (int)sizeof(mibname))
goto out;
parentlen = sizeof(parent);
if (sysctlbyname(mibname, parent, &parentlen, NULL, 0) != 0)
goto out;
printf("\tparent interface: %s\n", parent);
out:
free(drivername);
}
static struct afswtch af_ue = {
.af_name = "af_ue",
.af_af = AF_UNSPEC,
.af_other_status = ue_status,
};
static __constructor void
ue_ctor(void)
{
af_register(&af_ue);
}