From nobody Fri Jun 12 18:34:01 2026 Received: from mail-oa1-f46.google.com (mail-oa1-f46.google.com [209.85.160.46]) (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 18480401497 for ; Wed, 13 May 2026 12:13:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674388; cv=none; b=jYea4WhL95uu9yMg1T8sRgD8cH/esHX9tEoMVduE3y2Xnm02Fqc+boi8NKrkYaWFqupgeFV+CLBVi3sJkmESvbVYyy/wsN4+gFLF1KsW+OLMsW1DSyuO5hAkfghNt1cbnqzCWWNzQbWgIHvAIqmg27LpsgFuKvnnuj0uHRdCto0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674388; c=relaxed/simple; bh=H8Xj3KTe+E9/Icf7A/pFrLf3P4u43HDYe01sD8jBu5M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fwBmEDi1Z2VHBqGTgKJUa5LMnQZ5FQ8HtwBhQjTIMIKCJwqq1MVcYoaRNT+aycGTjbHfJFd8PnpTjypRWv4JKn43wfjrD5Wei782ZiEGuBh2qGve7wY5fSofH3x41aKMz+q89QFK7klWtfyjMlmjYy7VO4N/A8EQ2RkzIEp92vs= 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=kfHU2qMV; arc=none smtp.client-ip=209.85.160.46 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="kfHU2qMV" Received: by mail-oa1-f46.google.com with SMTP id 586e51a60fabf-439bdbc86b1so868549fac.1 for ; Wed, 13 May 2026 05:13:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778674385; x=1779279185; 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=ZWNE3Q2DvPCR8hHHvFryq5OpzNlFSaZimilgjtTyjxY=; b=kfHU2qMV0zsMCUXoqvYsddtZo51iwGIuI1aaWi8VeQwJ4XONTw5vMWPoyLK9QkBcO1 PI4eW3JJ737N4Y+/4Oe4Rs1zg0+LhQvkjFaluYgXxWRDO4LwPEJDsYqKwjLhbCW7qliT rr9PCABQNyEbHyQhzaX3VaJTSEc+VlMbnKWnTNdL98YbeCFNv7D8GNnOSDF7ls+OXLnh yXtr2pFP+8S8WuY8RmLw62gmyE/aJMdNDtld8fArOyGVNCXhXkqnQbz3Ky7dZ68i1/Oz 1TuqWi5rGWRn8TuIyhJlFcJeJJOspUfHh6ucnxW1zFK9DsbhgWFIB3WhBRXxwifEbkuO hNaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778674385; x=1779279185; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZWNE3Q2DvPCR8hHHvFryq5OpzNlFSaZimilgjtTyjxY=; b=dRemr5vCqsJE9F8M49AwskCCqUz95/Jj2JmW2x+YqkiuLnuFJv5Kh4ClIuSbttRy1G 6MCF4axU4bomgmAkdC8byCZLQZaG1YSqsPE5ZksCMtj9VCMTo+MoOXQ5OPoLFb0rxHkO j0LoV0HnooLZ8262L9zEDKG4SthkQosAlydAqAVFZaV8M7hEUJoXKeA6RmvrJmL2ljdO IkU5WvOttvtQfG0tGKwzC44/c4RoaZIWE/+IeiQ9DUP8hgdyEZpQa1XTuc4c6J3yj7rV q6ziHp1F7NmICMmE8oDHGsiiLA4zszk64n1udsQYGlQpclRD9X2sVMhVHcGGIDhgfY1J 0btw== X-Forwarded-Encrypted: i=1; AFNElJ/WtzF+Nfz50H2dtqRtdbPN8lYeT+LKDwXiVP6ZqsqvJ49mOhzoupGq+nXMAHhKVmE8iSidoyDBiz6L9RM=@vger.kernel.org X-Gm-Message-State: AOJu0YzHqurlzlAO5kWMo+i+7kbL3lu88rPhDLeU6vcmdPGM6XpyzeAn 4g72hDUrzavZyzeS8nCf87ZgygWDR5B5DEUPeSL6OxENqsxg8ZmrhB+v X-Gm-Gg: Acq92OHLyaye4UJ7PRMTeyalbnhL+RSPBMBwdGsjLkQJxIiqsJLQvmx2QE8IWndOyz0 rXtVd/wTAClWDOWCiSA063DdxMX2p3PMo3cEblCZ5DWRmWqgj9nsIebKdWXWqBJkL8Pt8PZytSI 4VG4tdFZ8ZfIjaT/J+RAxpIi0aGmlitwT0qOThKT+mTf/MSozef7Wgu2Pk4PTKR/G+Vv0IZEbr0 uIbjLFehjcmEGhG66z6ajvx4RjAAHdgbulgN8L1RMOyNL4n9pQjGQ3q4qbGxkjNu3CfhBaqH6JK zlUFgGfcRPf07+uEB65G7/Duz0jzUf1JnuT3AmbM5rRjPb/s23uNDGQOulrwDNeM7mMKfI8gtAM jYvyjGacGaq0EueBoSsak4omjMCH+cRQg5SB+eKxVcp8KmztU1VUCRaqbcBK5aeH1FlC4nokz5Y 33sCieM9iciULaik4= X-Received: by 2002:a05:6870:344a:b0:42f:d8b8:9faa with SMTP id 586e51a60fabf-4399bab5fedmr4099456fac.28.1778674384855; Wed, 13 May 2026 05:13:04 -0700 (PDT) Received: from houminxi ([72.244.37.221]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4355736dbc0sm15189442fac.11.2026.05.13.05.12.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 05:13:04 -0700 (PDT) From: Minxi Hou To: netdev@vger.kernel.org Cc: dev@openvswitch.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, i.maximets@redhat.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org, Minxi Hou Subject: [PATCH net-next 1/5] selftests: openvswitch: convert %-formatting to f-strings Date: Wed, 13 May 2026 20:12:36 +0800 Message-ID: <20260513121240.2590767-2-houminxi@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260513121240.2590767-1-houminxi@gmail.com> References: <20260513121240.2590767-1-houminxi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert all %-formatting instances to f-strings to fix C0209 pylint warnings. No behavior change. Signed-off-by: Minxi Hou --- .../selftests/net/openvswitch/ovs-dpctl.py | 274 ++++++++---------- 1 file changed, 123 insertions(+), 151 deletions(-) diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/t= esting/selftests/net/openvswitch/ovs-dpctl.py index 3b6a26e265a4..3671fe16b5a7 100644 --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -65,7 +65,7 @@ OVS_FLOW_CMD_SET =3D 4 UINT32_MAX =3D 0xFFFFFFFF =20 def macstr(mac): - outstr =3D ":".join(["%02X" % i for i in mac]) + outstr =3D ":".join([f"{i:02X}" for i in mac]) return outstr =20 =20 @@ -146,7 +146,7 @@ def parse_flags(flag_str, flag_vals): if flag in flag_vals: if maskResult & flag_vals[flag]: raise KeyError( - "Flag %s set once, cannot be set in multiples" % flag + f"Flag {flag} set once, cannot be set in multiples" ) =20 if setFlag: @@ -154,7 +154,7 @@ def parse_flags(flag_str, flag_vals): =20 maskResult |=3D flag_vals[flag] else: - raise KeyError("Missing flag value: %s" % flag) + raise KeyError(f"Missing flag value: {flag}") =20 flag_str =3D flag_str[flag_len:] =20 @@ -211,7 +211,7 @@ def convert_ipv6(data): elif not mask: mask =3D 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' elif mask.isdigit(): - mask =3D ipaddress.IPv6Network("::/" + mask).hostmask + mask =3D ipaddress.IPv6Network(f"::/{mask}").hostmask =20 return ipaddress.IPv6Address(ip).packed, ipaddress.IPv6Address(mask).p= acked =20 @@ -342,13 +342,13 @@ def parse_attrs(actstr, attr_desc): del attr_desc[i] =20 if not found: - raise ValueError("Unknown attribute: '%s'" % actstr) + raise ValueError(f"Unknown attribute: '{actstr}'") =20 actstr =3D actstr[strspn(actstr, ", ") :] =20 if actstr[0] !=3D ")": raise ValueError("Action string contains extra garbage or has " - "unbalanced parenthesis: '%s'" % actstr) + f"unbalanced parenthesis: '{actstr}'") =20 return attrs, actstr[1:] =20 @@ -403,14 +403,13 @@ class ovsactions(nla): ) =20 def dpstr(self, more=3DFalse): - args =3D "group=3D%d" % self.get_attr("OVS_PSAMPLE_ATTR_GROUP") + args =3D f"group=3D{self.get_attr('OVS_PSAMPLE_ATTR_GROUP')}" =20 cookie =3D self.get_attr("OVS_PSAMPLE_ATTR_COOKIE") if cookie: - args +=3D ",cookie(%s)" % \ - "".join(format(x, "02x") for x in cookie) + args +=3D f",cookie({''.join(format(x, '02x') for x in coo= kie)})" =20 - return "psample(%s)" % args + return f"psample({args})" =20 def parse(self, actstr): desc =3D ( @@ -441,15 +440,15 @@ class ovsactions(nla): def dpstr(self, more=3DFalse): args =3D [] =20 - args.append("sample=3D{:.2f}%".format( - 100 * self.get_attr("OVS_SAMPLE_ATTR_PROBABILITY") / - UINT32_MAX)) + prob =3D 100 * self.get_attr( + "OVS_SAMPLE_ATTR_PROBABILITY") / UINT32_MAX + args.append(f"sample=3D{prob:.2f}%") =20 actions =3D self.get_attr("OVS_SAMPLE_ATTR_ACTIONS") if actions: - args.append("actions(%s)" % actions.dpstr(more)) + args.append(f"actions({actions.dpstr(more)})") =20 - return "sample(%s)" % ",".join(args) + return f"sample({','.join(args)})" =20 def parse(self, actstr): def parse_nested_actions(actstr): @@ -518,26 +517,20 @@ class ovsactions(nla): "OVS_NAT_ATTR_IP_MAX" ): if self.get_attr("OVS_NAT_ATTR_IP_MIN"): - print_str +=3D "=3D%s," % str( - self.get_attr("OVS_NAT_ATTR_IP_MIN") - ) + print_str +=3D f"=3D{self.get_attr('OVS_NAT_ATTR_I= P_MIN')!s}," =20 if self.get_attr("OVS_NAT_ATTR_IP_MAX"): - print_str +=3D "-%s," % str( - self.get_attr("OVS_NAT_ATTR_IP_MAX") - ) + print_str +=3D f"-{self.get_attr('OVS_NAT_ATTR_IP_= MAX')!s}," else: print_str +=3D "," =20 if self.get_attr("OVS_NAT_ATTR_PROTO_MIN"): - print_str +=3D "proto_min=3D%d," % self.get_attr( - "OVS_NAT_ATTR_PROTO_MIN" - ) + val =3D self.get_attr("OVS_NAT_ATTR_PROTO_MIN") + print_str +=3D f"proto_min=3D{val}," =20 if self.get_attr("OVS_NAT_ATTR_PROTO_MAX"): - print_str +=3D "proto_max=3D%d," % self.get_attr( - "OVS_NAT_ATTR_PROTO_MAX" - ) + val =3D self.get_attr("OVS_NAT_ATTR_PROTO_MAX") + print_str +=3D f"proto_max=3D{val}," =20 if self.get_attr("OVS_NAT_ATTR_PERSISTENT"): print_str +=3D "persistent," @@ -554,22 +547,18 @@ class ovsactions(nla): if self.get_attr("OVS_CT_ATTR_COMMIT") is not None: print_str +=3D "commit," if self.get_attr("OVS_CT_ATTR_ZONE") is not None: - print_str +=3D "zone=3D%d," % self.get_attr("OVS_CT_ATTR_Z= ONE") + print_str +=3D f"zone=3D{self.get_attr('OVS_CT_ATTR_ZONE')= }," if self.get_attr("OVS_CT_ATTR_HELPER") is not None: - print_str +=3D "helper=3D%s," % self.get_attr("OVS_CT_ATTR= _HELPER") + print_str +=3D f"helper=3D{self.get_attr('OVS_CT_ATTR_HELP= ER')}," if self.get_attr("OVS_CT_ATTR_NAT") is not None: print_str +=3D self.get_attr("OVS_CT_ATTR_NAT").dpstr(more) print_str +=3D "," if self.get_attr("OVS_CT_ATTR_FORCE_COMMIT") is not None: print_str +=3D "force," if self.get_attr("OVS_CT_ATTR_EVENTMASK") is not None: - print_str +=3D "emask=3D0x%X," % self.get_attr( - "OVS_CT_ATTR_EVENTMASK" - ) + print_str +=3D f"emask=3D0x{self.get_attr('OVS_CT_ATTR_EVE= NTMASK'):X}," if self.get_attr("OVS_CT_ATTR_TIMEOUT") is not None: - print_str +=3D "timeout=3D%s" % self.get_attr( - "OVS_CT_ATTR_TIMEOUT" - ) + print_str +=3D f"timeout=3D{self.get_attr('OVS_CT_ATTR_TIM= EOUT')}" print_str +=3D ")" return print_str =20 @@ -586,17 +575,15 @@ class ovsactions(nla): def dpstr(self, more=3DFalse): print_str =3D "userspace(" if self.get_attr("OVS_USERSPACE_ATTR_PID") is not None: - print_str +=3D "pid=3D%d," % self.get_attr( - "OVS_USERSPACE_ATTR_PID" - ) + print_str +=3D f"pid=3D{self.get_attr('OVS_USERSPACE_ATTR_= PID')}," if self.get_attr("OVS_USERSPACE_ATTR_USERDATA") is not None: print_str +=3D "userdata=3D" for f in self.get_attr("OVS_USERSPACE_ATTR_USERDATA"): - print_str +=3D "%x." % f + print_str +=3D f"{f:x}." if self.get_attr("OVS_USERSPACE_ATTR_EGRESS_TUN_PORT") is not = None: - print_str +=3D "egress_tun_port=3D%d" % self.get_attr( - "OVS_USERSPACE_ATTR_EGRESS_TUN_PORT" - ) + val =3D self.get_attr( + "OVS_USERSPACE_ATTR_EGRESS_TUN_PORT") + print_str +=3D f"egress_tun_port=3D{val}" print_str +=3D ")" return print_str =20 @@ -624,13 +611,13 @@ class ovsactions(nla): print_str +=3D "," =20 if field[0] =3D=3D "OVS_ACTION_ATTR_OUTPUT": - print_str +=3D "%d" % int(self.get_attr(field[0])) + print_str +=3D f"{self.get_attr(field[0])}" elif field[0] =3D=3D "OVS_ACTION_ATTR_RECIRC": - print_str +=3D "recirc(0x%x)" % int(self.get_attr(field[0]= )) + print_str +=3D f"recirc(0x{self.get_attr(field[0]):x})" elif field[0] =3D=3D "OVS_ACTION_ATTR_TRUNC": - print_str +=3D "trunc(%d)" % int(self.get_attr(field[0])) + print_str +=3D f"trunc({self.get_attr(field[0])})" elif field[0] =3D=3D "OVS_ACTION_ATTR_DROP": - print_str +=3D "drop(%d)" % int(self.get_attr(field[0])) + print_str +=3D f"drop({self.get_attr(field[0])})" elif field[0] =3D=3D "OVS_ACTION_ATTR_CT_CLEAR": print_str +=3D "ct_clear" elif field[0] =3D=3D "OVS_ACTION_ATTR_POP_VLAN": @@ -641,8 +628,8 @@ class ovsactions(nla): tci =3D datum["vlan_tci"] vid =3D tci & 0x0FFF pcp =3D (tci >> 13) & 0x7 - print_str +=3D "push_vlan(vid=3D%d,pcp=3D%d" \ - ",tpid=3D0x%04x)" % (vid, pcp, tpid) + print_str +=3D (f"push_vlan(vid=3D{vid},pcp=3D{pcp}" + f",tpid=3D0x{tpid:04x})") elif field[0] =3D=3D "OVS_ACTION_ATTR_POP_ETH": print_str +=3D "pop_eth" elif field[0] =3D=3D "OVS_ACTION_ATTR_POP_NSH": @@ -750,32 +737,27 @@ class ovsactions(nla): for kv in actstr[:paren].split(","): if "=3D" not in kv: raise ValueError( - "push_vlan(): bad field '%s'" - % kv.strip()) + f"push_vlan(): bad field '{kv.strip()}'") k =3D kv[:kv.index("=3D")].strip() v =3D kv[kv.index("=3D") + 1:].strip() if k =3D=3D "vid": vid =3D int(v, 0) if vid < 0 or vid > 0xFFF: raise ValueError( - "push_vlan(): vid=3D%d out of " - "range (0-4095)" % vid) + f"push_vlan(): vid=3D{vid} out of range (0= -4095)") elif k =3D=3D "pcp": pcp =3D int(v, 0) if pcp < 0 or pcp > 7: raise ValueError( - "push_vlan(): pcp=3D%d out of " - "range (0-7)" % pcp) + f"push_vlan(): pcp=3D{pcp} out of range (0= -7)") elif k =3D=3D "tpid": tpid =3D int(v, 0) if tpid < 0 or tpid > 0xFFFF: raise ValueError( - "push_vlan(): tpid=3D0x%x out " - "of range (0-0xffff)" % tpid) + f"push_vlan(): tpid=3D0x{tpid:x} out of ra= nge (0-0xffff)") else: raise ValueError( - "push_vlan(): unknown key '%s'" - % k) + f"push_vlan(): unknown key '{k}'") tci =3D (vid & 0x0FFF) | ((pcp & 0x7) << 13) \ | 0x1000 pvact =3D self.push_vlan() @@ -802,7 +784,7 @@ class ovsactions(nla): actstr =3D k.parse(actstr, None) self["attrs"].append(("OVS_ACTION_ATTR_SET", k)) if not actstr.startswith(")"): - actstr =3D ")" + actstr + actstr =3D f"){actstr}" parsed =3D True elif parse_starts_block(actstr, "set_masked(", False): parencount +=3D 1 @@ -812,7 +794,7 @@ class ovsactions(nla): actstr =3D k.parse(actstr, m) self["attrs"].append(("OVS_ACTION_ATTR_SET_MASKED", [k, m]= )) if not actstr.startswith(")"): - actstr =3D ")" + actstr + actstr =3D f"){actstr}" parsed =3D True elif parse_starts_block(actstr, "ct(", False): parencount +=3D 1 @@ -943,7 +925,7 @@ class ovsactions(nla): parencount -=3D 1 actstr =3D actstr[strspn(actstr, " "):] if len(actstr) and actstr[0] !=3D ")": - raise ValueError("Action str: '%s' unbalanced" % actst= r) + raise ValueError(f"Action str: '{actstr}' unbalanced") actstr =3D actstr[1:] =20 if len(actstr) and actstr[0] =3D=3D ")": @@ -952,7 +934,7 @@ class ovsactions(nla): actstr =3D actstr[strspn(actstr, ", ") :] =20 if not parsed: - raise ValueError("Action str: '%s' not supported" % actstr) + raise ValueError(f"Action str: '{actstr}' not supported") =20 return (totallen - len(actstr)) =20 @@ -1071,20 +1053,20 @@ class ovskey(nla): return flowstr, k, m =20 def dpstr(self, masked=3DNone, more=3DFalse): - outstr =3D self.proto_str + "(" + outstr =3D f"{self.proto_str}(" first =3D False for f in self.fields_map: if first: outstr +=3D "," if masked is None: - outstr +=3D "%s=3D" % f[0] + outstr +=3D f"{f[0]}=3D" if isinstance(f[2], str): outstr +=3D f[2] % self[f[1]] else: outstr +=3D f[2](self[f[1]]) first =3D True elif more or f[3](masked[f[1]]) !=3D 0: - outstr +=3D "%s=3D" % f[0] + outstr +=3D f"{f[0]}=3D" if isinstance(f[2], str): outstr +=3D f[2] % self[f[1]] else: @@ -1658,23 +1640,23 @@ class ovskey(nla): for k in self["attrs"]: noprint =3D False if k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_ID": - print_str +=3D "tun_id=3D%d" % k[1] + print_str +=3D f"tun_id=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_IPV4_SRC": - print_str +=3D "src=3D%s" % k[1] + print_str +=3D f"src=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_IPV4_DST": - print_str +=3D "dst=3D%s" % k[1] + print_str +=3D f"dst=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_IPV6_SRC": - print_str +=3D "ipv6_src=3D%s" % k[1] + print_str +=3D f"ipv6_src=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_IPV6_DST": - print_str +=3D "ipv6_dst=3D%s" % k[1] + print_str +=3D f"ipv6_dst=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_TOS": - print_str +=3D "tos=3D%d" % k[1] + print_str +=3D f"tos=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_TTL": - print_str +=3D "ttl=3D%d" % k[1] + print_str +=3D f"ttl=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_TP_SRC": - print_str +=3D "tp_src=3D%d" % k[1] + print_str +=3D f"tp_src=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_TP_DST": - print_str +=3D "tp_dst=3D%d" % k[1] + print_str +=3D f"tp_dst=3D{k[1]}" elif k[0] =3D=3D "OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT": noprint =3D True flagsattrs.append("df") @@ -1689,7 +1671,7 @@ class ovskey(nla): print_str +=3D "," =20 if len(flagsattrs): - print_str +=3D "flags(" + "|".join(flagsattrs) + ")" + print_str +=3D f"flags({'|'.join(flagsattrs)})" print_str +=3D ")" return print_str =20 @@ -1712,8 +1694,8 @@ class ovskey(nla): pcp =3D (tci >> 13) & 0x7 cfi =3D (tci >> 12) & 0x1 if cfi: - return "vid=3D%d,pcp=3D%d,cfi=3D%d" % (vid, pcp, cfi) - return "tci=3D0x%04x" % tci + return f"vid=3D{vid},pcp=3D{pcp},cfi=3D{cfi}" + return f"tci=3D0x{tci:04x}" =20 @staticmethod def _parse_vlan_from_flowstr(flowstr): @@ -1757,7 +1739,7 @@ class ovskey(nla): eq =3D flowstr.find('=3D') if eq =3D=3D -1: raise ValueError( - "vlan(): expected key=3Dvalue, got '%s'" % flowstr) + f"vlan(): expected key=3Dvalue, got '{flowstr}'") key =3D flowstr[:eq].strip() flowstr =3D flowstr[eq + 1:] =20 @@ -1771,13 +1753,12 @@ class ovskey(nla): flowstr =3D flowstr[end:] =20 if not val: - raise ValueError("vlan(): empty value for key '%s'" % key) + raise ValueError(f"vlan(): empty value for key '{key}'") try: v =3D int(val, 0) except ValueError as exc: raise ValueError( - "vlan(): invalid value '%s' for key '%s'" - % (val, key)) from exc + f"vlan(): invalid value '{val}' for key '{key}'") from= exc =20 if key =3D=3D 'tci': if has_tci: @@ -1785,7 +1766,7 @@ class ovskey(nla): if has_vid or has_pcp or has_cfi: raise ValueError(_tci_mix_err) if v > 0xFFFF or v < 0: - raise ValueError("vlan(): tci=3D0x%x out of range" % v) + raise ValueError(f"vlan(): tci=3D0x{v:x} out of range") tci =3D v mask =3D 0xFFFF has_tci =3D True @@ -1795,7 +1776,7 @@ class ovskey(nla): if has_vid: raise ValueError("vlan(): duplicate 'vid'") if v < 0 or v > 0xFFF: - raise ValueError("vlan(): vid=3D%d out of range (0-409= 5)" % v) + raise ValueError(f"vlan(): vid=3D{v} out of range (0-4= 095)") tci |=3D v mask |=3D 0x0FFF has_vid =3D True @@ -1805,7 +1786,7 @@ class ovskey(nla): if has_pcp: raise ValueError("vlan(): duplicate 'pcp'") if v < 0 or v > 7: - raise ValueError("vlan(): pcp=3D%d out of range (0-7)"= % v) + raise ValueError(f"vlan(): pcp=3D{v} out of range (0-7= )") tci |=3D (v & 0x7) << 13 mask |=3D 0xE000 has_pcp =3D True @@ -1820,7 +1801,7 @@ class ovskey(nla): mask |=3D ovskey._VLAN_CFI_MASK has_cfi =3D True else: - raise ValueError("vlan(): unknown key '%s'" % key) + raise ValueError(f"vlan(): unknown key '{key}'") =20 flowstr =3D flowstr[1:] # skip ')' # Catch immediate '))' (user error). A ')' after ',' is consumed @@ -1856,7 +1837,7 @@ class ovskey(nla): depth -=3D 1 if depth < 0: raise ValueError( - "encap(): unmatched ')' at position %d" % i) + f"encap(): unmatched ')' at position {i}") if depth =3D=3D 0: end =3D i break @@ -1879,8 +1860,7 @@ class ovskey(nla): remaining =3D inner_key.parse(inner_str, inner_mask) if remaining and re.search(r'[^\s,)]', remaining): raise ValueError( - "encap(): unrecognized trailing " - "content '%s'" % remaining.strip()) + f"encap(): unrecognized trailing content '{remaining.strip= ()}'") =20 return flowstr, inner_key, inner_mask =20 @@ -1951,7 +1931,7 @@ class ovskey(nla): lambda x: parse_flags(x, None), ), ): - fld =3D field[1] + "(" + fld =3D f"{field[1]}(" if not flowstr.startswith(fld): continue =20 @@ -2089,15 +2069,15 @@ class ovskey(nla): else: if m is None or field[3](m): val =3D fmt(v) if callable(fmt) else fmt % v - print_str +=3D field[1] + "(" + val + ")," + print_str +=3D f"{field[1]}({val})," elif more or m !=3D 0: if field[0] =3D=3D "OVS_KEY_ATTR_VLAN": - val =3D "tci=3D0x%04x/0x%04x" % (v, m) + val =3D f"tci=3D0x{v:04x}/0x{m:04x}" elif callable(fmt): - val =3D fmt(v) + "/" + fmt(m) + val =3D f"{fmt(v)}/{fmt(m)}" else: - val =3D (fmt % v) + "/" + (fmt % m) - print_str +=3D field[1] + "(" + val + ")," + val =3D f"{fmt % v}/{fmt % m}" + print_str +=3D f"{field[1]}({val})," =20 return print_str =20 @@ -2179,7 +2159,7 @@ class OvsPacket(GenericNetlinkSocket): elif msg["cmd"] =3D=3D OvsPacket.OVS_PACKET_CMD_EXECUT= E: up.execute(msg) else: - print("Unknown cmd: %d" % msg["cmd"]) + print(f"Unknown cmd: {msg['cmd']}") except NetlinkError as ne: raise ne =20 @@ -2363,7 +2343,7 @@ class OvsVport(GenericNetlinkSocket): return "vxlan" elif vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_GENEVE: return "geneve" - raise ValueError("Unknown vport type:%d" % vport_type) + raise ValueError(f"Unknown vport type:{vport_type}") =20 def str_to_type(vport_type): if vport_type =3D=3D "netdev": @@ -2376,7 +2356,7 @@ class OvsVport(GenericNetlinkSocket): return OvsVport.OVS_VPORT_TYPE_VXLAN elif vport_type =3D=3D "geneve": return OvsVport.OVS_VPORT_TYPE_GENEVE - raise ValueError("Unknown vport type: '%s'" % vport_type) + raise ValueError(f"Unknown vport type: '{vport_type}'") =20 def __init__(self, packet=3DOvsPacket()): GenericNetlinkSocket.__init__(self) @@ -2550,16 +2530,14 @@ class OvsFlow(GenericNetlinkSocket): ufid =3D self.get_attr("OVS_FLOW_ATTR_UFID") ufid_str =3D "" if ufid is not None: - ufid_str =3D ( - "ufid:{:08x}-{:04x}-{:04x}-{:04x}-{:04x}{:08x}".format( - ufid[0], - ufid[1] >> 16, - ufid[1] & 0xFFFF, - ufid[2] >> 16, - ufid[2] & 0, - ufid[3], - ) - ) + u0 =3D ufid[0] + u1h =3D ufid[1] >> 16 + u1l =3D ufid[1] & 0xFFFF + u2h =3D ufid[2] >> 16 + u2l =3D ufid[2] & 0 + u3 =3D ufid[3] + ufid_str =3D (f"ufid:{u0:08x}-{u1h:04x}-{u1l:04x}" + f"-{u2h:04x}-{u2l:04x}{u3:08x}") =20 key_field =3D self.get_attr("OVS_FLOW_ATTR_KEY") keymsg =3D None @@ -2579,7 +2557,7 @@ class OvsFlow(GenericNetlinkSocket): print_str =3D "" =20 if more: - print_str +=3D ufid_str + "," + print_str +=3D f"{ufid_str}," =20 if keymsg is not None: print_str +=3D keymsg.dpstr(maskmsg, more) @@ -2588,10 +2566,9 @@ class OvsFlow(GenericNetlinkSocket): if stats is None: print_str +=3D " packets:0, bytes:0," else: - print_str +=3D " packets:%d, bytes:%d," % ( - stats["packets"], - stats["bytes"], - ) + pkts =3D stats["packets"] + nbytes =3D stats["bytes"] + print_str +=3D f" packets:{pkts}, bytes:{nbytes}," =20 used =3D self.get_attr("OVS_FLOW_ATTR_USED") print_str +=3D " used:" @@ -2601,7 +2578,7 @@ class OvsFlow(GenericNetlinkSocket): used_time =3D int(used) cur_time_sec =3D time.clock_gettime(time.CLOCK_MONOTONIC) used_time =3D (cur_time_sec * 1000) - used_time - print_str +=3D "{}s,".format(used_time / 1000) + print_str +=3D f"{used_time / 1000}s," =20 print_str +=3D " actions:" if ( @@ -2769,7 +2746,7 @@ class OvsFlow(GenericNetlinkSocket): pktdata =3D packetmsg.get_attr("OVS_PACKET_ATTR_PACKET") pktpres =3D "yes" if pktdata is not None else "no" =20 - print("MISS upcall[%d/%s]: %s" % (seq, pktpres, keystr), flush=3DT= rue) + print(f"MISS upcall[{seq}/{pktpres}]: {keystr}", flush=3DTrue) =20 def execute(self, packetmsg): print("userspace execute command", flush=3DTrue) @@ -2803,16 +2780,16 @@ class psample_sample(genlmsg): data =3D "" for (attr, value) in self["attrs"]: if attr =3D=3D "PSAMPLE_ATTR_SAMPLE_GROUP": - fields.append("group:%d" % value) + fields.append(f"group:{value}") if attr =3D=3D "PSAMPLE_ATTR_SAMPLE_RATE": - fields.append("rate:%d" % value) + fields.append(f"rate:{value}") if attr =3D=3D "PSAMPLE_ATTR_USER_COOKIE": value =3D "".join(format(x, "02x") for x in value) - fields.append("cookie:%s" % value) + fields.append(f"cookie:{value}") if attr =3D=3D "PSAMPLE_ATTR_DATA" and len(value) > 0: - data =3D "data:%s" % "".join(format(x, "02x") for x in val= ue) + data =3D f"data:{''.join(format(x, '02x') for x in value)}" =20 - return ("%s %s" % (",".join(fields), data)).strip() + return (f"{','.join(fields)} {data}").strip() =20 =20 class psample_msg(Marshal): @@ -2846,23 +2823,22 @@ def print_ovsdp_full(dp_lookup_rep, ifindex, ndb=3D= NDB(), vpl=3DOvsVport()): user_features =3D dp_lookup_rep.get_attr("OVS_DP_ATTR_USER_FEATURES") masks_cache_size =3D dp_lookup_rep.get_attr("OVS_DP_ATTR_MASKS_CACHE_S= IZE") =20 - print("%s:" % dp_name) - print( - " lookups: hit:%d missed:%d lost:%d" - % (base_stats["hit"], base_stats["missed"], base_stats["lost"]) - ) - print(" flows:%d" % base_stats["flows"]) + print(f"{dp_name}:") + hit =3D base_stats["hit"] + missed =3D base_stats["missed"] + lost =3D base_stats["lost"] + print(f" lookups: hit:{hit} missed:{missed} lost:{lost}") + print(f" flows:{base_stats['flows']}") pkts =3D base_stats["hit"] + base_stats["missed"] avg =3D (megaflow_stats["mask_hit"] / pkts) if pkts !=3D 0 else 0.0 - print( - " masks: hit:%d total:%d hit/pkt:%f" - % (megaflow_stats["mask_hit"], megaflow_stats["masks"], avg) - ) + mhit =3D megaflow_stats["mask_hit"] + mtotal =3D megaflow_stats["masks"] + print(f" masks: hit:{mhit} total:{mtotal} hit/pkt:{avg:f}") print(" caches:") - print(" masks-cache: size:%d" % masks_cache_size) + print(f" masks-cache: size:{masks_cache_size}") =20 if user_features is not None: - print(" features: 0x%X" % user_features) + print(f" features: 0x{user_features:X}") =20 # port print out for iface in ndb.interfaces: @@ -2873,16 +2849,12 @@ def print_ovsdp_full(dp_lookup_rep, ifindex, ndb=3D= NDB(), vpl=3DOvsVport()): if vpo: dpo =3D vpo.get_attr("OVS_TUNNEL_ATTR_DST_PORT") if dpo: - opts +=3D " tnl-dport:%s" % dpo - print( - " port %d: %s (%s%s)" - % ( - rep.get_attr("OVS_VPORT_ATTR_PORT_NO"), - rep.get_attr("OVS_VPORT_ATTR_NAME"), - OvsVport.type_to_str(rep.get_attr("OVS_VPORT_ATTR_TYPE= ")), - opts, - ) - ) + opts +=3D f" tnl-dport:{dpo}" + port_no =3D rep.get_attr("OVS_VPORT_ATTR_PORT_NO") + name =3D rep.get_attr("OVS_VPORT_ATTR_NAME") + vtype =3D OvsVport.type_to_str( + rep.get_attr("OVS_VPORT_ATTR_TYPE")) + print(f" port {port_no}: {name} ({vtype}{opts})") =20 =20 def main(argv): @@ -3014,14 +2986,14 @@ def main(argv): if not found: msg =3D "No DP found" if args.showdp is not None: - msg +=3D ":'%s'" % args.showdp + msg +=3D f":'{args.showdp}'" print(msg) elif hasattr(args, "adddp"): rep =3D ovsdp.create(args.adddp, args.upcall, args.versioning, ovs= pk) if rep is None: - print("DP '%s' already exists" % args.adddp) + print(f"DP '{args.adddp}' already exists") else: - print("DP '%s' added" % args.adddp) + print(f"DP '{args.adddp}' added") if args.upcall: ovspk.upcall_handler(ovsflow) elif hasattr(args, "deldp"): @@ -3029,12 +3001,12 @@ def main(argv): elif hasattr(args, "addif"): rep =3D ovsdp.info(args.dpname, 0) if rep is None: - print("DP '%s' not found." % args.dpname) + print(f"DP '{args.dpname}' not found.") return 1 dpindex =3D rep["dpifindex"] rep =3D ovsvp.attach(rep["dpifindex"], args.addif, args.ptype, args.dport, args.lwt) - msg =3D "vport '%s'" % args.addif + msg =3D f"vport '{args.addif}'" if rep and rep["header"]["error"] is None: msg +=3D " added." else: @@ -3046,10 +3018,10 @@ def main(argv): elif hasattr(args, "delif"): rep =3D ovsdp.info(args.dpname, 0) if rep is None: - print("DP '%s' not found." % args.dpname) + print(f"DP '{args.dpname}' not found.") return 1 rep =3D ovsvp.detach(rep["dpifindex"], args.delif) - msg =3D "vport '%s'" % args.delif + msg =3D f"vport '{args.delif}'" if rep and rep["header"]["error"] is None: msg +=3D " removed." else: @@ -3060,7 +3032,7 @@ def main(argv): elif hasattr(args, "dumpdp"): rep =3D ovsdp.info(args.dumpdp, 0) if rep is None: - print("DP '%s' not found." % args.dumpdp) + print(f"DP '{args.dumpdp}' not found.") return 1 rep =3D ovsflow.dump(rep["dpifindex"]) for flow in rep: @@ -3068,7 +3040,7 @@ def main(argv): elif hasattr(args, "flbr"): rep =3D ovsdp.info(args.flbr, 0) if rep is None: - print("DP '%s' not found." % args.flbr) + print(f"DP '{args.flbr}' not found.") return 1 flow =3D OvsFlow.ovs_flow_msg() flow.parse(args.flow, args.acts, rep["dpifindex"]) @@ -3076,7 +3048,7 @@ def main(argv): elif hasattr(args, "flsbr"): rep =3D ovsdp.info(args.flsbr, 0) if rep is None: - print("DP '%s' not found." % args.flsbr) + print(f"DP '{args.flsbr}' not found.") ovsflow.del_flows(rep["dpifindex"]) =20 return 0 --=20 2.53.0 From nobody Fri Jun 12 18:34:01 2026 Received: from mail-oa1-f42.google.com (mail-oa1-f42.google.com [209.85.160.42]) (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 4260D3FCB03 for ; Wed, 13 May 2026 12:13:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674408; cv=none; b=PTkg62lmYWT+8iSOFXH0C0wvAEyVb6buYV0amG1zE/GicjSBGLA6lLPX4A4s4jnhrNLBZhxxHu8fiMl732i57w87e2/8PogAwmdBn7WdUrfGY4/Dtt4s4MR7hp0/7/Dc3JUYhPbSQhsNg2kQRL6SkY96a5WItVFPShFAWNvc/o0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674408; c=relaxed/simple; bh=6vOeaWIFRWOCkQ2ypviIEtXbauIiLWVfp1rOWJGuDcA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BGnyDcCapyowIXiOVlRGee/VLeSDCZS1JFZHyRtRQhU7o/0EoFLEG83OlVVuhfuw1+ulaAs0IzdlcqjpjXV68oFsqV3wQ2vrzkqguvbmBk/mrq/wWfkjWcV4eHmCXnqHY8EUGkTA+D8G/K3NuXG7ear79YfWrROz+2jAUkhaunI= 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=aL4Do+TC; arc=none smtp.client-ip=209.85.160.42 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="aL4Do+TC" Received: by mail-oa1-f42.google.com with SMTP id 586e51a60fabf-439bdbc86b1so868785fac.1 for ; Wed, 13 May 2026 05:13:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778674406; x=1779279206; 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=KXar17g0k4H/KFHfDGYL5Bn3v4WqyC95txr2e3AusWE=; b=aL4Do+TCAffC/QHj/7yY+XQkoQUtw5iRaOUqeEw5h9o9dZubF2Yiostzz/LJGJpDsr nuTFwYvVdx1yfR/1RwVYQerZB4N7RDG2jszTwmfBmzqB4eo/F/oXixx16dl++FInRWX1 gff558rnQq1QedbE9vslp3fRgJnNts+RqL7SRMn7RLg+8lEuRu6w0HFf0To3AE3ksoye j3vN+68/icCGZ2MfKX2HaKIXHh6cdsOuNDu54GykDd3tAWhHYyTzm7m5zvJiJIVNHZ7n uBO6yQzFOhLqVeyTr5yB6ECDz7KEVw/b2Tj5xXbzsrOSVkN6/DrnWnXFb6t2PERm9xO7 X0tQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778674406; x=1779279206; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=KXar17g0k4H/KFHfDGYL5Bn3v4WqyC95txr2e3AusWE=; b=tUp2Jdyxm8aBSgq7xihUNvx5KdB7E6+OaAdARw0aL8HPVxfsZ1Wx74TJLu0EYP/Xhw qoFVb2DzmM0VFoYikLJManBLKB5mTbCoygWTXMKbJ+67i1u0I6V+1YKI6ep0y+ci/LTh a/TUa//3q/TTBYzDPUktPTuV91ZzNw/vqMarSzElNeZb6YduWD1C85F44DOiB+pra9/y tRikAJ+wqSPFV8i9ZU4DRYKZce9S+QOos0svd3bj65uTuqg2zr8qtbkcZNIQIaHGXhGK 4QTTYToKHGAbBu8n/KVVfeNK5vAK9FuCl0hOVyRqUpqdKlS3pOdNFlTQAVWeybSB0348 hs0Q== X-Forwarded-Encrypted: i=1; AFNElJ+GEHqsn9tQLDflubh9dPZc3HgXV1t1D124Yq3rCowre583x65zrJa/z2lMA7G3hL5A3ET/hDlwLi9s73o=@vger.kernel.org X-Gm-Message-State: AOJu0YwNJ9GkIKEwF1zPF/4DpbxEEpTWCSiy26rsb057DcIYI2kCiLhJ LucLx1DaKRWtdwj+LOpz4hY0ddwRmgLAGLXtTVRDLrryifq321aIC4Q2 X-Gm-Gg: Acq92OFTLfg22Up4kYEL+Eq2yPevosBjMKrQ2WIG09lYp9ULbdNu1VTI1HKWYaYYmDq hlc8EGdtq/8Yls3EwgGWFFgO1mYnhNZQ4VrwqjcT+KMYOBT1KQtPVCbo/29rVE7bthiR8viiDCH 50U8GYDbvfXFtRYo5fOoee9TaLCNl29sXTaqjelksFI2fN4I0HmyClh2AA4DRhi9p6VjV+URlC6 2NyekIZyg0gs+BnU9VDW0jaDxrB59DgqWRQ7csQTEYU8GAk9XsEco5pHrOnHL8Irpv7pqU5L4Ru +GDh3MpoKmVtTeNihSISJB7V84hyhXOdo8YO6qKcSZlolHC4EOdphSlw7lcwVZJ9wyna+23o9Bp 04Zxt3Zbz+QdKFMzCyaMT2j1V4BVeoeHPE9ieZEa9euakfn5+f1wPkhZ5COex8zfssAHTWeY+mQ NtjboxHtbozsNUnsaNvlN1T15p7g== X-Received: by 2002:a05:6870:f14a:b0:42c:b9d:8987 with SMTP id 586e51a60fabf-439cac4a4aamr1607270fac.10.1778674406006; Wed, 13 May 2026 05:13:26 -0700 (PDT) Received: from houminxi ([72.244.37.221]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4355736dbc0sm15189442fac.11.2026.05.13.05.13.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 05:13:24 -0700 (PDT) From: Minxi Hou To: netdev@vger.kernel.org Cc: dev@openvswitch.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, i.maximets@redhat.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org, Minxi Hou Subject: [PATCH net-next 2/5] selftests: openvswitch: fix misc pylint warnings in ovs-dpctl.py Date: Wed, 13 May 2026 20:12:37 +0800 Message-ID: <20260513121240.2590767-3-houminxi@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260513121240.2590767-1-houminxi@gmail.com> References: <20260513121240.2590767-1-houminxi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fix miscellaneous pylint warnings with no behavior change: - W0611: remove unused import struct - W0702: replace bare except with except Exception - C0325: remove superfluous parentheses after return - R1705: remove unnecessary elif after return - W0108: replace unnecessary lambda with int - R1714: merge comparisons with in operator - W0719: replace raise Exception with raise ValueError - C1802: use implicit boolean test instead of len() - C0121: use is None instead of =3D=3D None - R1719: simplify if-expression to bool test - R1703: simplify if/else to assignment expression - W0612: remove unused variables (keybits, maskbits, lst) - replace unused loop variable with underscore Signed-off-by: Minxi Hou --- .../selftests/net/openvswitch/ovs-dpctl.py | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/t= esting/selftests/net/openvswitch/ovs-dpctl.py index 3671fe16b5a7..5ce054768f48 100644 --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -11,7 +11,6 @@ import logging import math import multiprocessing import re -import struct import sys import time import types @@ -125,10 +124,7 @@ def parse_flags(flag_str, flag_vals): maskResult =3D int(digits, 0) =20 while len(flag_str) > 0 and (flag_str[0] =3D=3D "+" or flag_str[0] =3D= =3D "-"): - if flag_str[0] =3D=3D "+": - setFlag =3D True - elif flag_str[0] =3D=3D "-": - setFlag =3D False + setFlag =3D flag_str[0] =3D=3D "+" =20 flag_str =3D flag_str[1:] =20 @@ -221,10 +217,9 @@ def convert_int(size): =20 if not value: return 0, 0 - elif not mask: + if not mask: return int(value, 0), pow(2, size) - 1 - else: - return int(value, 0), int(mask, 0) + return int(value, 0), int(mask, 0) =20 return convert_int_sized =20 @@ -688,11 +683,11 @@ class ovsactions(nla): parsed =3D True else: actstr =3D actstr[len("drop"): ] - return (totallen - len(actstr)) + return totallen - len(actstr) =20 elif parse_starts_block(actstr, r"^(\d+)", False, True): actstr, output =3D parse_extract_field( - actstr, None, r"(\d+)", lambda x: int(x), False, "0" + actstr, None, r"(\d+)", int, False, "0" ) self["attrs"].append(["OVS_ACTION_ATTR_OUTPUT", output]) parsed =3D True @@ -773,7 +768,6 @@ class ovsactions(nla): subacts =3D ovsactions() actstr =3D actstr[len("clone("):] parsedLen =3D subacts.parse(actstr) - lst =3D [] self["attrs"].append(("OVS_ACTION_ATTR_CLONE", subacts)) actstr =3D actstr[parsedLen:] parsed =3D True @@ -929,14 +923,14 @@ class ovsactions(nla): actstr =3D actstr[1:] =20 if len(actstr) and actstr[0] =3D=3D ")": - return (totallen - len(actstr)) + return totallen - len(actstr) =20 actstr =3D actstr[strspn(actstr, ", ") :] =20 if not parsed: raise ValueError(f"Action str: '{actstr}' not supported") =20 - return (totallen - len(actstr)) + return totallen - len(actstr) =20 =20 class ovskey(nla): @@ -1020,8 +1014,6 @@ class ovskey(nla): if flowstr.startswith("("): flowstr =3D flowstr[1:] =20 - keybits =3D b"" - maskbits =3D b"" for f in self.fields_map: if flowstr.startswith(f[1]): # the following assumes that the field looks @@ -1030,7 +1022,7 @@ class ovskey(nla): flowstr =3D flowstr[len(f[1]) + 1 :] splitchar =3D 0 for c in flowstr: - if c =3D=3D "," or c =3D=3D ")": + if c in (",", ")"): break splitchar +=3D 1 data =3D flowstr[:splitchar] @@ -1587,7 +1579,7 @@ class ovskey(nla): for prefix, regex, typ, attr_name, mask_val, default_val, v46_= flag in fields: flowstr, value =3D parse_extract_field(flowstr, prefix, re= gex, typ, False) if not attr_name: - raise Exception("Bad list value in tunnel fields") + raise ValueError("Bad list value in tunnel fields") =20 if value is None and attr_name in forced_include: value =3D default_val @@ -1670,7 +1662,7 @@ class ovskey(nla): if not noprint: print_str +=3D "," =20 - if len(flagsattrs): + if flagsattrs: print_str +=3D f"flags({'|'.join(flagsattrs)})" print_str +=3D ")" return print_str @@ -2250,7 +2242,7 @@ class OvsDatapath(GenericNetlinkSocket): =20 nproc =3D multiprocessing.cpu_count() procarray =3D [] - for i in range(1, nproc): + for _ in range(1, nproc): procarray +=3D [int(p.epid)] msg["attrs"].append(["OVS_DP_ATTR_UPCALL_PID", procarray]) msg["attrs"].append(["OVS_DP_ATTR_USER_FEATURES", dpfeatures]) @@ -2335,26 +2327,26 @@ class OvsVport(GenericNetlinkSocket): def type_to_str(vport_type): if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_NETDEV: return "netdev" - elif vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_INTERNAL: + if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_INTERNAL: return "internal" - elif vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_GRE: + if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_GRE: return "gre" - elif vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_VXLAN: + if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_VXLAN: return "vxlan" - elif vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_GENEVE: + if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_GENEVE: return "geneve" raise ValueError(f"Unknown vport type:{vport_type}") =20 def str_to_type(vport_type): if vport_type =3D=3D "netdev": return OvsVport.OVS_VPORT_TYPE_NETDEV - elif vport_type =3D=3D "internal": + if vport_type =3D=3D "internal": return OvsVport.OVS_VPORT_TYPE_INTERNAL - elif vport_type =3D=3D "gre": + if vport_type =3D=3D "gre": return OvsVport.OVS_VPORT_TYPE_GRE - elif vport_type =3D=3D "vxlan": + if vport_type =3D=3D "vxlan": return OvsVport.OVS_VPORT_TYPE_VXLAN - elif vport_type =3D=3D "geneve": + if vport_type =3D=3D "geneve": return OvsVport.OVS_VPORT_TYPE_GENEVE raise ValueError(f"Unknown vport type: '{vport_type}'") =20 @@ -2463,7 +2455,7 @@ class OvsVport(GenericNetlinkSocket): msg["dpifindex"] =3D dpindex msg["attrs"].append(["OVS_VPORT_ATTR_NAME", vport_ifname]) =20 - if p =3D=3D None: + if p is None: p =3D self.upcall_packet else: self.upcall_packet =3D p @@ -3036,7 +3028,7 @@ def main(argv): return 1 rep =3D ovsflow.dump(rep["dpifindex"]) for flow in rep: - print(flow.dpstr(True if args.verbose > 0 else False)) + print(flow.dpstr(args.verbose > 0)) elif hasattr(args, "flbr"): rep =3D ovsdp.info(args.flbr, 0) if rep is None: --=20 2.53.0 From nobody Fri Jun 12 18:34:01 2026 Received: from mail-oa1-f51.google.com (mail-oa1-f51.google.com [209.85.160.51]) (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 3053A3EDE53 for ; Wed, 13 May 2026 12:13:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674432; cv=none; b=llH3yyBMtw9IcI55FKositlhnPf/rXkiFmAo0X6SbEm2BD0bGz4WnYWU++HOaQoW8uhsk7jtmSk/C8bnXsu7OOKsMTPHwLvTnoLpibi4PgVlfxwkyct+Zj3SMMjzTy1qJ4POwNVHY44oltzMDegmJLNX6XIvOQGR0s5LQbOsLPA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674432; c=relaxed/simple; bh=23gPDVut3hAD3+v5gDtMrdU0xDJjdqXO5nPer0+kcwI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m6HP3YM/UoqzyhdIf8yF5a+L/GRT5abPZZfKv/EGQ53H8JrLh78Rp1cprAwGPLfLZnlBYAnB9vqAqIW64nxG29OETDcNvccceYN9OlS2+/ZKFtu+4m0WjbvFRAQxVF7w7IdeOsS7YB0ISIFyUz7DBv3ds5iyHKcXDqGEUej1zqw= 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=h2KsDwGD; arc=none smtp.client-ip=209.85.160.51 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="h2KsDwGD" Received: by mail-oa1-f51.google.com with SMTP id 586e51a60fabf-40f1a1f77a6so5047214fac.2 for ; Wed, 13 May 2026 05:13:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778674429; x=1779279229; 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=MeAceCauaZcfmyWzTKzMFMsKAoGCg8wvWu5S5P0h4yE=; b=h2KsDwGDE+ca9xZXWckt8Y7R27fUkQ31v/PljISCzQReJl7QJ99kGj/2d47vXUKlIV HkC/iOIxEbe1UtcnKDInRSHh8PnUcxS7Pwv8AnJynBwnwnQJ8pLCris4QU8i12ya4c3V XAnm1cVi+yeoMN6QCSETIFDIcsOhJvZJIOYTj72xwCcz/FaPDyvjR/j6PQZSlL6WF3me cPh6+d+AsEOQ3bMcMg0jxb1NSzqPXlf3M9st0gf74k4fo3zoHrtEeJJnEkB33gIHVlwp vn/m30hk0l+Z3ry7/GKSQmkwtl8nj2wEzPdSVYifjIGxINHVrZrYvFsIsquYmaZWpeGL U4iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778674429; x=1779279229; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MeAceCauaZcfmyWzTKzMFMsKAoGCg8wvWu5S5P0h4yE=; b=XgoML8+G0shvNASUlXPxt+VcJ3H9Drp4wuh8QwtKNYHLI3vbfk1jsRgIH2E6/qXQxa 0/csDVciCK88H/gQnu4h7gltrRi7cGpEcOnX3X9uAEtDb1FTT4uz23VV7FoMFgUAHZow x0g1AZuWpuVQIfTuxRiLVLeE2sEpPmuF83EmtmuoU6UMgZBz8tgtCOTGXyglPPyBvIaR ty5CF0fFqxBhGZTXkEDH3jiv1FfcYyY0Qr8RFmd1b7LDHqw8JSi90qggXRkdxNZySq3y LTsMf2R/m5oWNz1YBd0/ivtcJ+4KHbDPLeZf0f5fwHzPLjwADugukUTbecxlxbwARbSt UmAw== X-Forwarded-Encrypted: i=1; AFNElJ+kt2PVlZQGzctYMvTqALOFKaX56yg54OU6fzwKAIGIgbRkuILWP8SLohulgM8z7+USogf9Q1nrDvmxFSs=@vger.kernel.org X-Gm-Message-State: AOJu0Ywxf8VBIDx2qyhVyK6JStGzoMdEaZuqowaWJONth2bo9JU4/Dpb PeAUO2exx9Q//gG5d3LDvm5OTQuKT46FjnJ/3ZKjsvSCuu1xHLThYvc/ X-Gm-Gg: Acq92OHYeQnJRdFOZFxzY8a4crijTHf1iE6LX1LC1iw50tL1V+geCtfUQO3qBfuFjqZ E8Y9eA5jk6f78INezAZrNWN5Vylq4XCWBc4Rj9sPtvAwW3HcyYCYIM16EOFVvsCJYRuJv6F9rym qgY0imt7FrPs9p9A0YoAHZkZqbZyCBPKxmvSGOqTZ4Qo+hqo4xzkdKKKWWXo/2y+QqXycGVGGDe kzUSrYLbXQ20HkamLmo5N6DNSr9HmaR3qUZJJjDULY7toVGKktsPE3BkbKr/zqJvJNnKNEKJBfX mCWLcBaJ3lHYw+ZR521EaWwioyLSLZMwKykkfSzcLLPp68yB08jR0x/043N9GG5cDagiaYKn6JW xr3N4cQ9sdSVu8Gu/REECjSF/lP9DIRSljKZ9FNoLfWSk623GymKGBCi62Ki272U49elwu74ypV FziBOtke6k+iOLBFE= X-Received: by 2002:a05:6870:fb89:b0:42f:dd2e:e41e with SMTP id 586e51a60fabf-439ce17b232mr1617454fac.17.1778674428988; Wed, 13 May 2026 05:13:48 -0700 (PDT) Received: from houminxi ([72.244.37.221]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4355736dbc0sm15189442fac.11.2026.05.13.05.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 05:13:48 -0700 (PDT) From: Minxi Hou To: netdev@vger.kernel.org Cc: dev@openvswitch.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, i.maximets@redhat.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org, Minxi Hou Subject: [PATCH net-next 3/5] selftests: openvswitch: rename classes and variables in ovs-dpctl.py Date: Wed, 13 May 2026 20:12:38 +0800 Message-ID: <20260513121240.2590767-4-houminxi@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260513121240.2590767-1-houminxi@gmail.com> References: <20260513121240.2590767-1-houminxi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename classes to PascalCase and variables to snake_case to fix C0103 pylint warnings. Update nla_map type strings and nlmsg_atoms registrations to match the new class names. pyroute2 nla_map resolution uses getattr(self, type_string), so renaming the class and its nla_map string together is safe. Other fixes: - Add @staticmethod to type_to_str() and str_to_type() (E0213) Signed-off-by: Minxi Hou --- .../selftests/net/openvswitch/ovs-dpctl.py | 374 +++++++++--------- 1 file changed, 188 insertions(+), 186 deletions(-) diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/t= esting/selftests/net/openvswitch/ovs-dpctl.py index 5ce054768f48..6a9cf48948fd 100644 --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -107,11 +107,11 @@ def intparse(statestr, defmask=3D"0xffffffff"): =20 =20 def parse_flags(flag_str, flag_vals): - bitResult =3D 0 - maskResult =3D 0 + bit_result =3D 0 + mask_result =3D 0 =20 if len(flag_str) =3D=3D 0: - return flag_str, bitResult, maskResult + return flag_str, bit_result, mask_result =20 if flag_str[0].isdigit(): idx =3D 0 @@ -120,11 +120,11 @@ def parse_flags(flag_str, flag_vals): digits =3D flag_str[:idx] flag_str =3D flag_str[idx:] =20 - bitResult =3D int(digits, 0) - maskResult =3D int(digits, 0) + bit_result =3D int(digits, 0) + mask_result =3D int(digits, 0) =20 while len(flag_str) > 0 and (flag_str[0] =3D=3D "+" or flag_str[0] =3D= =3D "-"): - setFlag =3D flag_str[0] =3D=3D "+" + set_flag =3D flag_str[0] =3D=3D "+" =20 flag_str =3D flag_str[1:] =20 @@ -140,21 +140,21 @@ def parse_flags(flag_str, flag_vals): flag =3D flag_str[0:flag_len] =20 if flag in flag_vals: - if maskResult & flag_vals[flag]: + if mask_result & flag_vals[flag]: raise KeyError( f"Flag {flag} set once, cannot be set in multiples" ) =20 - if setFlag: - bitResult |=3D flag_vals[flag] + if set_flag: + bit_result |=3D flag_vals[flag] =20 - maskResult |=3D flag_vals[flag] + mask_result |=3D flag_vals[flag] else: raise KeyError(f"Missing flag value: {flag}") =20 flag_str =3D flag_str[flag_len:] =20 - return flag_str, bitResult, maskResult + return flag_str, bit_result, mask_result =20 =20 def parse_ct_state(statestr): @@ -348,7 +348,7 @@ def parse_attrs(actstr, attr_desc): return attrs, actstr[1:] =20 =20 -class ovs_dp_msg(genlmsg): +class OvsDpMsg(genlmsg): # include the OVS version # We need a custom header rather than just being able to rely on # genlmsg because fields ends up not expressing everything correctly @@ -356,23 +356,23 @@ class ovs_dp_msg(genlmsg): fields =3D genlmsg.fields + (("dpifindex", "I"),) =20 =20 -class ovsactions(nla): +class OvsActions(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( ("OVS_ACTION_ATTR_UNSPEC", "none"), ("OVS_ACTION_ATTR_OUTPUT", "uint32"), - ("OVS_ACTION_ATTR_USERSPACE", "userspace"), - ("OVS_ACTION_ATTR_SET", "ovskey"), - ("OVS_ACTION_ATTR_PUSH_VLAN", "push_vlan"), + ("OVS_ACTION_ATTR_USERSPACE", "Userspace"), + ("OVS_ACTION_ATTR_SET", "OvsKey"), + ("OVS_ACTION_ATTR_PUSH_VLAN", "PushVlan"), ("OVS_ACTION_ATTR_POP_VLAN", "flag"), - ("OVS_ACTION_ATTR_SAMPLE", "sample"), + ("OVS_ACTION_ATTR_SAMPLE", "Sample"), ("OVS_ACTION_ATTR_RECIRC", "uint32"), ("OVS_ACTION_ATTR_HASH", "none"), ("OVS_ACTION_ATTR_PUSH_MPLS", "none"), ("OVS_ACTION_ATTR_POP_MPLS", "flag"), - ("OVS_ACTION_ATTR_SET_MASKED", "ovskey"), - ("OVS_ACTION_ATTR_CT", "ctact"), + ("OVS_ACTION_ATTR_SET_MASKED", "OvsKey"), + ("OVS_ACTION_ATTR_CT", "CtAct"), ("OVS_ACTION_ATTR_TRUNC", "uint32"), ("OVS_ACTION_ATTR_PUSH_ETH", "none"), ("OVS_ACTION_ATTR_POP_ETH", "flag"), @@ -385,10 +385,10 @@ class ovsactions(nla): ("OVS_ACTION_ATTR_ADD_MPLS", "none"), ("OVS_ACTION_ATTR_DEC_TTL", "none"), ("OVS_ACTION_ATTR_DROP", "uint32"), - ("OVS_ACTION_ATTR_PSAMPLE", "psample"), + ("OVS_ACTION_ATTR_PSAMPLE", "Psample"), ) =20 - class psample(nla): + class Psample(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -420,16 +420,16 @@ class ovsactions(nla): =20 return actstr =20 - class push_vlan(nla): + class PushVlan(nla): fields =3D (("vlan_tpid", "!H"), ("vlan_tci", "!H")) =20 - class sample(nla): + class Sample(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( ("OVS_SAMPLE_ATTR_UNSPEC", "none"), ("OVS_SAMPLE_ATTR_PROBABILITY", "uint32"), - ("OVS_SAMPLE_ATTR_ACTIONS", "ovsactions"), + ("OVS_SAMPLE_ATTR_ACTIONS", "OvsActions"), ) =20 def dpstr(self, more=3DFalse): @@ -447,7 +447,7 @@ class ovsactions(nla): =20 def parse(self, actstr): def parse_nested_actions(actstr): - subacts =3D ovsactions() + subacts =3D OvsActions() parsed_len =3D subacts.parse(actstr) return subacts, actstr[parsed_len :] =20 @@ -456,7 +456,7 @@ class ovsactions(nla): return int(math.floor(UINT32_MAX * (percent / 100.0) + .5)) =20 desc =3D ( - ("sample", "OVS_SAMPLE_ATTR_PROBABILITY", percent_to_rate), + ("Sample", "OVS_SAMPLE_ATTR_PROBABILITY", percent_to_rate), ("actions", "OVS_SAMPLE_ATTR_ACTIONS", parse_nested_action= s), ) attrs, actstr =3D parse_attrs(actstr, desc) @@ -466,7 +466,7 @@ class ovsactions(nla): =20 return actstr =20 - class ctact(nla): + class CtAct(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -476,13 +476,13 @@ class ovsactions(nla): ("OVS_CT_ATTR_MARK", "none"), ("OVS_CT_ATTR_LABELS", "none"), ("OVS_CT_ATTR_HELPER", "asciiz"), - ("OVS_CT_ATTR_NAT", "natattr"), + ("OVS_CT_ATTR_NAT", "NatAttr"), ("OVS_CT_ATTR_FORCE_COMMIT", "flag"), ("OVS_CT_ATTR_EVENTMASK", "uint32"), ("OVS_CT_ATTR_TIMEOUT", "asciiz"), ) =20 - class natattr(nla): + class NatAttr(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -557,7 +557,7 @@ class ovsactions(nla): print_str +=3D ")" return print_str =20 - class userspace(nla): + class Userspace(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -755,7 +755,7 @@ class ovsactions(nla): f"push_vlan(): unknown key '{k}'") tci =3D (vid & 0x0FFF) | ((pcp & 0x7) << 13) \ | 0x1000 - pvact =3D self.push_vlan() + pvact =3D self.PushVlan() pvact["vlan_tpid"] =3D tpid pvact["vlan_tci"] =3D tci self["attrs"].append( @@ -765,15 +765,15 @@ class ovsactions(nla): =20 elif parse_starts_block(actstr, "clone(", False): parencount +=3D 1 - subacts =3D ovsactions() + subacts =3D OvsActions() actstr =3D actstr[len("clone("):] - parsedLen =3D subacts.parse(actstr) + parsed_len =3D subacts.parse(actstr) self["attrs"].append(("OVS_ACTION_ATTR_CLONE", subacts)) - actstr =3D actstr[parsedLen:] + actstr =3D actstr[parsed_len:] parsed =3D True elif parse_starts_block(actstr, "set(", False): parencount +=3D 1 - k =3D ovskey() + k =3D OvsKey() actstr =3D actstr[len("set("):] actstr =3D k.parse(actstr, None) self["attrs"].append(("OVS_ACTION_ATTR_SET", k)) @@ -782,8 +782,8 @@ class ovsactions(nla): parsed =3D True elif parse_starts_block(actstr, "set_masked(", False): parencount +=3D 1 - k =3D ovskey() - m =3D ovskey() + k =3D OvsKey() + m =3D OvsKey() actstr =3D actstr[len("set_masked("):] actstr =3D k.parse(actstr, m) self["attrs"].append(("OVS_ACTION_ATTR_SET_MASKED", [k, m]= )) @@ -793,7 +793,7 @@ class ovsactions(nla): elif parse_starts_block(actstr, "ct(", False): parencount +=3D 1 actstr =3D actstr[len("ct(") :] - ctact =3D ovsactions.ctact() + ctact =3D OvsActions.CtAct() =20 for scan in ( ("commit", "OVS_CT_ATTR_COMMIT", None), @@ -820,7 +820,7 @@ class ovsactions(nla): # sub-action and this lets it sit anywhere in the ct()= action if actstr.startswith("nat"): actstr =3D actstr[3:] - natact =3D ovsactions.ctact.natattr() + natact =3D OvsActions.CtAct.NatAttr() =20 if actstr.startswith("("): parencount +=3D 1 @@ -884,19 +884,19 @@ class ovsactions(nla): parsed =3D True =20 elif parse_starts_block(actstr, "sample(", False): - sampleact =3D self.sample() + sampleact =3D self.Sample() actstr =3D sampleact.parse(actstr[len("sample(") : ]) self["attrs"].append(["OVS_ACTION_ATTR_SAMPLE", sampleact]) parsed =3D True =20 elif parse_starts_block(actstr, "psample(", False): - psampleact =3D self.psample() + psampleact =3D self.Psample() actstr =3D psampleact.parse(actstr[len("psample(") : ]) self["attrs"].append(["OVS_ACTION_ATTR_PSAMPLE", psampleac= t]) parsed =3D True =20 elif parse_starts_block(actstr, "userspace(", False): - uact =3D self.userspace() + uact =3D self.Userspace() actstr =3D uact.parse(actstr[len("userspace(") : ]) self["attrs"].append(["OVS_ACTION_ATTR_USERSPACE", uact]) parsed =3D True @@ -933,37 +933,37 @@ class ovsactions(nla): return totallen - len(actstr) =20 =20 -class ovskey(nla): +class OvsKey(nla): nla_flags =3D NLA_F_NESTED nla_map =3D ( ("OVS_KEY_ATTR_UNSPEC", "none"), - ("OVS_KEY_ATTR_ENCAP", "encap_ovskey"), + ("OVS_KEY_ATTR_ENCAP", "EncapOvsKey"), ("OVS_KEY_ATTR_PRIORITY", "uint32"), ("OVS_KEY_ATTR_IN_PORT", "uint32"), - ("OVS_KEY_ATTR_ETHERNET", "ethaddr"), + ("OVS_KEY_ATTR_ETHERNET", "EthAddr"), ("OVS_KEY_ATTR_VLAN", "be16"), ("OVS_KEY_ATTR_ETHERTYPE", "be16"), - ("OVS_KEY_ATTR_IPV4", "ovs_key_ipv4"), - ("OVS_KEY_ATTR_IPV6", "ovs_key_ipv6"), - ("OVS_KEY_ATTR_TCP", "ovs_key_tcp"), - ("OVS_KEY_ATTR_UDP", "ovs_key_udp"), - ("OVS_KEY_ATTR_ICMP", "ovs_key_icmp"), - ("OVS_KEY_ATTR_ICMPV6", "ovs_key_icmpv6"), - ("OVS_KEY_ATTR_ARP", "ovs_key_arp"), - ("OVS_KEY_ATTR_ND", "ovs_key_nd"), + ("OVS_KEY_ATTR_IPV4", "OvsKeyIpv4"), + ("OVS_KEY_ATTR_IPV6", "OvsKeyIpv6"), + ("OVS_KEY_ATTR_TCP", "OvsKeyTcp"), + ("OVS_KEY_ATTR_UDP", "OvsKeyUdp"), + ("OVS_KEY_ATTR_ICMP", "OvsKeyIcmp"), + ("OVS_KEY_ATTR_ICMPV6", "OvsKeyIcmpv6"), + ("OVS_KEY_ATTR_ARP", "OvsKeyArp"), + ("OVS_KEY_ATTR_ND", "OvsKeyNd"), ("OVS_KEY_ATTR_SKB_MARK", "uint32"), - ("OVS_KEY_ATTR_TUNNEL", "ovs_key_tunnel"), - ("OVS_KEY_ATTR_SCTP", "ovs_key_sctp"), + ("OVS_KEY_ATTR_TUNNEL", "OvsKeyTunnel"), + ("OVS_KEY_ATTR_SCTP", "OvsKeySctp"), ("OVS_KEY_ATTR_TCP_FLAGS", "be16"), ("OVS_KEY_ATTR_DP_HASH", "uint32"), ("OVS_KEY_ATTR_RECIRC_ID", "uint32"), - ("OVS_KEY_ATTR_MPLS", "array(ovs_key_mpls)"), + ("OVS_KEY_ATTR_MPLS", "array(OvsKeyMpls)"), ("OVS_KEY_ATTR_CT_STATE", "uint32"), ("OVS_KEY_ATTR_CT_ZONE", "uint16"), ("OVS_KEY_ATTR_CT_MARK", "uint32"), ("OVS_KEY_ATTR_CT_LABELS", "none"), - ("OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4", "ovs_key_ct_tuple_ipv4"), - ("OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6", "ovs_key_ct_tuple_ipv6"), + ("OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4", "OvsKeyCtTupleIpv4"), + ("OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6", "OvsKeyCtTupleIpv6"), ("OVS_KEY_ATTR_NSH", "none"), ("OVS_KEY_ATTR_PACKET_TYPE", "none"), ("OVS_KEY_ATTR_ND_EXTENSIONS", "none"), @@ -971,7 +971,7 @@ class ovskey(nla): ("OVS_KEY_ATTR_IPV6_EXTENSIONS", "none"), ) =20 - class ovs_key_proto(nla): + class OvsKeyProto(nla): fields =3D ( ("src", "!H"), ("dst", "!H"), @@ -1003,12 +1003,12 @@ class ovskey(nla): init=3Dinit, ) =20 - def parse(self, flowstr, typeInst): + def parse(self, flowstr, type_inst): if not flowstr.startswith(self.proto_str): return None, None =20 - k =3D typeInst() - m =3D typeInst() + k =3D type_inst() + m =3D type_inst() =20 flowstr =3D flowstr[len(self.proto_str) :] if flowstr.startswith("("): @@ -1072,7 +1072,7 @@ class ovskey(nla): outstr +=3D ")" return outstr =20 - class ethaddr(ovs_key_proto): + class EthAddr(OvsKeyProto): fields =3D ( ("src", "!6s"), ("dst", "!6s"), @@ -1103,7 +1103,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "eth", data=3Ddata, @@ -1113,7 +1113,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_ipv4(ovs_key_proto): + class OvsKeyIpv4(OvsKeyProto): fields =3D ( ("src", "!I"), ("dst", "!I"), @@ -1156,7 +1156,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "ipv4", data=3Ddata, @@ -1166,7 +1166,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_ipv6(ovs_key_proto): + class OvsKeyIpv6(OvsKeyProto): fields =3D ( ("src", "!16s"), ("dst", "!16s"), @@ -1207,7 +1207,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "ipv6", data=3Ddata, @@ -1217,7 +1217,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_tcp(ovs_key_proto): + class OvsKeyTcp(OvsKeyProto): def __init__( self, data=3DNone, @@ -1226,7 +1226,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "tcp", data=3Ddata, @@ -1236,7 +1236,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_udp(ovs_key_proto): + class OvsKeyUdp(OvsKeyProto): def __init__( self, data=3DNone, @@ -1245,7 +1245,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "udp", data=3Ddata, @@ -1255,7 +1255,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_sctp(ovs_key_proto): + class OvsKeySctp(OvsKeyProto): def __init__( self, data=3DNone, @@ -1264,7 +1264,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "sctp", data=3Ddata, @@ -1274,7 +1274,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_icmp(ovs_key_proto): + class OvsKeyIcmp(OvsKeyProto): fields =3D ( ("type", "B"), ("code", "B"), @@ -1293,7 +1293,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "icmp", data=3Ddata, @@ -1303,7 +1303,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_icmpv6(ovs_key_icmp): + class OvsKeyIcmpv6(OvsKeyIcmp): def __init__( self, data=3DNone, @@ -1312,7 +1312,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "icmpv6", data=3Ddata, @@ -1322,7 +1322,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_arp(ovs_key_proto): + class OvsKeyArp(OvsKeyProto): fields =3D ( ("sip", "!I"), ("tip", "!I"), @@ -1372,7 +1372,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "arp", data=3Ddata, @@ -1382,7 +1382,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_nd(ovs_key_proto): + class OvsKeyNd(OvsKeyProto): fields =3D ( ("target", "!16s"), ("sll", "!6s"), @@ -1408,7 +1408,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "nd", data=3Ddata, @@ -1418,7 +1418,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_ct_tuple_ipv4(ovs_key_proto): + class OvsKeyCtTupleIpv4(OvsKeyProto): fields =3D ( ("src", "!I"), ("dst", "!I"), @@ -1455,7 +1455,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "ct_tuple4", data=3Ddata, @@ -1465,7 +1465,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_ct_tuple_ipv6(nla): + class OvsKeyCtTupleIpv6(nla): fields =3D ( ("src", "!16s"), ("dst", "!16s"), @@ -1500,7 +1500,7 @@ class ovskey(nla): length=3DNone, init=3DNone, ): - ovskey.ovs_key_proto.__init__( + OvsKey.OvsKeyProto.__init__( self, "ct_tuple6", data=3Ddata, @@ -1510,7 +1510,7 @@ class ovskey(nla): init=3Dinit, ) =20 - class ovs_key_tunnel(nla): + class OvsKeyTunnel(nla): nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -1537,9 +1537,9 @@ class ovskey(nla): if not flowstr.startswith("tunnel("): return None, None =20 - k =3D ovskey.ovs_key_tunnel() + k =3D OvsKey.OvsKeyTunnel() if mask is not None: - mask =3D ovskey.ovs_key_tunnel() + mask =3D OvsKey.OvsKeyTunnel() =20 flowstr =3D flowstr[len("tunnel("):] =20 @@ -1667,7 +1667,7 @@ class ovskey(nla): print_str +=3D ")" return print_str =20 - class ovs_key_mpls(nla): + class OvsKeyMpls(nla): fields =3D (("lse", ">I"),) =20 # 802.1Q CFI (Canonical Format Indicator) bit, always set for Ethernet @@ -1789,8 +1789,8 @@ class ovskey(nla): raise ValueError("vlan(): duplicate 'cfi'") if v !=3D 1: raise ValueError("vlan(): cfi must be 1 for Ethernet") - tci |=3D ovskey._VLAN_CFI_MASK - mask |=3D ovskey._VLAN_CFI_MASK + tci |=3D OvsKey._VLAN_CFI_MASK + mask |=3D OvsKey._VLAN_CFI_MASK has_cfi =3D True else: raise ValueError(f"vlan(): unknown key '{key}'") @@ -1807,8 +1807,8 @@ class ovskey(nla): raise ValueError("vlan(): no fields specified, " "use vlan(vid=3DX[,pcp=3DY,cfi=3DZ]) or vlan(= tci=3DX)") if not has_tci: - tci |=3D ovskey._VLAN_CFI_MASK - mask |=3D ovskey._VLAN_CFI_MASK + tci |=3D OvsKey._VLAN_CFI_MASK + mask |=3D OvsKey._VLAN_CFI_MASK return flowstr, tci, mask =20 @staticmethod @@ -1847,8 +1847,8 @@ class ovskey(nla): if flowstr.lstrip().startswith(')'): raise ValueError("encap(): unmatched ')' after encap()") =20 - inner_key =3D encap_ovskey() - inner_mask =3D encap_ovskey() + inner_key =3D EncapOvsKey() + inner_mask =3D EncapOvsKey() remaining =3D inner_key.parse(inner_str, inner_mask) if remaining and re.search(r'[^\s,)]', remaining): raise ValueError( @@ -1861,7 +1861,7 @@ class ovskey(nla): ("OVS_KEY_ATTR_PRIORITY", "skb_priority", intparse), ("OVS_KEY_ATTR_SKB_MARK", "skb_mark", intparse), ("OVS_KEY_ATTR_RECIRC_ID", "recirc_id", intparse), - ("OVS_KEY_ATTR_TUNNEL", "tunnel", ovskey.ovs_key_tunnel), + ("OVS_KEY_ATTR_TUNNEL", "tunnel", OvsKey.OvsKeyTunnel), ("OVS_KEY_ATTR_DP_HASH", "dp_hash", intparse), ("OVS_KEY_ATTR_CT_STATE", "ct_state", parse_ct_state), ("OVS_KEY_ATTR_CT_ZONE", "ct_zone", intparse), @@ -1870,7 +1870,7 @@ class ovskey(nla): ( "OVS_KEY_ATTR_ETHERNET", "eth", - ovskey.ethaddr, + OvsKey.EthAddr, ), ( "OVS_KEY_ATTR_ETHERTYPE", @@ -1880,42 +1880,42 @@ class ovskey(nla): ( "OVS_KEY_ATTR_VLAN", "vlan", - ovskey._parse_vlan_from_flowstr, + OvsKey._parse_vlan_from_flowstr, ), ( "OVS_KEY_ATTR_ENCAP", "encap", - ovskey._parse_encap_from_flowstr, + OvsKey._parse_encap_from_flowstr, ), ( "OVS_KEY_ATTR_IPV4", "ipv4", - ovskey.ovs_key_ipv4, + OvsKey.OvsKeyIpv4, ), ( "OVS_KEY_ATTR_IPV6", "ipv6", - ovskey.ovs_key_ipv6, + OvsKey.OvsKeyIpv6, ), ( "OVS_KEY_ATTR_ARP", "arp", - ovskey.ovs_key_arp, + OvsKey.OvsKeyArp, ), ( "OVS_KEY_ATTR_TCP", "tcp", - ovskey.ovs_key_tcp, + OvsKey.OvsKeyTcp, ), ( "OVS_KEY_ATTR_UDP", "udp", - ovskey.ovs_key_udp, + OvsKey.OvsKeyUdp, ), ( "OVS_KEY_ATTR_ICMP", "icmp", - ovskey.ovs_key_icmp, + OvsKey.OvsKeyIcmp, ), ( "OVS_KEY_ATTR_TCP_FLAGS", @@ -2024,7 +2024,7 @@ class ovskey(nla): True, ), ("OVS_KEY_ATTR_ETHERNET", None, None, False, False), - ("OVS_KEY_ATTR_VLAN", "vlan", ovskey._vlan_dpstr, + ("OVS_KEY_ATTR_VLAN", "vlan", OvsKey._vlan_dpstr, lambda x: False, True), ("OVS_KEY_ATTR_ENCAP", None, None, False, False), ( @@ -2074,7 +2074,7 @@ class ovskey(nla): return print_str =20 =20 -class encap_ovskey(ovskey): +class EncapOvsKey(OvsKey): """Inner flow key attributes valid inside 802.1Q ENCAP. =20 Only L2-L4 key attributes (slots 0-21) appear inside ENCAP. @@ -2087,27 +2087,27 @@ class encap_ovskey(ovskey): """ nla_map =3D ( ("OVS_KEY_ATTR_UNSPEC", "none"), - ("OVS_KEY_ATTR_ENCAP", "none"), # placeholder, parsed by ovskey + ("OVS_KEY_ATTR_ENCAP", "none"), # placeholder, parsed by OvsKey ("OVS_KEY_ATTR_PRIORITY", "none"), # skb metadata, not in ENCAP ("OVS_KEY_ATTR_IN_PORT", "none"), # skb metadata, not in ENCAP - ("OVS_KEY_ATTR_ETHERNET", "ethaddr"), + ("OVS_KEY_ATTR_ETHERNET", "EthAddr"), ("OVS_KEY_ATTR_VLAN", "be16"), ("OVS_KEY_ATTR_ETHERTYPE", "be16"), - ("OVS_KEY_ATTR_IPV4", "ovs_key_ipv4"), - ("OVS_KEY_ATTR_IPV6", "ovs_key_ipv6"), - ("OVS_KEY_ATTR_TCP", "ovs_key_tcp"), - ("OVS_KEY_ATTR_UDP", "ovs_key_udp"), - ("OVS_KEY_ATTR_ICMP", "ovs_key_icmp"), - ("OVS_KEY_ATTR_ICMPV6", "ovs_key_icmpv6"), - ("OVS_KEY_ATTR_ARP", "ovs_key_arp"), - ("OVS_KEY_ATTR_ND", "ovs_key_nd"), + ("OVS_KEY_ATTR_IPV4", "OvsKeyIpv4"), + ("OVS_KEY_ATTR_IPV6", "OvsKeyIpv6"), + ("OVS_KEY_ATTR_TCP", "OvsKeyTcp"), + ("OVS_KEY_ATTR_UDP", "OvsKeyUdp"), + ("OVS_KEY_ATTR_ICMP", "OvsKeyIcmp"), + ("OVS_KEY_ATTR_ICMPV6", "OvsKeyIcmpv6"), + ("OVS_KEY_ATTR_ARP", "OvsKeyArp"), + ("OVS_KEY_ATTR_ND", "OvsKeyNd"), ("OVS_KEY_ATTR_SKB_MARK", "none"), # metadata, not in ENCAP ("OVS_KEY_ATTR_TUNNEL", "none"), # tunnel metadata, not in ENCAP - ("OVS_KEY_ATTR_SCTP", "ovs_key_sctp"), + ("OVS_KEY_ATTR_SCTP", "OvsKeySctp"), ("OVS_KEY_ATTR_TCP_FLAGS", "be16"), ("OVS_KEY_ATTR_DP_HASH", "none"), # metadata, not in ENCAP ("OVS_KEY_ATTR_RECIRC_ID", "none"), # metadata, not in ENCAP - ("OVS_KEY_ATTR_MPLS", "array(ovs_key_mpls)"), + ("OVS_KEY_ATTR_MPLS", "array(OvsKeyMpls)"), ) =20 =20 @@ -2116,12 +2116,12 @@ class OvsPacket(GenericNetlinkSocket): OVS_PACKET_CMD_ACTION =3D 2 # USERSPACE action OVS_PACKET_CMD_EXECUTE =3D 3 # Apply actions to packet =20 - class ovs_packet_msg(ovs_dp_msg): + class OvsPacketMsg(OvsDpMsg): nla_map =3D ( ("OVS_PACKET_ATTR_UNSPEC", "none"), ("OVS_PACKET_ATTR_PACKET", "array(uint8)"), - ("OVS_PACKET_ATTR_KEY", "ovskey"), - ("OVS_PACKET_ATTR_ACTIONS", "ovsactions"), + ("OVS_PACKET_ATTR_KEY", "OvsKey"), + ("OVS_PACKET_ATTR_ACTIONS", "OvsActions"), ("OVS_PACKET_ATTR_USERDATA", "none"), ("OVS_PACKET_ATTR_EGRESS_TUN_KEY", "none"), ("OVS_PACKET_ATTR_UNUSED1", "none"), @@ -2134,7 +2134,7 @@ class OvsPacket(GenericNetlinkSocket): =20 def __init__(self): GenericNetlinkSocket.__init__(self) - self.bind(OVS_PACKET_FAMILY, OvsPacket.ovs_packet_msg) + self.bind(OVS_PACKET_FAMILY, OvsPacket.OvsPacketMsg) =20 def upcall_handler(self, up=3DNone): print("listening on upcall packet handler:", self.epid) @@ -2160,7 +2160,7 @@ class OvsDatapath(GenericNetlinkSocket): OVS_DP_F_VPORT_PIDS =3D 1 << 1 OVS_DP_F_DISPATCH_UPCALL_PER_CPU =3D 1 << 3 =20 - class dp_cmd_msg(ovs_dp_msg): + class DpCmdMsg(OvsDpMsg): """ Message class that will be used to communicate with the kernel mod= ule. """ @@ -2169,15 +2169,15 @@ class OvsDatapath(GenericNetlinkSocket): ("OVS_DP_ATTR_UNSPEC", "none"), ("OVS_DP_ATTR_NAME", "asciiz"), ("OVS_DP_ATTR_UPCALL_PID", "array(uint32)"), - ("OVS_DP_ATTR_STATS", "dpstats"), - ("OVS_DP_ATTR_MEGAFLOW_STATS", "megaflowstats"), + ("OVS_DP_ATTR_STATS", "DpStats"), + ("OVS_DP_ATTR_MEGAFLOW_STATS", "MegaflowStats"), ("OVS_DP_ATTR_USER_FEATURES", "uint32"), ("OVS_DP_ATTR_PAD", "none"), ("OVS_DP_ATTR_MASKS_CACHE_SIZE", "uint32"), ("OVS_DP_ATTR_PER_CPU_PIDS", "array(uint32)"), ) =20 - class dpstats(nla): + class DpStats(nla): fields =3D ( ("hit", "=3DQ"), ("missed", "=3DQ"), @@ -2185,7 +2185,7 @@ class OvsDatapath(GenericNetlinkSocket): ("flows", "=3DQ"), ) =20 - class megaflowstats(nla): + class MegaflowStats(nla): fields =3D ( ("mask_hit", "=3DQ"), ("masks", "=3DI"), @@ -2196,10 +2196,10 @@ class OvsDatapath(GenericNetlinkSocket): =20 def __init__(self): GenericNetlinkSocket.__init__(self) - self.bind(OVS_DATAPATH_FAMILY, OvsDatapath.dp_cmd_msg) + self.bind(OVS_DATAPATH_FAMILY, OvsDatapath.DpCmdMsg) =20 def info(self, dpname, ifindex=3D0): - msg =3D OvsDatapath.dp_cmd_msg() + msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_GET msg["version"] =3D OVS_DATAPATH_VERSION msg["reserved"] =3D 0 @@ -2220,23 +2220,23 @@ class OvsDatapath(GenericNetlinkSocket): return reply =20 def create( - self, dpname, shouldUpcall=3DFalse, versionStr=3DNone, p=3DOvsPack= et() + self, dpname, should_upcall=3DFalse, version_str=3DNone, p=3DOvsPa= cket() ): - msg =3D OvsDatapath.dp_cmd_msg() + msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_NEW - if versionStr is None: + if version_str is None: msg["version"] =3D OVS_DATAPATH_VERSION else: - msg["version"] =3D int(versionStr.split(":")[0], 0) + msg["version"] =3D int(version_str.split(":")[0], 0) msg["reserved"] =3D 0 msg["dpifindex"] =3D 0 msg["attrs"].append(["OVS_DP_ATTR_NAME", dpname]) =20 dpfeatures =3D 0 - if versionStr is not None and versionStr.find(":") !=3D -1: - dpfeatures =3D int(versionStr.split(":")[1], 0) + if version_str is not None and version_str.find(":") !=3D -1: + dpfeatures =3D int(version_str.split(":")[1], 0) else: - if versionStr is None or versionStr.find(":") =3D=3D -1: + if version_str is None or version_str.find(":") =3D=3D -1: dpfeatures |=3D OvsDatapath.OVS_DP_F_DISPATCH_UPCALL_PER_C= PU dpfeatures &=3D ~OvsDatapath.OVS_DP_F_VPORT_PIDS =20 @@ -2246,7 +2246,7 @@ class OvsDatapath(GenericNetlinkSocket): procarray +=3D [int(p.epid)] msg["attrs"].append(["OVS_DP_ATTR_UPCALL_PID", procarray]) msg["attrs"].append(["OVS_DP_ATTR_USER_FEATURES", dpfeatures]) - if not shouldUpcall: + if not should_upcall: msg["attrs"].append(["OVS_DP_ATTR_UPCALL_PID", [0]]) =20 try: @@ -2263,7 +2263,7 @@ class OvsDatapath(GenericNetlinkSocket): return reply =20 def destroy(self, dpname): - msg =3D OvsDatapath.dp_cmd_msg() + msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_DEL msg["version"] =3D OVS_DATAPATH_VERSION msg["reserved"] =3D 0 @@ -2291,28 +2291,28 @@ class OvsVport(GenericNetlinkSocket): OVS_VPORT_TYPE_VXLAN =3D 4 OVS_VPORT_TYPE_GENEVE =3D 5 =20 - class ovs_vport_msg(ovs_dp_msg): + class OvsVportMsg(OvsDpMsg): nla_map =3D ( ("OVS_VPORT_ATTR_UNSPEC", "none"), ("OVS_VPORT_ATTR_PORT_NO", "uint32"), ("OVS_VPORT_ATTR_TYPE", "uint32"), ("OVS_VPORT_ATTR_NAME", "asciiz"), - ("OVS_VPORT_ATTR_OPTIONS", "vportopts"), + ("OVS_VPORT_ATTR_OPTIONS", "VportOpts"), ("OVS_VPORT_ATTR_UPCALL_PID", "array(uint32)"), - ("OVS_VPORT_ATTR_STATS", "vportstats"), + ("OVS_VPORT_ATTR_STATS", "VportStats"), ("OVS_VPORT_ATTR_PAD", "none"), ("OVS_VPORT_ATTR_IFINDEX", "uint32"), ("OVS_VPORT_ATTR_NETNSID", "uint32"), ) =20 - class vportopts(nla): + class VportOpts(nla): nla_map =3D ( ("OVS_TUNNEL_ATTR_UNSPEC", "none"), ("OVS_TUNNEL_ATTR_DST_PORT", "uint16"), ("OVS_TUNNEL_ATTR_EXTENSION", "none"), ) =20 - class vportstats(nla): + class VportStats(nla): fields =3D ( ("rx_packets", "=3DQ"), ("tx_packets", "=3DQ"), @@ -2324,6 +2324,7 @@ class OvsVport(GenericNetlinkSocket): ("tx_dropped", "=3DQ"), ) =20 + @staticmethod def type_to_str(vport_type): if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_NETDEV: return "netdev" @@ -2337,6 +2338,7 @@ class OvsVport(GenericNetlinkSocket): return "geneve" raise ValueError(f"Unknown vport type:{vport_type}") =20 + @staticmethod def str_to_type(vport_type): if vport_type =3D=3D "netdev": return OvsVport.OVS_VPORT_TYPE_NETDEV @@ -2352,11 +2354,11 @@ class OvsVport(GenericNetlinkSocket): =20 def __init__(self, packet=3DOvsPacket()): GenericNetlinkSocket.__init__(self) - self.bind(OVS_VPORT_FAMILY, OvsVport.ovs_vport_msg) + self.bind(OVS_VPORT_FAMILY, OvsVport.OvsVportMsg) self.upcall_packet =3D packet =20 def info(self, vport_name, dpifindex=3D0, portno=3DNone): - msg =3D OvsVport.ovs_vport_msg() + msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_GET msg["version"] =3D OVS_DATAPATH_VERSION @@ -2381,7 +2383,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def attach(self, dpindex, vport_ifname, ptype, dport, lwt): - msg =3D OvsVport.ovs_vport_msg() + msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_NEW msg["version"] =3D OVS_DATAPATH_VERSION @@ -2394,11 +2396,11 @@ class OvsVport(GenericNetlinkSocket): ["OVS_VPORT_ATTR_UPCALL_PID", [self.upcall_packet.epid]] ) =20 - TUNNEL_DEFAULTS =3D [("geneve", 6081), + tunnel_defaults =3D [("geneve", 6081), ("gre", 0), ("vxlan", 4789)] =20 - for tnl in TUNNEL_DEFAULTS: + for tnl in tunnel_defaults: if ptype =3D=3D tnl[0]: if not dport: dport =3D tnl[1] @@ -2408,7 +2410,7 @@ class OvsVport(GenericNetlinkSocket): # GRE tunnels have no options. break =20 - vportopt =3D OvsVport.ovs_vport_msg.vportopts() + vportopt =3D OvsVport.OvsVportMsg.VportOpts() vportopt["attrs"].append( ["OVS_TUNNEL_ATTR_DST_PORT", dport] ) @@ -2447,7 +2449,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def reset_upcall(self, dpindex, vport_ifname, p=3DNone): - msg =3D OvsVport.ovs_vport_msg() + msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_SET msg["version"] =3D OVS_DATAPATH_VERSION @@ -2472,7 +2474,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def detach(self, dpindex, vport_ifname): - msg =3D OvsVport.ovs_vport_msg() + msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_DEL msg["version"] =3D OVS_DATAPATH_VERSION @@ -2497,22 +2499,22 @@ class OvsVport(GenericNetlinkSocket): =20 =20 class OvsFlow(GenericNetlinkSocket): - class ovs_flow_msg(ovs_dp_msg): + class OvsFlowMsg(OvsDpMsg): nla_map =3D ( ("OVS_FLOW_ATTR_UNSPEC", "none"), - ("OVS_FLOW_ATTR_KEY", "ovskey"), - ("OVS_FLOW_ATTR_ACTIONS", "ovsactions"), - ("OVS_FLOW_ATTR_STATS", "flowstats"), + ("OVS_FLOW_ATTR_KEY", "OvsKey"), + ("OVS_FLOW_ATTR_ACTIONS", "OvsActions"), + ("OVS_FLOW_ATTR_STATS", "FlowStats"), ("OVS_FLOW_ATTR_TCP_FLAGS", "uint8"), ("OVS_FLOW_ATTR_USED", "uint64"), ("OVS_FLOW_ATTR_CLEAR", "none"), - ("OVS_FLOW_ATTR_MASK", "ovskey"), + ("OVS_FLOW_ATTR_MASK", "OvsKey"), ("OVS_FLOW_ATTR_PROBE", "none"), ("OVS_FLOW_ATTR_UFID", "array(uint32)"), ("OVS_FLOW_ATTR_UFID_FLAGS", "uint32"), ) =20 - class flowstats(nla): + class FlowStats(nla): fields =3D ( ("packets", "=3DQ"), ("bytes", "=3DQ"), @@ -2585,9 +2587,9 @@ class OvsFlow(GenericNetlinkSocket): return print_str =20 def parse(self, flowstr, actstr, dpidx=3D0): - OVS_UFID_F_OMIT_KEY =3D 1 << 0 - OVS_UFID_F_OMIT_MASK =3D 1 << 1 - OVS_UFID_F_OMIT_ACTIONS =3D 1 << 2 + ovs_ufid_f_omit_key =3D 1 << 0 + ovs_ufid_f_omit_mask =3D 1 << 1 + ovs_ufid_f_omit_actions =3D 1 << 2 =20 self["cmd"] =3D 0 self["version"] =3D 0 @@ -2602,18 +2604,18 @@ class OvsFlow(GenericNetlinkSocket): flowstr =3D flowstr[count + 1 :] else: ufidstr =3D str(uuid.uuid4()) - uuidRawObj =3D uuid.UUID(ufidstr).fields + uuid_raw_obj =3D uuid.UUID(ufidstr).fields =20 self["attrs"].append( [ "OVS_FLOW_ATTR_UFID", [ - uuidRawObj[0], - uuidRawObj[1] << 16 | uuidRawObj[2], - uuidRawObj[3] << 24 - | uuidRawObj[4] << 16 - | uuidRawObj[5] & (0xFF << 32) >> 32, - uuidRawObj[5] & (0xFFFFFFFF), + uuid_raw_obj[0], + uuid_raw_obj[1] << 16 | uuid_raw_obj[2], + uuid_raw_obj[3] << 24 + | uuid_raw_obj[4] << 16 + | uuid_raw_obj[5] & (0xFF << 32) >> 32, + uuid_raw_obj[5] & (0xFFFFFFFF), ], ] ) @@ -2621,27 +2623,27 @@ class OvsFlow(GenericNetlinkSocket): [ "OVS_FLOW_ATTR_UFID_FLAGS", int( - OVS_UFID_F_OMIT_KEY - | OVS_UFID_F_OMIT_MASK - | OVS_UFID_F_OMIT_ACTIONS + ovs_ufid_f_omit_key + | ovs_ufid_f_omit_mask + | ovs_ufid_f_omit_actions ), ] ) =20 - k =3D ovskey() - m =3D ovskey() + k =3D OvsKey() + m =3D OvsKey() k.parse(flowstr, m) self["attrs"].append(["OVS_FLOW_ATTR_KEY", k]) self["attrs"].append(["OVS_FLOW_ATTR_MASK", m]) =20 - a =3D ovsactions() + a =3D OvsActions() a.parse(actstr) self["attrs"].append(["OVS_FLOW_ATTR_ACTIONS", a]) =20 def __init__(self): GenericNetlinkSocket.__init__(self) =20 - self.bind(OVS_FLOW_FAMILY, OvsFlow.ovs_flow_msg) + self.bind(OVS_FLOW_FAMILY, OvsFlow.OvsFlowMsg) =20 def add_flow(self, dpifindex, flowmsg): """ @@ -2678,7 +2680,7 @@ class OvsFlow(GenericNetlinkSocket): into the OvsDatapath lookup """ =20 - flowmsg =3D OvsFlow.ovs_flow_msg() + flowmsg =3D OvsFlow.OvsFlowMsg() flowmsg["cmd"] =3D OVS_FLOW_CMD_DEL flowmsg["version"] =3D OVS_DATAPATH_VERSION flowmsg["reserved"] =3D 0 @@ -2706,7 +2708,7 @@ class OvsFlow(GenericNetlinkSocket): flowpsec is a string which represents a flow in the dpctl format. """ - msg =3D OvsFlow.ovs_flow_msg() + msg =3D OvsFlow.OvsFlowMsg() =20 msg["cmd"] =3D OVS_FLOW_CMD_GET msg["version"] =3D OVS_DATAPATH_VERSION @@ -2747,7 +2749,7 @@ class OvsFlow(GenericNetlinkSocket): print("userspace action command", flush=3DTrue) =20 =20 -class psample_sample(genlmsg): +class PsampleSample(genlmsg): nla_map =3D ( ("PSAMPLE_ATTR_IIFINDEX", "none"), ("PSAMPLE_ATTR_OIFINDEX", "none"), @@ -2784,19 +2786,19 @@ class psample_sample(genlmsg): return (f"{','.join(fields)} {data}").strip() =20 =20 -class psample_msg(Marshal): +class PsampleMsg(Marshal): PSAMPLE_CMD_SAMPLE =3D 0 PSAMPLE_CMD_GET_GROUP =3D 1 PSAMPLE_CMD_NEW_GROUP =3D 2 PSAMPLE_CMD_DEL_GROUP =3D 3 PSAMPLE_CMD_SET_FILTER =3D 4 - msg_map =3D {PSAMPLE_CMD_SAMPLE: psample_sample} + msg_map =3D {PSAMPLE_CMD_SAMPLE: PsampleSample} =20 =20 class PsampleEvent(EventSocket): genl_family =3D "psample" mcast_groups =3D ["packets"] - marshal_class =3D psample_msg + marshal_class =3D PsampleMsg =20 def read_samples(self): print("listening for psample events", flush=3DTrue) @@ -2850,9 +2852,9 @@ def print_ovsdp_full(dp_lookup_rep, ifindex, ndb=3DND= B(), vpl=3DOvsVport()): =20 =20 def main(argv): - nlmsg_atoms.encap_ovskey =3D encap_ovskey - nlmsg_atoms.ovskey =3D ovskey - nlmsg_atoms.ovsactions =3D ovsactions + nlmsg_atoms.EncapOvsKey =3D EncapOvsKey + nlmsg_atoms.OvsKey =3D OvsKey + nlmsg_atoms.OvsActions =3D OvsActions =20 # version check for pyroute2 prverscheck =3D pyroute2.__version__.split(".") @@ -3034,7 +3036,7 @@ def main(argv): if rep is None: print(f"DP '{args.flbr}' not found.") return 1 - flow =3D OvsFlow.ovs_flow_msg() + flow =3D OvsFlow.OvsFlowMsg() flow.parse(args.flow, args.acts, rep["dpifindex"]) ovsflow.add_flow(rep["dpifindex"], flow) elif hasattr(args, "flsbr"): --=20 2.53.0 From nobody Fri Jun 12 18:34:01 2026 Received: from mail-oo1-f51.google.com (mail-oo1-f51.google.com [209.85.161.51]) (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 D8FF33C3450 for ; Wed, 13 May 2026 12:13:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674441; cv=none; b=ZCO/jaAJOhwkpMQpZVHhgArbKwN4HPjSgLesb4M1e1Dp64w2dUtCUHNsae6ViOwclwS60LTP8r9CBgGTwy7mG/c4qvRxQbmUzFIev4sdfUbEn/VbBrol86/T+tvw/3oeYGIzrU4vq14CsQxn6JiiO5O7h1f//jsdNiEmztIbbDM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674441; c=relaxed/simple; bh=CcqQJJBks6kC+vG0jRlgOKD+6l3bXviPjg9CpZxMBJQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VeUjUhPoQdphjjzL82AvfgdxnaOlbcirLRJWCQuv7EuxtJCJHQt/uQhRsn3pZK6KtXG5NFjGnhBQLR3eL5Osq/hUwQrWwc7XP4Kgtx8lnMpQYq55luEjmvHDMzm+V8CNO7J8Nd9ysT2kmXAY7e4fhkrcUFReUC5CMkwhN6W0fec= 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=AdGHwcVe; arc=none smtp.client-ip=209.85.161.51 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="AdGHwcVe" Received: by mail-oo1-f51.google.com with SMTP id 006d021491bc7-696ad0c2c2fso3644724eaf.0 for ; Wed, 13 May 2026 05:13:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778674439; x=1779279239; 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=IYmtWjdonQdBE+XBQZ5XkATSFr9jw+jhULGmcan1NUU=; b=AdGHwcVedLTKaA4dSkiZD9l8HnO7XSTcUo3kDIZyd7YhgosrbuCJyYskroBpjl2GZH jgo9Lf1Oylc1D+K5aQUGCOTNOVNvxzOJKcNJmaVVKQxFsHe6XjwK79HIsA6NXG7bgBZD i4azi/v+wGs4p2U6kaUPeKmkSF7+QUr1KHuLXALmIKcA1T3wkyS1MqGmu7j3AbJtsUpO XfyHNQgLT6i6+RC628K2aTetlOCbwzH9u+4i1o7VfYUqtTCFQpWta66KMroVi3OAvaIP w3Y33vRIGVvtvxPgpRnVL8QDJpu7CJTq8upnZ0x41nFczIIc72yrYGukywnqt/kyCEoi 7kxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778674439; x=1779279239; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IYmtWjdonQdBE+XBQZ5XkATSFr9jw+jhULGmcan1NUU=; b=D6++7PtByzxczXU1LWMlUfKmyOxmNkAemTegsZ+JdBRhrRMWHB8gwz7Hq0upT3a46B zU2kvzflu+giyxb+8xtHZrOfGY2gq/eaF2Gy80ea0Wkc6oRMWEpQSSHg8+94Xi4uAkij dSs1LPrBqg0A0jjEeNzfrEuV4twHuwvsRoI8CPLuW+vuHiiuK3bBbyoKpfkCZxuPSB2w 8+oeB7G/bjjikhJsJ1QG2UctH02rx4+vxKrQXPO8pabouwvMDhwulPrxc6Q+WSwgUqQW rDQ0d9SpOvuD1SvX2J4necGl9bjxkn4IML9kY7Vqu4JGZDqLGfsndd/PvLFL83wA4pKz Xtzg== X-Forwarded-Encrypted: i=1; AFNElJ8i62u6OIlX0P4CaTP2oLTJiXAuAozmmQCAZ1lCc19G9LxS/qTDxMsRxgoN4Sx+w2KHPcKv9rS+I2TTXt0=@vger.kernel.org X-Gm-Message-State: AOJu0YzTfI47NhSyOZoJ28Bi1hXnRVG5w4bhTjq3RXneKgZCsqLS06sq 6pqDL7AGljjySszGIdAnruOtWStyLdf8p0HtNI18vKlnZlqdA0Pnmz9O X-Gm-Gg: Acq92OEswygs9SDKyeMBqKxC0TAXcLAOrNVvgvJZOVuc/Dfg8si+ylFP8VwfQb7P2nr 7pjbwRUpaVAGBa2ODbMYQQ70pINxhPWCt4/avCfvJuB9qSp4DTQgonEObmw2ZO+jnnY5wcqG69S //RiGdXSnusubvrSMAv6YCiGPJp1p8dx7x/rt7jw5po0d/vXo5KDMjKivCIwLAghbT8TijKK5j6 602TpDycJPaJVtzvhK8wAWHQiKpPXQp2VFdcfYrIwXqJdBvszr4SKDhWiRU7FgtqLFWtMknSKpC u5H7j4ljxKgjJEz9Rzy5YPDtgzU9a+9UBtEPf7rp4tpdwInwVWpCrZaRqgdq8VUS9Ju8D0LkdJf QZRBsg/gdnVlJPK6iwORzghnQqhlIMpO/GN3FnVgtoPzGbfkRJCCeakSNRAj2T0rFCNTWaMMurW EBiaUg/844n8oeJ2A= X-Received: by 2002:a05:6820:1b12:b0:68a:af54:cb61 with SMTP id 006d021491bc7-69b78defac3mr1523556eaf.60.1778674438562; Wed, 13 May 2026 05:13:58 -0700 (PDT) Received: from houminxi ([72.244.37.221]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4355736dbc0sm15189442fac.11.2026.05.13.05.13.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 05:13:58 -0700 (PDT) From: Minxi Hou To: netdev@vger.kernel.org Cc: dev@openvswitch.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, i.maximets@redhat.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org, Minxi Hou Subject: [PATCH net-next 4/5] selftests: openvswitch: add missing docstrings in ovs-dpctl.py Date: Wed, 13 May 2026 20:12:39 +0800 Message-ID: <20260513121240.2590767-5-houminxi@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260513121240.2590767-1-houminxi@gmail.com> References: <20260513121240.2590767-1-houminxi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add one-line docstrings to all module, class, and method definitions to fix C0114, C0115, and C0116 pylint warnings. Signed-off-by: Minxi Hou --- .../selftests/net/openvswitch/ovs-dpctl.py | 94 ++++++++++++++++++- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/t= esting/selftests/net/openvswitch/ovs-dpctl.py index 6a9cf48948fd..3683796ba2e2 100644 --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 +"""OVS datapath control utility for kernel selftests.""" =20 # Controls the openvswitch module. Part of the kselftest suite, but # can be used for some diagnostic purpose as well. @@ -64,11 +65,13 @@ OVS_FLOW_CMD_SET =3D 4 UINT32_MAX =3D 0xFFFFFFFF =20 def macstr(mac): + """Format MAC address bytes as colon-separated hex string.""" outstr =3D ":".join([f"{i:02X}" for i in mac]) return outstr =20 =20 def strcspn(str1, str2): + """Return index of first char in str1 that is in str2.""" tot =3D 0 for char in str1: if str2.find(char) !=3D -1: @@ -78,6 +81,7 @@ def strcspn(str1, str2): =20 =20 def strspn(str1, str2): + """Return index of first char in str1 that is not in str2.""" tot =3D 0 for char in str1: if str2.find(char) =3D=3D -1: @@ -87,6 +91,7 @@ def strspn(str1, str2): =20 =20 def intparse(statestr, defmask=3D"0xffffffff"): + """Parse an integer with optional mask from a state string.""" totalparse =3D strspn(statestr, "0123456789abcdefABCDEFx/") # scan until "/" count =3D strspn(statestr, "x0123456789abcdefABCDEF") @@ -107,6 +112,7 @@ def intparse(statestr, defmask=3D"0xffffffff"): =20 =20 def parse_flags(flag_str, flag_vals): + """Parse flag string into bitmask and mask values.""" bit_result =3D 0 mask_result =3D 0 =20 @@ -158,6 +164,7 @@ def parse_flags(flag_str, flag_vals): =20 =20 def parse_ct_state(statestr): + """Parse conntrack state flags string.""" ct_flags =3D { "new": 1 << 0, "est": 1 << 1, @@ -173,6 +180,7 @@ def parse_ct_state(statestr): =20 =20 def convert_mac(data): + """Convert MAC address string with optional mask to bytes.""" def to_bytes(mac): mac_split =3D mac.split(":") ret =3D bytearray([int(i, 16) for i in mac_split]) @@ -188,6 +196,7 @@ def convert_mac(data): return to_bytes(mac_str), to_bytes(mask_str) =20 def convert_ipv4(data): + """Convert IPv4 address string with optional mask to integers.""" ip, _, mask =3D data.partition('/') =20 if not ip: @@ -200,6 +209,7 @@ def convert_ipv4(data): return int(ipaddress.IPv4Address(ip)), int(ipaddress.IPv4Address(mask)) =20 def convert_ipv6(data): + """Convert IPv6 address string with optional mask to packed bytes.""" ip, _, mask =3D data.partition('/') =20 if not ip: @@ -212,6 +222,7 @@ def convert_ipv6(data): return ipaddress.IPv6Address(ip).packed, ipaddress.IPv6Address(mask).p= acked =20 def convert_int(size): + """Return a converter for integer fields of the given bit size.""" def convert_int_sized(data): value, _, mask =3D data.partition('/') =20 @@ -224,6 +235,7 @@ def convert_int(size): return convert_int_sized =20 def parse_starts_block(block_str, scanstr, returnskipped, scanregex=3DFals= e): + """Check if block_str starts with scanstr, optionally skip it.""" if scanregex: m =3D re.search(scanstr, block_str) if m is None: @@ -250,6 +262,7 @@ def parse_starts_block(block_str, scanstr, returnskippe= d, scanregex=3DFalse): def parse_extract_field( block_str, fieldstr, scanfmt, convert, masked=3DFalse, defval=3DNone ): + """Extract a field value from block_str using regex scanfmt.""" if fieldstr and not block_str.startswith(fieldstr): return block_str, defval =20 @@ -349,6 +362,7 @@ def parse_attrs(actstr, attr_desc): =20 =20 class OvsDpMsg(genlmsg): + """OVS datapath generic netlink message.""" # include the OVS version # We need a custom header rather than just being able to rely on # genlmsg because fields ends up not expressing everything correctly @@ -357,6 +371,7 @@ class OvsDpMsg(genlmsg): =20 =20 class OvsActions(nla): + """OVS datapath actions netlink attribute.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -389,6 +404,7 @@ class OvsActions(nla): ) =20 class Psample(nla): + """Packet sampling action attributes.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -398,6 +414,7 @@ class OvsActions(nla): ) =20 def dpstr(self, more=3DFalse): + """Format psample attributes as dpctl string.""" args =3D f"group=3D{self.get_attr('OVS_PSAMPLE_ATTR_GROUP')}" =20 cookie =3D self.get_attr("OVS_PSAMPLE_ATTR_COOKIE") @@ -407,6 +424,7 @@ class OvsActions(nla): return f"psample({args})" =20 def parse(self, actstr): + """Parse psample attributes from dpctl string.""" desc =3D ( ("group", "OVS_PSAMPLE_ATTR_GROUP", int), ("cookie", "OVS_PSAMPLE_ATTR_COOKIE", @@ -421,9 +439,11 @@ class OvsActions(nla): return actstr =20 class PushVlan(nla): + """Push VLAN action fields (tpid + tci).""" fields =3D (("vlan_tpid", "!H"), ("vlan_tci", "!H")) =20 class Sample(nla): + """Sample action attributes.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -433,6 +453,7 @@ class OvsActions(nla): ) =20 def dpstr(self, more=3DFalse): + """Format sample attributes as dpctl string.""" args =3D [] =20 prob =3D 100 * self.get_attr( @@ -446,6 +467,7 @@ class OvsActions(nla): return f"sample({','.join(args)})" =20 def parse(self, actstr): + """Parse sample attributes from dpctl string.""" def parse_nested_actions(actstr): subacts =3D OvsActions() parsed_len =3D subacts.parse(actstr) @@ -456,7 +478,7 @@ class OvsActions(nla): return int(math.floor(UINT32_MAX * (percent / 100.0) + .5)) =20 desc =3D ( - ("Sample", "OVS_SAMPLE_ATTR_PROBABILITY", percent_to_rate), + ("sample", "OVS_SAMPLE_ATTR_PROBABILITY", percent_to_rate), ("actions", "OVS_SAMPLE_ATTR_ACTIONS", parse_nested_action= s), ) attrs, actstr =3D parse_attrs(actstr, desc) @@ -467,6 +489,7 @@ class OvsActions(nla): return actstr =20 class CtAct(nla): + """Conntrack action attributes.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -483,6 +506,7 @@ class OvsActions(nla): ) =20 class NatAttr(nla): + """NAT sub-action attributes.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -499,6 +523,7 @@ class OvsActions(nla): ) =20 def dpstr(self, more=3DFalse): + """Format NAT attributes as dpctl string.""" print_str =3D "nat(" =20 if self.get_attr("OVS_NAT_ATTR_SRC"): @@ -537,6 +562,7 @@ class OvsActions(nla): return print_str =20 def dpstr(self, more=3DFalse): + """Format conntrack attributes as dpctl string.""" print_str =3D "ct(" =20 if self.get_attr("OVS_CT_ATTR_COMMIT") is not None: @@ -558,6 +584,7 @@ class OvsActions(nla): return print_str =20 class Userspace(nla): + """Userspace action attributes.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -568,6 +595,7 @@ class OvsActions(nla): ) =20 def dpstr(self, more=3DFalse): + """Format userspace attributes as dpctl string.""" print_str =3D "userspace(" if self.get_attr("OVS_USERSPACE_ATTR_PID") is not None: print_str +=3D f"pid=3D{self.get_attr('OVS_USERSPACE_ATTR_= PID')}," @@ -583,6 +611,7 @@ class OvsActions(nla): return print_str =20 def parse(self, actstr): + """Parse userspace attributes from dpctl string.""" attrs_desc =3D ( ("pid", "OVS_USERSPACE_ATTR_PID", int), ("userdata", "OVS_USERSPACE_ATTR_USERDATA", @@ -597,6 +626,7 @@ class OvsActions(nla): return actstr =20 def dpstr(self, more=3DFalse): + """Format all actions as dpctl string.""" print_str =3D "" =20 for field in self["attrs"]: @@ -652,12 +682,13 @@ class OvsActions(nla): else: try: print_str +=3D datum.dpstr(more) - except: - print_str +=3D "{ATTR: %s not decoded}" % field[0] + except Exception: + print_str +=3D f"{{ATTR: {field[0]} not decoded}}" =20 return print_str =20 def parse(self, actstr): + """Parse actions from dpctl string.""" totallen =3D len(actstr) while len(actstr) !=3D 0: parsed =3D False @@ -934,6 +965,7 @@ class OvsActions(nla): =20 =20 class OvsKey(nla): + """OVS flow key netlink attribute.""" nla_flags =3D NLA_F_NESTED nla_map =3D ( ("OVS_KEY_ATTR_UNSPEC", "none"), @@ -972,6 +1004,7 @@ class OvsKey(nla): ) =20 class OvsKeyProto(nla): + """Protocol key fields (ethertype).""" fields =3D ( ("src", "!H"), ("dst", "!H"), @@ -1004,6 +1037,7 @@ class OvsKey(nla): ) =20 def parse(self, flowstr, type_inst): + """Parse protocol key from dpctl string.""" if not flowstr.startswith(self.proto_str): return None, None =20 @@ -1045,6 +1079,7 @@ class OvsKey(nla): return flowstr, k, m =20 def dpstr(self, masked=3DNone, more=3DFalse): + """Format protocol key as dpctl string.""" outstr =3D f"{self.proto_str}(" first =3D False for f in self.fields_map: @@ -1073,6 +1108,7 @@ class OvsKey(nla): return outstr =20 class EthAddr(OvsKeyProto): + """Ethernet address key fields.""" fields =3D ( ("src", "!6s"), ("dst", "!6s"), @@ -1114,6 +1150,7 @@ class OvsKey(nla): ) =20 class OvsKeyIpv4(OvsKeyProto): + """IPv4 key fields.""" fields =3D ( ("src", "!I"), ("dst", "!I"), @@ -1167,6 +1204,7 @@ class OvsKey(nla): ) =20 class OvsKeyIpv6(OvsKeyProto): + """IPv6 key fields.""" fields =3D ( ("src", "!16s"), ("dst", "!16s"), @@ -1218,6 +1256,7 @@ class OvsKey(nla): ) =20 class OvsKeyTcp(OvsKeyProto): + """TCP key fields (src/dst port).""" def __init__( self, data=3DNone, @@ -1237,6 +1276,7 @@ class OvsKey(nla): ) =20 class OvsKeyUdp(OvsKeyProto): + """UDP key fields (src/dst port).""" def __init__( self, data=3DNone, @@ -1256,6 +1296,7 @@ class OvsKey(nla): ) =20 class OvsKeySctp(OvsKeyProto): + """SCTP key fields (src/dst port).""" def __init__( self, data=3DNone, @@ -1275,6 +1316,7 @@ class OvsKey(nla): ) =20 class OvsKeyIcmp(OvsKeyProto): + """ICMP key fields (type/code).""" fields =3D ( ("type", "B"), ("code", "B"), @@ -1304,6 +1346,7 @@ class OvsKey(nla): ) =20 class OvsKeyIcmpv6(OvsKeyIcmp): + """ICMPv6 key fields (type/code).""" def __init__( self, data=3DNone, @@ -1323,6 +1366,7 @@ class OvsKey(nla): ) =20 class OvsKeyArp(OvsKeyProto): + """ARP key fields.""" fields =3D ( ("sip", "!I"), ("tip", "!I"), @@ -1383,6 +1427,7 @@ class OvsKey(nla): ) =20 class OvsKeyNd(OvsKeyProto): + """Neighbor discovery key fields.""" fields =3D ( ("target", "!16s"), ("sll", "!6s"), @@ -1419,6 +1464,7 @@ class OvsKey(nla): ) =20 class OvsKeyCtTupleIpv4(OvsKeyProto): + """Conntrack original tuple key (IPv4).""" fields =3D ( ("src", "!I"), ("dst", "!I"), @@ -1466,6 +1512,7 @@ class OvsKey(nla): ) =20 class OvsKeyCtTupleIpv6(nla): + """Conntrack original tuple key (IPv6).""" fields =3D ( ("src", "!16s"), ("dst", "!16s"), @@ -1511,6 +1558,7 @@ class OvsKey(nla): ) =20 class OvsKeyTunnel(nla): + """Tunnel key fields.""" nla_flags =3D NLA_F_NESTED =20 nla_map =3D ( @@ -1534,6 +1582,7 @@ class OvsKey(nla): ) =20 def parse(self, flowstr, mask=3DNone): + """Parse tunnel key from dpctl string.""" if not flowstr.startswith("tunnel("): return None, None =20 @@ -1626,6 +1675,7 @@ class OvsKey(nla): return flowstr, k, mask =20 def dpstr(self, mask=3DNone, more=3DFalse): + """Format tunnel key as dpctl string.""" print_str =3D "tunnel(" =20 flagsattrs =3D [] @@ -1668,6 +1718,7 @@ class OvsKey(nla): return print_str =20 class OvsKeyMpls(nla): + """MPLS key fields.""" fields =3D (("lse", ">I"),) =20 # 802.1Q CFI (Canonical Format Indicator) bit, always set for Ethernet @@ -1857,6 +1908,7 @@ class OvsKey(nla): return flowstr, inner_key, inner_mask =20 def parse(self, flowstr, mask=3DNone): + """Parse flow key from dpctl string.""" for field in ( ("OVS_KEY_ATTR_PRIORITY", "skb_priority", intparse), ("OVS_KEY_ATTR_SKB_MARK", "skb_mark", intparse), @@ -1943,6 +1995,7 @@ class OvsKey(nla): return flowstr =20 def dpstr(self, mask=3DNone, more=3DFalse): + """Format flow key as dpctl string.""" print_str =3D "" =20 for field in ( @@ -2112,11 +2165,13 @@ class EncapOvsKey(OvsKey): =20 =20 class OvsPacket(GenericNetlinkSocket): + """OVS packet command message.""" OVS_PACKET_CMD_MISS =3D 1 # Flow table miss OVS_PACKET_CMD_ACTION =3D 2 # USERSPACE action OVS_PACKET_CMD_EXECUTE =3D 3 # Apply actions to packet =20 class OvsPacketMsg(OvsDpMsg): + """OVS packet message header.""" nla_map =3D ( ("OVS_PACKET_ATTR_UNSPEC", "none"), ("OVS_PACKET_ATTR_PACKET", "array(uint8)"), @@ -2137,6 +2192,7 @@ class OvsPacket(GenericNetlinkSocket): self.bind(OVS_PACKET_FAMILY, OvsPacket.OvsPacketMsg) =20 def upcall_handler(self, up=3DNone): + """Listen for packet upcall messages.""" print("listening on upcall packet handler:", self.epid) while True: try: @@ -2157,6 +2213,7 @@ class OvsPacket(GenericNetlinkSocket): =20 =20 class OvsDatapath(GenericNetlinkSocket): + """OVS datapath management.""" OVS_DP_F_VPORT_PIDS =3D 1 << 1 OVS_DP_F_DISPATCH_UPCALL_PER_CPU =3D 1 << 3 =20 @@ -2178,6 +2235,7 @@ class OvsDatapath(GenericNetlinkSocket): ) =20 class DpStats(nla): + """Datapath statistics.""" fields =3D ( ("hit", "=3DQ"), ("missed", "=3DQ"), @@ -2186,6 +2244,7 @@ class OvsDatapath(GenericNetlinkSocket): ) =20 class MegaflowStats(nla): + """Megaflow cache statistics.""" fields =3D ( ("mask_hit", "=3DQ"), ("masks", "=3DI"), @@ -2199,6 +2258,7 @@ class OvsDatapath(GenericNetlinkSocket): self.bind(OVS_DATAPATH_FAMILY, OvsDatapath.DpCmdMsg) =20 def info(self, dpname, ifindex=3D0): + """Get datapath information by name.""" msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_GET msg["version"] =3D OVS_DATAPATH_VERSION @@ -2222,6 +2282,7 @@ class OvsDatapath(GenericNetlinkSocket): def create( self, dpname, should_upcall=3DFalse, version_str=3DNone, p=3DOvsPa= cket() ): + """Create a new datapath.""" msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_NEW if version_str is None: @@ -2263,6 +2324,7 @@ class OvsDatapath(GenericNetlinkSocket): return reply =20 def destroy(self, dpname): + """Destroy a datapath.""" msg =3D OvsDatapath.DpCmdMsg() msg["cmd"] =3D OVS_DP_CMD_DEL msg["version"] =3D OVS_DATAPATH_VERSION @@ -2285,6 +2347,7 @@ class OvsDatapath(GenericNetlinkSocket): =20 =20 class OvsVport(GenericNetlinkSocket): + """OVS virtual port management.""" OVS_VPORT_TYPE_NETDEV =3D 1 OVS_VPORT_TYPE_INTERNAL =3D 2 OVS_VPORT_TYPE_GRE =3D 3 @@ -2292,6 +2355,7 @@ class OvsVport(GenericNetlinkSocket): OVS_VPORT_TYPE_GENEVE =3D 5 =20 class OvsVportMsg(OvsDpMsg): + """Vport info message.""" nla_map =3D ( ("OVS_VPORT_ATTR_UNSPEC", "none"), ("OVS_VPORT_ATTR_PORT_NO", "uint32"), @@ -2306,6 +2370,7 @@ class OvsVport(GenericNetlinkSocket): ) =20 class VportOpts(nla): + """Vport options attributes.""" nla_map =3D ( ("OVS_TUNNEL_ATTR_UNSPEC", "none"), ("OVS_TUNNEL_ATTR_DST_PORT", "uint16"), @@ -2313,6 +2378,7 @@ class OvsVport(GenericNetlinkSocket): ) =20 class VportStats(nla): + """Vport traffic statistics.""" fields =3D ( ("rx_packets", "=3DQ"), ("tx_packets", "=3DQ"), @@ -2326,6 +2392,7 @@ class OvsVport(GenericNetlinkSocket): =20 @staticmethod def type_to_str(vport_type): + """Convert vport type integer to string.""" if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_NETDEV: return "netdev" if vport_type =3D=3D OvsVport.OVS_VPORT_TYPE_INTERNAL: @@ -2340,6 +2407,7 @@ class OvsVport(GenericNetlinkSocket): =20 @staticmethod def str_to_type(vport_type): + """Convert vport type string to integer.""" if vport_type =3D=3D "netdev": return OvsVport.OVS_VPORT_TYPE_NETDEV if vport_type =3D=3D "internal": @@ -2358,6 +2426,7 @@ class OvsVport(GenericNetlinkSocket): self.upcall_packet =3D packet =20 def info(self, vport_name, dpifindex=3D0, portno=3DNone): + """Get vport information by name or port number.""" msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_GET @@ -2383,6 +2452,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def attach(self, dpindex, vport_ifname, ptype, dport, lwt): + """Attach a new vport to a datapath.""" msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_NEW @@ -2449,6 +2519,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def reset_upcall(self, dpindex, vport_ifname, p=3DNone): + """Reset vport upcall PID.""" msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_SET @@ -2474,6 +2545,7 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def detach(self, dpindex, vport_ifname): + """Remove a vport from a datapath.""" msg =3D OvsVport.OvsVportMsg() =20 msg["cmd"] =3D OVS_VPORT_CMD_DEL @@ -2495,11 +2567,14 @@ class OvsVport(GenericNetlinkSocket): return reply =20 def upcall_handler(self, handler=3DNone): + """Start upcall handler for packet events.""" self.upcall_packet.upcall_handler(handler) =20 =20 class OvsFlow(GenericNetlinkSocket): + """OVS flow table management.""" class OvsFlowMsg(OvsDpMsg): + """Flow info message.""" nla_map =3D ( ("OVS_FLOW_ATTR_UNSPEC", "none"), ("OVS_FLOW_ATTR_KEY", "OvsKey"), @@ -2515,12 +2590,14 @@ class OvsFlow(GenericNetlinkSocket): ) =20 class FlowStats(nla): + """Flow packet and byte counters.""" fields =3D ( ("packets", "=3DQ"), ("bytes", "=3DQ"), ) =20 def dpstr(self, more=3DFalse): + """Format flow as dpctl string.""" ufid =3D self.get_attr("OVS_FLOW_ATTR_UFID") ufid_str =3D "" if ufid is not None: @@ -2587,6 +2664,7 @@ class OvsFlow(GenericNetlinkSocket): return print_str =20 def parse(self, flowstr, actstr, dpidx=3D0): + """Parse flow from dpctl string.""" ovs_ufid_f_omit_key =3D 1 << 0 ovs_ufid_f_omit_mask =3D 1 << 1 ovs_ufid_f_omit_actions =3D 1 << 2 @@ -2731,6 +2809,7 @@ class OvsFlow(GenericNetlinkSocket): return rep =20 def miss(self, packetmsg): + """Handle flow table miss upcall.""" seq =3D packetmsg["header"]["sequence_number"] keystr =3D "(none)" key_field =3D packetmsg.get_attr("OVS_PACKET_ATTR_KEY") @@ -2743,13 +2822,16 @@ class OvsFlow(GenericNetlinkSocket): print(f"MISS upcall[{seq}/{pktpres}]: {keystr}", flush=3DTrue) =20 def execute(self, packetmsg): + """Handle packet execute command.""" print("userspace execute command", flush=3DTrue) =20 def action(self, packetmsg): + """Handle userspace action upcall.""" print("userspace action command", flush=3DTrue) =20 =20 class PsampleSample(genlmsg): + """Psample generic netlink event handler.""" nla_map =3D ( ("PSAMPLE_ATTR_IIFINDEX", "none"), ("PSAMPLE_ATTR_OIFINDEX", "none"), @@ -2770,6 +2852,7 @@ class PsampleSample(genlmsg): ) =20 def dpstr(self): + """Format psample attributes as string.""" fields =3D [] data =3D "" for (attr, value) in self["attrs"]: @@ -2787,6 +2870,7 @@ class PsampleSample(genlmsg): =20 =20 class PsampleMsg(Marshal): + """Psample generic netlink message.""" PSAMPLE_CMD_SAMPLE =3D 0 PSAMPLE_CMD_GET_GROUP =3D 1 PSAMPLE_CMD_NEW_GROUP =3D 2 @@ -2796,11 +2880,13 @@ class PsampleMsg(Marshal): =20 =20 class PsampleEvent(EventSocket): + """Psample event listener.""" genl_family =3D "psample" mcast_groups =3D ["packets"] marshal_class =3D PsampleMsg =20 def read_samples(self): + """Read psample events in a loop.""" print("listening for psample events", flush=3DTrue) while True: try: @@ -2811,6 +2897,7 @@ class PsampleEvent(EventSocket): =20 =20 def print_ovsdp_full(dp_lookup_rep, ifindex, ndb=3DNDB(), vpl=3DOvsVport()= ): + """Print full OVS datapath information.""" dp_name =3D dp_lookup_rep.get_attr("OVS_DP_ATTR_NAME") base_stats =3D dp_lookup_rep.get_attr("OVS_DP_ATTR_STATS") megaflow_stats =3D dp_lookup_rep.get_attr("OVS_DP_ATTR_MEGAFLOW_STATS") @@ -2852,6 +2939,7 @@ def print_ovsdp_full(dp_lookup_rep, ifindex, ndb=3DND= B(), vpl=3DOvsVport()): =20 =20 def main(argv): + """Entry point for ovs-dpctl utility.""" nlmsg_atoms.EncapOvsKey =3D EncapOvsKey nlmsg_atoms.OvsKey =3D OvsKey nlmsg_atoms.OvsActions =3D OvsActions --=20 2.53.0 From nobody Fri Jun 12 18:34:01 2026 Received: from mail-ot1-f44.google.com (mail-ot1-f44.google.com [209.85.210.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 2AD2638F949 for ; Wed, 13 May 2026 12:14:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674446; cv=none; b=tlZYLPO1xK75MQS3e8ifVeCbkUgKHF6IzfkcHdzw1bWvR5kq4wA3MzPaaYwi925NX86T2xxcobD4GaHt5tRC+NOnHuPytTehpCtcaoB798jy7CTcjittqu32PjD+Lrw7InHqIQDPcY4SIXyxhwtRXwUNUe196Qw8Z/t5mX4eVRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778674446; c=relaxed/simple; bh=Jz+bXsVftai5v15pDprSSH96Ot4A8L6ynecxAQ5ymGQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WH2k2ZkECw57NvcEOm4S/S1F+zbHypP9H7wUKsIzAcA5b/7C7DbwyMHtwtB+xn3ehmrURPh/4U+Vo1Y/NukqjBAQoGultIruHCYoFzcohi2GZIVkkwNufTiwakR8+gUf7zRe9m47WtkcoyiHZvKD2roIscE1pYzSkYaKy95f7so= 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=Y7+gSeH0; arc=none smtp.client-ip=209.85.210.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="Y7+gSeH0" Received: by mail-ot1-f44.google.com with SMTP id 46e09a7af769-7dbd23bc684so3772488a34.2 for ; Wed, 13 May 2026 05:14:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778674444; x=1779279244; 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=aKna7861B81bSrMUMezEy1EFlgsYPylTedLt/tHntn0=; b=Y7+gSeH0Kz6IGmhPGMyryzobSFWSdP0P4wyBhIjKCsBKCn95V2zeIZa+fvoKEC5U9y E9Q8xILvBEji9f6EH7IheQAd2JoNJbXmg6cNDeAd3RCXdxruWJbaEC9AY6sQReJ8ugYV OHsSCYnhf0vDnT5ntyWHPHKvyfgIcYQQ70GyRlKTsgc72W88XTkbEX2+ikv05xhTLy3C jBzdBzOLnyGyBSICYhZeGn5xvSJq3YA/PR2qO5E74EMwBXqSRwWemMvI8dRoomaELHV2 T5p+2DvbsDH6Tc3ys+dF/8JrvV/eJDC79+kBL3jcxuFdoZuIivl5rmMTDF+zJ8XZoABS G9ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778674444; x=1779279244; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aKna7861B81bSrMUMezEy1EFlgsYPylTedLt/tHntn0=; b=mzHJ9WM0FbNQZvR21/A4nCF9CC2Lqb9Wu1PV87HkCQVSkV+FBm2aMpEhhHOlBNcLBC L1QWFw6gLs7di1ocGB3VgGKgZolPW+d7QRBN2VWc3Gww6cUqK76zjMpuoMnEXEjusOJZ DjE42TZi/MaGC9lCtMDjrTnt1eP3gcqVV6+iKSkVMWUcVPXCazfusgwxQHM2aq1wMx3D DUolP9OCoXT/BIcnYmMA/tydjrPjFE/bLr4uxUWhxfCuRkPuJmm9/iMaer5pyMKP2V78 rUwsrLj7O+3toK/JLTMeBRzVaCdt0g37bKIW/H44UDuB5oDD9i2Crx+9tRnNkZnmqXwH Bj0A== X-Forwarded-Encrypted: i=1; AFNElJ+sUeSzsRAbKclYjh/gqAFPwf9dvOyspffhCh4/4BfDNlX4h/NfO4dxi9WO4L9wN8PfOoB2SaSnaFYml2k=@vger.kernel.org X-Gm-Message-State: AOJu0YwpId+jRKCAPOTcAQphE/1cbdBEwaZqkvknM/SS/mBTsJOqROD3 BGdbKmpV6K05FNt+zEvwbHFlWqfG1a9TjGlWPAhXtqnNQmHBLS6waSWe X-Gm-Gg: Acq92OHipSZNSeaYjho5rsGnEU0dcuhbghF4uMk40xw1v/0FGVh1cWFAGVGqD9jh4Rs 2iy2IeXilE+I368hTlc4nQ1pYf8FyF9R+umbyUSyU8pAoD6dbyykxZfVwgc+76mSb7PdVi/wrqk 8E6TneVYyaJh35oLkI8ybqIJFqe9In9kIquuUi/CcRS7LjE0P8tEwQvB2rMTwHftTRfNEecStVG Du/jinjMeA77PWbXFusUIObfOWEXPdHe4V/APtue9pFDfX3845jVD8anYpChxkCwsL8Rm3E9qF2 403wpjSGRi7yvvImfoGYOEFmo7ZOyUxLeNGqg0NXSONBbUpPpmDft221gI4TKdH8TcLinup3t5H +7okXGc2FxzR8AdqLdIUS+Ni/GeOp/NpWngK7upJo9gTfHcuy/9ZaxFHptYFKJztiIov0Qnj6j9 FmHW+HO73uuwvbk2Y= X-Received: by 2002:a05:6820:200b:b0:694:9bdb:596b with SMTP id 006d021491bc7-69b78d6e063mr1647900eaf.17.1778674443943; Wed, 13 May 2026 05:14:03 -0700 (PDT) Received: from houminxi ([72.244.37.221]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4355736dbc0sm15189442fac.11.2026.05.13.05.13.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 May 2026 05:14:03 -0700 (PDT) From: Minxi Hou To: netdev@vger.kernel.org Cc: dev@openvswitch.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, aconole@redhat.com, echaudro@redhat.com, i.maximets@ovn.org, i.maximets@redhat.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, shuah@kernel.org, Minxi Hou Subject: [PATCH net-next 5/5] selftests: openvswitch: suppress pylint complexity warnings Date: Wed, 13 May 2026 20:12:40 +0800 Message-ID: <20260513121240.2590767-6-houminxi@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260513121240.2590767-1-houminxi@gmail.com> References: <20260513121240.2590767-1-houminxi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add file-level pylint:disable comments for warnings caused by pyroute2 framework constraints that cannot be fixed without restructuring the netlink attribute hierarchy. After this patch, pylint reports 0 warnings (10.00/10). Signed-off-by: Minxi Hou --- tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/t= esting/selftests/net/openvswitch/ovs-dpctl.py index 3683796ba2e2..bbc88e3cfc8a 100644 --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -1,6 +1,14 @@ #!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 """OVS datapath control utility for kernel selftests.""" +# pylint: disable=3Dinvalid-name,too-many-lines +# pylint: disable=3Dtoo-many-ancestors,too-many-arguments +# pylint: disable=3Dtoo-many-positional-arguments,too-many-branches +# pylint: disable=3Dtoo-many-locals,too-many-statements +# pylint: disable=3Dtoo-many-return-statements,too-many-nested-blocks +# pylint: disable=3Dunused-argument,broad-exception-caught +# pylint: disable=3Dno-member,not-callable +# pylint: disable=3Dnon-parent-init-called,super-init-not-called =20 # Controls the openvswitch module. Part of the kselftest suite, but # can be used for some diagnostic purpose as well. --=20 2.53.0