[ovs-dev] [PATCH 05/10] lib/odp: Masked set action execution and printing.

Ben Pfaff blp at nicira.com
Wed Apr 9 17:51:33 UTC 2014


On Tue, Apr 08, 2014 at 04:38:47PM -0700, Jarno Rajahalme wrote:
> Masked set actions add a mask, immediately following the netlink
> attribute data, within the netlink attribute itself.  Thus the key
> attribute size for a masked set action is exactly double of the
> non-masked set action.
> 
> Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>

This adds a new restriction to key attributes: they must have a fixed
length (because otherwise one cannot tell whether the length is
doubled).  In fact, MPLS is already variable length, as documented in
<linux/openvswitch.h>:

	OVS_KEY_ATTR_MPLS = 62, /* array of struct ovs_key_mpls.
				 * The implementation may restrict
				 * the accepted length of the array. */

So I'd suggest some other way to distinguish masked set actions.

In general the code looks good but it has more repetition than I
usually like.  Is there a good way to avoid some of that?  Maybe some
pattern like this (not tested):

void
memcpy_masked(void *dst_, const void *src_, const void *mask_, size_t size)
{
    uint8_t *dst = dst_;
    const uint8_t *src = src_;
    const uint8_t *mask = mask_;
    size_t i;

    if (mask) {
        for (i = 0; i < size; i++) {
            dst[i] = src[i] | (dst[i] & ~mask[i]);
        }
    } else {
        memcpy(dst, src, size);
    }
}

#define copy_masked(dst, src, mask)             \
    ((void) sizeof((dst) == (src)),             \
     (void) sizeof((dst) == (mask)),            \
     memcpy_masked(dst, src, mask))
#define get_mask(a, type)                       \
    (nl_attr_get_size(a) >= 2 * sizeof(type)    \
     ? (const type *) nl_attr_get(a) + 1        \
     : NULL)

...
    switch (type) {
    case OVS_KEY_ATTR_PRIORITY:
        copy_masked(&md->skb_priority,
                    nl_attr_get_u32(a), get_mask(a, uint32_t));
        break;



More information about the dev mailing list