| 2399 | } |
| 2400 | |
| 2401 | static int |
| 2402 | sysctl_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 | |
| 2452 | static void |
| 2453 | rtable_sysctl_dump(uint32_t fibnum, int family, struct walkarg *w) |
no test coverage detected