summaryrefslogtreecommitdiffstats
path: root/src/plugins/ioam
AgeCommit message (Expand)AuthorFilesLines
2020-09-01ip: fix ip zero checksum verificationBenoît Ganne1-2/+2
2020-05-15misc: removed executable bits from source filesRay Kinsella1-0/+0
2020-05-06docs: clean up make docs jobPaul Vinciguerra3-8/+8
2020-05-04misc: binary api fuzz test fixesDave Barach1-5/+5
2020-04-27ioam: do not reuse existing vnet symbolBenoît Ganne1-2/+2
2020-04-08misc: check return values from vlib_buffer_copy(...)Dave Barach1-3/+5
2020-02-26api: improve api string safetyJakub Grajciar2-4/+4
2019-12-10ioam: use explicit api typesOle Troan18-871/+154
2019-10-09ioam: remove api boilerplateOle Troan28-974/+76
2019-09-20classify: remove includes from classifier header fileDamjan Marion5-0/+5
2019-07-31vppinfra: refactor test_and_set spinlocks to use clib_spinlock_tjaszha034-48/+33
2019-07-09vat: unload unused vat pluginsDave Barach1-17/+19
2019-06-07build: add -Wall and -fno-common, fix reported issuesBenoît Ganne2-2/+2
2019-06-04features will register udp ports once configuredJakub Grajciar1-3/+5
2019-05-28Add an ip6 local hop-by-hop protocol demux tableDave Barach1-4/+2
2019-05-24udp-ping: disable due to conflict with mldv2Florin Coras1-2/+4
2019-05-16init / exit function orderingDave Barach7-75/+65
2019-05-03plugins: clean up plugin descriptionsDave Wallace1-1/+1
2019-04-10API: Fix shared memory only action handlers.Ole Troan2-109/+20
2019-03-01ioam: migrate old MULTIARCH macros to VLIB_NODE_FNFilip Tehlar5-19/+27
2018-12-12VPP-1529: check hop-by-hop header lengthDave Barach1-7/+37
2018-11-14Remove c-11 memcpy checks from perf-critical codeDave Barach6-24/+24
2018-10-23c11 safe string handling supportDave Barach15-29/+30
2018-10-19vppinfra: add atomic macros for __sync builtinsSirshak Das4-26/+28
2018-08-27cmake: Fix plugins .h includesMohsin Kazmi1-0/+31
2018-08-27CMake: fix install lib and iOMA missing symbolNeale Ranns1-0/+1
2018-08-25cmake: handle api_test_plugins in add_vpp_plugin macroDamjan Marion1-19/+2
2018-08-25ioam: one api test plugin instead of fiveDamjan Marion7-6/+54
2018-08-25cmake: improve add_vpp_plugin macroDamjan Marion1-13/+16
2018-08-17CMake as an alternative to autotools (experimental)Damjan Marion1-0/+99
2018-05-13Improve ipfix template packet rewrite constructionDave Barach3-4/+11
2018-05-04Flow: Rename IPFIX exporter.Ole Troan4-4/+4
2018-05-04Harmonize vec/pool_get_aligned object sizes and alignment requestsDave Barach4-2/+12
2018-04-25Fix some build warnings about "Old Style VLA"Juraj Sloboda1-3/+3
2018-04-12Fixes for 'make UNATTENDED=yes CC=clang CXX=clang verify'Neale Ranns2-6/+6
2018-01-23VPPAPIGEN: vppapigen replacement in Python PLY.Ole Troan7-7/+7
2018-01-15fix udp_ping api naming errorGabriel Ganne3-35/+17
2018-01-09api: refactor vlibmemoryFlorin Coras2-4/+4
2017-12-21VPP-1109 Fix loop for some CLI (code review)Swarup Nayak1-0/+3
2017-10-24Add extern to *_main global variable declarations in header files.Dave Wallace2-1/+3
2017-10-09vppapigen: support per-file (major,minor,patch) version stampsDave Barach7-0/+10
2017-10-03Repair vlib API socket serverDave Barach14-14/+8
2017-06-06Rework vxlan-gpe to support FIB 2.0 and bypass modeHongjun Ni1-1/+1
2017-05-30Flowprobe: Stateful flows and IPv6, L4 recordingOle Troan2-2/+4
2017-05-24IPv6 Performance bugsNeale Ranns2-2/+1
2017-05-17ioam: configuration for SRv6 localsid (VPP-693)shwethab4-23/+54
2017-05-05First commit SR MPLSPablo Camarillo3-3/+3
2017-04-27ioam: adding missing setup api msg crc tableShwetha Bhandari4-0/+66
2017-04-25"autoreply" flag: autogenerate standard xxx_reply_t messagesDave Barach6-158/+14
2017-04-13Remove unsed parameter from fib_table_entry_special_add() (only used in FIB t...Neale Ranns1-3/+1
ass="sd">"""Configure IPv4 address on interface. :param interface: Interface name. :param address: IPv4 address. :param prefix_length: IPv4 prefix length. :type interface: str :type address: str :type prefix_length: int :returns: nothing """ pass @abstractmethod def set_route(self, network, prefix_length, gateway, interface): """Configure IPv4 route. :param network: Network IPv4 address. :param prefix_length: IPv4 prefix length. :param gateway: IPv4 address of the gateway. :param interface: Interface name. :type network: str :type prefix_length: int :type gateway: str :type interface: str :returns: nothing """ pass @abstractmethod def unset_route(self, network, prefix_length, gateway, interface): """Remove specified IPv4 route. :param network: Network IPv4 address. :param prefix_length: IPv4 prefix length. :param gateway: IPv4 address of the gateway. :param interface: Interface name. :type network: str :type prefix_length: int :type gateway: str :type interface: str :returns: nothing """ pass @abstractmethod def flush_ip_addresses(self, interface): """Flush all IPv4 addresses from specified interface. :param interface: Interface name. :type interface: str :return: nothing """ pass @abstractmethod def ping(self, destination_address, source_interface): """Send an ICMP request to destination node. :param destination_address: Address to send the ICMP request. :param source_interface: Source interface name. :type destination_address: str :type source_interface: str :returns: nothing """ pass class Tg(IPv4Node): """Traffic generator node""" def __init__(self, node_info): super(Tg, self).__init__(node_info) def _execute(self, cmd): """Executes the specified command on TG using SSH. :param cmd: Command to be executed. :type cmd: str :returns: Content of stdout and stderr returned by command. :rtype: tuple """ return exec_cmd_no_error(self.node_info, cmd) def _sudo_execute(self, cmd): """Executes the specified command with sudo on TG using SSH. :param cmd: Command to be executed. :type cmd: str :returns: Content of stdout and stderr returned by command. :rtype: tuple """ return exec_cmd_no_error(self.node_info, cmd, sudo=True) def set_ip(self, interface, address, prefix_length): cmd = 'ip -4 addr flush dev {}'.format(interface) self._sudo_execute(cmd) cmd = 'ip addr add {}/{} dev {}'.format(address, prefix_length, interface) self._sudo_execute(cmd) def set_route(self, network, prefix_length, gateway, interface): netmask = self._get_netmask(prefix_length) cmd = 'route add -net {} netmask {} gw {}'.\ format(network, netmask, gateway) self._sudo_execute(cmd) def unset_route(self, network, prefix_length, gateway, interface): self._sudo_execute('ip route delete {}/{}'. format(network, prefix_length)) def arp_ping(self, destination_address, source_interface): """Execute 'arping' command to send one ARP packet from the TG node. :param destination_address: Destination IP address for the ARP packet. :param source_interface: Name of an interface to send ARP packet from. :type destination_address: str :type source_interface: str """ self._sudo_execute('arping -c 1 -I {} {}'.format(source_interface, destination_address)) def ping(self, destination_address, source_interface): self._execute('ping -c 1 -w 5 -I {} {}'.format(source_interface, destination_address)) def flush_ip_addresses(self, interface): self._sudo_execute('ip addr flush dev {}'.format(interface)) class Dut(IPv4Node): """Device under test""" def __init__(self, node_info): super(Dut, self).__init__(node_info) def get_sw_if_index(self, interface): """Get sw_if_index of specified interface from current node. :param interface: Interface name. :type interface: str :returns: sw_if_index of the interface or None. :rtype: int """ return Topology().get_interface_sw_index(self.node_info, interface) def exec_vat(self, script, **args): """Wrapper for VAT executor. :param script: Script to execute. :param args: Parameters to the script. :type script: str :type args: dict :returns: nothing """ # TODO: check return value VatExecutor.cmd_from_template(self.node_info, script, **args) def set_arp(self, iface_key, ip_address, mac_address): """Set entry in ARP cache. :param iface_key: Interface key. :param ip_address: IP address. :param mac_address: MAC address. :type iface_key: str :type ip_address: str :type mac_address: str """ self.exec_vat('add_ip_neighbor.vat', sw_if_index=self.get_sw_if_index(iface_key), ip_address=ip_address, mac_address=mac_address) def set_ip(self, interface, address, prefix_length): self.exec_vat('add_ip_address.vat', sw_if_index=self.get_sw_if_index(interface), address=address, prefix_length=prefix_length) def set_route(self, network, prefix_length, gateway, interface, count=1): Routing.vpp_route_add(self.node_info, network=network, prefix_len=prefix_length, gateway=gateway, interface=interface, count=count) def unset_route(self, network, prefix_length, gateway, interface): self.exec_vat('del_route.vat', network=network, prefix_length=prefix_length, gateway=gateway, sw_if_index=self.get_sw_if_index(interface)) def arp_ping(self, destination_address, source_interface): """Does nothing.""" pass def flush_ip_addresses(self, interface): self.exec_vat('flush_ip_addresses.vat', sw_if_index=self.get_sw_if_index(interface)) def ping(self, destination_address, source_interface): pass def get_node(node_info): """Creates a class instance derived from Node based on type. :param node_info: Dictionary containing information on nodes in topology. :type node_info: dict :returns: Class instance that is derived from Node. """ if node_info['type'] == NodeType.TG: return Tg(node_info) elif node_info['type'] == NodeType.DUT: return Dut(node_info) else: raise NotImplementedError('Node type "{}" unsupported!'. format(node_info['type'])) class IPv4Setup(object): """IPv4 setup in topology.""" @staticmethod def vpp_nodes_set_ipv4_addresses(nodes, nodes_addr): """Set IPv4 addresses on all VPP nodes in topology. :param nodes: Nodes of the test topology. :param nodes_addr: Available nodes IPv4 addresses. :type nodes: dict :type nodes_addr: dict :returns: Affected interfaces as list of (node, interface) tuples. :rtype: list """ interfaces = [] for net in nodes_addr.values(): for port in net['ports'].values(): host = port.get('node') if host is None: continue topo = Topology() node = topo.get_node_by_hostname(nodes, host) if node is None: continue if node['type'] != NodeType.DUT: continue iface_key = topo.get_interface_by_name(node, port['if']) get_node(node).set_ip(iface_key, port['addr'], net['prefix']) interfaces.append((node, port['if'])) return interfaces @staticmethod @keyword('Get IPv4 address of node "${node}" interface "${port}" ' 'from "${nodes_addr}"') def get_ip_addr(node, iface_key, nodes_addr): """Return IPv4 address of the node port. :param node: Node in the topology. :param iface_key: Interface key of the node. :param nodes_addr: Nodes IPv4 addresses. :type node: dict :type iface_key: str :type nodes_addr: dict :returns: IPv4 address. :rtype: str """ interface = Topology.get_interface_name(node, iface_key) for net in nodes_addr.values(): for port in net['ports'].values(): host = port.get('node') dev = port.get('if') if host == node['host'] and dev == interface: ip_addr = port.get('addr') if ip_addr is not None: return ip_addr else: raise Exception( 'Node {n} port {p} IPv4 address is not set'.format( n=node['host'], p=interface)) raise Exception('Node {n} port {p} IPv4 address not found.'.format( n=node['host'], p=interface)) @staticmethod def setup_arp_on_all_duts(nodes_info, nodes_addr): """For all DUT nodes extract MAC and IP addresses of adjacent interfaces from topology and use them to setup ARP entries. :param nodes_info: Dictionary containing information on all nodes in topology. :param nodes_addr: Nodes IPv4 addresses. :type nodes_info: dict :type nodes_addr: dict """ for node in nodes_info.values(): if node['type'] == NodeType.TG: continue for iface_key in node['interfaces'].keys(): adj_node, adj_int = Topology.\ get_adjacent_node_and_interface(nodes_info, node, iface_key) ip_address = IPv4Setup.get_ip_addr(adj_node, adj_int, nodes_addr) mac_address = Topology.get_interface_mac(adj_node, adj_int) get_node(node).set_arp(iface_key, ip_address, mac_address) @staticmethod def add_arp_on_dut(node, iface_key, ip_address, mac_address): """Set ARP cache entree on DUT node. :param node: VPP Node in the topology. :param iface_key: Interface key. :param ip_address: IP address of the interface. :param mac_address: MAC address of the interface. :type node: dict :type iface_key: str :type ip_address: str :type mac_address: str """ get_node(node).set_arp(iface_key, ip_address, mac_address)