| 2729 | } |
| 2730 | |
| 2731 | int |
| 2732 | ff_rss_check(void *softc, uint32_t saddr, uint32_t daddr, |
| 2733 | uint16_t sport, uint16_t dport) |
| 2734 | { |
| 2735 | struct lcore_conf *qconf = &lcore_conf; |
| 2736 | struct ff_dpdk_if_context *ctx = ff_veth_softc_to_hostc(softc); |
| 2737 | uint16_t nb_queues = qconf->nb_queue_list[ctx->port_id]; |
| 2738 | |
| 2739 | if (nb_queues <= 1) { |
| 2740 | return 1; |
| 2741 | } |
| 2742 | |
| 2743 | uint16_t reta_size = rss_reta_size[ctx->port_id]; |
| 2744 | uint16_t queueid = qconf->tx_queue_id[ctx->port_id]; |
| 2745 | |
| 2746 | uint8_t data[sizeof(saddr) + sizeof(daddr) + sizeof(sport) + |
| 2747 | sizeof(dport)]; |
| 2748 | |
| 2749 | unsigned datalen = 0; |
| 2750 | |
| 2751 | bcopy(&saddr, &data[datalen], sizeof(saddr)); |
| 2752 | datalen += sizeof(saddr); |
| 2753 | |
| 2754 | bcopy(&daddr, &data[datalen], sizeof(daddr)); |
| 2755 | datalen += sizeof(daddr); |
| 2756 | |
| 2757 | bcopy(&sport, &data[datalen], sizeof(sport)); |
| 2758 | datalen += sizeof(sport); |
| 2759 | |
| 2760 | bcopy(&dport, &data[datalen], sizeof(dport)); |
| 2761 | datalen += sizeof(dport); |
| 2762 | |
| 2763 | uint32_t hash = 0; |
| 2764 | hash = toeplitz_hash(rsskey_len, rsskey, datalen, data); |
| 2765 | |
| 2766 | return ((hash & (reta_size - 1)) % nb_queues) == queueid; |
| 2767 | } |
| 2768 | |
| 2769 | void |
| 2770 | ff_regist_packet_dispatcher(dispatch_func_t func) |
no test coverage detected