| 167 | } |
| 168 | |
| 169 | static int |
| 170 | pdump_register_rx_callbacks(enum pdump_version ver, |
| 171 | uint16_t end_q, uint16_t port, uint16_t queue, |
| 172 | struct rte_ring *ring, struct rte_mempool *mp, |
| 173 | struct rte_bpf *filter, |
| 174 | uint16_t operation, uint32_t snaplen) |
| 175 | { |
| 176 | uint16_t qid; |
| 177 | |
| 178 | qid = (queue == RTE_PDUMP_ALL_QUEUES) ? 0 : queue; |
| 179 | for (; qid < end_q; qid++) { |
| 180 | struct pdump_rxtx_cbs *cbs = &rx_cbs[port][qid]; |
| 181 | |
| 182 | if (operation == ENABLE) { |
| 183 | if (cbs->cb) { |
| 184 | PDUMP_LOG(ERR, |
| 185 | "rx callback for port=%d queue=%d, already exists\n", |
| 186 | port, qid); |
| 187 | return -EEXIST; |
| 188 | } |
| 189 | cbs->ver = ver; |
| 190 | cbs->ring = ring; |
| 191 | cbs->mp = mp; |
| 192 | cbs->snaplen = snaplen; |
| 193 | cbs->filter = filter; |
| 194 | |
| 195 | cbs->cb = rte_eth_add_first_rx_callback(port, qid, |
| 196 | pdump_rx, cbs); |
| 197 | if (cbs->cb == NULL) { |
| 198 | PDUMP_LOG(ERR, |
| 199 | "failed to add rx callback, errno=%d\n", |
| 200 | rte_errno); |
| 201 | return rte_errno; |
| 202 | } |
| 203 | |
| 204 | memset(&pdump_stats->rx[port][qid], 0, sizeof(struct rte_pdump_stats)); |
| 205 | } else if (operation == DISABLE) { |
| 206 | int ret; |
| 207 | |
| 208 | if (cbs->cb == NULL) { |
| 209 | PDUMP_LOG(ERR, |
| 210 | "no existing rx callback for port=%d queue=%d\n", |
| 211 | port, qid); |
| 212 | return -EINVAL; |
| 213 | } |
| 214 | ret = rte_eth_remove_rx_callback(port, qid, cbs->cb); |
| 215 | if (ret < 0) { |
| 216 | PDUMP_LOG(ERR, |
| 217 | "failed to remove rx callback, errno=%d\n", |
| 218 | -ret); |
| 219 | return ret; |
| 220 | } |
| 221 | cbs->cb = NULL; |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | return 0; |
| 226 | } |
no test coverage detected