aboutsummaryrefslogtreecommitdiffstats
path: root/resources/test_data/softwire/map_utils.py
blob: 58ef551d7a9755d3fe46670b6d8c927d246e616c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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