Commit eee2e03c authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'netlink-specs-add-ynl-spec-for-ovs_flow'

Donald Hunter says:

====================
netlink: specs: add ynl spec for ovs_flow

Add a ynl specification for ovs_flow. The spec is sufficient to dump ovs
flows but some attrs have been left as binary blobs because ynl doesn't
support C arrays in struct definitions yet.

Patches 1-3 add features for genetlink-legacy specs
Patch 4 is the ovs_flow netlink spec
====================

Link: https://lore.kernel.org/r/20230527133107.68161-1-donald.hunter@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 45402f04 93b230b5
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,12 @@ properties:
                $ref: '#/$defs/len-or-define'
                $ref: '#/$defs/len-or-define'
              byte-order:
              byte-order:
                enum: [ little-endian, big-endian ]
                enum: [ little-endian, big-endian ]
              doc:
                description: Documentation for the struct member attribute.
                type: string
              enum:
                description: Name of the enum type used for the attribute.
                type: string
        # End genetlink-legacy
        # End genetlink-legacy


  attribute-sets:
  attribute-sets:
+831 −0

File added.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Original line Diff line number Diff line
@@ -228,11 +228,13 @@ class SpecStructMember(SpecElement):
    Attributes:
    Attributes:
        type        string, type of the member attribute
        type        string, type of the member attribute
        byte_order  string or None for native byte order
        byte_order  string or None for native byte order
        enum        string, name of the enum definition
    """
    """
    def __init__(self, family, yaml):
    def __init__(self, family, yaml):
        super().__init__(family, yaml)
        super().__init__(family, yaml)
        self.type = yaml['type']
        self.type = yaml['type']
        self.byte_order = yaml.get('byte-order')
        self.byte_order = yaml.get('byte-order')
        self.enum = yaml.get('enum')




class SpecStruct(SpecElement):
class SpecStruct(SpecElement):
+6 −2
Original line number Original line Diff line number Diff line
@@ -412,7 +412,11 @@ class YnlFamily(SpecFamily):


    def _decode_binary(self, attr, attr_spec):
    def _decode_binary(self, attr, attr_spec):
        if attr_spec.struct_name:
        if attr_spec.struct_name:
            decoded = attr.as_struct(self.consts[attr_spec.struct_name])
            members = self.consts[attr_spec.struct_name]
            decoded = attr.as_struct(members)
            for m in members:
                if m.enum:
                    self._decode_enum(decoded, m)
        elif attr_spec.sub_type:
        elif attr_spec.sub_type:
            decoded = attr.as_c_array(attr_spec.sub_type)
            decoded = attr.as_c_array(attr_spec.sub_type)
        else:
        else:
@@ -541,7 +545,7 @@ class YnlFamily(SpecFamily):
        if op.fixed_header:
        if op.fixed_header:
            fixed_header_members = self.consts[op.fixed_header].members
            fixed_header_members = self.consts[op.fixed_header].members
            for m in fixed_header_members:
            for m in fixed_header_members:
                value = vals.pop(m.name)
                value = vals.pop(m.name) if m.name in vals else 0
                format = NlAttr.get_format(m.type, m.byte_order)
                format = NlAttr.get_format(m.type, m.byte_order)
                msg += format.pack(value)
                msg += format.pack(value)
        for name, value in vals.items():
        for name, value in vals.items():