int make_ifmibdata(struct ifnet *ifp, int *name, struct sysctl_req *req) { struct ifmibdata ifmd; int error = 0; switch(name[1]) { default: error = ENOENT; break; case IFDATA_GENERAL: bzero(&ifmd, sizeof(ifmd)); /* * Make sure the interface is in use */ if (ifnet_is_attached(ifp, 0)) { snprintf(ifmd.ifmd_name, sizeof(ifmd.ifmd_name), "%s%d", ifp->if_name, ifp->if_unit); #define COPY(fld) ifmd.ifmd_##fld = ifp->if_##fld COPY(pcount); COPY(flags); if_data_internal_to_if_data64(ifp, &ifp->if_data, &ifmd.ifmd_data); #undef COPY ifmd.ifmd_snd_len = ifp->if_snd.ifq_len; ifmd.ifmd_snd_maxlen = ifp->if_snd.ifq_maxlen; ifmd.ifmd_snd_drops = ifp->if_snd.ifq_drops; } error = SYSCTL_OUT(req, &ifmd, sizeof ifmd); if (error || !req->newptr) break; #ifdef IF_MIB_WR error = SYSCTL_IN(req, &ifmd, sizeof ifmd); if (error) break; #define DONTCOPY(fld) ifmd.ifmd_data.ifi_##fld = ifp->if_data.ifi_##fld DONTCOPY(type); DONTCOPY(physical); DONTCOPY(addrlen); DONTCOPY(hdrlen); DONTCOPY(mtu); DONTCOPY(metric); DONTCOPY(baudrate); #undef DONTCOPY #define COPY(fld) ifp->if_##fld = ifmd.ifmd_##fld COPY(data); ifp->if_snd.ifq_maxlen = ifmd.ifmd_snd_maxlen; ifp->if_snd.ifq_drops = ifmd.ifmd_snd_drops; #undef COPY #endif /* IF_MIB_WR */ break; case IFDATA_LINKSPECIFIC: error = SYSCTL_OUT(req, ifp->if_linkmib, ifp->if_linkmiblen); if (error || !req->newptr) break; #ifdef IF_MIB_WR error = SYSCTL_IN(req, ifp->if_linkmib, ifp->if_linkmiblen); if (error) break; #endif /* IF_MIB_WR */ break; case IFDATA_SUPPLEMENTAL: { struct if_traffic_class if_tc; if_copy_traffic_class(ifp, &if_tc); error = SYSCTL_OUT(req, &if_tc, sizeof(struct if_traffic_class)); break; } } return error; }
int make_ifmibdata(struct ifnet *ifp, int *name, struct sysctl_req *req) { struct ifmibdata ifmd; int error = 0; switch(name[1]) { default: error = ENOENT; break; case IFDATA_GENERAL: bzero(&ifmd, sizeof(ifmd)); /* * Make sure the interface is in use */ if (ifnet_is_attached(ifp, 0)) { snprintf(ifmd.ifmd_name, sizeof(ifmd.ifmd_name), "%s%d", ifp->if_name, ifp->if_unit); #define COPY(fld) ifmd.ifmd_##fld = ifp->if_##fld COPY(pcount); COPY(flags); if_data_internal_to_if_data64(ifp, &ifp->if_data, &ifmd.ifmd_data); #undef COPY ifmd.ifmd_snd_len = IFCQ_LEN(&ifp->if_snd); ifmd.ifmd_snd_maxlen = IFCQ_MAXLEN(&ifp->if_snd); ifmd.ifmd_snd_drops = ifp->if_snd.ifcq_dropcnt.packets; } error = SYSCTL_OUT(req, &ifmd, sizeof ifmd); if (error || !req->newptr) break; #ifdef IF_MIB_WR error = SYSCTL_IN(req, &ifmd, sizeof ifmd); if (error) break; #define DONTCOPY(fld) ifmd.ifmd_data.ifi_##fld = ifp->if_data.ifi_##fld DONTCOPY(type); DONTCOPY(physical); DONTCOPY(addrlen); DONTCOPY(hdrlen); DONTCOPY(mtu); DONTCOPY(metric); DONTCOPY(baudrate); #undef DONTCOPY #define COPY(fld) ifp->if_##fld = ifmd.ifmd_##fld COPY(data); ifp->if_snd.ifq_maxlen = ifmd.ifmd_snd_maxlen; ifp->if_snd.ifq_drops = ifmd.ifmd_snd_drops; #undef COPY #endif /* IF_MIB_WR */ break; case IFDATA_LINKSPECIFIC: error = SYSCTL_OUT(req, ifp->if_linkmib, ifp->if_linkmiblen); if (error || !req->newptr) break; #ifdef IF_MIB_WR error = SYSCTL_IN(req, ifp->if_linkmib, ifp->if_linkmiblen); if (error) break; #endif /* IF_MIB_WR */ break; case IFDATA_SUPPLEMENTAL: { struct ifmibdata_supplemental *ifmd_supp; if ((ifmd_supp = _MALLOC(sizeof (*ifmd_supp), M_TEMP, M_NOWAIT | M_ZERO)) == NULL) { error = ENOMEM; break; } if_copy_traffic_class(ifp, &ifmd_supp->ifmd_traffic_class); if_copy_data_extended(ifp, &ifmd_supp->ifmd_data_extended); if_copy_packet_stats(ifp, &ifmd_supp->ifmd_packet_stats); if_copy_rxpoll_stats(ifp, &ifmd_supp->ifmd_rxpoll_stats); error = SYSCTL_OUT(req, ifmd_supp, sizeof (*ifmd_supp)); _FREE(ifmd_supp, M_TEMP); break; } } return error; }