关于dpdk中的L3Header访问

Regarding L3Header access in dpdk

如何访问指向第 3 层开头的指针 header。 我试图访问指向 L3 的指针,如以下代码段所示。

enter code here
for (i = 0; i < nb_rx; i++) {
            m = bufs[i];
pkt_len=rte_pktmbuf_pkt_len(bufs[i]);
if (RTE_ETH_IS_IPV4_HDR(m->packet_type))
{
                struct rte_ipv4_hdr *ip_hdr;
                ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv4_hdr *);
                    
if(Func1(P1,(unsigned char*)ip_hdr,pkt_len-sizeof(struct ethhdr),T1)){
//DO Something
}
}

但是 Func1 返回 false 以前使用原始套接字实现的相同代码正在运行。

unsigned char *buffer
    if Fun1(P1,(buffer+sizeof(struct ethhdr)),pkt_size-sizeof(struct ethhdr),T1){
}

@ima,访问 L2|L3|L4 很容易在 DPDK 示例中涵盖。对于您的特定要求 DPDK 示例,l3fwd 可以轻松涵盖该场景。因此我的谦虚建议是首先参考这样的应用程序

您查询的答案是您尝试访问 L3 header 的方式不正确。要正确访问 L3 header,您需要更改

if (RTE_ETH_IS_IPV4_HDR(m->packet_type))
{
                struct rte_ipv4_hdr *ip_hdr;
                ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv4_hdr *);

改为

if (RTE_ETH_IS_IPV4_HDR(m->packet_type))
{
struct rte_ipv4_hdr *ip_hdr; 
ip_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));

注意:这是假设以太网类型是 IPV4,并且前面没有 VLAN 或 MPLS。