From patchwork Mon Jan 29 22:34:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536451 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F0BC23741; Mon, 29 Jan 2024 22:35:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567725; cv=none; b=VECsVr0qdfn7Zknny+sek/eIu25n+ayecf3Aw/hL0EmMx+RjnmI+37PE/Qfoin0Zdzs2A6vDtLkYTDrHneGxtBGHC6mCw+P8Vv4MLfRp3g6coOdyiwahsJP35BTQC+hUZiD5jk8WAvRi7/PbJhMQRFHTCq6vCGWmAQd3p3iYszY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567725; c=relaxed/simple; bh=pnOBYK3Dw5OML6lGYNUMdydJOPAQ8Agj60vUhHWg+7w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pLxL4yoVhqcxUyBLNxHlKLPV36S6ab48UMuygX9hG8LAH27aICO9os9ml6F+DwUn8VOsmGhEvQeQOeBNbwVOkT33PT/YIhPpgJSJTsoWK/lz+1Lmjm9dgzpAwD4Ct6ThlwToVkUZ3QbNsUdNdVLAJlQp4moPyrHQ0v5Y14lp2sY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=EyaFG3ES; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EyaFG3ES" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-40eec4984acso26169035e9.2; Mon, 29 Jan 2024 14:35:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567722; x=1707172522; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=S9uk4F3L3/3yW82w3MBXJrp38V2fn9DHxZ2lnS7OUfo=; b=EyaFG3ESCAJ8lzoJ3G+LuV3ZBPq8LBy5X3M5UFXoS/0/ZbfJwhlrQ+XCxgLVgqZbek Mts2dsosWWqVP6ilKIMqCCFl3ageD/3WceaVSm1+W0ALTIoWotSF03Vol4Ds99lx5Gip lM1uDDAPNUnd3GDaH6v37k9BS8Ms0NN+C7Mh+6jLKqe/wMhoW96GWNG5pXCx3uinlKvW SLBBzGluWA99HBZe9iVcfyW3D80erwzE8v6nHPGgmz8FEgHfD6xgz4icgglNcq0SYVgi D7GNpXHCe78G9sSWksYUp4oXFaSq0WzmkyN19XqfQGkbIjJ6x8Mzy3ZD5868tiMOxHGI qk3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567722; x=1707172522; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S9uk4F3L3/3yW82w3MBXJrp38V2fn9DHxZ2lnS7OUfo=; b=wM8CxPtVleT2yKaUvZ1ULDqBdvh8j+K5uh+875JtQOHpNOrpJCqB527nBT/hA9u9IO AAgepI1tVMy0oisg1WVgp4qL0RjAcXBx1GfRS7DGU+tGmMD83/eMmKC0JBzwAAsD6U6V HzLLVAPUv7EmwAsYf8zIuQ0pqFnLYuCA/UZcgYVTZJysGqULH4FgCugeE5vWEsqRhwif 36q5NMVOVeDqd4kfoiAj37lvOD6guoyt0eyAXfeteQWYZZwo4FQ+K1G+KNou15HjjE4F GRVHimeQa57KN7n3BAymxa1Ay6vXy7yu3b0e2DJdz2/duZSRpa1JU1Esoo4vLo0lJMo8 y11g== X-Gm-Message-State: AOJu0Yz3jFMiVnPZ0kR9VZ45uVyo2P2X884UlOK40teY4fufj/k168j/ LenvTzS7HiSLDvt8MR150RvtBsinptHsfDKbXq0aOEE3JCXznw3X+bOe+jra0Mc= X-Google-Smtp-Source: AGHT+IGoKqQgv7ENUuxMM14iQqWmhVlROHpHYbY/JncUrBw2ZQKJeApVPy4FPSgg9iQEmssbdczuDA== X-Received: by 2002:adf:e603:0:b0:337:6e1b:2e9f with SMTP id p3-20020adfe603000000b003376e1b2e9fmr4503272wrm.20.1706567721865; Mon, 29 Jan 2024 14:35:21 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:21 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 01/13] tools/net/ynl: Add --output-json arg to ynl cli Date: Mon, 29 Jan 2024 22:34:46 +0000 Message-ID: <20240129223458.52046-2-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The ynl cli currently emits python pretty printed structures which is hard to consume. Add a new --output-json argument to emit JSON. Signed-off-by: Donald Hunter Reviewed-by: Breno Leitao --- tools/net/ynl/cli.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tools/net/ynl/cli.py b/tools/net/ynl/cli.py index 2ad9ec0f5545..0f8239979670 100755 --- a/tools/net/ynl/cli.py +++ b/tools/net/ynl/cli.py @@ -9,6 +9,15 @@ import time from lib import YnlFamily, Netlink +class YnlEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, bytes): + return bytes.hex(obj) + if isinstance(obj, set): + return list(obj) + return json.JSONEncoder.default(self, obj) + + def main(): parser = argparse.ArgumentParser(description='YNL CLI sample') parser.add_argument('--spec', dest='spec', type=str, required=True) @@ -28,8 +37,15 @@ def main(): parser.add_argument('--append', dest='flags', action='append_const', const=Netlink.NLM_F_APPEND) parser.add_argument('--process-unknown', action=argparse.BooleanOptionalAction) + parser.add_argument('--output-json', action='store_true') args = parser.parse_args() + def output(msg): + if args.output_json: + print(json.dumps(msg, cls=YnlEncoder)) + else: + pprint.PrettyPrinter().pprint(msg) + if args.no_schema: args.schema = '' @@ -47,14 +63,14 @@ def main(): if args.do: reply = ynl.do(args.do, attrs, args.flags) - pprint.PrettyPrinter().pprint(reply) + output(reply) if args.dump: reply = ynl.dump(args.dump, attrs) - pprint.PrettyPrinter().pprint(reply) + output(reply) if args.ntf: ynl.check_ntf() - pprint.PrettyPrinter().pprint(ynl.async_msg_queue) + output(ynl.async_msg_queue) if __name__ == "__main__": From patchwork Mon Jan 29 22:34:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536452 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C9D54C605; Mon, 29 Jan 2024 22:35:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567726; cv=none; b=gzyErETW0Qe7ApAYtHYHSkTf94jQcN7PeTRya7APSoJxDmK6UgqvV522bbaLg5cAozqKXqTVi4XhifkcUCLPRl2Pj1dljuxABlGlS4725D/x4AZprdM92W+EtUEiUSxai641Fm+vZhO700LzF5YE+py45sNThneBbpH6dBIUfBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567726; c=relaxed/simple; bh=oXNIrlpbTKUfQPJHUWPw/qMK/7MKjDVQDLOBMzrF0IY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l9L3t+GeK1zPP7D9LM7aiwaV6Y3mFbSNRSLx3NFP39JKbRCJ9eqm4DbNMF8s3FZlY/FT+jL2Uh7YQ6hokndF2BcedBHkdLvtKOhffs4xmLX+EfMbd4NLZOFzmzwXG/UBqaXWEzBMqq5PGvMNM7P+KKhsbqiDxsTKA/Oy+KGUmh8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WqNUE7Eu; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WqNUE7Eu" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-40e80046264so43562575e9.0; Mon, 29 Jan 2024 14:35:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567723; x=1707172523; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WpynuJh5fIDOf0QfYdr4oU7DJfOhE7bZIxOiGaTAD6k=; b=WqNUE7EuNWkeTiaC2RU/HHJ/TCnSJ2EOHdLx0qsFZp6eGmsQbimrWFrEpT/es6W4cF C7VOE2hPoPSiwxLyx2gHmQDVBQhc57ndrDKx+y9Plq//G5eX29ibArOby5PEMAYQL3Yo slET/8U7obz/IyrC7+6lsPtK0dkNa/5widKHwJiY5zrtE8LGm1v2AT7ACbiZiLe05BwT 3wFv0DApQVA84h0iQXmuGBLz27F9iG2B7ezj8QBfbDRcpaGJpyY9trbzhVtwcN6jAW9z HOTz7gyw+BW1WddvV6c4tiww8wlj20GGjGJAd2cBDGYo5u9qvN0MmtamzLp4G8qtiiqw lLfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567723; x=1707172523; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WpynuJh5fIDOf0QfYdr4oU7DJfOhE7bZIxOiGaTAD6k=; b=akDBXGNwEdZfCo7xlTGSIP5a41qMk8f+zL0D+q39lor9kyKymv6q5Oi//PpM28Lr7I PSxO+OXVAnHjAxjNGWRieNibSRk0PvaKCeIc8uIcge1LZ7e7M9UuLIe6/6bKqwn7kQSh 0u0JX/lN9KRO+n0NGW+7l1MD0xuazNYiotJiNtVdVyPvIMLSurvJOEvJdioP2EXBfxVh fMOpguF2fHlY/JtVohQCpgF9bHdz9YDbzck1/zpdEo96ufeWy+RJLB6IHSKdeGcYpOHF P6TsRa1wPWJJVo4afqDDgLbRrHWzCci4rHhHiEO2T3/rYUQkJ11QeEOE10mQK39kejC0 Hq7g== X-Gm-Message-State: AOJu0YxqUI23ott2IpEIhX5SZM3XN0U621RMpLHh8QKZf8hIg7YnP0WR jZLGhOW2pzGaiNzYlQOvkaMIdWs41HGy7JmK7n2VfMCEu99r3SBB45iEF9ZwYqk= X-Google-Smtp-Source: AGHT+IHG9MErHJA7U+Wc/9sc0vHLk2YYL7mOOugOzMChMBzbKoVWBOn3LtmURMNsWb87Arv7+5bjug== X-Received: by 2002:a05:600c:3c82:b0:40e:c6ae:3c88 with SMTP id bg2-20020a05600c3c8200b0040ec6ae3c88mr5651589wmb.35.1706567722943; Mon, 29 Jan 2024 14:35:22 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:22 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 02/13] tools/net/ynl: Support sub-messages in nested attribute spaces Date: Mon, 29 Jan 2024 22:34:47 +0000 Message-ID: <20240129223458.52046-3-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Sub-message selectors could only be resolved using values from the current nest level. Enable value lookup in outer scopes by using collections.ChainMap to implement an ordered lookup from nested to outer scopes. Signed-off-by: Donald Hunter --- tools/net/ynl/lib/ynl.py | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 1e10512b2117..f24581759acf 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -405,6 +405,26 @@ class GenlProtocol(NetlinkProtocol): return self.genl_family['mcast'][mcast_name] + +class SpaceAttrs: + SpecValuesPair = namedtuple('SpecValuesPair', ['spec', 'values']) + + def __init__(self, attr_space, attrs, outer = None): + outer_scopes = outer.scopes if outer else [] + inner_scope = self.SpecValuesPair(attr_space, attrs) + self.scopes = [inner_scope] + outer_scopes + + def lookup(self, name): + for scope in self.scopes: + if name in scope.spec: + if name in scope.values: + return scope.values[name] + spec_name = scope.spec.yaml['name'] + raise Exception( + f"No value for '{name}' in attribute space '{spec_name}'") + raise Exception(f"Attribute '{name}' not defined in any attribute-set") + + # # YNL implementation details. # @@ -548,24 +568,22 @@ class YnlFamily(SpecFamily): else: rsp[name] = [decoded] - def _resolve_selector(self, attr_spec, vals): + def _resolve_selector(self, attr_spec, search_attrs): sub_msg = attr_spec.sub_message if sub_msg not in self.sub_msgs: raise Exception(f"No sub-message spec named {sub_msg} for {attr_spec.name}") sub_msg_spec = self.sub_msgs[sub_msg] selector = attr_spec.selector - if selector not in vals: - raise Exception(f"There is no value for {selector} to resolve '{attr_spec.name}'") - value = vals[selector] + value = search_attrs.lookup(selector) if value not in sub_msg_spec.formats: raise Exception(f"No message format for '{value}' in sub-message spec '{sub_msg}'") spec = sub_msg_spec.formats[value] return spec - def _decode_sub_msg(self, attr, attr_spec, rsp): - msg_format = self._resolve_selector(attr_spec, rsp) + def _decode_sub_msg(self, attr, attr_spec, search_attrs): + msg_format = self._resolve_selector(attr_spec, search_attrs) decoded = {} offset = 0 if msg_format.fixed_header: @@ -579,10 +597,12 @@ class YnlFamily(SpecFamily): raise Exception(f"Unknown attribute-set '{attr_space}' when decoding '{attr_spec.name}'") return decoded - def _decode(self, attrs, space): + def _decode(self, attrs, space, outer_attrs = None): if space: attr_space = self.attr_sets[space] rsp = dict() + search_attrs = SpaceAttrs(attr_space, rsp, outer_attrs) + for attr in attrs: try: attr_spec = attr_space.attrs_by_val[attr.type] @@ -594,7 +614,7 @@ class YnlFamily(SpecFamily): continue if attr_spec["type"] == 'nest': - subdict = self._decode(NlAttrs(attr.raw), attr_spec['nested-attributes']) + subdict = self._decode(NlAttrs(attr.raw), attr_spec['nested-attributes'], search_attrs) decoded = subdict elif attr_spec["type"] == 'string': decoded = attr.as_strz() @@ -617,7 +637,7 @@ class YnlFamily(SpecFamily): selector = self._decode_enum(selector, attr_spec) decoded = {"value": value, "selector": selector} elif attr_spec["type"] == 'sub-message': - decoded = self._decode_sub_msg(attr, attr_spec, rsp) + decoded = self._decode_sub_msg(attr, attr_spec, vals) else: if not self.process_unknown: raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}') From patchwork Mon Jan 29 22:34:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536453 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 602494F88E; Mon, 29 Jan 2024 22:35:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567728; cv=none; b=jWkAjX/lwLUbJPHSrdpTC1qxEgWD4lzKRMtYpYj5qwM8OXzds0wylSo2VvVpitdeAyKUHSKbnBmTwvvZUhxxFu3uEViqri9tRQx23WtM3/alkvA8fm+3Y92OePC1NoZmvH5Uc6QRwSw+BeQWvJUZTjaXTJsShCOvTTmU52jqPp8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567728; c=relaxed/simple; bh=XUCRM/KfecuYYb42+fz4AbPXcbIlUDFTDJChPwbbgtY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T7MtSPBDdOBekieGRQ9ZRDIQtPpWDAkyrmj+1t/MtUGY7x7qWQfi8aBEaouMDL7OfNQp4rGj4PvB6k20G50lZZ/d+7oJGifRTQTSikxOjffqYUewX8PTihEEXwkHk2JVZ+/L6NnJSS2xbmcDH5PdEEcVNZV+sU8blF7ROd/18ks= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HbbJWj00; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HbbJWj00" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-40e72a567eeso51908825e9.0; Mon, 29 Jan 2024 14:35:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567724; x=1707172524; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dOw08TVc7E3Usuj6AiFlUBllrHJ+QmGBs3FGjEsWVTg=; b=HbbJWj00cRQFpCKO+0CI5N0T81YDa5dABDr0nNShZa5Ak6P3Uv9v8ZK1EptUb7l8hW RekvnZ8nu46DnJTLi4oPGN4OlJBb6Hsht4h9+QhHVdSLsF+6ZmkIO/hiUDzvJtckwvSf c+Rc7GnUgv5gPX/EL6WH2OWVsROpWJAF/wG7cuM2tmxQ1FdjfRAeUQHIPT0HY+gKjdKX asbvvHnF9ohyRezjNBl6AKH9rM/Z46u+xvOKYeaV5s1Jz/h+ZHNgdic94mxGNtmSF0kN tto6siNf4pmLcWO/QChpQyG0cVVutkHLPFL7eY3XeWdriV8jLREdlcZPxY22cbeQnO/u GZ1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567724; x=1707172524; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dOw08TVc7E3Usuj6AiFlUBllrHJ+QmGBs3FGjEsWVTg=; b=uWQIJV+T1+4rBjPSBz0hxE6eg+KFUsXJqIfHI51OoJJFI+9Ne6cdbfsrvlwIeX0ZjX QXXLOQ1fGnuvevjqiz/GEc/YMeN+9i+AHhXb1PCVHTT6G85uos9syXLMrMv+MuhpF/iy a8nxCsYeExtRiKmUqTE4r5nPEzvXIcfjdx6vUHEoITa0ejt6kCiXQOMCoqRnfBh7U4qb 27KRVNawOffDFJYBQavvLb3IqMiKWS+f0RY1/TXkQHSh60cT9NQ3rX4InOZh4ylXE6eG nn8VoaWIYYs4GnLFByUFsfk8uZBR8tIvmLl+oE7ZKhLtB4ZowbFNx8v93kmuyUdGWF3i +a0Q== X-Gm-Message-State: AOJu0YywzSx1/vp4v7GzLmSg1OmzKm8bo9rKb8d8fuapkJFKol6EZEjW fXKFq4h9x2Aoz2LgzPjwO9OAIxIRM9e1PXPXmILDaw59uZfN818AxMIyjiqpRBA= X-Google-Smtp-Source: AGHT+IGn0PFd3TkURgIXPxOZab05f4xIpSi0HQK0t/KV2YlwzUrlEbLjNNrIZiItDVTRDNzxxMc3tQ== X-Received: by 2002:a5d:4e89:0:b0:337:c58c:95f1 with SMTP id e9-20020a5d4e89000000b00337c58c95f1mr5049860wru.53.1706567724048; Mon, 29 Jan 2024 14:35:24 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:23 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 03/13] doc/netlink: Describe sub-message selector resolution Date: Mon, 29 Jan 2024 22:34:48 +0000 Message-ID: <20240129223458.52046-4-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Update the netlink-raw docs to add a description of sub-message selector resolution to explain that selector resolution is constrained by the spec. Signed-off-by: Donald Hunter --- Documentation/userspace-api/netlink/netlink-raw.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Documentation/userspace-api/netlink/netlink-raw.rst b/Documentation/userspace-api/netlink/netlink-raw.rst index 1e14f5f22b8e..32197f3cb40e 100644 --- a/Documentation/userspace-api/netlink/netlink-raw.rst +++ b/Documentation/userspace-api/netlink/netlink-raw.rst @@ -150,3 +150,11 @@ attributes from an ``attribute-set``. For example the following Note that a selector attribute must appear in a netlink message before any sub-message attributes that depend on it. + +If an attribute such as ``kind`` is defined at more than one nest level, then a +sub-message selector will be resolved using the value 'closest' to the selector. +For example, if the same attribute name is defined in a nested ``attribute-set`` +alongside a sub-message selector and also in a top level ``attribute-set``, then +the selector will be resolved using the value 'closest' to the selector. If the +value is not present in the message at the same level as defined in the spec +then this is an error. From patchwork Mon Jan 29 22:34:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536454 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 580285103F; Mon, 29 Jan 2024 22:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567729; cv=none; b=B6vlfpvDd5Hlrp+yDicczWFQAgvtTF8JYI6h/QNFrOyZov4WVPMr/Vp+GxWgnaFA/li+wK5IJaKnqzVunD78u8NLhSPYvA7DqsY0UnTMMbW9ecqAb6keaiRgVR7F8lz0usDVAdtULPGLhzwGZUQz22gRz3QMVcAfrsqJh0ktnkM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567729; c=relaxed/simple; bh=ANtnWEVXI1AV83OlOcvNu9rEOkcP/Did4RzDf3NBz7A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IZCoEwm8Io9tMKEfQwm1vVgpr+UX9l2QJrBCQR/2/ox7RJT5HK/GmxE3QcLrMoLIke0337gG6CuXL6oiNvEYHhCna5PGtgDB+s7AaxScY8e9jjK9iAjT4kZW2JsSk6pyEpPvZ5z3C/x5kYpvzsa0kRdTthljZNnF5TaUPAncyq4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mSQ/++pb; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mSQ/++pb" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-40ef6bbb61fso12706055e9.1; Mon, 29 Jan 2024 14:35:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567725; x=1707172525; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2JM/gR7NVL2DszlNp4e0M5nRJ+g7WurjZDhv7/vO4M8=; b=mSQ/++pblmbRrBilm/tDehiAGGxiZcgyRZ2aapT3oUDGRUh5zVZZihjArO/PKgFBEi 12MNPcuC1umrPf3HZjbT5WaSL4LM/wdUzDz247CLpQRaYsP7Z5Ic4cMY0cVEEchl3Wx7 macShYiGQmhPojmwOopL4bNYtOjyhXAwuU9Palh22tG4BVU+GnTbiVBeqC4Lg/YJRRlz EqOUltd/cslH13m9G0UejXCJq8PQJ4IFTKRk1k9WzwOaDlHewBgGmlvanKiWlW0gp1Fo g3LNtfSjW0QvFHm5gZeHB3VNpjWykPnrKy6loHxPijk4Ui2XgujgNodJ8mTWsB3V4cSu nXpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567725; x=1707172525; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2JM/gR7NVL2DszlNp4e0M5nRJ+g7WurjZDhv7/vO4M8=; b=CKFZzbYrBdjbypBMUpB9TLUvsKXEgOcY8WYOsUzW6DFZyehzoloB0XITJMEgK7vVHr UKGHyNQ9ULw6AtrCJ9W/QjwNldU6llTv46+baKShkF/689PSkgZkEo3Cp9IowYujTSKR pxDU23RvIhuWwuEE5pixLkvMhbB7GuxOeC2dzOGrFpzua7wMxUyyZkAlOvxu0S77XlTX FHs5veeOrau0oz3bUI6xwmeRf52DXhuMyjG6M97GtsU9FtWLD2Cw5Ac1hZCj8FGiOd+j mHiafY+NZqRFi/iN0gioXBWNCYK/nEQ0tAX02yWWaoYZ2mPEaiQwfiSSrjj2Ou8TLDtW 6wig== X-Gm-Message-State: AOJu0YwO4+cnBB/p/977T51BPCyjKt8IFxuse54fzq4wWJMmxRQzZWSF /WPPo1Vi4QjQIcBh+uwFTE2lgs4CS8dkssZUX5PE176EggRUqm9OWZUyzGASpUA= X-Google-Smtp-Source: AGHT+IFU+8Qwwv4EGo4YN8morFOH48qe1RGdvIgF1fueHIhQEyQguKULDOk7xYplmwi7bx7csUmuRw== X-Received: by 2002:a05:600c:4f10:b0:40f:210:e60f with SMTP id l16-20020a05600c4f1000b0040f0210e60fmr75747wmq.18.1706567725185; Mon, 29 Jan 2024 14:35:25 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:24 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 04/13] tools/net/ynl: Refactor fixed header encoding into separate method Date: Mon, 29 Jan 2024 22:34:49 +0000 Message-ID: <20240129223458.52046-5-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Refactor the fixed header encoding into a separate _encode_struct method so that it can be reused for fixed headers in sub-messages and for encoding structs. Signed-off-by: Donald Hunter Reviewed-by: Breno Leitao --- tools/net/ynl/lib/ynl.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index f24581759acf..b22ddedb801b 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -720,6 +720,20 @@ class YnlFamily(SpecFamily): fixed_header_attrs[m.name] = value return fixed_header_attrs + def _encode_struct(self, name, vals): + members = self.consts[name].members + attr_payload = b'' + for m in members: + value = vals.pop(m.name) if m.name in vals else 0 + if m.type == 'pad': + attr_payload += bytearray(m.len) + elif m.type == 'binary': + attr_payload += bytes.fromhex(value) + else: + format = NlAttr.get_format(m.type, m.byte_order) + attr_payload += format.pack(value) + return attr_payload + def handle_ntf(self, decoded): msg = dict() if self.include_raw: @@ -779,18 +793,8 @@ class YnlFamily(SpecFamily): req_seq = random.randint(1024, 65535) msg = self.nlproto.message(nl_flags, op.req_value, 1, req_seq) - fixed_header_members = [] if op.fixed_header: - fixed_header_members = self.consts[op.fixed_header].members - for m in fixed_header_members: - value = vals.pop(m.name) if m.name in vals else 0 - if m.type == 'pad': - msg += bytearray(m.len) - elif m.type == 'binary': - msg += bytes.fromhex(value) - else: - format = NlAttr.get_format(m.type, m.byte_order) - msg += format.pack(value) + msg += self._encode_struct(op.fixed_header, vals) for name, value in vals.items(): msg += self._add_attr(op.attr_set.name, name, value) msg = _genl_msg_finalize(msg) From patchwork Mon Jan 29 22:34:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536455 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2AA7E51C3B; Mon, 29 Jan 2024 22:35:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567729; cv=none; b=PTllyVcCyj3o/6iVFC2c7/qgpA1dFCacdOyAN03X6ri0mIj7KAOdn4BUBMqaGpq7Pc4K7tY2XlXCKb4cVWLmSDjfwPD5/m9kIONZHDCecA5Ln8eEPZBjCMAQmqQtF4B8JRFbByQHRNJRHWCOgwHQNUJyX/J+AAIcW7xpwIxmmwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567729; c=relaxed/simple; bh=hWx/ja2QPXjY1phmYXHcxIxn2UDyl08MO3R4pYjnO6E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PVbYWswXp8k2nXnGhEKFFtHunpkRhsSDDdh27d1Uk/hkmPUz00ORL1UULkXU8R/OMdjSlCUVfrF6g9rvoelMMhB60rZv/Jwu9Becf46Y8yjkD6xHWGgAn9qJjWbQE48wutSALd+w9OjCJTXss8y/ssrEcVQjg+Rx/Cgiji/xOhA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JTTlhBjM; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JTTlhBjM" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40f021d3f00so271065e9.0; Mon, 29 Jan 2024 14:35:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567726; x=1707172526; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SVmTeSgbnkcz+pALfFAGVh+BIbjfMn1ebWVGvNl/cfE=; b=JTTlhBjMBELQkFzdyWk8Z9/fRO7m/9vuKhBwh95eA0HK92X/Q3rKryAhB88csLW+zC 7NirOK+neAKZyNh+OdN3LkxbiJoU60AZbDY3D2jB+9DgREM7hfwAZk4peRpmrP+/HAyX dE4h2qxKZ3TKvj+3fLqDYdfsgugbpuGQKiiQ52HdJEAHHFdHdqtnSP66xqeSgR787Wbd 9O1dRfqXR9no/1fSaLslpCdEbwjXB8bLU80jGsY4jvT+/YFnm2d3cdLOBloYeLEpkVdO v3Id4F1XBnO1Y8RLMiIhrkY/w7tjfevJqBsI9FHT+e/2fL4vxudi2BVRMRUU0ZySPitC e7rA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567726; x=1707172526; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SVmTeSgbnkcz+pALfFAGVh+BIbjfMn1ebWVGvNl/cfE=; b=HKpChVdE507nBKCyuUf8J8IER5O6UCg/huY2XURu5XJ00C0hTbOtxx1PqHK1JTqB/e 9z70aeqfHMnDB7lmOcI5u+DdrO8hG0T2JamrqCIo61eZQSZsoemb0t1D73kYLwQqdiPg /PoootjCb2vYOnv/sUde8Q46I3oVMFz36wkeXomYUq2Zq3UW2wDHn11U1JSQ4GOv/fTo apsCTcU1CzyYJeulZGsHpz3fzdyVAaEyPC0vYhbF9g7P/6dqiSo6jS2PhF4EtJpyPCh7 7FEe+5+XukYQFjLJHXekeufCqZCUHPCl7X9ULoUPw3R4mokmD2/kvOL6OMNRPTwp24Xq XABA== X-Gm-Message-State: AOJu0Yy9dhjpWQgiInhnnRgoUU08sBsFUyMQeaYfj6jQWbUgPgqFB8gn 8qBBtv2X2bmYWfCT4aWe3QGIHaH1fEwpj3wG+CDk6FcA/eYz3+OHEGMz7OWYIv0= X-Google-Smtp-Source: AGHT+IGM0/coxBJnjo+o1MWTQNKo7eLMj1fp1SMkGV8xwHedlPVV7WPIKMAGIyNPfN/ZChX1W6/ZVA== X-Received: by 2002:a05:600c:5123:b0:40d:484e:935 with SMTP id o35-20020a05600c512300b0040d484e0935mr6009812wms.12.1706567726226; Mon, 29 Jan 2024 14:35:26 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:25 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 05/13] tools/net/ynl: Add support for encoding sub-messages Date: Mon, 29 Jan 2024 22:34:50 +0000 Message-ID: <20240129223458.52046-6-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Add sub-message encoding to ynl. This makes it possible to create tc qdiscs and other polymorphic netlink objects. Signed-off-by: Donald Hunter --- tools/net/ynl/lib/ynl.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index b22ddedb801b..b063094e8a4b 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -469,7 +469,7 @@ class YnlFamily(SpecFamily): self.sock.setsockopt(Netlink.SOL_NETLINK, Netlink.NETLINK_ADD_MEMBERSHIP, mcast_id) - def _add_attr(self, space, name, value): + def _add_attr(self, space, name, value, search_attrs): try: attr = self.attr_sets[space][name] except KeyError: @@ -478,8 +478,10 @@ class YnlFamily(SpecFamily): if attr["type"] == 'nest': nl_type |= Netlink.NLA_F_NESTED attr_payload = b'' + sub_attrs = SpaceAttrs(self.attr_sets[space], value, search_attrs) for subname, subvalue in value.items(): - attr_payload += self._add_attr(attr['nested-attributes'], subname, subvalue) + attr_payload += self._add_attr(attr['nested-attributes'], + subname, subvalue, sub_attrs) elif attr["type"] == 'flag': attr_payload = b'' elif attr["type"] == 'string': @@ -489,6 +491,8 @@ class YnlFamily(SpecFamily): attr_payload = value elif isinstance(value, str): attr_payload = bytes.fromhex(value) + elif isinstance(value, dict) and attr.struct_name: + attr_payload = self._encode_struct(attr.struct_name, value) else: raise Exception(f'Unknown type for binary attribute, value: {value}') elif attr.is_auto_scalar: @@ -501,6 +505,20 @@ class YnlFamily(SpecFamily): attr_payload = format.pack(int(value)) elif attr['type'] in "bitfield32": attr_payload = struct.pack("II", int(value["value"]), int(value["selector"])) + elif attr['type'] == 'sub-message': + msg_format = self._resolve_selector(attr, search_attrs) + attr_payload = b'' + if msg_format.fixed_header: + attr_payload += self._encode_struct(msg_format.fixed_header, value) + if msg_format.attr_set: + if msg_format.attr_set in self.attr_sets: + nl_type |= Netlink.NLA_F_NESTED + sub_attrs = SpaceAttrs(msg_format.attr_set, value, search_attrs) + for subname, subvalue in value.items(): + attr_payload += self._add_attr(msg_format.attr_set, + subname, subvalue, sub_attrs) + else: + raise Exception(f"Unknown attribute-set '{msg_format.attr_set}'") else: raise Exception(f'Unknown type at {space} {name} {value} {attr["type"]}') @@ -637,7 +655,7 @@ class YnlFamily(SpecFamily): selector = self._decode_enum(selector, attr_spec) decoded = {"value": value, "selector": selector} elif attr_spec["type"] == 'sub-message': - decoded = self._decode_sub_msg(attr, attr_spec, vals) + decoded = self._decode_sub_msg(attr, attr_spec, search_attrs) else: if not self.process_unknown: raise Exception(f'Unknown {attr_spec["type"]} with name {attr_spec["name"]}') @@ -795,8 +813,9 @@ class YnlFamily(SpecFamily): msg = self.nlproto.message(nl_flags, op.req_value, 1, req_seq) if op.fixed_header: msg += self._encode_struct(op.fixed_header, vals) + search_attrs = SpaceAttrs(op.attr_set, vals) for name, value in vals.items(): - msg += self._add_attr(op.attr_set.name, name, value) + msg += self._add_attr(op.attr_set.name, name, value, search_attrs) msg = _genl_msg_finalize(msg) self.sock.send(msg, 0) From patchwork Mon Jan 29 22:34:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536456 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 698EC4F88E; Mon, 29 Jan 2024 22:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567731; cv=none; b=L/lm1SYE8PT1bU+s8Rwf8BZ4RaOffGXKo0vJ0RvMkFXUYQQAEyGRIc1yJSVTyi07PxQnTAWyJMuyA0H34fU0OS8dO2wEtORxPgcfZLC/+JIqhGzo0PV6+N3tsSPyzGAlg/drcqlFBbXMS/TKu4rYygcsb0DFN01fSgbx8jYxXIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567731; c=relaxed/simple; bh=ZASf48694OrEmuDePErvbVSLSggReyyUKqPIO7O3PJc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uztYdjVkahSSqzY+xU71CrI/PV8Wm3Rwiq1f79wmkbv64yIyaKL9aed7as/jkKEc710a17mdN/aCFuwYbKhT3Fm0dISPsgz/FcJRoGp+OekuC8yAjSArpip/kmZCim3GEW5bPbZNj0J0X8Rc9qhHHXm36u+PWO8m+/7InupWgnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IjsSPFgN; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IjsSPFgN" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-40e800461baso47412935e9.3; Mon, 29 Jan 2024 14:35:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567727; x=1707172527; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gFL3pgYoLnlV7dRNW/O+RioCRgfWEC9qcVky3MedcLo=; b=IjsSPFgNA6w1MOGMYXPo+vU7qsSzLDpB1seN18GXz30mle4L7rw/1LVbWc7qBFHxMa Ury4/N8NzgFutcje4UAfFBwpEsylsKVisg18iE65tKAy+WC216WqlPzieLe+dx9WsXC2 RQggVU5t/2I95gYDhb7YpLyhB0yPSJ83zzvO6SKUfom5RroSjTywUMD+2eTjRyoa6w3u UCX922bPF442W9mTrvu7t9keGHqoRkzNR4dV4AoZsxcd59Hf0PLvu5RiTgOOzvAj7sc6 mFwURxIRQvn6p12OOmFnvXlJW5B1Jwi2lBJ3yaicc9Pbdzp5VEt7IDJQYEv3WF9PX4s9 tQSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567727; x=1707172527; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gFL3pgYoLnlV7dRNW/O+RioCRgfWEC9qcVky3MedcLo=; b=OjdUmPZ7/z/s9Lzy38+idpYexJ6nXBREIT5F7bzKJPJpYagJjfDEc/4OvyIZyAcE02 QKCpg/QW1yASNRxHMKhvLcg3GK0dyrH++ugzTeY57k4/k/XaUZQEW5RwI11BzaT7lmEJ J0jjx43QB0p+xH9eeh61xbmtcnPg/kXCsXr+MzzFdwFGRBb2w27V+A/e0glQWLozP+To qvcC1KE7xx2fUeM3MNL1+efwwUDwiY6o18d3S9XZakAkcz73BpVe3GFmMf05Pu+x/thJ 0rLK7w6werHWyGsb8iIrDzoaDi2Degebk/nS4Go45eul5CA2TjfLSrimM8iw9LYlFjDX PQQw== X-Gm-Message-State: AOJu0YyGvCLMnk71r7vLmI0vssg5m621vIJYtflDZBMyDntA/G9pf1FJ gE5RbdimHmqB1SY8hA+fxlnFJ6DcqrccBo/mQo27kWkCpdIqGFevQH3KXK7P/rE= X-Google-Smtp-Source: AGHT+IHCh02Mtuqjh2ITXAJ6/WFwFQdpBis6XGKqpnJ/9SLLVD4MwT7cex2KUkDqLiUoAcIY0exYkw== X-Received: by 2002:a05:600c:4754:b0:40e:a39e:461f with SMTP id w20-20020a05600c475400b0040ea39e461fmr6482057wmo.38.1706567727322; Mon, 29 Jan 2024 14:35:27 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:26 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 06/13] tools/net/ynl: Encode default values for binary blobs Date: Mon, 29 Jan 2024 22:34:51 +0000 Message-ID: <20240129223458.52046-7-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Add support for defaulting binary byte arrays to all zeros as well as defaulting scalar values to 0 when encoding input parameters. Signed-off-by: Donald Hunter --- tools/net/ynl/lib/ynl.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index b063094e8a4b..d04435f26f89 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -742,12 +742,17 @@ class YnlFamily(SpecFamily): members = self.consts[name].members attr_payload = b'' for m in members: - value = vals.pop(m.name) if m.name in vals else 0 + value = vals.pop(m.name) if m.name in vals else None if m.type == 'pad': attr_payload += bytearray(m.len) elif m.type == 'binary': - attr_payload += bytes.fromhex(value) + if value is None: + attr_payload += bytearray(m.len) + else: + attr_payload += bytes.fromhex(value) else: + if value is None: + value = 0 format = NlAttr.get_format(m.type, m.byte_order) attr_payload += format.pack(value) return attr_payload From patchwork Mon Jan 29 22:34:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536457 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 782FC524CC; Mon, 29 Jan 2024 22:35:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567732; cv=none; b=ptpEEeD+dlZB6jDHSLw7zUb3piht2FOjBiWoZM2vdnkJcCFrsYLZXkB4Xb0GZQ5X0hmgl5fLMrnBzI7350Yle95+TqIeYtJOU8iuCMfNjhNaPYThlkFJpgr8u5ueDSxQOHeIoZUbEP2LycSuLb2gV4v50Kc29jDjU3orxb7w/tA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567732; c=relaxed/simple; bh=eRAww5xgaHUIVRBj6TwxVDcJuENASUe3CnxQkrZ4xnY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q0q277ARpN/VpdebaqzOIIoNKdLXSlEdS7dI2k2vCFoa5bDPvaQ1b1cgkYD0Em/SvmDJAvRl5BvJw6FVwxsx3CtdTX3z5jJwCVUuGrwfeMwNB8XZrigK0Kt1RwEv0KdPLociVrdxQdOEF7LPJJJGOwh/x+VG3SJWMEnSNwutlvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WIAYEfx+; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WIAYEfx+" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-40ef6bbb61fso12706485e9.1; Mon, 29 Jan 2024 14:35:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567728; x=1707172528; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qKr9Frm0cRtXPQqadchGci8z9VSX2tvpauuGJGrN5Xk=; b=WIAYEfx+g7IOyrvxat090ZF5RX7IpwhasictjXoVldCzSSgpb/2isbECDkf16iOb2z +Wo63MRb8nXVoVqXhIye7PFCZANDXJiT1j82Xc9/XTS/EF9FDlIgE4cBXOouBhuxJt/N GlcQ89GYe9fj+yvdut1d5S5r8ydNfsArBIg/mowvkAx+H0FcDO46oKdjxgOL556eHFVc t3W6SEf+jXe5FJj0vy3ey2jazqodXMTOfOviRgzlBH17ool5Ea2v3IMTTpNSUyYH3QSk fdXnWsmm5q4PRki6c74/ZC5rq6b3kMYK0xo7ptm5DbnoG5woVPJi3gQQlL1dkFmPddj2 kYPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567728; x=1707172528; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qKr9Frm0cRtXPQqadchGci8z9VSX2tvpauuGJGrN5Xk=; b=d+lfUQcyYcdP8j6iz/bhBaaE3QFAbyOVhsRXTm3zzzje+zOa/oUcKfh+GkjORpbhvq p5PT3IedneRqs55Fzi6nOqvi/iBAfkwYy9MAXbKLD4zIJ+9sFq7z9Si16xUMQAmcMy4d GHgsLNAZxIrQYtrRm+iH/syzA5XyFdo6gHBBjXUKhMiwKMabT6QJNvEAuc3N0s6oD8ss Qdtz1LEbay3WK+/4pqcxWxMifSqlRgmmQRSosW+cnT2K02roapeXEHevNLLFyj2OKqoO ZwMoXK/5vPInSA3Xn+8dSCO23SGjWv3xVFqyelx6PsJsoykfwyYgy9RyWAu2hxQRKbBt 4U/g== X-Gm-Message-State: AOJu0YyH00e1gordFEmscCcVLUOAePzTmtMRWLEOX1pcjaAPdJv45Czu mbGR+t/ohrcCRmy7XP9PyF0yg1F8vn4nBq1uIUFbi4wC/Gf78HUiirPyT4Rdmfg= X-Google-Smtp-Source: AGHT+IG7nMldgOYEdJm7omsPAva55gUjRgd9Yn1wTqO9ntdeCtBmor+h96XDDLcQqjBcH60wvbjc2A== X-Received: by 2002:a05:600c:2110:b0:40e:ce9e:b543 with SMTP id u16-20020a05600c211000b0040ece9eb543mr5395149wml.41.1706567728403; Mon, 29 Jan 2024 14:35:28 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:27 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 07/13] tools/net/ynl: Combine struct decoding logic in ynl Date: Mon, 29 Jan 2024 22:34:52 +0000 Message-ID: <20240129223458.52046-8-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org _decode_fixed_header() and NlAttr.as_struct() both implemented struct decoding logic. Deduplicate the code into newly named _decode_struct() method. Signed-off-by: Donald Hunter --- tools/net/ynl/lib/ynl.py | 47 ++++++++++++---------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index d04435f26f89..0e7e9f60ab7e 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -148,23 +148,6 @@ class NlAttr: format = self.get_format(type) return [ x[0] for x in format.iter_unpack(self.raw) ] - def as_struct(self, members): - value = dict() - offset = 0 - for m in members: - # TODO: handle non-scalar members - if m.type == 'binary': - decoded = self.raw[offset : offset + m['len']] - offset += m['len'] - elif m.type in NlAttr.type_formats: - format = self.get_format(m.type, m.byte_order) - [ decoded ] = format.unpack_from(self.raw, offset) - offset += format.size - if m.display_hint: - decoded = self.formatted_string(decoded, m.display_hint) - value[m.name] = decoded - return value - def __repr__(self): return f"[type:{self.type} len:{self._len}] {self.raw}" @@ -541,11 +524,7 @@ class YnlFamily(SpecFamily): def _decode_binary(self, attr, attr_spec): if attr_spec.struct_name: - members = self.consts[attr_spec.struct_name] - decoded = attr.as_struct(members) - for m in members: - if m.enum: - decoded[m.name] = self._decode_enum(decoded[m.name], m) + decoded = self._decode_struct(attr.raw, attr_spec.struct_name) elif attr_spec.sub_type: decoded = attr.as_c_array(attr_spec.sub_type) else: @@ -605,7 +584,7 @@ class YnlFamily(SpecFamily): decoded = {} offset = 0 if msg_format.fixed_header: - decoded.update(self._decode_fixed_header(attr, msg_format.fixed_header)); + decoded.update(self._decode_struct(attr.raw, msg_format.fixed_header)); offset = self._fixed_header_size(msg_format.fixed_header) if msg_format.attr_set: if msg_format.attr_set in self.attr_sets: @@ -717,26 +696,28 @@ class YnlFamily(SpecFamily): else: return 0 - def _decode_fixed_header(self, msg, name): - fixed_header_members = self.consts[name].members - fixed_header_attrs = dict() + def _decode_struct(self, data, name): + members = self.consts[name].members + attrs = dict() offset = 0 - for m in fixed_header_members: + for m in members: value = None if m.type == 'pad': offset += m.len elif m.type == 'binary': - value = msg.raw[offset : offset + m.len] + value = data[offset : offset + m.len] offset += m.len else: format = NlAttr.get_format(m.type, m.byte_order) - [ value ] = format.unpack_from(msg.raw, offset) + [ value ] = format.unpack_from(data, offset) offset += format.size if value is not None: if m.enum: value = self._decode_enum(value, m) - fixed_header_attrs[m.name] = value - return fixed_header_attrs + elif m.display_hint: + value = NlAttr.formatted_string(value, m.display_hint) + attrs[m.name] = value + return attrs def _encode_struct(self, name, vals): members = self.consts[name].members @@ -764,7 +745,7 @@ class YnlFamily(SpecFamily): op = self.rsp_by_value[decoded.cmd()] attrs = self._decode(decoded.raw_attrs, op.attr_set.name) if op.fixed_header: - attrs.update(self._decode_fixed_header(decoded, op.fixed_header)) + attrs.update(self._decode_struct(decoded.raw, op.fixed_header)) msg['name'] = op['name'] msg['msg'] = attrs @@ -856,7 +837,7 @@ class YnlFamily(SpecFamily): rsp_msg = self._decode(decoded.raw_attrs, op.attr_set.name) if op.fixed_header: - rsp_msg.update(self._decode_fixed_header(decoded, op.fixed_header)) + rsp_msg.update(self._decode_struct(decoded.raw, op.fixed_header)) rsp.append(rsp_msg) if not rsp: From patchwork Mon Jan 29 22:34:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536458 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6931753802; Mon, 29 Jan 2024 22:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567733; cv=none; b=WVuMDJhQgN9gIzmYKZ9V+17/nu3IY3CMuwveIVjeAETMegFCK6WCc7P+Br4MqM+opn9mrUcJJLcKLzFrgnvLP8v5daFLPiLGvKk/4+rTm9QPcHSASZGUBS1MdbpbMKjYagPmyv5R1AGNXpCsib4tX105k+x8+BfJ3lWWj1YAtoE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567733; c=relaxed/simple; bh=v7mHrXLQRTCNsbXYMNkSWpZBqQ2SOM37cEmn1Anbty0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TI5wjuXP97kzV3R8Jq+fCeJzdav3KzcSjlUCwT5YTZIZsVWPSmhCli4NLfu97vVSd3zBalJ+p2YJ1EKezlpFQU8deeXxOz8L5vxcB+io5K0pTEY5eDad5E9awFHwEWLDwIXqXc9c6imJujcSFVDy19Ugrd51DR7tfgNCqDxuH6c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=U5ibpr6d; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="U5ibpr6d" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-33934567777so2685153f8f.1; Mon, 29 Jan 2024 14:35:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567729; x=1707172529; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bfXnxN6LhrHnAn4S/DiUOKAmUqQTDXqkpo6xUmXayic=; b=U5ibpr6dFSjLt2ctg0dkK3IJ+5qNEvPVvQj9qu2E6NPmXKGGyxop02mlUy6PTo8C3a FaAySscRofrfZh/Vq1c3PrUBQILksY5aeNofPuH9yBkQoHN+ClbQ1sAOFsGeNOx3epbA +U8BhuDWHiiwc7WdmHSvhQOTGEq43qjoECke8G9aSRvtvmsAdU39CosF5GlzgSYmFRPA XjBLsV6pT4AsrSSPU8uT0BVq3ZR2W4D73YjuOPfcPxsbTmhFeHhOkEx+p5AWVQGN/LLl 6sxhmMzn6yhld2BU4j4DqM9yJ1BWQckw5ZTflzXYCqRaUu88m5vKTsXPkWJbWqtDioz3 g9Kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567729; x=1707172529; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bfXnxN6LhrHnAn4S/DiUOKAmUqQTDXqkpo6xUmXayic=; b=ZM+E0e4uzwhCQg1os0cnyZDOTJ/2t9xLa6/DO/mwq6iJzI7X169FOiZfzwNb3VmTsL soIVj5MeLryF0VpQ/VbwsB9jeDGp5ZR4D0O8WOW/KvMuQkOcn+JJOBXuN72L0qNZgCeN Kt9UzvtAooEVnMb/cL75Oy2662pXvwMUPoYjJof2uk3bTxSEIrbuXmElrgZ4IHNrrYEr nWgGDYdd08UDGEj+KbWg5lgiUWurwQtX1YwPMtDohkumnziCp1RUC3qWELEvuOJvEqg1 Y+IjeSKCl7iilDdW0BBaYoZClgncbM30UywP9DkNA5o84BB6Mae+vTg+kA4x8H9Dgi7b OASw== X-Gm-Message-State: AOJu0Yx+CzmojQO+Tdvbn9nlRXM9l7YXVQTTW0SOWcLY8ud5hueni2qb Tn3WDEAYB10+QzGMwdhwYIJCsD61nZ60XePCRmF65afpO7ujaswQeBRjKd/mGpM= X-Google-Smtp-Source: AGHT+IGGZF5jQl3IIWuAsaM2aU2t9r80+mOvCIo7AYjYGPJYMksXZy09TOB84rzzslqknE19i6lktg== X-Received: by 2002:a5d:49d1:0:b0:33a:e756:bd21 with SMTP id t17-20020a5d49d1000000b0033ae756bd21mr3602846wrs.43.1706567729446; Mon, 29 Jan 2024 14:35:29 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:29 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 08/13] tools/net/ynl: Rename _fixed_header_size() to _struct_size() Date: Mon, 29 Jan 2024 22:34:53 +0000 Message-ID: <20240129223458.52046-9-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Refactor the _fixed_header_size() method to be _struct_size() so that naming is consistent with _encode_struct() and _decode_struct(). Signed-off-by: Donald Hunter --- tools/net/ynl/lib/ynl.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 0e7e9f60ab7e..173ef4489e38 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -353,7 +353,7 @@ class NetlinkProtocol: fixed_header_size = 0 if ynl: op = ynl.rsp_by_value[msg.cmd()] - fixed_header_size = ynl._fixed_header_size(op.fixed_header) + fixed_header_size = ynl._struct_size(op.fixed_header) msg.raw_attrs = NlAttrs(msg.raw, fixed_header_size) return msg @@ -585,7 +585,7 @@ class YnlFamily(SpecFamily): offset = 0 if msg_format.fixed_header: decoded.update(self._decode_struct(attr.raw, msg_format.fixed_header)); - offset = self._fixed_header_size(msg_format.fixed_header) + offset = self._struct_size(msg_format.fixed_header) if msg_format.attr_set: if msg_format.attr_set in self.attr_sets: subdict = self._decode(NlAttrs(attr.raw, offset), msg_format.attr_set) @@ -675,18 +675,18 @@ class YnlFamily(SpecFamily): return msg = self.nlproto.decode(self, NlMsg(request, 0, op.attr_set)) - offset = 20 + self._fixed_header_size(op.fixed_header) + offset = 20 + self._struct_size(op.fixed_header) path = self._decode_extack_path(msg.raw_attrs, op.attr_set, offset, extack['bad-attr-offs']) if path: del extack['bad-attr-offs'] extack['bad-attr'] = path - def _fixed_header_size(self, name): + def _struct_size(self, name): if name: - fixed_header_members = self.consts[name].members + members = self.consts[name].members size = 0 - for m in fixed_header_members: + for m in members: if m.type in ['pad', 'binary']: size += m.len else: From patchwork Mon Jan 29 22:34:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536459 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DB4953E07; Mon, 29 Jan 2024 22:35:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567734; cv=none; b=YM0HuF35fHD/IaIuyuRtOlcM4w1udK3pjZtJ3Rd/C3nJG4beSLcRb1bSYku+3I45gdSpNKO+gYyUPwAu4dSVDnj0/MBe/nsQmYUdRT176/hRMs0hqdzzloeSTIqrdyCLt7fI2Je7GaJVWE+ofI6Uko125ljmMsutAfGtNe1ONIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567734; c=relaxed/simple; bh=1mZRqWZII3pMTZWLi8ep1djbp4wRvSZDAG85K3O66ck=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tgu6CksRWt4AFNw/vyWxgIsEbYmnTPnnVP3H4Yoxg7dKvuC7jEZDU+E8nSJSI6SrCVBlQ5Z14/91LH7fh2iRFRXJPJFnkusKVp1zDDoZqsNOyaODHimWQ0NLe/huHnGkp+rUJapqoHiH/scm12AhHRF2EzEzngAXiEFDwy3lcO4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XL3CS2kD; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XL3CS2kD" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-40eec4984acso26169955e9.2; Mon, 29 Jan 2024 14:35:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567730; x=1707172530; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xyCHyvffOH+oRJ6ypOtqrlTb6yApdanhXfSR1Ucu//I=; b=XL3CS2kDBSp0zxPVQdVTBc/pgy7vV7cdkKL6qJYQwsA/uBHjQN3s/Sxb38sjRtcdtz YPKN5aDCJYhYfmWQWvTAzxhoFr794zuG09OOBi119CKJdus8MBN11yyomuyCoBO2/UiJ YlVT+VqITqIWA3cA/Zkcd4Q82CPh1Mbjgq63sxwsIrdK4DJjpmo51ETnNGxZXXC6ejRx ZduSu/kAJ8xyN8QdXHo/4KArLV+RDZaqGtM8aTRfYg0XwCtFuInRGRyRzXgNfGruYIS1 qHsaKCfkoSfWgV4RJtBNf28GRg3TgtxuMxe3z1v9sV9AnhSkYSLCXYutJjx0SMXNX3fb rqVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567730; x=1707172530; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xyCHyvffOH+oRJ6ypOtqrlTb6yApdanhXfSR1Ucu//I=; b=pjJGDhgn9cfHT7Inzx2uKpiOD9FsB5C+7dB++o1GEHQJqzKEudyscm+95ksViziff9 pQIUvJIEsdQVJM9roH5YobSNCSNuMhjZmMpOKC5985kQUkezJI2qyiow9OKwfKgmaAW8 WkHli7cFG+SF33PE78sCA614IM46GbEVDtM8CsqjRhxJXCBxvYQFu5lapYN3Ma2nZyCG mVl/yOrC7gR+MNhOOIH/9A0xg/YUSsmQq1NfGUAQEMaIXacN+VJFAto+3EMzqzggOMc9 1wRawfpiLHumcN3ei32l1Pa3u53CtkIcqdUEgDy/NfQsiBGawwLhdk0ht9UqYUv6li9g vhcw== X-Gm-Message-State: AOJu0Yx3dgISv7qE+tV0PZQ0ypMQfsauCaP6jKBPK8Xj3m4QhdW0w8zE dPYHRgYbSwrhc0fvUqCYWcA/RRvX4iw2veYKBlF+Jdw6daXtEJJ7UEk8cgSDphw= X-Google-Smtp-Source: AGHT+IF62LOUAk04aWRddh9fCzf/eGijkdKw+5e6vuL03XW6DU3uUY4iVsnmXygxkY8W6MlSvXdbKg== X-Received: by 2002:a05:600c:350b:b0:40e:d176:1c98 with SMTP id h11-20020a05600c350b00b0040ed1761c98mr5292202wmq.18.1706567730451; Mon, 29 Jan 2024 14:35:30 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:30 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 09/13] tools/net/ynl: Move formatted_string method out of NlAttr Date: Mon, 29 Jan 2024 22:34:54 +0000 Message-ID: <20240129223458.52046-10-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The formatted_string() class method was in NlAttr so that it could be accessed by NlAttr.as_struct(). Now that as_struct() has been removed, move formatted_string() to YnlFamily as an internal helper method. Signed-off-by: Donald Hunter Reviewed-by: Breno Leitao --- tools/net/ynl/lib/ynl.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 173ef4489e38..2b0ca61deaf8 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -113,20 +113,6 @@ class NlAttr: else format.little return format.native - @classmethod - def formatted_string(cls, raw, display_hint): - if display_hint == 'mac': - formatted = ':'.join('%02x' % b for b in raw) - elif display_hint == 'hex': - formatted = bytes.hex(raw, ' ') - elif display_hint in [ 'ipv4', 'ipv6' ]: - formatted = format(ipaddress.ip_address(raw)) - elif display_hint == 'uuid': - formatted = str(uuid.UUID(bytes=raw)) - else: - formatted = raw - return formatted - def as_scalar(self, attr_type, byte_order=None): format = self.get_format(attr_type, byte_order) return format.unpack(self.raw)[0] @@ -530,7 +516,7 @@ class YnlFamily(SpecFamily): else: decoded = attr.as_bin() if attr_spec.display_hint: - decoded = NlAttr.formatted_string(decoded, attr_spec.display_hint) + decoded = self._formatted_string(decoded, attr_spec.display_hint) return decoded def _decode_array_nest(self, attr, attr_spec): @@ -715,7 +701,7 @@ class YnlFamily(SpecFamily): if m.enum: value = self._decode_enum(value, m) elif m.display_hint: - value = NlAttr.formatted_string(value, m.display_hint) + value = self._formatted_string(value, m.display_hint) attrs[m.name] = value return attrs @@ -738,6 +724,19 @@ class YnlFamily(SpecFamily): attr_payload += format.pack(value) return attr_payload + def _formatted_string(self, raw, display_hint): + if display_hint == 'mac': + formatted = ':'.join('%02x' % b for b in raw) + elif display_hint == 'hex': + formatted = bytes.hex(raw, ' ') + elif display_hint in [ 'ipv4', 'ipv6' ]: + formatted = format(ipaddress.ip_address(raw)) + elif display_hint == 'uuid': + formatted = str(uuid.UUID(bytes=raw)) + else: + formatted = raw + return formatted + def handle_ntf(self, decoded): msg = dict() if self.include_raw: From patchwork Mon Jan 29 22:34:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536460 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C3CA54276; Mon, 29 Jan 2024 22:35:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567735; cv=none; b=oW8XzYCz8jVBw5Pc9cYpFz78KoYVYUh+9yjAtoCm1iixpAZSTfZwEVtW+f4GM9Tv435mzA+jFVOMPkd2e7991McT0VveHxV+Kv9fICTk2+q7IREz5O6rdgASobVVgzTpNLTQR4i76xwf0+vvtz+rqkXKKYnmLdFdf6DOos3mrnE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567735; c=relaxed/simple; bh=hG82PmU96foe+hKO0K3H/9CAb3vxzu+h0O9pK1YlwpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VxCQfUtQd4vXaJoAYPhk+cSyMTZ/FpCazjtbzcH4w3Kt/GyOPYh/l2aqDewZ7et9F2Vq2HHvY9wViHqa8SMY7TeSinzLNY1WNbwjjGL1/nvrdnoo2NWp3s3lSH5PZCWGznaT35LX60IuwGxDlVZSZzcNCdMOPrn65DyuVZorvpo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QpJ7rh0A; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QpJ7rh0A" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-40ef75adf44so11996905e9.3; Mon, 29 Jan 2024 14:35:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567731; x=1707172531; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JLRsyiBLlG1o/uwlyldd0juZuNiwvnE4YR1zXRqyT+w=; b=QpJ7rh0A/KxE1As8+lEQiBzmzQdUGl4zTzPCFKCAbdQ9OFZ9hCLQJRhKfFRRRhUspG UPAb6EmE728GUWJOaR+Dwe8n+yA0RbbdECzyNsjbMVcCWXRuvpsZ/RrXjUKDIPgxV+v6 MYLz4lCAr5CRZTG2u9zjHoScSD6plFN4Dt8kPxLN0k24eTbWn9dbSHyjwA+v3vniutfr mv8wtIR/njXeHbzbuF/8dxax4XhavCZI4pU+VQz5EJQWnSxEo2jfgdY+kcTMVBcmvexA dd6SgACFUzWfydygLk0wWxVmTcM3uSiYMjWR1aIpV5BoCjdRjQDYm5wgUHbHY/GK78No CiMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567731; x=1707172531; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JLRsyiBLlG1o/uwlyldd0juZuNiwvnE4YR1zXRqyT+w=; b=dUi1C75YV59GxtTNO5GxdCIwbykRYI6d3PxtVjTYPjVlSZxJV4478sTxOS09oPTD4W F+tJfZFQKTO7YCSRaiL1/X29Yn0xmJUE7oZS5Di3ADCoPtIsPDwj0TOxuRzKPwFnwBac HMEEkWtkgmKU01JRJZqbKVbTQWmc/OEhOpcOVzeuiXmUujOYx4a4PsHPZmbtj26xw9+C CbHF3fPSO6awAUDqSyAcvpoYz0YDgfyLyPWkC51Rx9HB7yuQ7CkbWXL7tB0iE7nt3LLg L8vwaOQSfkuu1Yn4lw4Z9BdohsGmMLY50p2KRsFw8RRmoZUc0fVgUO//elic/9NDAdMG lAzg== X-Gm-Message-State: AOJu0YzlFVEgIm59XFzyLeZPXvDqJvfz3hdfuiOBsP/1OFcvDiTzvaKG BbCgYwTfASM7w72FtgkjzAx7qwmkIqxNW/o0l6zSRzDgxL7WxxEjfgsfC2h9P+E= X-Google-Smtp-Source: AGHT+IGTz9LEWhX0dX3SS/wuQaV5Jr6/xP6h8h41ftyAq3MUnlT5aqD8ZRaNstpm/25mwUVjKTbydA== X-Received: by 2002:a05:600c:4ecb:b0:40e:4f81:3f68 with SMTP id g11-20020a05600c4ecb00b0040e4f813f68mr6042883wmq.16.1706567731452; Mon, 29 Jan 2024 14:35:31 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:31 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 10/13] tools/net/ynl: Add support for nested structs Date: Mon, 29 Jan 2024 22:34:55 +0000 Message-ID: <20240129223458.52046-11-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Make it possible for struct definitions to reference other struct definitions ofr binary members. For example, the tbf qdisc uses this struct definition for its parms attribute: - name: tc-tbf-qopt type: struct members: - name: rate type: binary struct: tc-ratespec - name: peakrate type: binary struct: tc-ratespec - name: limit type: u32 - name: buffer type: u32 - name: mtu type: u32 This adds the necessary schema changes and adds nested struct encoding and decoding to ynl. Signed-off-by: Donald Hunter --- Documentation/netlink/netlink-raw.yaml | 15 ++++++++++++--- tools/net/ynl/lib/nlspec.py | 2 ++ tools/net/ynl/lib/ynl.py | 26 ++++++++++++++++++++------ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Documentation/netlink/netlink-raw.yaml b/Documentation/netlink/netlink-raw.yaml index 04b92f1a5cd6..ac4e05415f2f 100644 --- a/Documentation/netlink/netlink-raw.yaml +++ b/Documentation/netlink/netlink-raw.yaml @@ -152,14 +152,23 @@ properties: the right formatting mechanism when displaying values of this type. enum: [ hex, mac, fddi, ipv4, ipv6, uuid ] + struct: + description: Name of the nested struct type. + type: string if: properties: type: - oneOf: - - const: binary - - const: pad + const: pad then: required: [ len ] + if: + properties: + type: + const: binary + then: + oneOf: + - required: [ len ] + - required: [ struct ] # End genetlink-legacy attribute-sets: diff --git a/tools/net/ynl/lib/nlspec.py b/tools/net/ynl/lib/nlspec.py index 44f13e383e8a..5d197a12ab8d 100644 --- a/tools/net/ynl/lib/nlspec.py +++ b/tools/net/ynl/lib/nlspec.py @@ -248,6 +248,7 @@ class SpecStructMember(SpecElement): len integer, optional byte length of binary types display_hint string, hint to help choose format specifier when displaying the value + struct string, name of nested struct type """ def __init__(self, family, yaml): super().__init__(family, yaml) @@ -256,6 +257,7 @@ class SpecStructMember(SpecElement): self.enum = yaml.get('enum') self.len = yaml.get('len') self.display_hint = yaml.get('display-hint') + self.struct = yaml.get('struct') class SpecStruct(SpecElement): diff --git a/tools/net/ynl/lib/ynl.py b/tools/net/ynl/lib/ynl.py index 2b0ca61deaf8..0f4193cc2e3b 100644 --- a/tools/net/ynl/lib/ynl.py +++ b/tools/net/ynl/lib/ynl.py @@ -674,7 +674,10 @@ class YnlFamily(SpecFamily): size = 0 for m in members: if m.type in ['pad', 'binary']: - size += m.len + if m.struct: + size += self._struct_size(m.struct) + else: + size += m.len else: format = NlAttr.get_format(m.type, m.byte_order) size += format.size @@ -691,8 +694,14 @@ class YnlFamily(SpecFamily): if m.type == 'pad': offset += m.len elif m.type == 'binary': - value = data[offset : offset + m.len] - offset += m.len + if m.struct: + len = self._struct_size(m.struct) + value = self._decode_struct(data[offset : offset + len], + m.struct) + offset += len + else: + value = data[offset : offset + m.len] + offset += m.len else: format = NlAttr.get_format(m.type, m.byte_order) [ value ] = format.unpack_from(data, offset) @@ -713,10 +722,15 @@ class YnlFamily(SpecFamily): if m.type == 'pad': attr_payload += bytearray(m.len) elif m.type == 'binary': - if value is None: - attr_payload += bytearray(m.len) + if m.struct: + if value is None: + value = dict() + attr_payload += self._encode_struct(m.struct, value) else: - attr_payload += bytes.fromhex(value) + if value is None: + attr_payload += bytearray(m.len) + else: + attr_payload += bytes.fromhex(value) else: if value is None: value = 0 From patchwork Mon Jan 29 22:34:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536461 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 89A3854666; Mon, 29 Jan 2024 22:35:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567736; cv=none; b=tWYaVv3ruSU8s7XrvGmf6s0x2i5Cq9nhktnYUdUQWkw0ZmergoPdKm9nkNwyVt0QIjRMXHw3TGU72z3dWl/XBOS1dnCOi0UhmXGxkDTgbxxZ82szKplof7mqP9fa1K8blqdQp7Rhb6ifLX6iJjFMPeh420TqPvGwmQcQw8iP3fQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567736; c=relaxed/simple; bh=/zsXTUB3sjsImCCK9upNqx8I9wVeovJbph39RKjkwx4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MBTTBqhjvOdUJw4K6MW8sjJDBsRpcBNYpbtzXJBmypaaJ9tqY+nUS9O+5vzpjYBvfW8jasTu0XM4dXSCZie+x7E4lI8gQSP6CF0O5zJWz/8/rhBWuZ2AQ3P22rVRQ1enrKF4ulobwMVnjL+s25iZ4cUbI+yo8374UOZWIFfWWFI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=X+zzDs2j; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="X+zzDs2j" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-40ed356a6ecso29309795e9.2; Mon, 29 Jan 2024 14:35:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567732; x=1707172532; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WqSkYHAmR43l7wpB22/dLWRzx8oLOkfvDSmsds3Q2K4=; b=X+zzDs2jeGvGJcWJPXQqPtvoAkRpc5cJ6987kgqMM7EQr7dpAJFJ4oO07c/2SgZf9a 3CcS8Ls6zXvpOzUa+xArqWVQriSfPKqBtz/y8T34MkuiGEaV94YpIV0mao10oLuxY+Kc F+W670lR8nqszqZsCEPiBjlAMYZuLUs2N4BF70RUWaJRgHymKnCw/wxbU2FJIijsV9/k wW0fPFlz2y5u61NF9kFMSYmstbHcfovyK38CAdyQSPj6g2K93JI60mq3INdXZuj+iZw7 yt1vV+EI9wqC4ryXh3dUf7TnJNpL4rvKqnRdfmsxYAnBRgWJsAWPd9kvfZcoxcju3V6p 28bA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567732; x=1707172532; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WqSkYHAmR43l7wpB22/dLWRzx8oLOkfvDSmsds3Q2K4=; b=P+RkmYyTNO6DP42Lglfa0nxlpRMDhKhjOwYlHsEe9OhGwXGy38NQtOkYxPXaF5sQyo GqKPTiWLe1dJWoMPmKhyKFf7n27JpHd+D51vH1ZIAO7l16SVxYtRaw5ZYSg6JdYaWqrO VBdRt8lc7x8FS9Dq5lsdt31ORTfnYbIql9PU+2tR1g3X/Y95OJ5yuUdiGLcpU4ZYdGBn 9r34xGmY01n+x6+rXielXR+Xbr4DCdc0okuoIDKiJJ+prRk3aM9FmRrawtEiQdzPmfcZ rKjIP6CbfqaneMcDtH68j5Egi6H7NfSSMqF2P5J4+hxHmm9u/YeSDJ0+njkrJ6kWaqe9 BN0Q== X-Gm-Message-State: AOJu0YxitKApvF/s+GqnCCn/j1cxPTbzoOQMxpuwbaaJ373rS+6P2lNY QdRI14SFcxESvwAyv+jAsxo7WUoAyJykdc2kjrr1Hvz+++0qEI23kU1sGm1k0lQ= X-Google-Smtp-Source: AGHT+IGFR4Pfb1zlHg1h0N+vtD1O0WHmdcvf/w22FftA+PBZvJeX0mHNgQrPEi1nCuEoj4ThBSj4iA== X-Received: by 2002:a1c:7914:0:b0:40e:ccca:33e with SMTP id l20-20020a1c7914000000b0040eccca033emr6275758wme.31.1706567732462; Mon, 29 Jan 2024 14:35:32 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:32 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 11/13] doc/netlink: Describe nested structs in netlink raw docs Date: Mon, 29 Jan 2024 22:34:56 +0000 Message-ID: <20240129223458.52046-12-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Add a description and example of nested struct definitions to the netlink raw documentation. Signed-off-by: Donald Hunter --- .../userspace-api/netlink/netlink-raw.rst | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Documentation/userspace-api/netlink/netlink-raw.rst b/Documentation/userspace-api/netlink/netlink-raw.rst index 32197f3cb40e..1990eea772d0 100644 --- a/Documentation/userspace-api/netlink/netlink-raw.rst +++ b/Documentation/userspace-api/netlink/netlink-raw.rst @@ -158,3 +158,37 @@ alongside a sub-message selector and also in a top level ``attribute-set``, then the selector will be resolved using the value 'closest' to the selector. If the value is not present in the message at the same level as defined in the spec then this is an error. + +Nested struct definitions +------------------------- + +Many raw netlink families such as :doc:`tc<../../networking/netlink_spec/tc>` +make use of nested struct definitions. The ``netlink-raw`` schema makes it +possible to embed a struct within a struct definition using the ``struct`` +property. For example, the following struct definition embeds the +``tc-ratespec`` struct definition for both the ``rate`` and the ``peakrate`` +members of ``struct tc-tbf-qopt``. + +.. code-block:: yaml + + - + name: tc-tbf-qopt + type: struct + members: + - + name: rate + type: binary + struct: tc-ratespec + - + name: peakrate + type: binary + struct: tc-ratespec + - + name: limit + type: u32 + - + name: buffer + type: u32 + - + name: mtu + type: u32 From patchwork Mon Jan 29 22:34:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536462 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B3BE53E07; Mon, 29 Jan 2024 22:35:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567737; cv=none; b=ZjwZ2HXf+c/gBklAl8+IbMG4ELFyxRPOttqq0n3iDvUN91EP7EWeGBdSevJrxtU2wkHSnQ68+44dB7QJWhf8Zlao6Fpi6rz+sXmOTOlLBr57H4xk6nMy69YtIVA8hrLq5bay8aALXq4w+R+jcas4XGODuXGC9XcU7ztXBhSKV0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567737; c=relaxed/simple; bh=OdvP8j6NATYldZfJ2QxJSvvvX/SxB4R5gU9B3uI+VYQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P8jmwqT1ZyD4QZNcbStvTDLF8vcUTUIwoDIToPyqu4RqJmQDEIFBlWSqe5i7vj74wCs4bYSbR3uKwlJ9PJvPD2ohLUx2jKbmlAmjXPXk3W5opfQC6+juwZWcGMbDwBAp+kXSuX/3a/ryD2OIbVcq+Drr0zuQQJ9MZB6sT3dieUo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Qtlm+oHh; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Qtlm+oHh" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-40eec4984acso26170395e9.2; Mon, 29 Jan 2024 14:35:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567733; x=1707172533; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ClXG9uTDgBMA81lLT/nmnwAaiOCypQE3e9mwTp7YT8E=; b=Qtlm+oHhMmoUafbHyU2IwpI8sj2WcKr9FerNTpbpEWrH3hNSiE93zUEH94O9q/0y8J CCPigCe2HJLTnX3jqPCRZhyhX9+l/jRUrVs79uz7WGRZ7pHuKQnmXITJho+bjIGb7TyO PrNk+qqnCZDyk4HirzyZR7Te+oOYjPCobXgoiKLXZot7WeY/q1c3OeNU92FcAZofyRw/ KI8VZENBC7Jnw7cHZCSySwKkRBjWbmbKlfHn0Bj3Q4ss4eAKoDQvC9TRkBkaHmiDbTKm JvE97rH5k0yUxf20Pbvd/nRxVwnWBves4kU4Ngq09nGjGxM+Exz+GATfWiI3CM54UpOi g8LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567733; x=1707172533; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ClXG9uTDgBMA81lLT/nmnwAaiOCypQE3e9mwTp7YT8E=; b=NMoP+b3JXoL9VoWgCmILGbzmXggcgkX5VlH9L8VGkIijw1D0hvPf3XtUPnrwRk/ITD im9byL6GWFl7oxjmetnfSQUlxjmul97f1MiQ1HycXdA5Ao9YUZHKvvVnVzY1MfcnGoO7 Ua+zBsefdtnZArlCYpDOT0sc3Gbq1a5dDFQbIeNl98BK3rMfHdSEFH5ZavyeXS3vy+H8 9Wuw/cMKmyofMxrlXeelSKepjzITKS4cNWpgWZu07MWJixQn2XxH6Z+IfqVJMR+8qpdn Zn4F3ciTTM3qSj3luwohYZkCYTV2kh2edTg6i9RDNYSUAPs4vpe98rRn5igIzp+H8B9m epzg== X-Gm-Message-State: AOJu0YyjHWwaTHuu8qEvni+0kVD6VtMUPBVDvoHZWE4hOPnRM6qcN3ZO fBAZKzaHOF9IbxTdSMIbLBV/x4lzwZYeqW+17bjdnOupZFHaa1ZmISqcHUMz1GI= X-Google-Smtp-Source: AGHT+IGv8t7aMEWyLzZQD5Q/4Rxbz1k5hTzsoMtXeeA+qcD2zSfHq3xkcCA0yrs8A54AM1p6KU83Ew== X-Received: by 2002:a05:600c:3b28:b0:40e:e2eb:bea8 with SMTP id m40-20020a05600c3b2800b0040ee2ebbea8mr5944049wms.0.1706567733466; Mon, 29 Jan 2024 14:35:33 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:33 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 12/13] tools/net/ynl: Add type info to struct members in generated docs Date: Mon, 29 Jan 2024 22:34:57 +0000 Message-ID: <20240129223458.52046-13-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Extend the ynl doc generator to include type information for struct members, ignoring the pad type. Signed-off-by: Donald Hunter --- tools/net/ynl/ynl-gen-rst.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/net/ynl/ynl-gen-rst.py b/tools/net/ynl/ynl-gen-rst.py index 262d88f88696..927407b3efb3 100755 --- a/tools/net/ynl/ynl-gen-rst.py +++ b/tools/net/ynl/ynl-gen-rst.py @@ -189,12 +189,19 @@ def parse_operations(operations: List[Dict[str, Any]]) -> str: def parse_entries(entries: List[Dict[str, Any]], level: int) -> str: """Parse a list of entries""" + ignored = ["pad"] lines = [] for entry in entries: if isinstance(entry, dict): # entries could be a list or a dictionary + field_name = entry.get("name", "") + if field_name in ignored: + continue + type_ = entry.get("type") + if type_: + field_name += f" ({inline(type_)})" lines.append( - rst_fields(entry.get("name", ""), sanitize(entry.get("doc", "")), level) + rst_fields(field_name, sanitize(entry.get("doc", "")), level) ) elif isinstance(entry, list): lines.append(rst_list_inline(entry, level)) From patchwork Mon Jan 29 22:34:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Hunter X-Patchwork-Id: 13536463 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 254DE15959E; Mon, 29 Jan 2024 22:35:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567741; cv=none; b=QmSVGp1UqF0EpW80KacJsark9WUFCAMi86KrSnWGDxFM36bS6E4xzOw33EoPYmcvJpzf4+sJb84UOx9KSLv0VEZIV7mdqIFBrdDmkEMJW+EaEKTYXaeekVRpk3nymuP142KlyGycczwopybFJ5ivZrU1E8lybI9BMOxN1jH8yXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706567741; c=relaxed/simple; bh=8098iyevRZmq8WUQ6q/OsqtuWNClMOQs4E4MOL4qOWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NE+SVvsARV9SrE8IXhng6zfjuh8rVVidMQ0KSkgQAQYryzEfKkOZjkso1nKx2O+V+IYZmhCN+5TJ/CTuFnYn7KF+lR1ElBSZwHPzsl8pCwPrdSYXP9bY2Yrkl4R8simTUr+FKwSTz5pHpWP8PUHdGIZx7nlq6dADRs1hP2q8SZc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DWbo9kVw; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DWbo9kVw" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-50eabbc3dccso3989744e87.2; Mon, 29 Jan 2024 14:35:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706567736; x=1707172536; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=TBzt6nKGUUhQiFpCbWAozRASE/SVErwuAmCVEdz/fDE=; b=DWbo9kVwbwp2Q8Llfp2GuNJRVGOOAiU61NekYPeIELh3NJDWIey/mfV5BoZTBtAB0v jl8RSiVcSFc502SUPPgepiOhgsbXGRd4kti09Ke5zz6wiCbJbDegeA0E7Oi/h6o6sE/K Tc7yycy/VBrO1Y/oofs/23I6us+a5rmTGTLR+TYnspdEIsmcyKBygMFJZhmoVB96Opu1 Lv/DfO3lPk/KSozDJu80p0atXDXgmFYO4FzgGfkzBMFnygGoReIE0NGNRH+NcRaowbeE UpQFlpZVQuKQfpiiIOHZWZGnLelx/Ruee5IoR9w8thw1O+04vVuJJjwuRJUuGqCLRdbL t8DA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706567736; x=1707172536; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TBzt6nKGUUhQiFpCbWAozRASE/SVErwuAmCVEdz/fDE=; b=WmQ0GcHi/X011FHZ0XcIImJTxMqg7vxWvw6NUWVGz3r1wNtEu8cFoKqQbQCegApUU7 xtcC3Ox2mCL2lzYTQrmdTYf0wqdZ9ZJIwjCMVPTcbm1xflXAtV3JRQ35LYgl+aFLoN9Y +bQLZa3XNyLVH/RR1yFf8qg45Bq78bWVRUbQkqEiWLOs2kC6ruyXRcoGQGv/IXdCFOtr aEN9lcDioiOdbi4j5VvkKX18HKjhmwgHp1bVaJSHKTeGqe0nYROvBg4mB2RqIF6ZvOK/ rrFF0eeOT02R9ibH6WLemWiwAJ01xCAwl8qKH6nZWM82xpB26C+D3qLnGKRx1gwfApjN rrvQ== X-Gm-Message-State: AOJu0Yy/vaYsnk4AyzrUqTfSUJ2vKZ+ViP4UbYIhqYhwnFi/MCoAqq4W EhpxVutpZvvhBzDsoMhVv47cYriPZQwI+URG7ud/RxIYMmV8KMvR/OFaFY0xlfU= X-Google-Smtp-Source: AGHT+IEhaCXFuhc7tgcFzqZwvgUt7b2rsel8hoJZkEJHttzsOUeHl6+4RlYPSRRPN/ccRMBsJGeskw== X-Received: by 2002:ac2:51a7:0:b0:50e:4a61:c369 with SMTP id f7-20020ac251a7000000b0050e4a61c369mr4384329lfk.46.1706567735548; Mon, 29 Jan 2024 14:35:35 -0800 (PST) Received: from imac.fritz.box ([2a02:8010:60a0:0:9c2b:323d:b44d:b76d]) by smtp.gmail.com with ESMTPSA id je16-20020a05600c1f9000b0040ec66021a7sm11357281wmb.1.2024.01.29.14.35.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 14:35:35 -0800 (PST) From: Donald Hunter To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jonathan Corbet , linux-doc@vger.kernel.org, Jacob Keller , Breno Leitao , Jiri Pirko , Alessandro Marcolini Cc: donald.hunter@redhat.com, Donald Hunter Subject: [PATCH net-next v2 13/13] doc/netlink/specs: Update the tc spec Date: Mon, 29 Jan 2024 22:34:58 +0000 Message-ID: <20240129223458.52046-14-donald.hunter@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20240129223458.52046-1-donald.hunter@gmail.com> References: <20240129223458.52046-1-donald.hunter@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Fill in many of the gaps in the tc netlink spec, including stats attrs, classes and actions. Many documentation strings have also been added. This is still a work in progress, albeit fairly complete: - there are still many attributes left as binary blobs. - actions have not had much testing Signed-off-by: Donald Hunter --- Documentation/netlink/specs/tc.yaml | 2218 +++++++++++++++++++++++++-- 1 file changed, 2067 insertions(+), 151 deletions(-) diff --git a/Documentation/netlink/specs/tc.yaml b/Documentation/netlink/specs/tc.yaml index 4346fa402fc9..4b21b00dbebe 100644 --- a/Documentation/netlink/specs/tc.yaml +++ b/Documentation/netlink/specs/tc.yaml @@ -48,21 +48,28 @@ definitions: - name: bytes type: u64 + doc: Number of enqueued bytes - name: packets type: u32 + doc: Number of enqueued packets - name: drops type: u32 + doc: Packets dropped because of lack of resources - name: overlimits type: u32 + doc: | + Number of throttle events when this flow goes out of allocated bandwidth - name: bps type: u32 + doc: Current flow byte rate - name: pps type: u32 + doc: Current flow packet rate - name: qlen type: u32 @@ -112,6 +119,7 @@ definitions: - name: limit type: u32 + doc: Queue length; bytes for bfifo, packets for pfifo - name: tc-htb-opt type: struct @@ -119,11 +127,11 @@ definitions: - name: rate type: binary - len: 12 + struct: tc-ratespec - name: ceil type: binary - len: 12 + struct: tc-ratespec - name: buffer type: u32 @@ -149,15 +157,19 @@ definitions: - name: rate2quantum type: u32 + doc: bps->quantum divisor - name: defcls type: u32 + doc: Default class number - name: debug type: u32 + doc: Debug flags - name: direct-pkts type: u32 + doc: Count of non shaped packets - name: tc-gred-qopt type: struct @@ -165,15 +177,19 @@ definitions: - name: limit type: u32 + doc: HARD maximal queue length in bytes - name: qth-min type: u32 + doc: Min average length threshold in bytes - name: qth-max type: u32 + doc: Max average length threshold in bytes - name: DP type: u32 + doc: Up to 2^32 DPs - name: backlog type: u32 @@ -195,15 +211,19 @@ definitions: - name: Wlog type: u8 + doc: log(W) - name: Plog type: u8 + doc: log(P_max / (qth-max - qth-min)) - name: Scell_log type: u8 + doc: cell size for idle damping - name: prio type: u8 + doc: Priority of this VQ - name: packets type: u32 @@ -266,9 +286,11 @@ definitions: - name: bands type: u16 + doc: Number of bands - name: max-bands type: u16 + doc: Maximum number of queues - name: tc-netem-qopt type: struct @@ -276,21 +298,138 @@ definitions: - name: latency type: u32 + doc: Added delay in microseconds - name: limit type: u32 + doc: Fifo limit in packets - name: loss type: u32 + doc: Random packet loss (0=none, ~0=100%) - name: gap type: u32 + doc: Re-ordering gap (0 for none) - name: duplicate type: u32 + doc: Random packet duplication (0=none, ~0=100%) - name: jitter type: u32 + doc: Random jitter latency in microseconds + - + name: tc-netem-gimodel + doc: State transition probabilities for 4 state model + type: struct + members: + - + name: p13 + type: u32 + - + name: p31 + type: u32 + - + name: p32 + type: u32 + - + name: p14 + type: u32 + - + name: p23 + type: u32 + - + name: tc-netem-gemodel + doc: Gilbert-Elliot models + type: struct + members: + - + name: p + type: u32 + - + name: r + type: u32 + - + name: h + type: u32 + - + name: k1 + type: u32 + - + name: tc-netem-corr + type: struct + members: + - + name: delay-corr + type: u32 + doc: Delay correlation + - + name: loss-corr + type: u32 + doc: Packet loss correlation + - + name: dup-corr + type: u32 + doc: Duplicate correlation + - + name: tc-netem-reorder + type: struct + members: + - + name: probability + type: u32 + - + name: correlation + type: u32 + - + name: tc-netem-corrupt + type: struct + members: + - + name: probability + type: u32 + - + name: correlation + type: u32 + - + name: tc-netem-rate + type: struct + members: + - + name: rate + type: u32 + - + name: packet-overhead + type: s32 + - + name: cell-size + type: u32 + - + name: cell-overhead + type: s32 + - + name: tc-netem-slot + type: struct + members: + - + name: min-delay + type: s64 + - + name: max-delay + type: s64 + - + name: max-packets + type: s32 + - + name: max-bytes + type: s32 + - + name: dist-delay + type: s64 + - + name: dist-jitter + type: s64 - name: tc-plug-qopt type: struct @@ -307,11 +446,13 @@ definitions: members: - name: bands - type: u16 + type: u32 + doc: Number of bands - name: priomap type: binary len: 16 + doc: Map of logical priority -> PRIO band - name: tc-red-qopt type: struct @@ -319,21 +460,27 @@ definitions: - name: limit type: u32 + doc: Hard queue length in packets - name: qth-min type: u32 + doc: Min average threshold in packets - name: qth-max type: u32 + doc: Max average threshold in packets - name: Wlog type: u8 + doc: log(W) - name: Plog type: u8 + doc: log(P_max / (qth-max - qth-min)) - name: Scell-log type: u8 + doc: Cell size for idle damping - name: flags type: u8 @@ -369,71 +516,128 @@ definitions: name: penalty-burst type: u32 - - name: tc-sfq-qopt-v1 # TODO nested structs + name: tc-sfq-qopt type: struct members: - name: quantum type: u32 + doc: Bytes per round allocated to flow - name: perturb-period type: s32 + doc: Period of hash perturbation - name: limit type: u32 + doc: Maximal packets in queue - name: divisor type: u32 + doc: Hash divisor - name: flows type: u32 + doc: Maximal number of flows + - + name: tc-sfqred-stats + type: struct + members: + - + name: prob-drop + type: u32 + doc: Early drops, below max threshold + - + name: forced-drop + type: u32 + doc: Early drops, after max threshold + - + name: prob-mark + type: u32 + doc: Marked packets, below max threshold + - + name: forced-mark + type: u32 + doc: Marked packets, after max threshold + - + name: prob-mark-head + type: u32 + doc: Marked packets, below max threshold + - + name: forced-mark-head + type: u32 + doc: Marked packets, after max threshold + - + name: tc-sfq-qopt-v1 + type: struct + members: + - + name: v0 + type: binary + struct: tc-sfq-qopt - name: depth type: u32 + doc: Maximum number of packets per flow - name: headdrop type: u32 - name: limit type: u32 + doc: HARD maximal flow queue length in bytes - name: qth-min type: u32 + doc: Min average length threshold in bytes - - name: qth-mac + name: qth-max type: u32 + doc: Max average length threshold in bytes - name: Wlog type: u8 + doc: log(W) - name: Plog type: u8 + doc: log(P_max / (qth-max - qth-min)) - name: Scell-log type: u8 + doc: Cell size for idle damping - name: flags type: u8 - name: max-P type: u32 + doc: probabilty, high resolution - - name: prob-drop - type: u32 + name: stats + type: binary + struct: tc-sfqred-stats + - + name: tc-ratespec + type: struct + members: - - name: forced-drop - type: u32 + name: cell-log + type: u8 - - name: prob-mark - type: u32 + name: linklayer + type: u8 - - name: forced-mark - type: u32 + name: overhead + type: u8 - - name: prob-mark-head - type: u32 + name: cell-align + type: u8 - - name: forced-mark-head + name: mpu + type: u8 + - + name: rate type: u32 - name: tc-tbf-qopt @@ -441,12 +645,12 @@ definitions: members: - name: rate - type: binary # TODO nested struct tc_ratespec - len: 12 + type: binary + struct: tc-ratespec - name: peakrate - type: binary # TODO nested struct tc_ratespec - len: 12 + type: binary + struct: tc-ratespec - name: limit type: u32 @@ -491,67 +695,1299 @@ definitions: - name: interval type: s8 + doc: Sampling period - name: ewma-log type: u8 -attribute-sets: + doc: The log() of measurement window weight - - name: tc-attrs + name: tc-choke-xstats + type: struct + members: + - + name: early + type: u32 + doc: Early drops + - + name: pdrop + type: u32 + doc: Drops due to queue limits + - + name: other + type: u32 + doc: Drops due to drop() calls + - + name: marked + type: u32 + doc: Marked packets + - + name: matched + type: u32 + doc: Drops due to flow match + - + name: tc-codel-xstats + type: struct + members: + - + name: maxpacket + type: u32 + doc: Largest packet we've seen so far + - + name: count + type: u32 + doc: How many drops we've done since the last time we entered dropping state + - + name: lastcount + type: u32 + doc: Count at entry to dropping state + - + name: ldelay + type: u32 + doc: in-queue delay seen by most recently dequeued packet + - + name: drop-next + type: s32 + doc: Time to drop next packet + - + name: drop-overlimit + type: u32 + doc: Number of times max qdisc packet limit was hit + - + name: ecn-mark + type: u32 + doc: Number of packets we've ECN marked instead of dropped + - + name: dropping + type: u32 + doc: Are we in a dropping state? + - + name: ce-mark + type: u32 + doc: Number of CE marked packets because of ce-threshold + - + name: tc-fq-codel-xstats + type: struct + members: + - + name: type + type: u32 + - + name: maxpacket + type: u32 + doc: Largest packet we've seen so far + - + name: drop-overlimit + type: u32 + doc: Number of times max qdisc packet limit was hit + - + name: ecn-mark + type: u32 + doc: Number of packets we ECN marked instead of being dropped + - + name: new-flow-count + type: u32 + doc: Number of times packets created a new flow + - + name: new-flows-len + type: u32 + doc: Count of flows in new list + - + name: old-flows-len + type: u32 + doc: Count of flows in old list + - + name: ce-mark + type: u32 + doc: Packets above ce-threshold + - + name: memory-usage + type: u32 + doc: Memory usage in bytes + - + name: drop-overmemory + type: u32 + - + name: tc-fq-pie-xstats + type: struct + members: + - + name: packets-in + type: u32 + doc: Total number of packets enqueued + - + name: dropped + type: u32 + doc: Packets dropped due to fq_pie_action + - + name: overlimit + type: u32 + doc: Dropped due to lack of space in queue + - + name: overmemory + type: u32 + doc: Dropped due to lack of memory in queue + - + name: ecn-mark + type: u32 + doc: Packets marked with ecn + - + name: new-flow-count + type: u32 + doc: Count of new flows created by packets + - + name: new-flows-len + type: u32 + doc: Count of flows in new list + - + name: old-flows-len + type: u32 + doc: Count of flows in old list + - + name: memory-usage + type: u32 + doc: Total memory across all queues + - + name: tc-fq-qd-stats + type: struct + members: + - + name: gc-flows + type: u64 + - + name: highprio-packets + type: u64 + doc: obsolete + - + name: tcp-retrans + type: u64 + doc: obsolete + - + name: throttled + type: u64 + - + name: flows-plimit + type: u64 + - + name: pkts-too-long + type: u64 + - + name: allocation-errors + type: u64 + - + name: time-next-delayed-flow + type: s64 + - + name: flows + type: u32 + - + name: inactive-flows + type: u32 + - + name: throttled-flows + type: u32 + - + name: unthrottle-latency-ns + type: u32 + - + name: ce-mark + type: u64 + doc: Packets above ce-threshold + - + name: horizon-drops + type: u64 + - + name: horizon-caps + type: u64 + - + name: fastpath-packets + type: u64 + - + name: band-drops + type: binary + len: 24 + - + name: band-pkt-count + type: binary + len: 12 + - + name: pad + type: pad + len: 4 + - + name: tc-hhf-xstats + type: struct + members: + - + name: drop-overlimit + type: u32 + doc: Number of times max qdisc packet limit was hit + - + name: hh-overlimit + type: u32 + doc: Number of times max heavy-hitters was hit + - + name: hh-tot-count + type: u32 + doc: Number of captured heavy-hitters so far + - + name: hh-cur-count + type: u32 + doc: Number of current heavy-hitters + - + name: tc-pie-xstats + type: struct + members: + - + name: prob + type: u64 + doc: Current probability + - + name: delay + type: u32 + doc: Current delay in ms + - + name: avg-dq-rate + type: u32 + doc: Current average dq rate in bits/pie-time + - + name: dq-rate-estimating + type: u32 + doc: Is avg-dq-rate being calculated? + - + name: packets-in + type: u32 + doc: Total number of packets enqueued + - + name: dropped + type: u32 + doc: Packets dropped due to pie action + - + name: overlimit + type: u32 + doc: Dropped due to lack of space in queue + - + name: maxq + type: u32 + doc: Maximum queue size + - + name: ecn-mark + type: u32 + doc: Packets marked with ecn + - + name: tc-red-xstats + type: struct + members: + - + name: early + type: u32 + doc: Early drops + - + name: pdrop + type: u32 + doc: Drops due to queue limits + - + name: other + type: u32 + doc: Drops due to drop() calls + - + name: marked + type: u32 + doc: Marked packets + - + name: tc-sfb-xstats + type: struct + members: + - + name: earlydrop + type: u32 + - + name: penaltydrop + type: u32 + - + name: bucketdrop + type: u32 + - + name: queuedrop + type: u32 + - + name: childdrop + type: u32 + doc: drops in child qdisc + - + name: marked + type: u32 + - + name: maxqlen + type: u32 + - + name: maxprob + type: u32 + - + name: avgprob + type: u32 + - + name: tc-sfq-xstats + type: struct + members: + - + name: allot + type: s32 + - + name: gnet-stats-basic + type: struct + members: + - + name: bytes + type: u64 + - + name: packets + type: u32 + - + name: gnet-stats-rate-est + type: struct + members: + - + name: bps + type: u32 + - + name: pps + type: u32 + - + name: gnet-stats-rate-est64 + type: struct + members: + - + name: bps + type: u64 + - + name: pps + type: u64 + - + name: gnet-stats-queue + type: struct + members: + - + name: qlen + type: u32 + - + name: backlog + type: u32 + - + name: drops + type: u32 + - + name: requeues + type: u32 + - + name: overlimits + type: u32 + - + name: tc-u32-key + type: struct + members: + - + name: mask + type: u32 + byte-order: big-endian + - + name: val + type: u32 + byte-order: big-endian + - + name: "off" + type: s32 + - + name: offmask + type: s32 + - + name: tc-u32-sel + type: struct + members: + - + name: flags + type: u8 + - + name: offshift + type: u8 + - + name: nkeys + type: u8 + - + name: offmask + type: u16 + byte-order: big-endian + - + name: "off" + type: u16 + - + name: offoff + type: s16 + - + name: hoff + type: s16 + - + name: hmask + type: u32 + byte-order: big-endian + - + name: keys + type: binary + struct: tc-u32-key # TODO: array + - + name: tc-u32-pcnt + type: struct + members: + - + name: rcnt + type: u64 + - + name: rhit + type: u64 + - + name: kcnts + type: u64 # TODO: array + - + name: tcf-t + type: struct + members: + - + name: install + type: u64 + - + name: lastuse + type: u64 + - + name: expires + type: u64 + - + name: firstuse + type: u64 + - + name: tc-gen + type: struct + members: + - + name: index + type: u32 + - + name: capab + type: u32 + - + name: action + type: s32 + - + name: refcnt + type: s32 + - + name: bindcnt + type: s32 + - + name: tc-gact-p + type: struct + members: + - + name: ptype + type: u16 + - + name: pval + type: u16 + - + name: paction + type: s32 + - + name: tcf-ematch-tree-hdr + type: struct + members: + - + name: nmatches + type: u16 + - + name: progid + type: u16 + - + name: tc-basic-pcnt + type: struct + members: + - + name: rcnt + type: u64 + - + name: rhit + type: u64 + - + name: tc-matchall-pcnt + type: struct + members: + - + name: rhit + type: u64 + - + name: tc-mpls + type: struct + members: + - + name: index + type: u32 + - + name: capab + type: u32 + - + name: action + type: s32 + - + name: refcnt + type: s32 + - + name: bindcnt + type: s32 + - + name: m-action + type: s32 + - + name: tc-police + type: struct + members: + - + name: index + type: u32 + - + name: action + type: s32 + - + name: limit + type: u32 + - + name: burst + type: u32 + - + name: mtu + type: u32 + - + name: rate + type: binary + struct: tc-ratespec + - + name: peakrate + type: binary + struct: tc-ratespec + - + name: refcnt + type: s32 + - + name: bindcnt + type: s32 + - + name: capab + type: u32 + - + name: tc-pedit-sel + type: struct + members: + - + name: index + type: u32 + - + name: capab + type: u32 + - + name: action + type: s32 + - + name: refcnt + type: s32 + - + name: bindcnt + type: s32 + - + name: nkeys + type: u8 + - + name: flags + type: u8 + - + name: keys + type: binary + struct: tc-pedit-key # TODO: array + - + name: tc-pedit-key + type: struct + members: + - + name: mask + type: u32 + - + name: val + type: u32 + - + name: "off" + type: u32 + - + name: at + type: u32 + - + name: offmask + type: u32 + - + name: shift + type: u32 + - + name: tc-vlan + type: struct + members: + - + name: index + type: u32 + - + name: capab + type: u32 + - + name: action + type: s32 + - + name: refcnt + type: s32 + - + name: bindcnt + type: s32 + - + name: v-action + type: s32 +attribute-sets: + - + name: tc-attrs + attributes: + - + name: kind + type: string + - + name: options + type: sub-message + sub-message: tc-options-msg + selector: kind + - + name: stats + type: binary + struct: tc-stats + - + name: xstats + type: sub-message + sub-message: tca-stats-app-msg + selector: kind + - + name: rate + type: binary + struct: gnet-estimator + - + name: fcnt + type: u32 + - + name: stats2 + type: nest + nested-attributes: tca-stats-attrs + - + name: stab + type: nest + nested-attributes: tca-stab-attrs + - + name: pad + type: pad + - + name: dump-invisible + type: flag + - + name: chain + type: u32 + - + name: hw-offload + type: u8 + - + name: ingress-block + type: u32 + - + name: egress-block + type: u32 + - + name: dump-flags + type: bitfield32 + - + name: ext-warn-msg + type: string + - + name: tc-act-attrs + attributes: + - + name: kind + type: string + - + name: options + type: sub-message + sub-message: tc-act-options-msg + selector: kind + - + name: index + type: u32 + - + name: stats + type: nest + nested-attributes: tc-act-stats-attrs + - + name: pad + type: pad + - + name: cookie + type: binary + - + name: flags + type: bitfield32 + - + name: hw-stats + type: bitfield32 + - + name: used-hw-stats + type: bitfield32 + - + name: in-hw-count + type: u32 + - + name: tc-act-stats-attrs + attributes: + - + name: basic + type: binary + struct: gnet-stats-basic + - + name: rate-est + type: binary + struct: gnet-stats-rate-est + - + name: queue + type: binary + struct: gnet-stats-queue + - + name: app + type: binary + - + name: rate-est64 + type: binary + struct: gnet-stats-rate-est64 + - + name: pad + type: pad + - + name: basic-hw + type: binary + struct: gnet-stats-basic + - + name: pkt64 + type: u64 + - + name: tc-act-bpf-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: ops-len + type: u16 + - + name: ops + type: binary + - + name: fd + type: u32 + - + name: name + type: string + - + name: pad + type: pad + - + name: tag + type: binary + - + name: id + type: binary + - + name: tc-act-connmark-attrs + attributes: + - + name: parms + type: binary + - + name: tm + type: binary + struct: tcf-t + - + name: pad + type: pad + - + name: tc-act-csum-attrs + attributes: + - + name: parms + type: binary + - + name: tm + type: binary + struct: tcf-t + - + name: pad + type: pad + - + name: tc-act-ct-attrs + attributes: + - + name: parms + type: binary + - + name: tm + type: binary + struct: tcf-t + - + name: action + type: u16 + - + name: zone + type: u16 + - + name: mark + type: u32 + - + name: mark-mask + type: u32 + - + name: labels + type: binary + - + name: labels-mask + type: binary + - + name: nat-ipv4-min + type: u32 + byte-order: big-endian + - + name: nat-ipv4-max + type: u32 + byte-order: big-endian + - + name: nat-ipv6-min + type: binary + - + name: nat-ipv6-max + type: binary + - + name: nat-port-min + type: u16 + byte-order: big-endian + - + name: nat-port-max + type: u16 + byte-order: big-endian + - + name: pad + type: pad + - + name: helper-name + type: string + - + name: helper-family + type: u8 + - + name: helper-proto + type: u8 + - + name: tc-act-ctinfo-attrs + attributes: + - + name: pad + type: pad + - + name: tm + type: binary + struct: tcf-t + - + name: act + type: binary + - + name: zone + type: u16 + - + name: parms-dscp-mask + type: u32 + - + name: parms-dscp-statemask + type: u32 + - + name: parms-cpmark-mask + type: u32 + - + name: stats-dscp-set + type: u64 + - + name: stats-dscp-error + type: u64 + - + name: stats-cpmark-set + type: u64 + - + name: tc-act-gate-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: pad + type: pad + - + name: priority + type: s32 + - + name: entry-list + type: binary + - + name: base-time + type: u64 + - + name: cycle-time + type: u64 + - + name: cycle-time-ext + type: u64 + - + name: flags + type: u32 + - + name: clockid + type: s32 + - + name: tc-act-ife-attrs + attributes: + - + name: parms + type: binary + - + name: tm + type: binary + struct: tcf-t + - + name: dmac + type: binary + - + name: smac + type: binary + - + name: type + type: u16 + - + name: metalst + type: binary + - + name: pad + type: pad + - + name: tc-act-mirred-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: pad + type: pad + - + name: blockid + type: binary + - + name: tc-act-mpls-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + struct: tc-mpls + - + name: pad + type: pad + - + name: proto + type: u16 + byte-order: big-endian + - + name: label + type: u32 + - + name: tc + type: u8 + - + name: ttl + type: u8 + - + name: bos + type: u8 + - + name: tc-act-nat-attrs + attributes: + - + name: parms + type: binary + - + name: tm + type: binary + struct: tcf-t + - + name: pad + type: pad + - + name: tc-act-pedit-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + struct: tc-pedit-sel + - + name: pad + type: pad + - + name: parms-ex + type: binary + - + name: keys-ex + type: binary + - + name: key-ex + type: binary + - + name: tc-act-simple-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: data + type: binary + - + name: pad + type: pad + - + name: tc-act-skbedit-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: priority + type: u32 + - + name: queue-mapping + type: u16 + - + name: mark + type: u32 + - + name: pad + type: pad + - + name: ptype + type: u16 + - + name: mask + type: u32 + - + name: flags + type: u64 + - + name: queue-mapping-max + type: u16 + - + name: tc-act-skbmod-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: dmac + type: binary + - + name: smac + type: binary + - + name: etype + type: binary + - + name: pad + type: pad + - + name: tc-act-tunnel-key-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + - + name: enc-ipv4-src + type: u32 + byte-order: big-endian + - + name: enc-ipv4-dst + type: u32 + byte-order: big-endian + - + name: enc-ipv6-src + type: binary + - + name: enc-ipv6-dst + type: binary + - + name: enc-key-id + type: u64 + byte-order: big-endian + - + name: pad + type: pad + - + name: enc-dst-port + type: u16 + byte-order: big-endian + - + name: no-csum + type: u8 + - + name: enc-opts + type: binary + - + name: enc-tos + type: u8 + - + name: enc-ttl + type: u8 + - + name: no-frag + type: flag + - + name: tc-act-vlan-attrs attributes: - - name: kind - type: string - - - name: options - type: sub-message - sub-message: tc-options-msg - selector: kind + name: tm + type: binary + struct: tcf-t - - name: stats + name: parms type: binary - struct: tc-stats + struct: tc-vlan - - name: xstats + name: push-vlan-id + type: u16 + - + name: push-vlan-protocol + type: u16 + - + name: pad + type: pad + - + name: push-vlan-priority + type: u8 + - + name: push-eth-dst type: binary - - name: rate + name: push-eth-src type: binary - struct: gnet-estimator + - + name: tc-basic-attrs + attributes: - - name: fcnt + name: classid type: u32 - - name: stats2 + name: ematches type: nest - nested-attributes: tca-stats-attrs + nested-attributes: tc-ematch-attrs - - name: stab + name: act + type: array-nest + nested-attributes: tc-act-attrs + - + name: police type: nest - nested-attributes: tca-stab-attrs + nested-attributes: tc-police-attrs + - + name: pcnt + type: binary + struct: tc-basic-pcnt - name: pad type: pad + - + name: tc-bpf-attrs + attributes: - - name: dump-invisible - type: flag + name: act + type: nest + nested-attributes: tc-act-attrs - - name: chain + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: classid type: u32 - - name: hw-offload - type: u8 + name: ops-len + type: u16 - - name: ingress-block + name: ops + type: binary + - + name: fd type: u32 - - name: egress-block + name: name + type: string + - + name: flags type: u32 - - name: dump-flags - type: bitfield32 + name: flags-gen + type: u32 - - name: ext-warn-msg - type: string + name: tag + type: binary + - + name: id + type: u32 - name: tc-cake-attrs attributes: @@ -641,7 +2077,8 @@ attribute-sets: type: u32 - name: tin-stats - type: binary + type: array-nest + nested-attributes: tc-cake-tin-stats-attrs - name: deficit type: s32 @@ -660,6 +2097,84 @@ attribute-sets: - name: blue-timer-us type: s32 + - + name: tc-cake-tin-stats-attrs + attributes: + - + name: pad + type: pad + - + name: sent-packets + type: u32 + - + name: sent-bytes64 + type: u64 + - + name: dropped-packets + type: u32 + - + name: dropped-bytes64 + type: u64 + - + name: acks-dropped-packets + type: u32 + - + name: acks-dropped-bytes64 + type: u64 + - + name: ecn-marked-packets + type: u32 + - + name: ecn-marked-bytes64 + type: u64 + - + name: backlog-packets + type: u32 + - + name: backlog-bytes + type: u32 + - + name: threshold-rate64 + type: u64 + - + name: target-us + type: u32 + - + name: interval-us + type: u32 + - + name: way-indirect-hits + type: u32 + - + name: way-misses + type: u32 + - + name: way-collisions + type: u32 + - + name: peak-delay-us + type: u32 + - + name: avg-delay-us + type: u32 + - + name: base-delay-us + type: u32 + - + name: sparse-flows + type: u32 + - + name: bulk-flows + type: u32 + - + name: unresponsive-flows + type: u32 + - + name: max-skblen + type: u32 + - + name: flow-quantum + type: u32 - name: tc-cbs-attrs attributes: @@ -667,6 +2182,20 @@ attribute-sets: name: parms type: binary struct: tc-cbs-qopt + - + name: tc-cgroup-attrs + attributes: + - + name: act + type: nest + nested-attributes: tc-act-attrs + - + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: ematches + type: binary - name: tc-choke-attrs attributes: @@ -677,6 +2206,9 @@ attribute-sets: - name: stab type: binary + checks: + min-len: 256 + max-len: 256 - name: max-p type: u32 @@ -704,6 +2236,56 @@ attribute-sets: - name: quantum type: u32 + - + name: tc-ematch-attrs + attributes: + - + name: tree-hdr + type: binary + struct: tcf-ematch-tree-hdr + - + name: tree-list + type: binary + - + name: tc-flow-attrs + attributes: + - + name: keys + type: u32 + - + name: mode + type: u32 + - + name: baseclass + type: u32 + - + name: rshift + type: u32 + - + name: addend + type: u32 + - + name: mask + type: u32 + - + name: xor + type: u32 + - + name: divisor + type: u32 + - + name: act + type: binary + - + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: ematches + type: binary + - + name: perturb + type: u32 - name: tc-flower-attrs attributes: @@ -953,15 +2535,19 @@ attribute-sets: - name: key-arp-sha type: binary + display-hint: mac - name: key-arp-sha-mask type: binary + display-hint: mac - name: key-arp-tha type: binary + display-hint: mac - name: key-arp-tha-mask type: binary + display-hint: mac - name: key-mpls-ttl type: u8 @@ -1020,10 +2606,12 @@ attribute-sets: type: u8 - name: key-enc-opts - type: binary + type: nest + nested-attributes: tc-flower-key-enc-opts-attrs - name: key-enc-opts-mask - type: binary + type: nest + nested-attributes: tc-flower-key-enc-opts-attrs - name: in-hw-count type: u32 @@ -1056,41 +2644,165 @@ attribute-sets: name: key-ct-zone-mask type: u16 - - name: key-ct-mark - type: u32 + name: key-ct-mark + type: u32 + - + name: key-ct-mark-mask + type: u32 + - + name: key-ct-labels + type: binary + - + name: key-ct-labels-mask + type: binary + - + name: key-mpls-opts + type: nest + nested-attributes: tc-flower-key-mpls-opt-attrs + - + name: key-hash + type: u32 + - + name: key-hash-mask + type: u32 + - + name: key-num-of-vlans + type: u8 + - + name: key-pppoe-sid + type: u16 + byte-order: big-endian + - + name: key-ppp-proto + type: u16 + byte-order: big-endian + - + name: key-l2-tpv3-sid + type: u32 + byte-order: big-endian + - + name: l2-miss + type: u8 + - + name: key-cfm + type: nest + nested-attributes: tc-flower-key-cfm-attrs + - + name: key-spi + type: u32 + byte-order: big-endian + - + name: key-spi-mask + type: u32 + byte-order: big-endian + - + name: tc-flower-key-enc-opts-attrs + attributes: + - + name: geneve + type: nest + nested-attributes: tc-flower-key-enc-opt-geneve-attrs + - + name: vxlan + type: nest + nested-attributes: tc-flower-key-enc-opt-vxlan-attrs + - + name: erspan + type: nest + nested-attributes: tc-flower-key-enc-opt-erspan-attrs + - + name: gtp + type: nest + nested-attributes: tc-flower-key-enc-opt-gtp-attrs + - + name: tc-flower-key-enc-opt-geneve-attrs + attributes: + - + name: class + type: u16 + - + name: type + type: u8 + - + name: data + type: binary + - + name: tc-flower-key-enc-opt-vxlan-attrs + attributes: + - + name: gbp + type: u32 + - + name: tc-flower-key-enc-opt-erspan-attrs + attributes: + - + name: ver + type: u8 + - + name: index + type: u32 + - + name: dir + type: u8 + - + name: hwid + type: u8 + - + name: tc-flower-key-enc-opt-gtp-attrs + attributes: + - + name: pdu-type + type: u8 - - name: key-ct-mark-mask - type: u32 + name: qfi + type: u8 + - + name: tc-flower-key-mpls-opt-attrs + attributes: - - name: key-ct-labels - type: binary + name: lse-depth + type: u8 - - name: key-ct-labels-mask - type: binary + name: lse-ttl + type: u8 - - name: key-mpls-opts - type: binary + name: lse-bos + type: u8 - - name: key-hash - type: u32 + name: lse-tc + type: u8 - - name: key-hash-mask + name: lse-label type: u32 + - + name: tc-flower-key-cfm-attrs + attributes: - - name: key-num-of-vlans + name: md-level type: u8 - - name: key-pppoe-sid - type: u16 - byte-order: big-endian + name: opcode + type: u8 + - + name: tc-fw-attrs + attributes: - - name: key-ppp-proto - type: u16 - byte-order: big-endian + name: classid + type: u32 - - name: key-l2-tpv3-sid + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: indev + type: string + - + name: act + type: array-nest + nested-attributes: tc-act-attrs + - + name: mask type: u32 - byte-order: big-endian - name: tc-gred-attrs attributes: @@ -1135,7 +2847,7 @@ attribute-sets: type: u32 - name: stat-bytes - type: u32 + type: u64 - name: stat-packets type: u32 @@ -1232,40 +2944,25 @@ attribute-sets: name: offload type: flag - - name: tc-act-attrs + name: tc-matchall-attrs attributes: - - name: kind - type: string + name: classid + type: u32 - - name: options - type: sub-message - sub-message: tc-act-options-msg - selector: kind + name: act + type: array-nest + nested-attributes: tc-act-attrs - - name: index + name: flags type: u32 - - name: stats + name: pcnt type: binary + struct: tc-matchall-pcnt - name: pad type: pad - - - name: cookie - type: binary - - - name: flags - type: bitfield32 - - - name: hw-stats - type: bitfield32 - - - name: used-hw-stats - type: bitfield32 - - - name: in-hw-count - type: u32 - name: tc-etf-attrs attributes: @@ -1304,48 +3001,71 @@ attribute-sets: - name: plimit type: u32 + doc: Limit of total number of packets in queue - name: flow-plimit type: u32 + doc: Limit of packets per flow - name: quantum type: u32 + doc: RR quantum - name: initial-quantum type: u32 + doc: RR quantum for new flow - name: rate-enable type: u32 + doc: Enable / disable rate limiting - name: flow-default-rate type: u32 + doc: Obsolete, do not use - name: flow-max-rate type: u32 + doc: Per flow max rate - name: buckets-log type: u32 + doc: log2(number of buckets) - name: flow-refill-delay type: u32 + doc: Flow credit refill delay in usec - name: orphan-mask type: u32 + doc: Mask applied to orphaned skb hashes - name: low-rate-threshold type: u32 + doc: Per packet delay under this rate - name: ce-threshold type: u32 + doc: DCTCP-like CE marking threshold - name: timer-slack type: u32 - name: horizon type: u32 + doc: Time horizon in usec - name: horizon-drop type: u8 + doc: Drop packets beyond horizon, or cap their EDT + - + name: priomap + type: binary + struct: tc-prio-qopt + - + name: weights + type: binary + sub-type: s32 + doc: Weights for each band - name: tc-fq-codel-attrs attributes: @@ -1427,6 +3147,7 @@ attribute-sets: - name: corr type: binary + struct: tc-netem-corr - name: delay-dist type: binary @@ -1434,15 +3155,19 @@ attribute-sets: - name: reorder type: binary + struct: tc-netem-reorder - name: corrupt type: binary + struct: tc-netem-corrupt - name: loss - type: binary + type: nest + nested-attributes: tc-netem-loss-attrs - name: rate type: binary + struct: tc-netem-rate - name: ecn type: u32 @@ -1461,10 +3186,27 @@ attribute-sets: - name: slot type: binary + struct: tc-netem-slot - name: slot-dist type: binary sub-type: s16 + - + name: prng-seed + type: u64 + - + name: tc-netem-loss-attrs + attributes: + - + name: gi + type: binary + doc: General Intuitive - 4 state model + struct: tc-netem-gimodel + - + name: ge + type: binary + doc: Gilbert Elliot models + struct: tc-netem-gemodel - name: tc-pie-attrs attributes: @@ -1492,6 +3234,44 @@ attribute-sets: - name: dq-rate-estimator type: u32 + - + name: tc-police-attrs + attributes: + - + name: tbf + type: binary + struct: tc-police + - + name: rate + type: binary + - + name: peakrate + type: binary + - + name: avrate + type: u32 + - + name: result + type: u32 + - + name: tm + type: binary + struct: tcf-t + - + name: pad + type: pad + - + name: rate64 + type: u64 + - + name: peakrate64 + type: u64 + - + name: pktrate64 + type: u64 + - + name: pktburst64 + type: u64 - name: tc-qfq-attrs attributes: @@ -1516,13 +3296,36 @@ attribute-sets: type: u32 - name: flags - type: binary + type: bitfield32 - name: early-drop-block type: u32 - name: mark-block type: u32 + - + name: tc-route-attrs + attributes: + - + name: classid + type: u32 + - + name: to + type: u32 + - + name: from + type: u32 + - + name: iif + type: u32 + - + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: act + type: array-nest + nested-attributes: tc-act-attrs - name: tc-taprio-attrs attributes: @@ -1629,17 +3432,43 @@ attribute-sets: name: pad type: pad - - name: tca-gact-attrs + name: tc-act-sample-attrs + attributes: + - + name: tm + type: binary + struct: tcf-t + - + name: parms + type: binary + struct: tc-gen + - + name: rate + type: u32 + - + name: trunc-size + type: u32 + - + name: psample-group + type: u32 + - + name: pad + type: pad + - + name: tc-act-gact-attrs attributes: - name: tm type: binary + struct: tcf-t - name: parms type: binary + struct: tc-gen - name: prob type: binary + struct: tc-gact-p - name: pad type: pad @@ -1659,34 +3488,89 @@ attribute-sets: - name: basic type: binary + struct: gnet-stats-basic - name: rate-est type: binary + struct: gnet-stats-rate-est - name: queue type: binary + struct: gnet-stats-queue - name: app - type: binary # TODO sub-message needs 2+ level deep lookup + type: sub-message sub-message: tca-stats-app-msg selector: kind - name: rate-est64 type: binary + struct: gnet-stats-rate-est64 - name: pad type: pad - name: basic-hw type: binary + struct: gnet-stats-basic - name: pkt64 + type: u64 + - + name: tc-u32-attrs + attributes: + - + name: classid + type: u32 + - + name: hash + type: u32 + - + name: link + type: u32 + - + name: divisor + type: u32 + - + name: sel + type: binary + struct: tc-u32-sel + - + name: police + type: nest + nested-attributes: tc-police-attrs + - + name: act + type: array-nest + nested-attributes: tc-act-attrs + - + name: indev + type: string + - + name: pcnt + type: binary + struct: tc-u32-pcnt + - + name: mark type: binary + struct: tc-u32-mark + - + name: flags + type: u32 + - + name: pad + type: pad sub-messages: - name: tc-options-msg formats: + - + value: basic + attribute-set: tc-basic-attrs + - + value: bpf + attribute-set: tc-bpf-attrs - value: bfifo fixed-header: tc-fifo-qopt @@ -1696,6 +3580,9 @@ sub-messages: - value: cbs attribute-set: tc-cbs-attrs + - + value: cgroup + attribute-set: tc-cgroup-attrs - value: choke attribute-set: tc-choke-attrs @@ -1713,6 +3600,12 @@ sub-messages: - value: ets attribute-set: tc-ets-attrs + - + value: flow + attribute-set: tc-flow-attrs + - + value: flower + attribute-set: tc-flower-attrs - value: fq attribute-set: tc-fq-attrs @@ -1723,8 +3616,8 @@ sub-messages: value: fq_pie attribute-set: tc-fq-pie-attrs - - value: flower - attribute-set: tc-flower-attrs + value: fw + attribute-set: tc-fw-attrs - value: gred attribute-set: tc-gred-attrs @@ -1739,6 +3632,9 @@ sub-messages: attribute-set: tc-htb-attrs - value: ingress # no content + - + value: matchall + attribute-set: tc-matchall-attrs - value: mq # no content - @@ -1775,6 +3671,9 @@ sub-messages: - value: red attribute-set: tc-red-attrs + - + value: route + attribute-set: tc-route-attrs - value: sfb fixed-header: tc-sfb-qopt @@ -1787,88 +3686,105 @@ sub-messages: - value: tbf attribute-set: tc-tbf-attrs - - - name: tc-act-options-msg - formats: - - value: gact - attribute-set: tca-gact-attrs + value: u32 + attribute-set: tc-u32-attrs - - name: tca-stats-app-msg + name: tc-act-options-msg formats: - - value: bfifo - - - value: blackhole + value: bpf + attribute-set: tc-act-bpf-attrs - - value: cake - attribute-set: tc-cake-stats-attrs + value: connmark + attribute-set: tc-act-connmark-attrs - - value: cbs + value: csum + attribute-set: tc-act-csum-attrs - - value: choke + value: ct + attribute-set: tc-act-ct-attrs - - value: clsact + value: ctinfo + attribute-set: tc-act-ctinfo-attrs - - value: codel + value: gact + attribute-set: tc-act-gact-attrs - - value: drr + value: gate + attribute-set: tc-act-gate-attrs - - value: etf + value: ife + attribute-set: tc-act-ife-attrs - - value: ets + value: mirred + attribute-set: tc-act-mirred-attrs - - value: fq + value: mpls + attribute-set: tc-act-mpls-attrs - - value: fq_codel + value: nat + attribute-set: tc-act-nat-attrs - - value: fq_pie + value: pedit + attribute-set: tc-act-pedit-attrs - - value: flower + value: police + attribute-set: tc-act-police-attrs - - value: gred + value: sample + attribute-set: tc-act-sample-attrs - - value: hfsc + value: simple + attribute-set: tc-act-simple-attrs - - value: hhf + value: skbedit + attribute-set: tc-act-skbedit-attrs - - value: htb + value: skbmod + attribute-set: tc-act-skbmod-attrs - - value: ingress + value: tunnel_key + attribute-set: tc-act-tunnel-key-attrs - - value: mq + value: vlan + attribute-set: tc-act-vlan-attrs + - + name: tca-stats-app-msg + formats: - - value: mqprio + value: cake + attribute-set: tc-cake-stats-attrs - - value: multiq + value: choke + fixed-header: tc-choke-xstats - - value: netem + value: codel + fixed-header: tc-codel-xstats - - value: noqueue + value: fq + fixed-header: tc-fq-qd-stats - - value: pfifo + value: fq_codel + fixed-header: tc-fq-codel-xstats - - value: pfifo_fast + value: fq_pie + fixed-header: tc-fq-pie-xstats - - value: pfifo_head_drop + value: hhf + fixed-header: tc-hhf-xstats - value: pie - - - value: plug - - - value: prio - - - value: qfq + fixed-header: tc-pie-xstats - value: red + fixed-header: tc-red-xstats - value: sfb + fixed-header: tc-sfb-xstats - value: sfq - - - value: taprio - - - value: tbf + fixed-header: tc-sfq-xstats operations: enum-model: directional