MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sysctl_ifmalist

Function sysctl_ifmalist

freebsd/net/rtsock.c:2401–2450  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2399}
2400
2401static int
2402sysctl_ifmalist(int af, struct walkarg *w)
2403{
2404 struct rt_addrinfo info;
2405 struct ifaddr *ifa;
2406 struct ifmultiaddr *ifma;
2407 struct ifnet *ifp;
2408 int error, len;
2409
2410 NET_EPOCH_ASSERT();
2411
2412 error = 0;
2413 bzero((caddr_t)&info, sizeof(info));
2414
2415 CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) {
2416 if (w->w_arg && w->w_arg != ifp->if_index)
2417 continue;
2418 ifa = ifp->if_addr;
2419 info.rti_info[RTAX_IFP] = ifa ? ifa->ifa_addr : NULL;
2420 CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2421 if (af && af != ifma->ifma_addr->sa_family)
2422 continue;
2423 if (prison_if(w->w_req->td->td_ucred,
2424 ifma->ifma_addr) != 0)
2425 continue;
2426 info.rti_info[RTAX_IFA] = ifma->ifma_addr;
2427 info.rti_info[RTAX_GATEWAY] =
2428 (ifma->ifma_addr->sa_family != AF_LINK) ?
2429 ifma->ifma_lladdr : NULL;
2430 error = rtsock_msg_buffer(RTM_NEWMADDR, &info, w, &len);
2431 if (error != 0)
2432 break;
2433 if (w->w_req && w->w_tmem) {
2434 struct ifma_msghdr *ifmam;
2435
2436 ifmam = (struct ifma_msghdr *)w->w_tmem;
2437 ifmam->ifmam_index = ifma->ifma_ifp->if_index;
2438 ifmam->ifmam_flags = 0;
2439 ifmam->ifmam_addrs = info.rti_addrs;
2440 ifmam->_ifmam_spare1 = 0;
2441 error = SYSCTL_OUT(w->w_req, w->w_tmem, len);
2442 if (error != 0)
2443 break;
2444 }
2445 }
2446 if (error != 0)
2447 break;
2448 }
2449 return (error);
2450}
2451
2452static void
2453rtable_sysctl_dump(uint32_t fibnum, int family, struct walkarg *w)

Callers 1

sysctl_rtsockFunction · 0.85

Calls 3

bzeroFunction · 0.85
rtsock_msg_bufferFunction · 0.70
prison_ifFunction · 0.50

Tested by

no test coverage detected