| 1417 | } |
| 1418 | |
| 1419 | static void |
| 1420 | ff_veth_input(const struct ff_dpdk_if_context *ctx, struct rte_mbuf *pkt) |
| 1421 | { |
| 1422 | uint8_t rx_csum = ctx->hw_features.rx_csum; |
| 1423 | if (rx_csum) { |
| 1424 | if (pkt->ol_flags & (RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_BAD)) { |
| 1425 | rte_pktmbuf_free(pkt); |
| 1426 | return; |
| 1427 | } |
| 1428 | } |
| 1429 | |
| 1430 | void *data = rte_pktmbuf_mtod(pkt, void*); |
| 1431 | uint16_t len = rte_pktmbuf_data_len(pkt); |
| 1432 | |
| 1433 | void *hdr = ff_mbuf_gethdr(pkt, pkt->pkt_len, data, len, rx_csum); |
| 1434 | if (hdr == NULL) { |
| 1435 | rte_pktmbuf_free(pkt); |
| 1436 | return; |
| 1437 | } |
| 1438 | |
| 1439 | if (pkt->ol_flags & RTE_MBUF_F_RX_VLAN_STRIPPED) { |
| 1440 | ff_mbuf_set_vlan_info(hdr, pkt->vlan_tci); |
| 1441 | } |
| 1442 | |
| 1443 | struct rte_mbuf *pn = pkt->next; |
| 1444 | void *prev = hdr; |
| 1445 | while(pn != NULL) { |
| 1446 | data = rte_pktmbuf_mtod(pn, void*); |
| 1447 | len = rte_pktmbuf_data_len(pn); |
| 1448 | |
| 1449 | void *mb = ff_mbuf_get(prev, pn, data, len); |
| 1450 | if (mb == NULL) { |
| 1451 | ff_mbuf_free(hdr); |
| 1452 | rte_pktmbuf_free(pkt); |
| 1453 | return; |
| 1454 | } |
| 1455 | pn = pn->next; |
| 1456 | prev = mb; |
| 1457 | } |
| 1458 | |
| 1459 | ff_veth_process_packet(ctx->ifp, hdr); |
| 1460 | } |
| 1461 | |
| 1462 | static enum FilterReturn |
| 1463 | protocol_filter(const void *data, uint16_t len) |
no test coverage detected