c-关于dpdk中的L3Header访问



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

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标头的方式不正确。要正确访问L3标头,您需要从进行更改

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。

相关内容

  • 没有找到相关文章

最新更新