| 441 | } |
| 442 | |
| 443 | static struct rte_flow * |
| 444 | nfp_flow_alloc(struct nfp_fl_key_ls *key_layer, uint32_t port_id) |
| 445 | { |
| 446 | char *tmp; |
| 447 | size_t len; |
| 448 | struct rte_flow *nfp_flow; |
| 449 | struct nfp_fl_payload *payload; |
| 450 | |
| 451 | nfp_flow = rte_zmalloc("nfp_flow", sizeof(struct rte_flow), 0); |
| 452 | if (nfp_flow == NULL) |
| 453 | goto exit; |
| 454 | |
| 455 | len = key_layer->key_size + key_layer->key_size + key_layer->act_size; |
| 456 | tmp = rte_zmalloc("nfp_flow_payload", len + sizeof(struct nfp_fl_rule_metadata), 0); |
| 457 | if (tmp == NULL) |
| 458 | goto free_flow; |
| 459 | |
| 460 | nfp_flow->length = len; |
| 461 | nfp_flow->mtr_id = NFP_MAX_MTR_CNT; |
| 462 | nfp_flow->port_id = port_id; |
| 463 | payload = &nfp_flow->payload; |
| 464 | payload->meta = (struct nfp_fl_rule_metadata *)tmp; |
| 465 | payload->unmasked_data = tmp + sizeof(struct nfp_fl_rule_metadata); |
| 466 | payload->mask_data = payload->unmasked_data + key_layer->key_size; |
| 467 | payload->action_data = payload->mask_data + key_layer->key_size; |
| 468 | |
| 469 | return nfp_flow; |
| 470 | |
| 471 | free_flow: |
| 472 | rte_free(nfp_flow); |
| 473 | exit: |
| 474 | return NULL; |
| 475 | } |
| 476 | |
| 477 | void |
| 478 | nfp_flow_free(struct rte_flow *nfp_flow) |
no test coverage detected