[ovs-dev] [PATCH 4/4] netdev-tc-offloads: Add support for action set
Paul Blakey
paulb at mellanox.com
Tue Aug 15 07:28:23 UTC 2017
On 15/08/2017 04:04, Joe Stringer wrote:
> On 8 August 2017 at 07:21, Roi Dayan <roid at mellanox.com> wrote:
>> From: Paul Blakey <paulb at mellanox.com>
>>
>> Implement support for offloading ovs action set using
>> tc header rewrite action.
>>
>> Signed-off-by: Paul Blakey <paulb at mellanox.com>
>> Reviewed-by: Roi Dayan <roid at mellanox.com>
>> ---
>
> <snip>
>
>> @@ -274,6 +346,48 @@ netdev_tc_flow_dump_destroy(struct netdev_flow_dump *dump)
>> return 0;
>> }
>>
>> +static void
>> +parse_flower_rewrite_to_netlink_action(struct ofpbuf *buf,
>> + struct tc_flower *flower)
>> +{
>> + char *mask = (char *) &flower->rewrite.mask;
>> + char *data = (char *) &flower->rewrite.key;
>> +
>> + for (int type = 0; type < ARRAY_SIZE(set_flower_map); type++) {
>> + char *put = NULL;
>> + size_t nested = 0;
>> + int len = ovs_flow_key_attr_lens[type].len;
>> +
>> + if (len <= 0) {
>> + continue;
>> + }
>> +
>> + for (int j = 0; j < ARRAY_SIZE(set_flower_map[type]); j++) {
>> + struct netlink_field *f = &set_flower_map[type][j];
>> +
>> + if (!f->size) {
>> + break;
>> + }
>
> Seems like maybe there's similar feedback here to the previous patch
> wrt sparsely populated array set_flower_map[].
>
I'll answer there.
>> +
>> + if (!is_all_zeros(mask + f->flower_offset, f->size)) {
>> + if (!put) {
>> + nested = nl_msg_start_nested(buf,
>> + OVS_ACTION_ATTR_SET_MASKED);
>> + put = nl_msg_put_unspec_zero(buf, type, len * 2);
>
> Do we ever have multiple of these attributes in a single nested
> OVS_ACTION_ATTR_SET_MASKED? If so, won't the following memcpys avoid
> putting the netlink header for the subsequent sets?
>
OVS_ACTION_ATTR_SET_MASKED always has a single nested OVS_KEY_ATTR_*
attribute so we put it (all zeros) the first time we find a sub
attribute (e.g ipv4_dst of ipv4) that isn't zero and use memcpy below to
overwrite the non zero sub attributes.
>> + }
>> +
>> + memcpy(put + f->offset, data + f->flower_offset, f->size);
>> + memcpy(put + len + f->offset,
>> + mask + f->flower_offset, f->size);
>
> Could we these combine with the nl_msg_put_unspec() above?
>
We'd have to accumulate the data as we go over the inner loop and then
write it.
We could, for example, create a stack buffer like char
buff[MAX_ATTR_LEN] (kinda ugly), write it there, and if we wrote
something to buff, flush it to a nested attribute in a single write.
Would that be better? It might be less readable and it is less flexible
(defining of MAX_ATTR_LEN).
More information about the dev
mailing list