[ovs-dev] [PATCH 2/2] miniflow: Use 64-bit data.

Madhu Challa challa at noironetworks.com
Wed Dec 17 21:07:13 UTC 2014


Thanks for the helpful explanation.

Thanks.

On Wed, Dec 17, 2014 at 12:45 PM, Jarno Rajahalme <jrajahalme at nicira.com>
wrote:
>
>
> On Dec 17, 2014, at 12:07 PM, Madhu Challa <challa at noironetworks.com>
> wrote:
>
> Jarno,
>
> I did some simple tests increasing flow_tnl size and trying to match on it
> looks good. Thanks for solving this. I have a question inline around
> miniflow_extract. Other than that the diff looks good to me.
>
> Thanks.
>
> On Wed, Dec 17, 2014 at 10:30 AM, Jarno Rajahalme <jrajahalme at nicira.com>
> wrote:
>>
>> (snip)
>
>
> +
>> +#define miniflow_push_be32_(MF, OFS, VALUE)                     \
>> +    miniflow_push_uint32_(MF, OFS, (OVS_FORCE uint32_t)(VALUE))
>> +
>> +#define miniflow_push_uint16_(MF, OFS, VALUE)                           \
>> +{                                                                       \
>> +    MINIFLOW_ASSERT(MF.data < MF.end &&                                 \
>> +                    (((OFS) % 8 == 0 && !(MF.map & (UINT64_MAX << (OFS)
>> / 8))) \
>> +                     || ((OFS) % 2 == 0 && MF.map & (UINT64_C(1) <<
>> (OFS) / 8) \
>> +                         && !(MF.map & (UINT64_MAX << ((OFS) / 8 +
>> 1)))))); \
>>                                                                          \
>> -    if ((OFS) % 4 == 0) {                                               \
>> +    if ((OFS) % 8 == 0) {                                               \
>>          *(uint16_t *)MF.data = VALUE;                                   \
>> -        MF.map |= UINT64_C(1) << (OFS) / 4;                             \
>> -    } else if ((OFS) % 4 == 2) {                                        \
>> +        MF.map |= UINT64_C(1) << (OFS) / 8;                             \
>> +    } else if ((OFS) % 8 == 2) {                                        \
>>          *((uint16_t *)MF.data + 1) = VALUE;                             \
>> +    } else if ((OFS) % 8 == 4) {                                        \
>> +        *((uint16_t *)MF.data + 2) = VALUE;                             \
>> +    } else if ((OFS) % 8 == 6) {                                        \
>> +        *((uint16_t *)MF.data + 3) = VALUE;                             \
>>          MF.data++;                                                      \
>>      }                                                                   \
>>  }
>>
>
> So I am assuming these calls should come in groups of 4 for the increment
> to work ? This does not show up in the diff but was wondering how this
> would get incremented and map set for say the ethernet header where we have
>
>  468         vlan_tci = parse_vlan(&data, &size);
>  469         dl_type = parse_ethertype(&data, &size);
>  470         miniflow_push_be16(mf, dl_type, dl_type);
>  471         miniflow_push_be16(mf, vlan_tci, vlan_tci);
>  472     }
>
>
> This was maybe the most involving change, and I don’t claim the “push”
> macros to be very general. In this case, a prior call to
> miniflow_push_macs() sets the map bits, but leaves the data pointer to
> point to the second, still incomplete 64-bit word, which can then be
> completed with other push types or padding. In general, a push starting a
> new 64-bit word sets the map bit, and the a push on the last bits of the
> 64-bit word increments the data pointer. This way we can mix and match
> different data types within the 64 bits.
>
> So the miniflow_push_macs() currently only works when the macs fields
> start 64-bit aligned. We can make it more general later if needed, but this
> should be good enough for now.
>
>   Jarno
>
>



More information about the dev mailing list