sw_error_t cmd_show_fdb(a_uint32_t *arg_val) { sw_error_t rtn; a_uint32_t cnt = 0; fal_fdb_op_t *fdb_op = (fal_fdb_op_t *) (ioctl_buf + sizeof(sw_error_t) / 4); fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + sizeof(sw_error_t) / 4 + sizeof(fal_fdb_op_t) / 4); aos_mem_zero(fdb_op, sizeof (fal_fdb_op_t)); aos_mem_zero(fdb_entry, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_EXTEND_FIRST; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) fdb_op; arg_val[4] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } arg_val[0] = SW_API_FDB_EXTEND_NEXT; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); return SW_OK; }
sw_error_t cmd_show_fdb(a_uint32_t *arg_val) { sw_error_t rtn; a_uint32_t cnt = 0; fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + 2); memset(fdb_entry, 0, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_ITERATE; *(ioctl_buf + 1) = 0; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) (ioctl_buf + 1); arg_val[4] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); return SW_OK; }
sw_error_t cmd_show_napt(a_uint32_t *arg_val) { sw_error_t rtn; a_uint32_t cnt = 0; fal_napt_entry_t *napt_entry = (fal_napt_entry_t *) (ioctl_buf + sizeof(sw_error_t) / 4); aos_mem_zero(napt_entry, sizeof (fal_napt_entry_t)); napt_entry->entry_id = FAL_NEXT_ENTRY_FIRST_ID; arg_val[0] = SW_API_NAPT_NEXT; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = 0; arg_val[4] = (a_uint32_t) napt_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); return SW_OK; }
sw_error_t cmd_show_vlan(a_uint32_t *arg_val) { sw_error_t rtn; a_uint32_t rtn_size = 1 ,tmp_vid = 0, cnt = 0; fal_vlan_t *vlan_entry = (fal_vlan_t *) (ioctl_buf + rtn_size); while (1) { arg_val[0] = SW_API_VLAN_NEXT; arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = tmp_vid; arg_val[4] = (a_uint32_t) vlan_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } tmp_vid = vlan_entry->vid; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); return SW_OK; }
sw_error_t cmd_show_resv_fdb(a_uint32_t *arg_val) { sw_error_t rtn; a_uint32_t cnt = 0; a_uint32_t *iterator = ioctl_buf + 1; fal_fdb_entry_t *entry = (fal_fdb_entry_t *) (ioctl_buf + 2); *iterator = 0; while (1) { arg_val[0] = SW_API_FDB_RESV_ITERATE; arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) iterator; arg_val[4] = (a_uint32_t) entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } cnt++; dprintf("\n"); } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); return SW_OK; }
/* will be removed */ int usbip_vhci_attach_device(uint8_t port, int sockfd, uint8_t busnum, uint8_t devnum, uint32_t speed) { int devid = get_devid(busnum, devnum); return usbip_vhci_attach_device2(port, sockfd, devid, speed); }
/*user command api*/ sw_error_t cmd_exec_api(a_uint32_t *arg_val) { sw_error_t rv; sw_api_t sw_api; sw_api.api_id = arg_val[0]; SW_RTN_ON_ERROR(sw_api_get(&sw_api)); /*save cmd return value */ arg_val[1] = (a_uint32_t) ioctl_buf; /*save set device id */ arg_val[2] = get_devid(); rv = cmd_api_func(sw_api.api_fp, sw_api.api_nr, arg_val); SW_RTN_ON_ERROR(rv); rv = cmd_api_output(sw_api.api_pp, sw_api.api_nr, arg_val); SW_RTN_ON_ERROR(rv); return rv; }
/* * Go through and fix up any path and/or devid information for the given vdev * configuration. */ static int fix_paths(nvlist_t *nv, name_entry_t *names) { nvlist_t **child; uint_t c, children; uint64_t guid; name_entry_t *ne, *best; char *path, *devid; if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { for (c = 0; c < children; c++) if (fix_paths(child[c], names) != 0) return (-1); return (0); } /* * This is a leaf (file or disk) vdev. In either case, go through * the name list and see if we find a matching guid. If so, replace * the path and see if we can calculate a new devid. * * There may be multiple names associated with a particular guid, in * which case we have overlapping partitions or multiple paths to the * same disk. In this case we prefer to use the path name which * matches the ZPOOL_CONFIG_PATH. If no matching entry is found we * use the lowest order device which corresponds to the first match * while traversing the ZPOOL_IMPORT_PATH search path. */ verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0); if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0) path = NULL; best = NULL; for (ne = names; ne != NULL; ne = ne->ne_next) { if (ne->ne_guid == guid) { if (path == NULL) { best = ne; break; } if ((strlen(path) == strlen(ne->ne_name)) && strncmp(path, ne->ne_name, strlen(path)) == 0) { best = ne; break; } if (best == NULL) { best = ne; continue; } /* Prefer paths with move vdev labels. */ if (ne->ne_num_labels > best->ne_num_labels) { best = ne; continue; } /* Prefer paths earlier in the search order. */ if (ne->ne_num_labels == best->ne_num_labels && ne->ne_order < best->ne_order) { best = ne; continue; } } } if (best == NULL) return (0); if (nvlist_add_string(nv, ZPOOL_CONFIG_PATH, best->ne_name) != 0) return (-1); if ((devid = get_devid(best->ne_name)) == NULL) { (void) nvlist_remove_all(nv, ZPOOL_CONFIG_DEVID); } else { if (nvlist_add_string(nv, ZPOOL_CONFIG_DEVID, devid) != 0) { devid_str_free(devid); return (-1); } devid_str_free(devid); } return (0); }
static sw_error_t cmd_parse_api(char **cmd_str, a_uint32_t * arg_val) { char *tmp_str; a_uint32_t arg_index, arg_start = 2, reserve_index = 1; /*reserve for dev_id */ a_uint32_t last_param_in = 0; a_uint32_t *temp; void *pentry; sw_api_param_t *pptmp = NULL; sw_api_t sw_api; a_uint32_t ignorecnt = 0; sw_api.api_id = arg_val[0]; SW_RTN_ON_ERROR(sw_api_get(&sw_api)); /*set device id */ arg_val[arg_start] = get_devid(); for (arg_index = reserve_index; arg_index < sw_api.api_nr; arg_index++) { tmp_str = NULL; pptmp = sw_api.api_pp + arg_index; if (!(pptmp->param_type & SW_PARAM_IN)) { ignorecnt++; } if (pptmp->param_type & SW_PARAM_IN) { tmp_str = cmd_str[arg_index - reserve_index - ignorecnt]; last_param_in = arg_index; if((pptmp->api_id == 314) && last_param_in == 2) last_param_in = 4;//SW_API_FDB_EXTEND_NEXT wr if((pptmp->api_id == 327) && last_param_in == 2) last_param_in = 4;//SW_API_FDB_EXTEND_FIRST wr } temp = &arg_val[arg_start + arg_index]; sw_data_type_t *data_type; if (!(data_type = cmd_data_type_find(pptmp->data_type))) return SW_NO_SUCH; pentry = temp; if (pptmp->param_type & SW_PARAM_PTR) { if (cmd_input_parser(temp, arg_index, sw_api.api_pp) != SW_OK) return SW_NO_RESOURCE; pentry = (void *) *temp; } if (pptmp->param_type & SW_PARAM_IN) { #if 1 if(pptmp->param_type & SW_PARAM_PTR) //quiet mode { if(!get_talk_mode()) set_full_cmdstrp((char **)(cmd_str + (last_param_in - reserve_index))); } #endif /*check and convert input param */ if (data_type->param_check != NULL) { if (data_type->param_check(tmp_str, pentry, pptmp->data_size) != SW_OK) return SW_BAD_PARAM; } } } /*superfluous args */ /* if(cmd_str[last_param_in] != NULL) return SW_BAD_PARAM; */ return SW_OK; }
sw_error_t cmd_show_fdb(a_uint32_t *arg_val) { if (ssdk_cfg.init_cfg.chip_type == CHIP_ISIS) { sw_error_t rtn; a_uint32_t cnt = 0; fal_fdb_op_t *fdb_op = (fal_fdb_op_t *) (ioctl_buf + sizeof(sw_error_t) / 4); fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + sizeof(sw_error_t) / 4 + sizeof(fal_fdb_op_t) / 4); aos_mem_zero(fdb_op, sizeof (fal_fdb_op_t)); aos_mem_zero(fdb_entry, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_EXTEND_FIRST; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) fdb_op; arg_val[4] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } arg_val[0] = SW_API_FDB_EXTEND_NEXT; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); }else if ((ssdk_cfg.init_cfg.chip_type == CHIP_ISISC) || (ssdk_cfg.init_cfg.chip_type == CHIP_DESS)) { sw_error_t rtn; a_uint32_t cnt = 0; fal_fdb_op_t *fdb_op = (fal_fdb_op_t *) (ioctl_buf + sizeof(sw_error_t) / 4); fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + sizeof(sw_error_t) / 4 + sizeof(fal_fdb_op_t) / 4); aos_mem_zero(fdb_op, sizeof (fal_fdb_op_t)); aos_mem_zero(fdb_entry, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_EXTEND_FIRST; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) fdb_op; arg_val[4] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } arg_val[0] = SW_API_FDB_EXTEND_NEXT; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); }else if (ssdk_cfg.init_cfg.chip_type == CHIP_SHIVA) { sw_error_t rtn; a_uint32_t cnt = 0; fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + 2); memset(fdb_entry, 0, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_ITERATE; *(ioctl_buf + 1) = 0; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) (ioctl_buf + 1); arg_val[4] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); }else { sw_error_t rtn; a_uint32_t rtn_size = 1, cnt = 0; fal_fdb_entry_t *fdb_entry = (fal_fdb_entry_t *) (ioctl_buf + rtn_size); memset(fdb_entry, 0, sizeof (fal_fdb_entry_t)); arg_val[0] = SW_API_FDB_FIRST; while (1) { arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = (a_uint32_t) fdb_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } arg_val[0] = SW_API_FDB_NEXT; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); } return SW_OK; }
sw_error_t cmd_show_vlan(a_uint32_t *arg_val) { if (ssdk_cfg.init_cfg.chip_type == CHIP_ISIS) { sw_error_t rtn; a_uint32_t rtn_size = 1 ,tmp_vid = FAL_NEXT_ENTRY_FIRST_ID, cnt = 0; fal_vlan_t *vlan_entry = (fal_vlan_t *) (ioctl_buf + rtn_size); while (1) { arg_val[0] = SW_API_VLAN_NEXT; arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = tmp_vid; arg_val[4] = (a_uint32_t) vlan_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } tmp_vid = vlan_entry->vid; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); }else if ((ssdk_cfg.init_cfg.chip_type == CHIP_ISISC) || (ssdk_cfg.init_cfg.chip_type == CHIP_DESS)) { sw_error_t rtn; a_uint32_t rtn_size = 1 ,tmp_vid = FAL_NEXT_ENTRY_FIRST_ID, cnt = 0; fal_vlan_t *vlan_entry = (fal_vlan_t *) (ioctl_buf + rtn_size); while (1) { arg_val[0] = SW_API_VLAN_NEXT; arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = tmp_vid; arg_val[4] = (a_uint32_t) vlan_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } tmp_vid = vlan_entry->vid; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); } else { sw_error_t rtn; a_uint32_t rtn_size = 1 ,tmp_vid = 0, cnt = 0; fal_vlan_t *vlan_entry = (fal_vlan_t *) (ioctl_buf + rtn_size); while (1) { arg_val[0] = SW_API_VLAN_NEXT; arg_val[1] = (a_uint32_t) ioctl_buf; arg_val[2] = get_devid(); arg_val[3] = tmp_vid; arg_val[4] = (a_uint32_t) vlan_entry; rtn = cmd_exec_api(arg_val); if ((SW_OK != rtn) || (SW_OK != (sw_error_t) (*ioctl_buf))) { break; } tmp_vid = vlan_entry->vid; cnt++; } if((rtn != SW_OK) && (rtn != SW_NO_MORE)) cmd_print_error(rtn); else dprintf("\ntotal %d entries\n", cnt); } return SW_OK; }
/* * Go through and fix up any path and/or devid information for the given vdev * configuration. */ static int fix_paths(nvlist_t *nv, name_entry_t *names) { nvlist_t **child; uint_t c, children; uint64_t guid; name_entry_t *ne, *best; char *path, *devid; int matched; if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, &child, &children) == 0) { for (c = 0; c < children; c++) if (fix_paths(child[c], names) != 0) return (-1); return (0); } /* * This is a leaf (file or disk) vdev. In either case, go through * the name list and see if we find a matching guid. If so, replace * the path and see if we can calculate a new devid. * * There may be multiple names associated with a particular guid, in * which case we have overlapping slices or multiple paths to the same * disk. If this is the case, then we want to pick the path that is * the most similar to the original, where "most similar" is the number * of matching characters starting from the end of the path. This will * preserve slice numbers even if the disks have been reorganized, and * will also catch preferred disk names if multiple paths exist. */ verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0); if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) != 0) path = NULL; matched = 0; best = NULL; for (ne = names; ne != NULL; ne = ne->ne_next) { if (ne->ne_guid == guid) { const char *src, *dst; int count; if (path == NULL) { best = ne; break; } src = ne->ne_name + strlen(ne->ne_name) - 1; dst = path + strlen(path) - 1; for (count = 0; src >= ne->ne_name && dst >= path; src--, dst--, count++) if (*src != *dst) break; /* * At this point, 'count' is the number of characters * matched from the end. */ if (count > matched || best == NULL) { best = ne; matched = count; } } } if (best == NULL) return (0); if (nvlist_add_string(nv, ZPOOL_CONFIG_PATH, best->ne_name) != 0) return (-1); if ((devid = get_devid(best->ne_name)) == NULL) { (void) nvlist_remove_all(nv, ZPOOL_CONFIG_DEVID); } else { if (nvlist_add_string(nv, ZPOOL_CONFIG_DEVID, devid) != 0) { devid_str_free(devid); return (-1); } devid_str_free(devid); } return (0); }
static int mpxio_nvl_boilerplate(di_node_t curnode) { int rv; char *strdevid; ddi_devid_t curdevid; nvlist_t *newnvl; for (; curnode != DI_NODE_NIL; curnode = di_drv_next_node(curnode)) { errno = 0; curdevid = NULL; get_devid(curnode, &curdevid); if (curdevid == NULL) /* * There's no devid registered for this device * so it's not cool enough to play with us */ continue; strdevid = devid_str_encode(curdevid, NULL); /* does this exist in the on-disk cache? */ rv = nvlist_lookup_nvlist(mapnvl, strdevid, &newnvl); if (rv == ENOENT) { logmsg(MSG_INFO, "nvlist for %s not found\n", strdevid); /* no, so alloc a new nvl to store it */ if (nvlist_alloc(&newnvl, NV_UNIQUE_NAME, 0) != 0) { logmsg(MSG_ERROR, gettext("Unable to allocate space for " "a devid property list: %s\n"), strerror(errno)); return (-1); } } else { if ((rv != ENOTSUP) && (rv != EINVAL)) logmsg(MSG_INFO, "%s exists in ondisknvl, verifying\n", strdevid); } if (popcheck_devnvl(curnode, newnvl, strdevid) != 0) { logmsg(MSG_ERROR, gettext("Unable to populate devid nvpair " "for device with devid %s\n"), strdevid); devid_str_free(strdevid); nvlist_free(newnvl); return (-1); } /* Now add newnvl into our cache. */ errno = 0; rv = nvlist_add_nvlist(mapnvl, strdevid, newnvl); if (rv) { logmsg(MSG_ERROR, gettext("Unable to add device (devid %s) " "to in-kernel nvl: %s (%d)\n"), strdevid, strerror(rv), rv); devid_str_free(strdevid); nvlist_free(newnvl); return (-1); } logmsg(MSG_INFO, gettext("added device (devid %s) to mapnvl\n\n"), strdevid); devid_str_free(strdevid); } return (0); }