On 28 Feb 2022, at 10:03, Adrian Moreno wrote:
> On 2/11/22 15:12, Eelco Chaudron wrote: >> >> On 28 Jan 2022, at 17:04, Adrian Moreno wrote: >> >>> Introduce OFPFlow class and all its decoders. >>> >>> Most of the decoders are generic (from decoders.py). Some have special >>> syntax and need a specific implementation. >>> >>> Decoders for nat are moved to the common decoders.py because it's syntax >>> is shared with other types of flows (e.g: dpif flows). >>> >>> Signed-off-by: Adrian Moreno <amore...@redhat.com> >> >> Some small comments below… >> >>> --- >>> python/automake.mk | 2 + >>> python/ovs/flows/decoders.py | 108 +++++++++ >>> python/ovs/flows/ofp.py | 453 +++++++++++++++++++++++++++++++++++ >>> python/ovs/flows/ofp_act.py | 243 +++++++++++++++++++ >>> 4 files changed, 806 insertions(+) >>> create mode 100644 python/ovs/flows/ofp.py >>> create mode 100644 python/ovs/flows/ofp_act.py >>> >>> diff --git a/python/automake.mk b/python/automake.mk >>> index b7debfbd9..7b6d6596f 100644 >>> --- a/python/automake.mk >>> +++ b/python/automake.mk >>> @@ -31,6 +31,8 @@ ovs_pyfiles = \ >>> python/ovs/flows/flow.py \ >>> python/ovs/flows/kv.py \ >>> python/ovs/flows/list.py \ >>> + python/ovs/flows/ofp.py \ >>> + python/ovs/flows/ofp_act.py \ >>> python/ovs/json.py \ >>> python/ovs/jsonrpc.py \ >>> python/ovs/ovsuuid.py \ >>> diff --git a/python/ovs/flows/decoders.py b/python/ovs/flows/decoders.py >>> index 2f8e5bd0a..1462b0b9d 100644 >>> --- a/python/ovs/flows/decoders.py >>> +++ b/python/ovs/flows/decoders.py >>> @@ -6,6 +6,7 @@ object. >>> """ >>> >>> import netaddr >>> +import re >>> >>> >>> class Decoder(object): >>> @@ -414,3 +415,110 @@ class IPMask(Decoder): >>> >>> def to_json(self): >>> return str(self) >>> + >>> + >>> +def decode_free_output(value): >>> + """The value of the output action can be found free, i.e: without the >>> + 'output' keyword. This decoder decodes its value when found this >>> way.""" >>> + try: >>> + return "output", {"port": int(value)} >>> + except ValueError: >>> + return "output", {"port": value.strip('"')} >>> + >>> + >>> +ipv4 = r"(?:\d{1,3}.?){3}\d{1,3}" >>> +ipv4_capture = r"({ipv4})".format(ipv4=ipv4) >>> +""" >>> +The following IPv6 regexp is a modified version of the one in: >>> +https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4?_ga=2.113564423.1432958022.1523882681-2146416484.1523557976 >>> + >>> +It matches all these types of ipv6 addresses: >>> +fe80:0000:0000:0000:0204:61ff:fe9d:f156 >>> +fe80:0:0:0:204:61ff:fe9d:f156 >>> +fe80::204:61ff:fe9d:f156 >>> +fe80:0000:0000:0000:0204:61ff:254.157.241.86 >>> +fe80:0:0:0:0204:61ff:254.157.241.86 >>> +fe80::204:61ff:254.157.241.86 >>> +::1 >>> +2001:: >>> +fe80:: >>> +""" >>> +ipv6 = >>> r"(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:[0-9A-Fa-f]{1,4}|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,3})|(?:(?::[0-9A-Fa-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,4})|(?:(?::[0-9A-Fa-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,5})|(?:(?::[0-9A-Fa-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){1}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,6})|(?:(?::[0-9A-Fa-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9A-Fa-f]{1,4}){1,7})|(?:(?::[0-9A-Fa-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))" >>> # noqa: E501 >>> +ipv6_capture = r"(?:\[*)?({ipv6})(?:\]*)?".format(ipv6=ipv6) >>> +port_range = r":(\d+)(?:-(\d+))?" >>> +ip_range_regexp = r"{ip_cap}(?:-{ip_cap})?(?:{port_range})?" >>> +ipv4_port_regex = re.compile( >>> + ip_range_regexp.format(ip_cap=ipv4_capture, port_range=port_range) >>> +) >>> +ipv6_port_regex = re.compile( >>> + ip_range_regexp.format(ip_cap=ipv6_capture, port_range=port_range) >>> +) >>> + >>> + > > Hi Eelco, what do you think about going back to the v1 version of this regexp > that successfully captured the IPv4 and IPv6 addresses? As mentioned in > another email, this regexp is only used to capture the substrings that > _might_ be ipv4/6 addresses, leaving the actual address parsing to > netaddr.IPAddress. Therefore, we don't need it to be 100% accurate in terms > of address format and we can favor maintanability. Yes, this makes sense to me for the v6! I assume you keep the v4 above? <SNIP> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev