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