代码之家  ›  专栏  ›  技术社区  ›  Ruffio

DPDK:修改捕获的数据包头的最有效方法

  •  0
  • Ruffio  · 技术社区  · 7 年前

    我正在尝试使用mbuf和mempool库修改一些GTP数据包的头,特别是我想要删除所有ETH、IP、UDP、GTP层和 获取数据包有效负载的(深层)副本 .

    下面是应该完成这项工作的一段代码:

    void (const unsigned char* packet, size_t size)
    {
        auto outer_header_len = sizeof(ether_header) + sizeof(ip) + sizeof(udphdr) + sizeof(gtp); //length to cut
        uint8_t byte_size = static_cast<uint8_t>(size);
        struct rte_mempool* mbuf_pool;
    
        struct rte_mbuf *mbuf_pkt = rte_pktmbuf_alloc(mbuf_pool);
        mbuf_pkt->data_len = byte_size;
        mbuf_pkt->pkt_len = byte_size;
    
        rte_pktmbuf_append(mbuf_pkt, packet[byte_size]);    
        auto payload = rte_pktmbuf_adj(mbuf_pkt, outer_header_len);
    }
    

    此函数从解析数据包流和传递的循环调用 小包裹 大小

    1 回复  |  直到 7 年前
        1
  •  0
  •   Andriy Berestovskyy    7 年前

    代码几乎没有问题。

    byte\u大小

    uint8_t byte_size = static_cast<uint8_t>(size); size 这本身就是一个完美的例子。

    rte\u pktmbuf\u append()

    rte_pktmbuf_append(mbuf_pkt, packet[byte_size]); 此函数用于增加 mbuf_pkt ,但不要更改mbuf字节本身。所以我们必须使用它返回的指针来实际进行复制,即。

    ptr = rte_pktmbuf_append(mbuf_pkt, size);
    if (ptr != NULL)
        rte_memcpy(ptr, packet + outer_header_len, size -outer_header_len);
    

    rte_pktmbuf_append() rte_memcpy()

    其他Mbuf长度操作

    rte_pktmbuf_append() 增加数据包的长度,以下行是冗余的:

    mbuf_pkt->data_len = byte_size;
    mbuf_pkt->pkt_len = byte_size;
    auto payload = rte_pktmbuf_adj(mbuf_pkt, outer_header_len);
    

    表演

    我们可以通过考虑 outer_header_len 在数据复制过程中,如前一示例所示:

    ptr=rte\U pktmbuf\U append(mbuf\U pkt,大小);
    if(ptr!=空)
    rte\u memcpy(ptr,数据包+outer\u header\u len,size-outer\u header\u len);
    

    检查 外部\u标题\u长度 也可能需要小于数据包长度,除非在代码的前面进行了这样的检查。