如何访问指向第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。