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

Reply via email to