[ovs-dev] why the max action length is 32K in kernel?

Greg Rose gvrose8192 at gmail.com
Mon Sep 18 20:27:52 UTC 2017


On 09/18/2017 11:15 AM, Ben Pfaff wrote:
> On Mon, Sep 18, 2017 at 10:58:28AM -0700, Greg Rose wrote:
>> On 09/12/2017 08:37 PM, ychen wrote:
>>> in function nla_alloc_flow_actions(), there is a check if action length is greater than MAX_ACTIONS_BUFSIZE(32k), then kernel datapath flow will not be installed, and packets will droppped.
>>> but in function xlate_actions(), there is such clause:
>>> if (nl_attr_oversized(ctx.odp_actions->size)) {
>>>          /* These datapath actions are too big for a Netlink attribute, so we
>>>           * 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;
>>>      }
>>> and in function nl_attr_oversized(), the clause is like this:
>>> return payload_size > UINT16_MAX - NLA_HDRLEN;
>>>
>>>
>>> so we can see that in user space, max action length is almost 64K, but in kernel space, max action length is only 32K.
>>> my question is: why the max action length is different? packet will drop when its action length exceeds 32K, but packet can excute in slow path when its action length exceeds 64K?
>>
>> It's a kernel limitation.
>>
>> http://www.spinics.net/lists/netdev/msg431592.html
> 
> It sounds like the userspace limit, then, should also be 32 kB (or
> possibly 16 kB).  I guess we should fix that.
> 

Correct, the user space limit should be 32KB.  That's what it is in iproute2.

Thanks,

- Greg


More information about the dev mailing list