summaryrefslogtreecommitdiffstats
path: root/src/plugins/flowprobe
ModeNameSize
-rw-r--r--CMakeLists.txt725logstatsplain
-rw-r--r--FEATURE.yaml371logstatsplain
-rw-r--r--flowprobe.api1617logstatsplain
-rw-r--r--flowprobe.c33605logstatsplain
-rw-r--r--flowprobe.h4279logstatsplain
-rw-r--r--flowprobe_plugin_doc.md408logstatsplain
-rw-r--r--flowprobe_test.c3951logstatsplain
-rw-r--r--node.c29171logstatsplain
d---------test45logstatsplain
95' href='#n195'>195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
"""
  BIER Tables and Routes
"""

import socket
from vpp_object import VppObject


class BIER_HDR_PAYLOAD:
    BIER_HDR_PROTO_MPLS_DOWN_STREAM = 1
    BIER_HDR_PROTO_MPLS_UP_STREAM = 2
    BIER_HDR_PROTO_ETHERNET = 3
    BIER_HDR_PROTO_IPV4 = 4
    BIER_HDR_PROTO_IPV6 = 5
    BIER_HDR_PROTO_VXLAN = 6
    BIER_HDR_PROTO_CTRL = 7
    BIER_HDR_PROTO_OAM = 8


class VppBierTableID:
    def __init__(self, sub_domain_id, set_id, hdr_len_id):
        self.set_id = set_id
        self.sub_domain_id = sub_domain_id
        self.hdr_len_id = hdr_len_id


def find_bier_table(test, bti):
    tables = test.vapi.bier_table_dump()
    for t in tables:
        if (
            bti.set_id == t.bt_tbl_id.bt_set
            and bti.sub_domain_id == t.bt_tbl_id.bt_sub_domain
            and bti.hdr_len_id == t.bt_tbl_id.bt_hdr_len_id
        ):
            return True
    return False


def find_bier_route(test, bti, bp):
    routes = test.vapi.bier_route_dump(bti)
    for r in routes:
        if (
            bti.set_id == r.br_route.br_tbl_id.bt_set
            and bti.sub_domain_id == r.br_route.br_tbl_id.bt_sub_domain
            and bti.hdr_len_id == r.br_route.br_tbl_id.bt_hdr_len_id
            and bp == r.br_route.br_bp
        ):
            return True
    return False


def find_bier_disp_table(test, bdti):
    tables = test.vapi.bier_disp_table_dump()
    for t in tables:
        if bdti == t.bdt_tbl_id:
            return True
    return False


def find_bier_disp_entry(test, bdti, bp):
    entries = test.vapi.bier_disp_entry_dump(bdti)
    for e in entries:
        if bp == e.bde_bp and bdti == e.bde_tbl_id:
            return True
    return False


def find_bier_imp(test, bti, bp):
    imps = test.vapi.bier_imp_dump()
    for i in imps:
        if (
            bti.set_id == i.bi_tbl_id.bt_set
            and bti.sub_domain_id == i.bi_tbl_id.bt_sub_domain
            and bti.hdr_len_id == i.bi_tbl_id.bt_hdr_len_id
            and bp == i.bi_src
        ):
            return True
    return False


class VppBierTable(VppObject):
    """
    BIER Table
    """

    def __init__(self, test, id, mpls_label):
        self._test = test
        self.id = id
        self.mpls_label = mpls_label

    def add_vpp_config(self):
        self._test.vapi.bier_table_add_del(self.id, self.mpls_label, is_add=1)
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.bier_table_add_del(self.id, self.mpls_label, is_add=0)

    def object_id(self):
        return "bier-table;[%d:%d:%d]" % (
            self.id.set_id,
            self.id.sub_domain_id,
            self.id.hdr_len_id,
        )

    def query_vpp_config(self):
        return find_bier_table(self._test, self.id)


class VppBierRoute(VppObject):
    """
    BIER route
    """

    def __init__(self, test, tbl_id, bp, paths):
        self._test = test
        self.tbl_id = tbl_id
        self.bp = bp
        self.paths = paths
        self.encoded_paths = []
        for path in self.paths:
            self.encoded_paths.append(path.encode())

    def add_vpp_config(self):
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, self.encoded_paths, is_add=1
        )
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, self.encoded_paths, is_add=0
        )

    def update_paths(self, paths):
        self.paths = paths
        self.encoded_paths = []
        for path in self.paths:
            self.encoded_paths.append(path.encode())
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, self.encoded_paths, is_replace=1
        )

    def add_path(self, path):
        self.encoded_paths.append(path.encode())
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, [path.encode()], is_add=1, is_replace=0
        )
        self.paths.append(path)
        self._test.registry.register(self, self._test.logger)

    def remove_path(self, path):
        self.encoded_paths.remove(path.encode())
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, [path.encode()], is_add=0, is_replace=0
        )
        self.paths.remove(path)

    def remove_all_paths(self):
        self._test.vapi.bier_route_add_del(
            self.tbl_id, self.bp, [], is_add=0, is_replace=1
        )
        self.paths = []

    def object_id(self):
        return "bier-route;[%d:%d:%d:%d]" % (
            self.tbl_id.set_id,
            self.tbl_id.sub_domain_id,
            self.tbl_id.hdr_len_id,
            self.bp,
        )

    def query_vpp_config(self):
        return find_bier_route(self._test, self.tbl_id, self.bp)


class VppBierImp(VppObject):
    """
    BIER route
    """

    def __init__(self, test, tbl_id, src, ibytes):
        self._test = test
        self.tbl_id = tbl_id
        self.ibytes = ibytes
        self.src = src

    def add_vpp_config(self):
        res = self._test.vapi.bier_imp_add(self.tbl_id, self.src, self.ibytes)
        self.bi_index = res.bi_index
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.bier_imp_del(self.bi_index)

    def object_id(self):
        return "bier-imp;[%d:%d:%d:%d]" % (
            self.tbl_id.set_id,
            self.tbl_id.sub_domain_id,
            self.tbl_id.hdr_len_id,
            self.src,
        )

    def query_vpp_config(self):
        return find_bier_imp(self._test, self.tbl_id, self.src)


class VppBierDispTable(VppObject):
    """
    BIER Disposition Table
    """

    def __init__(self, test, id):
        self._test = test
        self.id = id

    def add_vpp_config(self):
        self._test.vapi.bier_disp_table_add_del(self.id, is_add=1)
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.bier_disp_table_add_del(self.id, is_add=0)

    def object_id(self):
        return "bier-disp-table;[%d]" % (self.id)

    def query_vpp_config(self):
        return find_bier_disp_table(self._test, self.id)


class VppBierDispEntry(VppObject):
    """
    BIER Disposition Entry
    """

    def __init__(
        self, test, tbl_id, bp, payload_proto, nh_proto, nh, nh_tbl, rpf_id=~0
    ):
        self._test = test
        self.tbl_id = tbl_id
        self.nh_tbl = nh_tbl
        self.nh_proto = nh_proto
        self.bp = bp
        self.payload_proto = payload_proto
        self.rpf_id = rpf_id
        self.nh = socket.inet_pton(socket.AF_INET, nh)

    def add_vpp_config(self):
        self._test.vapi.bier_disp_entry_add_del(
            self.tbl_id,
            self.bp,
            self.payload_proto,
            self.nh_proto,
            self.nh,
            self.nh_tbl,
            self.rpf_id,
            is_add=1,
        )
        self._test.registry.register(self, self._test.logger)

    def remove_vpp_config(self):
        self._test.vapi.bier_disp_entry_add_del(
            self.tbl_id,
            self.bp,
            self.payload_proto,
            self.nh_proto,
            self.nh,
            self.nh_tbl,
            self.rpf_id,
            is_add=0,
        )

    def object_id(self):
        return "bier-disp-entry;[%d:%d]" % (self.tbl_id, self.bp)

    def query_vpp_config(self):
        return find_bier_disp_entry(self._test, self.tbl_id, self.bp)