On 01/07/15 at 09:32am, Alexei Starovoitov wrote: > I'm afraid 'union' style with first u8 flags working as selector > won't work for the case you're describing, but since > md.gbp = ntohs(vxh->gbp.policy_id); > 2652: 41 0f b7 55 0a movzwl 0xa(%r13),%edx > then at least from performance side it's ok at least on x86. > So this _packed stuff is fine, though not pretty. > It's internal header, so we can improve it later.
I'm not sure I understand your first sentence but I'm not married to the code as-is. Would you like something like this? struct vxlanhdr_gbp { __u8 vx_flags; +#ifdef __LITTLE_ENDIAN_BITFIELD + __u8 reserved_flags1:3, + policy_applied:1, + reserved_flags2:2, + dont_learn:1, + reserved_flags3:1; +#elif defined(__BIG_ENDIAN_BITFIELD) + __u8 reserved_flags1:1, + dont_learn:1, + reserved_flags2:2, + policy_applied:1, + reserved_flags3:3; +#else +#error "Please fix <asm/byteorder.h>" +#endif + __be16 policy_id; + __be32 vx_vni; }; struct vxlanhdr { + union { + struct { +#ifdef __LITTLE_ENDIAN_BITFIELD + __u8 reserved_flags1:3, + vni_present:1, + reserved_flags2:3, + gbp_present:1; +#elif defined(__BIG_ENDIAN_BITFIELD) + __u8 gbp_present:1, + reserved_flags2:3, + vni_present:1, + reserved_flags1:3; +#else +#error "Please fix <asm/byteorder.h>" +#endif + __u8 vx_reserved1; + __be16 vx_reserved2; + }; + __be32 vx_flags; + }; + __be32 vx_vni; }; _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev