This looks good in principle.

Test 706 (ofproto-dpif - too many output actions) fails on this, as it
expects the old VLOG_ERR in the logs.

There is also an error from ofproto_dpif_xlate in this case,
complaining about resubmits yielding >64kB of actions. I assume this
is intended to remain as a hint in the logs that something's a bit
strange, even though we should now handle this case.

On Wed, Oct 9, 2013 at 6:09 PM, Ben Pfaff <b...@nicira.com> wrote:
>>
>> If the datapath actions exceed the maximum size of a Netlink attribute
>> (about 64 kB), then previously we would assert-fail (before commit
>> 542024c4c3d36 "ofproto-dpif-xlate: Suppress oversize datapath actions.")
>> or just drop all of them (after that commit).  This commit makes OVS cope
>> by slow-pathing the flow and executing all of its actions in userspace.
>>
>> Signed-off-by: Ben Pfaff <b...@nicira.com>
>> ---
>>  lib/dpif.c                   |    4 +++-
>>  ofproto/ofproto-dpif-xlate.c |   11 ++++++-----
>>  2 files changed, 9 insertions(+), 6 deletions(-)
>>
>> diff --git a/lib/dpif.c b/lib/dpif.c
>> index b284e13..ed84f5f 100644
>> --- a/lib/dpif.c
>> +++ b/lib/dpif.c
>> @@ -1183,6 +1183,8 @@ dpif_execute__(struct dpif *dpif, const struct
>> dpif_execute *execute)
>>   * OVS_ACTION_ATTR_USERSPACE actions it passes the packet through to the
>> dpif
>>   * implementation.
>>   *
>> + * This works even if 'actions_len' is too long for a Netlink attribute.
>> + *
>>   * Returns 0 if successful, otherwise a positive errno value. */
>>  int
>>  dpif_execute(struct dpif *dpif,
>> @@ -1198,7 +1200,7 @@ dpif_execute(struct dpif *dpif,
>>      execute.actions = actions;
>>      execute.actions_len = actions_len;
>>      execute.packet = buf;
>> -    execute.needs_help = needs_help;
>> +    execute.needs_help = needs_help || nl_attr_oversized(actions_len);
>>      return dpif_execute__(dpif, &execute);
>>  }
>>
>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>> index 4fb0d5e..ec83db7 100644
>> --- a/ofproto/ofproto-dpif-xlate.c
>> +++ b/ofproto/ofproto-dpif-xlate.c
>> @@ -49,6 +49,7 @@
>>  #include "vlog.h"
>>
>>  COVERAGE_DEFINE(xlate_actions);
>> +COVERAGE_DEFINE(xlate_actions_oversize);
>>
>>  VLOG_DEFINE_THIS_MODULE(ofproto_dpif_xlate);
>>
>> @@ -2832,11 +2833,11 @@ xlate_actions__(struct xlate_in *xin, struct
>> xlate_out *xout)
>>
>>      if (nl_attr_oversized(ctx.xout->odp_actions.size)) {
>>          /* These datapath actions are too big for a Netlink attribute, so
>> we
>> -         * can't execute them. */
>> -        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
>> -
>> -        VLOG_ERR_RL(&rl, "discarding oversize datapath actions");
>> -        ofpbuf_clear(&ctx.xout->odp_actions);
>> +         * can't hand them to the kernel directly.  dpif_execute() can
>> execute
>> +         * them one by one with help, so just mark the result as
>> SLOW_ACTION to
>> +         * prevent the flow from being installed. */
>> +        COVERAGE_INC(xlate_actions_oversize);
>> +        ctx.xout->slow |= SLOW_ACTION;
>>      }
>>
>>      ofpbuf_uninit(&ctx.stack);
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
>
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to