Enqueue number of destroy flow rules operations. */
| 2803 | |
| 2804 | /** Enqueue number of destroy flow rules operations. */ |
| 2805 | int |
| 2806 | port_queue_flow_destroy(portid_t port_id, queueid_t queue_id, |
| 2807 | bool postpone, uint32_t n, const uint64_t *rule) |
| 2808 | { |
| 2809 | struct rte_flow_op_attr op_attr = { .postpone = postpone }; |
| 2810 | struct rte_port *port; |
| 2811 | struct port_flow **tmp; |
| 2812 | int ret = 0; |
| 2813 | struct queue_job *job; |
| 2814 | |
| 2815 | if (port_id_is_invalid(port_id, ENABLED_WARN) || |
| 2816 | port_id == (portid_t)RTE_PORT_ALL) |
| 2817 | return -EINVAL; |
| 2818 | port = &ports[port_id]; |
| 2819 | |
| 2820 | if (queue_id >= port->queue_nb) { |
| 2821 | printf("Queue #%u is invalid\n", queue_id); |
| 2822 | return -EINVAL; |
| 2823 | } |
| 2824 | |
| 2825 | tmp = &port->flow_list; |
| 2826 | while (*tmp) { |
| 2827 | uint32_t i; |
| 2828 | |
| 2829 | for (i = 0; i != n; ++i) { |
| 2830 | struct rte_flow_error error; |
| 2831 | struct port_flow *pf = *tmp; |
| 2832 | |
| 2833 | if (rule[i] != pf->id) |
| 2834 | continue; |
| 2835 | /* |
| 2836 | * Poisoning to make sure PMD |
| 2837 | * update it in case of error. |
| 2838 | */ |
| 2839 | memset(&error, 0x33, sizeof(error)); |
| 2840 | job = calloc(1, sizeof(*job)); |
| 2841 | if (!job) { |
| 2842 | printf("Queue flow destroy job allocate failed\n"); |
| 2843 | return -ENOMEM; |
| 2844 | } |
| 2845 | job->type = QUEUE_JOB_TYPE_FLOW_DESTROY; |
| 2846 | job->pf = pf; |
| 2847 | |
| 2848 | if (rte_flow_async_destroy(port_id, queue_id, &op_attr, |
| 2849 | pf->flow, job, &error)) { |
| 2850 | free(job); |
| 2851 | ret = port_flow_complain(&error); |
| 2852 | continue; |
| 2853 | } |
| 2854 | printf("Flow rule #%"PRIu64" destruction enqueued\n", |
| 2855 | pf->id); |
| 2856 | *tmp = pf->next; |
| 2857 | break; |
| 2858 | } |
| 2859 | if (i == n) |
| 2860 | tmp = &(*tmp)->next; |
| 2861 | } |
| 2862 | return ret; |
no test coverage detected