static int32 igs_sdb_list(char *buf, char **start, off_t offset, int32 size, int32 *eof, void *data) { igs_info_t *igs_info = (igs_info_t *)data; igs_cfg_request_t *cfg; igs_cfg_sdb_list_t *list; int32 i; struct bcmstrbuf b; ASSERT(igs_info); cfg = MALLOC(igs_info->osh, sizeof(igs_cfg_request_t)); if (cfg == NULL) { IGS_ERROR("Out of memory allocating igs_cfg_request\n"); return (FAILURE); } strcpy(cfg->inst_id, igs_info->inst_id); cfg->command_id = IGSCFG_CMD_IGSDB_LIST; cfg->oper_type = IGSCFG_OPER_TYPE_GET; cfg->size = sizeof(cfg->arg); list = (igs_cfg_sdb_list_t *)cfg->arg; igsc_cfg_request_process(igs_info->igsc_info, cfg); if (cfg->status != IGSCFG_STATUS_SUCCESS) { IGS_ERROR("Unable to get the IGSDB list\n"); MFREE(igs_info->osh, cfg, sizeof(igs_cfg_request_t)); return (FAILURE); } bcm_binit(&b, buf, size); bcm_bprintf(&b, "Group Members Interface\n"); for (i = 0; i < list->num_entries; i++) { bcm_bprintf(&b, "%08x ", list->sdb_entry[i].mgrp_ip); bcm_bprintf(&b, "%08x ", list->sdb_entry[i].mh_ip); bcm_bprintf(&b, "%s\n", list->sdb_entry[i].if_name); } MFREE(igs_info->osh, cfg, sizeof(igs_cfg_request_t)); if (b.size == 0) { IGS_ERROR("Input buffer overflow\n"); return (FAILURE); } return (b.buf - b.origbuf); }
/* * IGSL Packet Counters/Statistics Function */ static int32 igs_stats_get(char *buf, char **start, off_t offset, int32 size, int32 *eof, void *data) { igs_info_t *igs_info; igs_cfg_request_t cfg; igs_stats_t *stats; struct bcmstrbuf b; igs_info = (igs_info_t *)data; strcpy(cfg.inst_id, igs_info->inst_id); cfg.command_id = IGSCFG_CMD_IGS_STATS; cfg.oper_type = IGSCFG_OPER_TYPE_GET; cfg.size = sizeof(cfg.arg); stats = (igs_stats_t *)cfg.arg; igsc_cfg_request_process(igs_info->igsc_info, &cfg); if (cfg.status != IGSCFG_STATUS_SUCCESS) { IGS_ERROR("Unable to get the IGS stats\n"); return (FAILURE); } bcm_binit(&b, buf, size); bcm_bprintf(&b, "IgmpPkts IgmpQueries " "IgmpReports IgmpV2Reports IgmpLeaves\n"); bcm_bprintf(&b, "%-15d %-15d %-15d %-15d %d\n", stats->igmp_packets, stats->igmp_queries, stats->igmp_reports, stats->igmp_v2reports, stats->igmp_leaves); bcm_bprintf(&b, "IgmpNotHandled McastGroups " "McastMembers MemTimeouts\n"); bcm_bprintf(&b, "%-15d %-15d %-15d %d\n", stats->igmp_not_handled, stats->igmp_mcast_groups, stats->igmp_mcast_members, stats->igmp_mem_timeouts); if (b.size == 0) { IGS_ERROR("Input buffer overflow\n"); return (FAILURE); } return (b.buf - b.origbuf); }
/* * Description: This function handles the OS specific processing * required for configuration commands. * * Input: data - Configuration command parameters */ void igs_cfg_request_process(igs_cfg_request_t *cfg) { igs_info_t *igs_info; struct net_device *br_ptr; if (cfg == NULL) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "Invalid input buffer passed\n"); return; } /* Validate the instance identifier */ br_ptr = igs_if_name_validate(cfg->inst_id); if (br_ptr == NULL) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "Unknown instance identifier %s\n", cfg->inst_id); return; } /* Locate the IGS instance */ igs_info = igs_instance_find(cfg->inst_id); if ((igs_info == NULL) && (cfg->command_id != IGSCFG_CMD_BR_ADD)) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "Invalid instance identifier %s\n", cfg->inst_id); return; } /* Convert the interface name in arguments to interface pointer */ switch (cfg->command_id) { case IGSCFG_CMD_BR_ADD: if (igs_info != NULL) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "IGMP Snooping already enabled on %s\n", cfg->inst_id); return; } /* Create a new IGS instance corresponding to the bridge * interface. */ igs_info = igs_instance_add(cfg->inst_id, br_ptr); if (igs_info == NULL) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "IGMP Snooping enable on %s failed\n", cfg->inst_id); return; } cfg->status = IGSCFG_STATUS_SUCCESS; break; case IGSCFG_CMD_BR_DEL: /* Delete and free the IGS instance */ if (igs_instance_del(igs_info) != SUCCESS) { cfg->status = IGSCFG_STATUS_FAILURE; cfg->size = sprintf(cfg->arg, "IGMP Snooping disable failed\n"); return; } cfg->status = IGSCFG_STATUS_SUCCESS; break; case IGSCFG_CMD_BR_LIST: break; default: igsc_cfg_request_process(igs_info->igsc_info, cfg); break; } return; }
/* * IGSL Packet Counters/Statistics Function */ static int32 igs_stats_get(char *buf, char **start, off_t offset, int32 size, int32 *eof, void *data) { igs_info_t *igs_info = (igs_info_t *)data; igs_cfg_request_t *cfg; igs_stats_t *stats; struct bcmstrbuf b; ASSERT(igs_info); cfg = MALLOC(igs_info->osh, sizeof(igs_cfg_request_t)); if (cfg == NULL) { IGS_ERROR("Out of memory allocating igs_cfg_request\n"); return (FAILURE); } strcpy(cfg->inst_id, igs_info->inst_id); cfg->command_id = IGSCFG_CMD_IGS_STATS; cfg->oper_type = IGSCFG_OPER_TYPE_GET; cfg->size = sizeof(cfg->arg); stats = (igs_stats_t *)cfg->arg; igsc_cfg_request_process(igs_info->igsc_info, cfg); if (cfg->status != IGSCFG_STATUS_SUCCESS) { IGS_ERROR("Unable to get the IGS stats\n"); MFREE(igs_info->osh, cfg, sizeof(igs_cfg_request_t)); return (FAILURE); } bcm_binit(&b, buf, size); bcm_bprintf(&b, "IgmpPkts IgmpQueries " "IgmpReports IgmpV2Reports " #ifdef SUPPORT_IGMP_V3 "IgmpV3Reports " #endif "IgmpLeaves\n"); bcm_bprintf(&b, "%-15d %-15d %-15d %-15d " #ifdef SUPPORT_IGMP_V3 "%-15d " #endif "%d\n", stats->igmp_packets, stats->igmp_queries, stats->igmp_reports, stats->igmp_v2reports, #ifdef SUPPORT_IGMP_V3 stats->igmp_v3reports, #endif stats->igmp_leaves); bcm_bprintf(&b, "IgmpNotHandled McastGroups " "McastMembers MemTimeouts\n"); bcm_bprintf(&b, "%-15d %-15d %-15d %d\n", stats->igmp_not_handled, stats->igmp_mcast_groups, stats->igmp_mcast_members, stats->igmp_mem_timeouts); MFREE(igs_info->osh, cfg, sizeof(igs_cfg_request_t)); if (b.size == 0) { IGS_ERROR("Input buffer overflow\n"); return (FAILURE); } return (b.buf - b.origbuf); }