CSIT-32: Add Lightweight 4over6 test.
[csit.git] / resources / test_data / softwire / map_utils.py
diff --git a/resources/test_data/softwire/map_utils.py b/resources/test_data/softwire/map_utils.py
new file mode 100644 (file)
index 0000000..58ef551
--- /dev/null
@@ -0,0 +1,53 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Utils for MAP feature."""
+
+
+def map_port_ranges(psid, length, offset=6):
+    """Return list of port ranges for given PSID in tuple <min, max>.
+
+    :param psid: PSID.
+    :param length: PSID length.
+    :param offset: PSID offset.
+    :type psid: int
+    :type length: int
+    :type offset: int
+    :return: List of (min, max) port range tuples inclusive.
+    :rtype: list
+
+                      0                   1
+                      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+                     +-----------+-----------+-------+
+       Ports in      |     A     |    PSID   |   j   |
+    the CE port set  |    > 0    |           |       |
+                     +-----------+-----------+-------+
+                     |  a bits   |  k bits   |m bits |
+    """
+
+    port_field_len = 16
+    port_field_min = int('0x0000', 16)
+    port_field_max = int('0xffff', 16)
+
+    a = offset
+    k = length
+    m = port_field_len - offset - length
+    km = k + m
+    j_max = port_field_max >> a + k
+
+    port_ranges = []
+    for A in range(1, (port_field_max >> km) + 1):
+        port_ranges.append((((A << k) | psid) << m,
+                            ((A << k) | psid) << m | j_max))
+
+    return port_ranges