xref: /freebsd/sbin/ifconfig/ifue.c (revision ef27f784697c4f9d95a0d343b1001028714f4687)
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