| 2335 | } |
| 2336 | |
| 2337 | static int |
| 2338 | sysctl_iflist(int af, struct walkarg *w) |
| 2339 | { |
| 2340 | struct ifnet *ifp; |
| 2341 | struct ifaddr *ifa; |
| 2342 | struct if_data ifd; |
| 2343 | struct rt_addrinfo info; |
| 2344 | int len, error = 0; |
| 2345 | struct sockaddr_storage ss; |
| 2346 | |
| 2347 | bzero((caddr_t)&info, sizeof(info)); |
| 2348 | bzero(&ifd, sizeof(ifd)); |
| 2349 | CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { |
| 2350 | if (w->w_arg && w->w_arg != ifp->if_index) |
| 2351 | continue; |
| 2352 | if_data_copy(ifp, &ifd); |
| 2353 | ifa = ifp->if_addr; |
| 2354 | info.rti_info[RTAX_IFP] = ifa->ifa_addr; |
| 2355 | error = rtsock_msg_buffer(RTM_IFINFO, &info, w, &len); |
| 2356 | if (error != 0) |
| 2357 | goto done; |
| 2358 | info.rti_info[RTAX_IFP] = NULL; |
| 2359 | if (w->w_req && w->w_tmem) { |
| 2360 | if (w->w_op == NET_RT_IFLISTL) |
| 2361 | error = sysctl_iflist_ifml(ifp, &ifd, &info, w, |
| 2362 | len); |
| 2363 | else |
| 2364 | error = sysctl_iflist_ifm(ifp, &ifd, &info, w, |
| 2365 | len); |
| 2366 | if (error) |
| 2367 | goto done; |
| 2368 | } |
| 2369 | while ((ifa = CK_STAILQ_NEXT(ifa, ifa_link)) != NULL) { |
| 2370 | if (af && af != ifa->ifa_addr->sa_family) |
| 2371 | continue; |
| 2372 | if (prison_if(w->w_req->td->td_ucred, |
| 2373 | ifa->ifa_addr) != 0) |
| 2374 | continue; |
| 2375 | info.rti_info[RTAX_IFA] = ifa->ifa_addr; |
| 2376 | info.rti_info[RTAX_NETMASK] = rtsock_fix_netmask( |
| 2377 | ifa->ifa_addr, ifa->ifa_netmask, &ss); |
| 2378 | info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr; |
| 2379 | error = rtsock_msg_buffer(RTM_NEWADDR, &info, w, &len); |
| 2380 | if (error != 0) |
| 2381 | goto done; |
| 2382 | if (w->w_req && w->w_tmem) { |
| 2383 | if (w->w_op == NET_RT_IFLISTL) |
| 2384 | error = sysctl_iflist_ifaml(ifa, &info, |
| 2385 | w, len); |
| 2386 | else |
| 2387 | error = sysctl_iflist_ifam(ifa, &info, |
| 2388 | w, len); |
| 2389 | if (error) |
| 2390 | goto done; |
| 2391 | } |
| 2392 | } |
| 2393 | info.rti_info[RTAX_IFA] = NULL; |
| 2394 | info.rti_info[RTAX_NETMASK] = NULL; |
no test coverage detected