Hi,

 

I am seeing strange behavior where rte_pktmbuf_clone is not giving desired result.

Here is the detailed info, in my dpdk application  , once I received the packet info in mbuf, I need to send the same packet to two destinations, the sequence  I should follow is,

(i)                  First, Tunnel the packet to one of desired destination, so I created the shallow copy using rte_pktmbuf_clone, had another mbuf for Outer IP Header for IPinIP tunnel and sent to NIC.

(ii)                Second, I need to modify the source and destination ip addresses of the packet and send out.

 

The issue, I am seeing is the tunneled packet (clone) have modified IP addresses from (ii).

 

Code flow:

 

Main()

{

Struct rte_mbuf *org_mbuf; //lets assume this org_mbuf is holding the packet info.

(i)                  Towards First destination.

Build_tunnel_packet(org_mbuf) {

 

-          Struct rte_mbuf *clone_buffer;

-          Allocate a clone buffer Clone_buffer = rte_pktmbuf_clone(org_mbuf, clone_pool);

 

-          Constructed IPinIP info in another mbuf and prepended in clone_buffer

-          Call rte_pktmbuf_tx_burst();

}

(ii)                Towards another destination.

Modify_l3_and_route(org_mbuf)

{

 

-          Modify L3 information of ‘org_mbuf’

-          and Call rte_pkt_mbuf_tx_burst();

}

 

}

 

 

In the above screenshot, the packet 37 should tunneled as it is by adding the outer ip layer(i.e 182.16.146.*), but the inner L3 information also getting changed (which I am modifying in the second step) for some packets.

Using, rte_pktmbuf_copy(), solving the issue, but in expense of extra mbuf.

 

 

Please, help me in understanding what is wrong in the case of rte_pktmbuf_clone()?

 

 

Regards,
Nagendra