| 247 | } |
| 248 | |
| 249 | static int |
| 250 | parse_pdump(const char *optarg) |
| 251 | { |
| 252 | struct rte_kvargs *kvlist; |
| 253 | int ret = 0, cnt1, cnt2; |
| 254 | struct pdump_tuples *pt; |
| 255 | struct parse_val v = {0}; |
| 256 | |
| 257 | pt = &pdump_t[num_tuples]; |
| 258 | |
| 259 | /* initial check for invalid arguments */ |
| 260 | kvlist = rte_kvargs_parse(optarg, valid_pdump_arguments); |
| 261 | if (kvlist == NULL) { |
| 262 | printf("--pdump=\"%s\": invalid argument passed\n", optarg); |
| 263 | return -1; |
| 264 | } |
| 265 | |
| 266 | /* port/device_id parsing and validation */ |
| 267 | cnt1 = rte_kvargs_count(kvlist, PDUMP_PORT_ARG); |
| 268 | cnt2 = rte_kvargs_count(kvlist, PDUMP_PCI_ARG); |
| 269 | if (!((cnt1 == 1 && cnt2 == 0) || (cnt1 == 0 && cnt2 == 1))) { |
| 270 | printf("--pdump=\"%s\": must have either port or " |
| 271 | "device_id argument\n", optarg); |
| 272 | ret = -1; |
| 273 | goto free_kvlist; |
| 274 | } else if (cnt1 == 1) { |
| 275 | v.min = 0; |
| 276 | v.max = RTE_MAX_ETHPORTS-1; |
| 277 | ret = rte_kvargs_process(kvlist, PDUMP_PORT_ARG, |
| 278 | &parse_uint_value, &v); |
| 279 | if (ret < 0) |
| 280 | goto free_kvlist; |
| 281 | pt->port = (uint16_t) v.val; |
| 282 | pt->dump_by_type = PORT_ID; |
| 283 | } else if (cnt2 == 1) { |
| 284 | ret = rte_kvargs_process(kvlist, PDUMP_PCI_ARG, |
| 285 | &parse_device_id, pt); |
| 286 | if (ret < 0) |
| 287 | goto free_kvlist; |
| 288 | } |
| 289 | |
| 290 | /* queue parsing and validation */ |
| 291 | cnt1 = rte_kvargs_count(kvlist, PDUMP_QUEUE_ARG); |
| 292 | if (cnt1 != 1) { |
| 293 | printf("--pdump=\"%s\": must have queue argument\n", optarg); |
| 294 | ret = -1; |
| 295 | goto free_kvlist; |
| 296 | } |
| 297 | ret = rte_kvargs_process(kvlist, PDUMP_QUEUE_ARG, &parse_queue, pt); |
| 298 | if (ret < 0) |
| 299 | goto free_kvlist; |
| 300 | |
| 301 | /* rx-dev and tx-dev parsing and validation */ |
| 302 | cnt1 = rte_kvargs_count(kvlist, PDUMP_RX_DEV_ARG); |
| 303 | cnt2 = rte_kvargs_count(kvlist, PDUMP_TX_DEV_ARG); |
| 304 | if (cnt1 == 0 && cnt2 == 0) { |
| 305 | printf("--pdump=\"%s\": must have either rx-dev or " |
| 306 | "tx-dev argument\n", optarg); |
no test coverage detected