Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145984514
D38962.id121415.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D38962.id121415.diff
View Options
diff --git a/sys/nfs/bootp_subr.c b/sys/nfs/bootp_subr.c
--- a/sys/nfs/bootp_subr.c
+++ b/sys/nfs/bootp_subr.c
@@ -137,7 +137,7 @@
} _req;
#define ireq _req._ifreq
#define iareq _req._in_alias_req
- struct ifnet *ifp;
+ if_t ifp;
struct sockaddr_dl *sdl;
struct sockaddr_in myaddr;
struct sockaddr_in netmask;
@@ -263,7 +263,6 @@
unsigned char *start, int len, int tag);
#ifdef BOOTP_DEBUG
-void bootpboot_p_if(struct ifnet *ifp, struct ifaddr *ifa);
void bootpboot_p_iflist(void);
#endif
@@ -295,38 +294,35 @@
*/
#ifdef BOOTP_DEBUG
-void
-bootpboot_p_if(struct ifnet *ifp, struct ifaddr *ifa)
+static u_int
+bootpboot_p_ifa(void *ifp, struct ifaddr *ifa, u_int count __unused)
{
printf("%s flags %x, addr ",
- ifp->if_xname, ifp->if_flags);
+ if_name(ifp), if_getflags(ifp));
print_sin_addr((struct sockaddr_in *) ifa->ifa_addr);
printf(", broadcast ");
print_sin_addr((struct sockaddr_in *) ifa->ifa_dstaddr);
printf(", netmask ");
print_sin_addr((struct sockaddr_in *) ifa->ifa_netmask);
printf("\n");
+
+ return (0);
}
void
bootpboot_p_iflist(void)
{
- struct ifnet *ifp;
- struct ifaddr *ifa;
+ struct epoch_tracker et;
+ struct if_iter iter;
+ if_t ifp;
printf("Interface list:\n");
- IFNET_RLOCK();
- for (ifp = CK_STAILQ_FIRST(&V_ifnet);
- ifp != NULL;
- ifp = CK_STAILQ_NEXT(ifp, if_link)) {
- for (ifa = CK_STAILQ_FIRST(&ifp->if_addrhead);
- ifa != NULL;
- ifa = CK_STAILQ_NEXT(ifa, ifa_link))
- if (ifa->ifa_addr->sa_family == AF_INET)
- bootpboot_p_if(ifp, ifa);
- }
- IFNET_RUNLOCK();
+ NET_EPOCH_ENTER(et);
+ for (ifp = if_iter_start(&iter); ifp != NULL; ifp = if_iter_next(&iter))
+ if_foreach_addr_type(ifp, AF_INET, bootpboot_p_ifa, ifp);
+ if_iter_finish(&iter);
+ NET_EPOCH_EXIT(et);
}
#endif /* defined(BOOTP_DEBUG) */
@@ -1498,14 +1494,31 @@
}
}
+static u_int
+bootpc_init_ifa_cb(void *arg, struct ifaddr *ifa, u_int count)
+{
+ struct sockaddr_dl *sdl = (struct sockaddr_dl *)ifa->ifa_addr;
+
+ if (count != 0)
+ return (0);
+
+ if (sdl->sdl_type != IFT_ETHER)
+ return (0);
+
+ *(struct sockaddr_dl **)arg = sdl;
+
+ return (1);
+}
+
void
bootpc_init(void)
{
+ struct epoch_tracker et;
struct bootpc_ifcontext *ifctx = NULL; /* Interface BOOTP contexts */
struct bootpc_globalcontext *gctx; /* Global BOOTP context */
- struct ifnet *ifp;
struct sockaddr_dl *sdl;
- struct ifaddr *ifa;
+ struct if_iter iter;
+ if_t ifp;
int error;
#ifndef BOOTP_WIRED_TO
int ifcnt;
@@ -1573,22 +1586,15 @@
* attaches and wins the race, it won't be eligible for bootp.
*/
ifcnt = 0;
- IFNET_RLOCK();
- CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
- if ((ifp->if_flags &
- (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) !=
+ NET_EPOCH_ENTER(et);
+ for (if_t ifp = if_iter_start(&iter); ifp != NULL; ifp = if_iter_next(&iter)) {
+ if ((if_getflags(ifp) &
+ (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) ==
IFF_BROADCAST)
- continue;
- switch (ifp->if_alloctype) {
- case IFT_ETHER:
- break;
- default:
- continue;
- }
- ifcnt++;
+ ifcnt++;
}
-
- IFNET_RUNLOCK();
+ if_iter_finish(&iter);
+ NET_EPOCH_EXIT(et);
if (ifcnt == 0) {
printf("WARNING: BOOTP found no eligible network interfaces, skipping!\n");
goto out;
@@ -1600,37 +1606,32 @@
retry:
ifctx = STAILQ_FIRST(&gctx->interfaces);
- IFNET_RLOCK();
- CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
+ NET_EPOCH_ENTER(et);
+ for (ifp = if_iter_start(&iter); ifp != NULL; ifp = if_iter_next(&iter)) {
if (ifctx == NULL)
break;
#ifdef BOOTP_WIRED_TO
- if (strcmp(ifp->if_xname, __XSTRING(BOOTP_WIRED_TO)) != 0)
+ if (strcmp(if_name(ifp), __XSTRING(BOOTP_WIRED_TO)) != 0)
continue;
#else
- if ((ifp->if_flags &
+ if ((if_getflags(ifp) &
(IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) !=
IFF_BROADCAST)
- continue;
- switch (ifp->if_alloctype) {
+ break;
+ switch (if_getalloctype(ifp)) {
case IFT_ETHER:
break;
default:
continue;
}
#endif
- strlcpy(ifctx->ireq.ifr_name, ifp->if_xname,
+ strlcpy(ifctx->ireq.ifr_name, if_name(ifp),
sizeof(ifctx->ireq.ifr_name));
ifctx->ifp = ifp;
/* Get HW address */
sdl = NULL;
- CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
- if (ifa->ifa_addr->sa_family == AF_LINK) {
- sdl = (struct sockaddr_dl *)ifa->ifa_addr;
- if (sdl->sdl_type == IFT_ETHER)
- break;
- }
+ if_foreach_addr_type(ifp, AF_LINK, bootpc_init_ifa_cb, &sdl);
if (sdl == NULL)
panic("bootpc: Unable to find HW address for %s",
ifctx->ireq.ifr_name);
@@ -1638,7 +1639,8 @@
ifctx = STAILQ_NEXT(ifctx, next);
}
- IFNET_RUNLOCK();
+ if_iter_finish(&iter);
+ NET_EPOCH_EXIT(et);
CURVNET_RESTORE();
if (STAILQ_EMPTY(&gctx->interfaces) ||
@@ -1702,7 +1704,7 @@
if (gctx->gotrootpath != 0) {
struct epoch_tracker et;
- kern_setenv("boot.netif.name", ifctx->ifp->if_xname);
+ kern_setenv("boot.netif.name", if_name(ifctx->ifp));
NET_EPOCH_ENTER(et);
bootpc_add_default_route(ifctx);
diff --git a/sys/nfs/nfs_diskless.c b/sys/nfs/nfs_diskless.c
--- a/sys/nfs/nfs_diskless.c
+++ b/sys/nfs/nfs_diskless.c
@@ -146,6 +146,19 @@
free(opts, M_TEMP);
}
+static u_int
+nfs_setup_diskless_ifa_cb(void *arg, struct sockaddr_dl *sdl, u_int count)
+{
+ struct sockaddr_dl *ourdl = arg;
+
+ if ((sdl->sdl_type == ourdl->sdl_type) &&
+ (sdl->sdl_alen == ourdl->sdl_alen) &&
+ !bcmp(LLADDR(sdl), LLADDR(ourdl), sdl->sdl_alen))
+ return (1);
+
+ return (0);
+}
+
/*
* Populate the essential fields in the nfsv3_diskless structure.
*
@@ -166,16 +179,18 @@
void
nfs_setup_diskless(void)
{
+ struct epoch_tracker et;
+ struct if_iter iter;
struct nfs_diskless *nd = &nfs_diskless;
struct nfsv3_diskless *nd3 = &nfsv3_diskless;
- struct ifnet *ifp;
- struct ifaddr *ifa;
- struct sockaddr_dl *sdl, ourdl;
+ if_t ifp;
+ struct sockaddr_dl ourdl;
struct sockaddr_in myaddr, netmask;
char *cp;
int cnt, fhlen, is_nfsv3;
uint32_t len;
time_t timeout_at;
+ u_int count;
if (nfs_diskless_valid != 0)
return;
@@ -219,29 +234,25 @@
printf("nfs_diskless: no hardware address\n");
return;
}
- ifa = NULL;
timeout_at = time_uptime + NFS_IFACE_TIMEOUT_SECS;
retry:
CURVNET_SET(TD_TO_VNET(curthread));
- IFNET_RLOCK();
- CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
- CK_STAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- if (ifa->ifa_addr->sa_family == AF_LINK) {
- sdl = (struct sockaddr_dl *)ifa->ifa_addr;
- if ((sdl->sdl_type == ourdl.sdl_type) &&
- (sdl->sdl_alen == ourdl.sdl_alen) &&
- !bcmp(LLADDR(sdl),
- LLADDR(&ourdl),
- sdl->sdl_alen)) {
- IFNET_RUNLOCK();
- CURVNET_RESTORE();
- goto match_done;
- }
- }
- }
+ NET_EPOCH_ENTER(et);
+
+ for (ifp = if_iter_start(&iter); ifp != NULL; ifp = if_iter_next(&iter)) {
+ count = if_foreach_lladdr(ifp, nfs_setup_diskless_ifa_cb, &ourdl);
+
+ if (count > 0)
+ break;
+
}
- IFNET_RUNLOCK();
+ if_iter_finish(&iter);
+ NET_EPOCH_EXIT(et);
CURVNET_RESTORE();
+ if (cnt > 0) {
+ goto match_done;
+ }
+
if (time_uptime < timeout_at) {
pause("nfssdl", hz / 5);
goto retry;
@@ -249,9 +260,9 @@
printf("nfs_diskless: no interface\n");
return; /* no matching interface */
match_done:
- kern_setenv("boot.netif.name", ifp->if_xname);
+ kern_setenv("boot.netif.name", if_name(ifp));
if (is_nfsv3 != 0) {
- strlcpy(nd3->myif.ifra_name, ifp->if_xname,
+ strlcpy(nd3->myif.ifra_name, if_name(ifp),
sizeof(nd3->myif.ifra_name));
/* set up gateway */
@@ -290,7 +301,7 @@
nfs_diskless_valid = 3;
} else {
- strlcpy(nd->myif.ifra_name, ifp->if_xname,
+ strlcpy(nd->myif.ifra_name, if_name(ifp),
sizeof(nd->myif.ifra_name));
/* set up gateway */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Feb 27, 6:33 PM (14 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29038621
Default Alt Text
D38962.id121415.diff (7 KB)
Attached To
Mode
D38962: Convert nfs to use the IfAPI
Attached
Detach File
Event Timeline
Log In to Comment