tools: ynl-gen: add support for exact-len validation

add support for 'exact-len' validation on netlink attributes.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/340
Acked-by: Matthieu Baerts <matttbe@kernel.org>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: Mat Martineau <martineau@kernel.org>
Link: https://lore.kernel.org/r/20231023-send-net-next-20231023-1-v2-2-16b1f701f900@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Davide Caratti 2023-10-23 11:17:06 -07:00 committed by Jakub Kicinski
parent 52c121f4bf
commit 0c63ad3795
5 changed files with 29 additions and 11 deletions

View File

@ -199,6 +199,9 @@ properties:
max-len:
description: Max length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
exact-len:
description: Exact length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
sub-type: *attr-type
display-hint: &display-hint
description: |

View File

@ -242,6 +242,9 @@ properties:
max-len:
description: Max length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
exact-len:
description: Exact length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
sub-type: *attr-type
display-hint: *display-hint
# Start genetlink-c

View File

@ -172,6 +172,9 @@ properties:
max-len:
description: Max length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
exact-len:
description: Exact length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
sub-type: *attr-type
display-hint: &display-hint
description: |

View File

@ -240,6 +240,9 @@ properties:
max-len:
description: Max length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
exact-len:
description: Exact length for a string or a binary attribute.
$ref: '#/$defs/len-or-define'
sub-type: *attr-type
display-hint: *display-hint
# Start genetlink-c

View File

@ -410,10 +410,13 @@ class TypeString(Type):
return f'.type = YNL_PT_NUL_STR, '
def _attr_policy(self, policy):
mem = '{ .type = ' + policy
if 'max-len' in self.checks:
mem += ', .len = ' + str(self.get_limit('max-len'))
mem += ', }'
if 'exact-len' in self.checks:
mem = 'NLA_POLICY_EXACT_LEN(' + str(self.checks['exact-len']) + ')'
else:
mem = '{ .type = ' + policy
if 'max-len' in self.checks:
mem += ', .len = ' + str(self.get_limit('max-len'))
mem += ', }'
return mem
def attr_policy(self, cw):
@ -459,14 +462,17 @@ class TypeBinary(Type):
return f'.type = YNL_PT_BINARY,'
def _attr_policy(self, policy):
mem = '{ '
if len(self.checks) == 1 and 'min-len' in self.checks:
mem += '.len = ' + str(self.get_limit('min-len'))
elif len(self.checks) == 0:
mem += '.type = NLA_BINARY'
if 'exact-len' in self.checks:
mem = 'NLA_POLICY_EXACT_LEN(' + str(self.checks['exact-len']) + ')'
else:
raise Exception('One or more of binary type checks not implemented, yet')
mem += ', }'
mem = '{ '
if len(self.checks) == 1 and 'min-len' in self.checks:
mem += '.len = ' + str(self.get_limit('min-len'))
elif len(self.checks) == 0:
mem += '.type = NLA_BINARY'
else:
raise Exception('One or more of binary type checks not implemented, yet')
mem += ', }'
return mem
def attr_put(self, ri, var):