1*ef27f784SLi-Wen Hsu /*
2*ef27f784SLi-Wen Hsu * Copyright (c) 2026 The FreeBSD Foundation
3*ef27f784SLi-Wen Hsu *
4*ef27f784SLi-Wen Hsu * SPDX-License-Identifier: BSD-2-Clause
5*ef27f784SLi-Wen Hsu *
6*ef27f784SLi-Wen Hsu * This software was developed by Li-Wen Hsu <lwhsu@FreeBSD.org>
7*ef27f784SLi-Wen Hsu * under sponsorship from the FreeBSD Foundation.
8*ef27f784SLi-Wen Hsu */
9*ef27f784SLi-Wen Hsu
10*ef27f784SLi-Wen Hsu #include <sys/types.h>
11*ef27f784SLi-Wen Hsu #include <sys/socket.h>
12*ef27f784SLi-Wen Hsu #include <sys/sysctl.h>
13*ef27f784SLi-Wen Hsu
14*ef27f784SLi-Wen Hsu #include <net/if.h>
15*ef27f784SLi-Wen Hsu
16*ef27f784SLi-Wen Hsu #include <stdio.h>
17*ef27f784SLi-Wen Hsu #include <stdlib.h>
18*ef27f784SLi-Wen Hsu
19*ef27f784SLi-Wen Hsu #include "ifconfig.h"
20*ef27f784SLi-Wen Hsu
21*ef27f784SLi-Wen Hsu #define UE_DRIVER_NAME "ue"
22*ef27f784SLi-Wen Hsu
23*ef27f784SLi-Wen Hsu static void
ue_status(if_ctx * ctx)24*ef27f784SLi-Wen Hsu ue_status(if_ctx *ctx)
25*ef27f784SLi-Wen Hsu {
26*ef27f784SLi-Wen Hsu char mibname[32]; /* "net.ue.<unit>.%parent" */
27*ef27f784SLi-Wen Hsu char parent[IFNAMSIZ];
28*ef27f784SLi-Wen Hsu char *drivername;
29*ef27f784SLi-Wen Hsu size_t parentlen;
30*ef27f784SLi-Wen Hsu u_int unit;
31*ef27f784SLi-Wen Hsu char c;
32*ef27f784SLi-Wen Hsu
33*ef27f784SLi-Wen Hsu /* Use the orig name so it keeps working after interface renaming. */
34*ef27f784SLi-Wen Hsu if (ifconfig_get_orig_name(lifh, ctx->ifname, &drivername) != 0)
35*ef27f784SLi-Wen Hsu return;
36*ef27f784SLi-Wen Hsu if (sscanf(drivername, UE_DRIVER_NAME "%u%c", &unit, &c) != 1)
37*ef27f784SLi-Wen Hsu goto out;
38*ef27f784SLi-Wen Hsu
39*ef27f784SLi-Wen Hsu if (snprintf(mibname, sizeof(mibname),
40*ef27f784SLi-Wen Hsu "net." UE_DRIVER_NAME ".%u.%%parent", unit) >= (int)sizeof(mibname))
41*ef27f784SLi-Wen Hsu goto out;
42*ef27f784SLi-Wen Hsu
43*ef27f784SLi-Wen Hsu parentlen = sizeof(parent);
44*ef27f784SLi-Wen Hsu if (sysctlbyname(mibname, parent, &parentlen, NULL, 0) != 0)
45*ef27f784SLi-Wen Hsu goto out;
46*ef27f784SLi-Wen Hsu
47*ef27f784SLi-Wen Hsu printf("\tparent interface: %s\n", parent);
48*ef27f784SLi-Wen Hsu out:
49*ef27f784SLi-Wen Hsu free(drivername);
50*ef27f784SLi-Wen Hsu }
51*ef27f784SLi-Wen Hsu
52*ef27f784SLi-Wen Hsu static struct afswtch af_ue = {
53*ef27f784SLi-Wen Hsu .af_name = "af_ue",
54*ef27f784SLi-Wen Hsu .af_af = AF_UNSPEC,
55*ef27f784SLi-Wen Hsu .af_other_status = ue_status,
56*ef27f784SLi-Wen Hsu };
57*ef27f784SLi-Wen Hsu
58*ef27f784SLi-Wen Hsu static __constructor void
ue_ctor(void)59*ef27f784SLi-Wen Hsu ue_ctor(void)
60*ef27f784SLi-Wen Hsu {
61*ef27f784SLi-Wen Hsu af_register(&af_ue);
62*ef27f784SLi-Wen Hsu }
63