Hello guys,

I wanted to ask you: do you have buffer management functionality to duplicate a 
packet?

I have seen that the function OvsOutputBeforeSetAction CLONES instead of 
duplicating the packet.

Did you know that, when cloning a packet, both the old and the cloned packet 
reference the same data (buffer)?
So that setting bytes, say, in the ipv4 header of the cloned NET_BUFFER 
actually modifies the original NET_BUFFER as well?

Also, we are not allowed to set data in the original packet. We must create a 
clone / duplicate for this.
For tunneling (i.e. adding headroom) cloning is ok, because the clone writes 
bytes to the "unused" area of the buffer, or allocates a new MDL for the 
headroom (which is removed at Complete).

The procedure for setting data within the buffer using cloning is a bit more 
complicated:
You must allocate a new MDL, copy the 'modified' data into its buffer, and 
chain it to the cloned NET_BUFFER (replacing the old MDL). And at Complete, you 
must free your MDL and put the old MDL back.
A simpler method would be to duplicate the buffer, instead of cloning it.

Here the architecture of a cloned NET_BUFFER_LIST is presented:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff544929(v=vs.85).aspx

Samuel Ghinet
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to