+ ifnet_head_done();
+ return error;
+}
+
+int
+sysctl_iflist2(
+ int af,
+ struct walkarg *w)
+{
+ struct ifnet *ifp;
+ struct ifaddr *ifa;
+ struct rt_addrinfo info;
+ int len, error = 0;
+
+ bzero((caddr_t)&info, sizeof(info));
+ ifnet_head_lock_shared();
+ TAILQ_FOREACH(ifp, &ifnet_head, if_link) {
+ if (error)
+ break;
+ if (w->w_arg && w->w_arg != ifp->if_index)
+ continue;
+ ifnet_lock_shared(ifp);
+ ifa = ifp->if_addrhead.tqh_first;
+ ifpaddr = ifa->ifa_addr;
+ len = rt_msg2(RTM_IFINFO2, &info, (caddr_t)0, w);
+ ifpaddr = 0;
+ if (w->w_req && w->w_tmem) {
+ struct if_msghdr2 *ifm;
+
+ ifm = (struct if_msghdr2 *)w->w_tmem;
+ ifm->ifm_addrs = info.rti_addrs;
+ ifm->ifm_flags = (u_short)ifp->if_flags;
+ ifm->ifm_index = ifp->if_index;
+ ifm->ifm_snd_len = ifp->if_snd.ifq_len;
+ ifm->ifm_snd_maxlen = ifp->if_snd.ifq_maxlen;
+ ifm->ifm_snd_drops = ifp->if_snd.ifq_drops;
+ ifm->ifm_timer = ifp->if_timer;
+ if_data_internal_to_if_data64(&ifp->if_data, &ifm->ifm_data);
+ error = SYSCTL_OUT(w->w_req, w->w_tmem, len);
+ if (error) {
+ ifnet_lock_done(ifp);
+ break;
+ }
+ }
+ while ((ifa = ifa->ifa_link.tqe_next) != 0) {
+ if (af && af != ifa->ifa_addr->sa_family)
+ continue;
+ ifaaddr = ifa->ifa_addr;
+ netmask = ifa->ifa_netmask;
+ brdaddr = ifa->ifa_dstaddr;
+ len = rt_msg2(RTM_NEWADDR, &info, 0, w);
+ if (w->w_req && w->w_tmem) {
+ struct ifa_msghdr *ifam;
+
+ ifam = (struct ifa_msghdr *)w->w_tmem;
+ ifam->ifam_index = ifa->ifa_ifp->if_index;
+ ifam->ifam_flags = ifa->ifa_flags;
+ ifam->ifam_metric = ifa->ifa_metric;
+ ifam->ifam_addrs = info.rti_addrs;
+ error = SYSCTL_OUT(w->w_req, w->w_tmem, len);
+ if (error)
+ break;
+ }
+ }
+ if (error) {
+ ifnet_lock_done(ifp);
+ break;
+ }
+ {
+ struct ifmultiaddr *ifma;
+
+ for (ifma = ifp->if_multiaddrs.lh_first; ifma;
+ ifma = ifma->ifma_link.le_next) {
+ if (af && af != ifma->ifma_addr->sa_family)
+ continue;
+ bzero((caddr_t)&info, sizeof(info));
+ ifaaddr = ifma->ifma_addr;
+ if (ifp->if_addrhead.tqh_first)
+ ifpaddr = ifp->if_addrhead.tqh_first->ifa_addr;
+ if (ifma->ifma_ll)
+ gate = ifma->ifma_ll->ifma_addr;
+ len = rt_msg2(RTM_NEWMADDR2, &info, 0, w);
+ if (w->w_req && w->w_tmem) {
+ struct ifma_msghdr2 *ifmam;
+
+ ifmam = (struct ifma_msghdr2 *)w->w_tmem;
+ ifmam->ifmam_addrs = info.rti_addrs;
+ ifmam->ifmam_flags = 0;
+ ifmam->ifmam_index = ifma->ifma_ifp->if_index;
+ ifmam->ifmam_refcount = ifma->ifma_refcount;
+ error = SYSCTL_OUT(w->w_req, w->w_tmem, len);
+ if (error)
+ break;
+ }
+ }
+ }
+ ifnet_lock_done(ifp);
+ ifaaddr = netmask = brdaddr = 0;
+ }
+ ifnet_head_done();
+ return error;
+}
+
+
+static int
+sysctl_rtstat(struct sysctl_req *req)
+{
+ int error;
+
+ error = SYSCTL_OUT(req, &rtstat, sizeof(struct rtstat));
+ if (error)
+ return (error);
+
+ return 0;
+}
+
+static int
+sysctl_rttrash(struct sysctl_req *req)
+{
+ int error;
+
+ error = SYSCTL_OUT(req, &rttrash, sizeof(rttrash));
+ if (error)
+ return (error);
+
+ return 0;