[v2,4/7] rte flow: add more specifc data structures
diff mbox series

Message ID 20201023232903.37387-4-ohilyard@iol.unh.edu
State Accepted
Headers show
Series
  • [v2,1/7] rte flow: add test plan and test suite
Related show

Commit Message

Owen Hilyard Oct. 23, 2020, 11:28 p.m. UTC
The reason that all of this is broken off from flow_pattern_items and flow_action_items is that those are both 1000 line+ files.

Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
---
 framework/flow/flow_items.py | 116 +++++++++++++++++++++++++++++++++++
 framework/flow/flow_rule.py  |  64 +++++++++++++++++++
 2 files changed, 180 insertions(+)
 create mode 100644 framework/flow/flow_items.py
 create mode 100644 framework/flow/flow_rule.py

Patch
diff mbox series

diff --git a/framework/flow/flow_items.py b/framework/flow/flow_items.py
new file mode 100644
index 0000000..d7be345
--- /dev/null
+++ b/framework/flow/flow_items.py
@@ -0,0 +1,116 @@ 
+# BSD LICENSE
+#
+# Copyright(c) 2020 Intel Corporation. All rights reserved.
+# Copyright © 2018[, 2019] The University of New Hampshire. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from __future__ import annotations
+
+import copy
+import itertools
+from functools import reduce
+from typing import FrozenSet, Union, Any, Set, Dict, Tuple, Iterable, Hashable
+
+from flow.enums import FlowItemType, FlowActionType
+from flow.exceptions import InvalidFlowItemException
+from flow import flow_action_items
+from flow import flow_pattern_items
+
+PATTERN_ACTION_ITEMS = {FlowItemType.INVERT, FlowItemType.VOID, FlowItemType.MARK, FlowItemType.META}
+
+
+class FlowItem(object):
+    type: Union[FlowItemType, FlowActionType]
+    # Defines what items this may not appear with
+    allowed_with: FrozenSet[Union[FlowItemType, FlowActionType]]
+    # OSI Model layer of the protocol
+    # This should be the lowest layer a protocol is used in, for example
+    # QUIC would be considered L5 since it needs to go after UDP (L4),
+    # even though it has capabilities in L6.
+    layer: int
+    valid_next_items: FrozenSet[Union[FlowItemType, FlowActionType]]
+
+    # Types subject to change, should only be accessed through
+    possible_properties: Dict[str, Tuple[str, FrozenSet[str], FrozenSet[str]]]
+    properties: str
+
+    def get_property_stream(self) -> Iterable[Tuple[FlowItem, FrozenSet[str], FrozenSet[str], str]]:
+        """
+        This function will return a generator that will provide all
+        configured property combinations.
+
+        This function will not mutate the instance it is called on.
+
+        @return: a generator that will provide all
+        permutations of possible properties this object has as a flow
+        item with properties
+        """
+        base_copy = copy.deepcopy(self)
+        for key, value in self.possible_properties.items():
+            new_copy = copy.deepcopy(base_copy)
+            new_copy.properties = value[0]  # The properties string
+            yield new_copy, *value[1:], f"{self.type.value}_{key}"
+
+    def __init__(self):
+        self.properties = ""
+
+    def __truediv__(self, other: FlowItem):
+        """
+        Used in a similar way to scapy's packet composition.
+        @param other: The other flow item.
+        @return: A Flow containing both items
+        """
+        if type(self) != type(other):
+            raise InvalidFlowItemException(self, other)
+        elif other.type in self.valid_next_items:
+            # This import is in here so there is no circular import
+            from flow.flow import Flow
+            if isinstance(self, flow_pattern_items.PatternFlowItem):
+                return Flow(pattern_items=[self, other])
+            elif isinstance(self, flow_action_items.ActionFlowItem):
+                return Flow(action_items=[self, other])
+            else:
+                raise TypeError(
+                    f"{type(self):s} is not one of {flow_pattern_items.PatternFlowItem:s}, {flow_action_items.ActionFlowItem:s}.")
+        else:
+            raise InvalidFlowItemException(self, other)
+
+    def __eq__(self, other) -> bool:
+        return type(self) == type(other) and \
+               self.type == other.type and \
+               self.properties == other.properties
+
+    def __str__(self):
+        if self.properties != "":
+            return self.properties
+        else:
+            return self.type.value
+
+    def __repr__(self):
+        return str(self)
diff --git a/framework/flow/flow_rule.py b/framework/flow/flow_rule.py
new file mode 100644
index 0000000..361afae
--- /dev/null
+++ b/framework/flow/flow_rule.py
@@ -0,0 +1,64 @@ 
+# BSD LICENSE
+#
+# Copyright(c) 2020 Intel Corporation. All rights reserved.
+# Copyright © 2018[, 2019] The University of New Hampshire. All rights reserved.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of Intel Corporation nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from typing import Union
+
+from flow.enums import *
+from flow.flow import Flow
+import flow.flow_action_items as flow_action_items
+
+
+class FlowPattern(Flow):
+    entry_points = {FlowItemType.ETH, FlowItemType.FUZZY}
+
+    def __str__(self):
+        return f"pattern {super(FlowPattern, self).__str__()} / end"
+
+
+class FlowActions(Flow):
+    entry_points = flow_action_items.ENTRY_POINTS
+
+    def __str__(self):
+        return f"action {super(FlowActions, self).__str__()} / end"
+
+
+class FlowRule(object):
+    port: int
+    group: Union[int, None]
+    priority: Union[int, None]
+
+    ingress: bool
+    egress: bool
+    transfer: bool
+
+    pattern: FlowPattern
+    actions: FlowActions