static boolean_t sfunc_addr_outbound(ofmt_arg_t *ofmtarg, char *buf, uint_t bufsize) { ipmpstat_sfunc_arg_t *arg = ofmtarg->ofmt_cbarg; int err; uint_t i, nactive = 0; ipmp_ifinfo_t *ifinfop; ipmp_iflist_t *iflistp; ipmp_addrinfo_t *adinfop = arg->sa_data; ipmp_groupinfo_t *grinfop; if (adinfop->ad_state == IPMP_ADDR_DOWN) return (B_TRUE); /* * If there's no inbound interface for this address, there can't * be any outbound traffic. */ if (adinfop->ad_binding[0] == '\0') return (B_TRUE); /* * The address can use any active interface in the group, so * obtain all of those. */ err = ipmp_getgroupinfo(arg->sa_ih, adinfop->ad_group, &grinfop); if (err != IPMP_SUCCESS) { warn_ipmperr(err, "cannot get info for group `%s'", adinfop->ad_group); return (B_FALSE); } iflistp = grinfop->gr_iflistp; for (i = 0; i < iflistp->il_nif; i++) { err = ipmp_getifinfo(arg->sa_ih, iflistp->il_ifs[i], &ifinfop); if (err != IPMP_SUCCESS) { warn_ipmperr(err, "cannot get info for interface `%s'", iflistp->il_ifs[i]); continue; } if (ifinfop->if_flags & IPMP_IFFLAG_ACTIVE) { if (nactive++ != 0) (void) strlcat(buf, " ", bufsize); (void) strlcat(buf, ifinfop->if_name, bufsize); } ipmp_freeifinfo(ifinfop); } ipmp_freegroupinfo(grinfop); return (B_TRUE); }
static boolean_t sfunc_addr_group(ofmt_arg_t *ofmtarg, char *buf, uint_t bufsize) { ipmpstat_sfunc_arg_t *arg = ofmtarg->ofmt_cbarg; int err; ipmp_addrinfo_t *adinfop = arg->sa_data; ipmp_groupinfo_t *grinfop; err = ipmp_getgroupinfo(arg->sa_ih, adinfop->ad_group, &grinfop); if (err != IPMP_SUCCESS) { warn_ipmperr(err, "cannot get info for group `%s'", adinfop->ad_group); return (B_FALSE); } (void) strlcpy(buf, grinfop->gr_ifname, bufsize); ipmp_freegroupinfo(grinfop); return (B_TRUE); }
static boolean_t sfunc_if_flags(ofmt_arg_t *ofmtarg, char *buf, uint_t bufsize) { ipmpstat_sfunc_arg_t *arg = ofmtarg->ofmt_cbarg; int err; ipmp_ifinfo_t *ifinfop = arg->sa_data; ipmp_groupinfo_t *grinfop; assert(bufsize > IPMPSTAT_NUM_FLAGS); (void) memset(buf, '-', IPMPSTAT_NUM_FLAGS); buf[IPMPSTAT_NUM_FLAGS] = '\0'; if (ifinfop->if_type == IPMP_IF_STANDBY) buf[IPMPSTAT_SFLAG_INDEX] = 's'; if (ifinfop->if_flags & IPMP_IFFLAG_INACTIVE) buf[IPMPSTAT_IFLAG_INDEX] = 'i'; if (ifinfop->if_flags & IPMP_IFFLAG_DOWN) buf[IPMPSTAT_DFLAG_INDEX] = 'd'; if (ifinfop->if_flags & IPMP_IFFLAG_HWADDRDUP) buf[IPMPSTAT_HFLAG_INDEX] = 'h'; err = ipmp_getgroupinfo(arg->sa_ih, ifinfop->if_group, &grinfop); if (err != IPMP_SUCCESS) { warn_ipmperr(err, "cannot get broadcast/multicast info for " "group `%s'", ifinfop->if_group); return (B_TRUE); } if (strcmp(grinfop->gr_m4ifname, ifinfop->if_name) == 0) buf[IPMPSTAT_M4FLAG_INDEX] = 'm'; if (strcmp(grinfop->gr_m6ifname, ifinfop->if_name) == 0) buf[IPMPSTAT_M6FLAG_INDEX] = 'M'; if (strcmp(grinfop->gr_bcifname, ifinfop->if_name) == 0) buf[IPMPSTAT_BFLAG_INDEX] = 'b'; ipmp_freegroupinfo(grinfop); return (B_TRUE); }
/* * Free all of the resources associated with snapshot `snap'. */ void ipmp_snap_free(ipmp_snap_t *snap) { ipmp_ifinfolist_t *iflp, *ifnext; ipmp_groupinfolist_t *grlp, *grnext; ipmp_freegrouplist(snap->sn_grlistp); for (grlp = snap->sn_grinfolistp; grlp != NULL; grlp = grnext) { grnext = grlp->grl_next; ipmp_freegroupinfo(grlp->grl_grinfop); free(grlp); } for (iflp = snap->sn_ifinfolistp; iflp != NULL; iflp = ifnext) { ifnext = iflp->ifl_next; ipmp_freeifinfo(iflp->ifl_ifinfop); free(iflp); } free(snap); }
/* * Walks all IPMP groups on the system and invokes `cbfunc' on each, passing * it `ih', the ipmp_groupinfo_t pointer, and `arg'. */ static void walk_group(ipmp_handle_t ih, ipmpstat_cbfunc_t *cbfunc, void *arg) { int err; uint_t i; ipmp_groupinfo_t *grinfop; ipmp_grouplist_t *grlistp; if ((err = ipmp_getgrouplist(ih, &grlistp)) != IPMP_SUCCESS) die_ipmperr(err, "cannot get IPMP group list"); for (i = 0; i < grlistp->gl_ngroup; i++) { err = ipmp_getgroupinfo(ih, grlistp->gl_groups[i], &grinfop); if (err != IPMP_SUCCESS) { warn_ipmperr(err, "cannot get info for group `%s'", grlistp->gl_groups[i]); continue; } (*cbfunc)(ih, grinfop, arg); ipmp_freegroupinfo(grinfop); } ipmp_freegrouplist(grlistp); }