Sent from my iPhone
> On Apr 1, 2014, at 7:27 AM, Ben Pfaff <b...@nicira.com> wrote: > >> On Tue, Apr 01, 2014 at 03:14:16PM +0300, Lori Jakab wrote: >>> On 3/26/14, 2:16 AM, Ben Pfaff wrote: >>>> On Mon, Mar 24, 2014 at 10:59:06AM -0700, Jarno Rajahalme wrote: >>>> This patch shrinks the struct ofpbuf from 104 to 48 bytes on 64-bit >>>> systems, or from 52 to 36 bytes on 32-bit systems (counting in the >>>> 'l7' removal by the previous patch). This may help contribute to >>>> cache efficiency, and will speed up initializing, copying and >>>> manipulating ofpbufs. This is potentially important for the DPDK >>>> datapath, but the rest of the code base may also see a little benefit. >>>> >>>> Changes are: >>>> >>>> - Remove 'l7' pointer (previous patch). >>>> - Use offsets instead of layer pointers for l2_5, l3, and l4 using >>>> 'l2' as basis. Usually 'data' is the same as 'l2', but this is not >>>> always the case (e.g., when parsing or constructing a packet), so it >>>> can not be easily used as the offset basis. Also, packet parsing is >>>> faster if we do not need to maintain the offsets each time we pull >>>> data from the ofpbuf. >>>> - Use uint32_t for 'allocated' and 'size', as 2^32 is enough even for >>>> largest possible messages/packets. >>>> - Use packed enum for 'source'. >>>> - Rearrange to avoid unnecessary padding. >>>> - Remove 'private_p', which was used only in two cases, both of which >>>> had the invariant ('l2' == 'data'), so we can temporarily use 'l2' >>>> as a private pointer. >>>> >>>> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> >> >> Unfotunately I missed this patch until rebasing my layer 3 patch >> series [1] today. >> >> Before this patch, I set the 'l2' pointer to NULL and 'l3' to the >> start of the network header to represent a layer 3 packet in a >> struct ofpbuf. The way struct ofpbuf looks after this patch makes >> the assumption of always having layer 2 headers a lot stronger. >> >> I see two options for my patches going forward: >> 1) Add back 'l3' and remove 'l3_ofs' from struct ofpbuf (keeping the >> rest as is); or >> 2) Encode a layer 3 packet by setting 'l2' to the network header >> address and set l3_ofs to 0. > > Can we do the following? > 3) Replace 'l2' by 'l2_ofs' also? I'll look into this today. However, my earlier analysis was that this would complicate things when the offset basis ('data') is changing a lot (e.g., when pulling data from ofpbuf). Maybe the cleanest solution would be to have a pointer to the start of packet and an additional l2 offset. However, as 0 is a valid offset value, having a separate l2 offset seems redundant as l3_ofs 0 would be an unambiguous way of encoding the absence of the l2 header. Jarno _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev