+ }
+ len = rt_msg2(RTM_NEWADDR, &info, (caddr_t)cp, 0);
+
+ ifam = (struct ifa_msghdr *)cp;
+ 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;
+
+ cp += len;
+ VERIFY(IS_P2ALIGNED(cp, sizeof(u_int32_t)));
+ current_len += len;
+ }
+ IFA_UNLOCK(ifa);
+ }
+ if (error) {
+ ifnet_lock_done(ifp);
+ break;
+ }
+ {
+ struct ifmultiaddr *ifma;
+
+ for (ifma = LIST_FIRST(&ifp->if_multiaddrs);
+ ifma != NULL; ifma = LIST_NEXT(ifma, ifma_link)) {
+ struct ifaddr *ifa0;
+
+ IFMA_LOCK(ifma);
+ if (af && af != ifma->ifma_addr->sa_family) {
+ IFMA_UNLOCK(ifma);
+ continue;
+ }
+ bzero((caddr_t)&info, sizeof(info));
+ info.rti_info[RTAX_IFA] = ifma->ifma_addr;
+ /*
+ * Holding ifnet lock here prevents the link
+ * address from changing contents, so no need
+ * to hold the ifa0 lock. The link address is
+ * always present; it's never freed.
+ */
+ ifa0 = ifp->if_lladdr;
+ info.rti_info[RTAX_IFP] = ifa0->ifa_addr;
+ if (ifma->ifma_ll != NULL)
+ info.rti_info[RTAX_GATEWAY] = ifma->ifma_ll->ifma_addr;
+ len = rt_msg2(RTM_NEWMADDR2, &info, 0, 0);
+ if (pass == 0) {
+ total_len += len;
+ } else {
+ struct ifma_msghdr2 *ifmam;
+
+ if (current_len + len > total_len) {
+ IFMA_UNLOCK(ifma);
+ printf("sysctl_iflist2: current_len (%d) + len (%d) > total_len (%d)\n",
+ current_len, len, total_len);
+ error = ENOBUFS;
+ break;
+ }
+ len = rt_msg2(RTM_NEWMADDR2, &info, (caddr_t)cp, 0);
+
+ ifmam = (struct ifma_msghdr2 *)cp;
+ ifmam->ifmam_addrs = info.rti_addrs;
+ ifmam->ifmam_flags = 0;
+ ifmam->ifmam_index =
+ ifma->ifma_ifp->if_index;
+ ifmam->ifmam_refcount =
+ ifma->ifma_reqcnt;
+
+ cp += len;
+ VERIFY(IS_P2ALIGNED(cp, sizeof(u_int32_t)));
+ current_len += len;
+ }
+ IFMA_UNLOCK(ifma);