""" test framework utilities """ import ipaddress import logging import socket from socket import AF_INET6 import os.path from copy import deepcopy from collections import UserDict import scapy.compat from scapy.layers.l2 import Ether from scapy.layers.inet import IP from scapy.layers.inet6 import ( IPv6, IPv6ExtHdrFragment, IPv6ExtHdrRouting, IPv6ExtHdrHopByHop, ) from scapy.packet import Raw from scapy.utils import hexdump from scapy.utils6 import in6_mactoifaceid from io import BytesIO from vpp_papi import mac_pton # Set up an empty logger for the testcase that can be overridden as necessary null_logger = logging.getLogger("VppTestCase.util") null_logger.addHandler(logging.NullHandler()) def pr(packet): return packet.__repr__() def ppp(headline, packet): """Return string containing headline and output of scapy packet.show()""" return "%s\n%s\n\n%s\n" % ( headline, hexdump(packet, dump=True), packet.show(dump=True), ) def ppc(headline, capture, limit=10): """Return string containing ppp() printout for a capture. :param headline: printed as first line of output :param capture: packets to print :param limit: limit the print to # of packets """ if not capture: return headline tail = "" if limit < len(capture): tail = "\nPrint limit reached, %s out of %s packets printed" % ( limit, len(capture), ) body = "".join( [ppp("Packet #%s:" % count, p) for count, p in zip(range(0, limit), capture)] ) return "%s\n%s%s" % (headline, body, tail) def ip4_range(ip4, s, e): tmp = ip4.rsplit(".", 1)[0] return ("%s.%d" % (tmp, i) for i in range(s, e)) def mcast_ip_to_mac(ip): ip = ipaddress.ip_address(ip) if not ip.is_multicast: raise ValueError("Must be multicast address.") ip_as_int = int(ip) if ip.version == 4: mcast_mac = "01:00:5e:%02x:%02x:%02x" % ( (ip_as_int >> 16) & 0x7F, (ip_as_int >> 8) & 0xFF, ip_as_int & 0xFF, ) else: mcast_mac = "33:33:%02x:%02x:%02x:%02x" % ( (ip_as_int >> 24) & 0xFF, (ip_as_int >> 16) & 0xFF, (ip_as_int >> 8) & 0xFF, ip_as_int & 0xFF, ) return mcast_mac # wrapper around scapy library function. def mk_ll_addr(mac): euid = in6_mactoifaceid(str(mac)) addr = "fe80::" + euid return addr def ip6_normalize(ip6): return socket.inet_ntop(socket.AF_INET6, socket.inet_pton(socket.AF_INET6, ip6)) def get_core_path(tempdir): return "%s/%s" % (tempdir, get_core_pattern()) def is_core_present(tempdir): return os.path.isfile(get_core_path(tempdir)) def get_core_pattern(): with open("/proc/sys/kernel/core_pattern", "r") as f: corefmt = f.read().strip() return corefmt def check_core_path(logger, core_path): corefmt = get_core_pattern() if corefmt.startswith("|"): logger.error( "WARNING: redirecting the core dump through a" " filter may result in truncated dumps." ) logger.error( " You may want to check the filter settings" " or uninstall it and edit the" " /proc/sys/kernel/core_pattern accordingly." ) logger.error(" current core pattern is: %s" % corefmt) class NumericConstant: desc_dict = {} def __init__(self, value): self._value = value def __int__(self): return self._value def __long__(self): return self._value def __str__(self): if self._value in self.desc_dict: return self.desc_dict[self._value] return "" class Host: """Generic test host "connected" to VPPs interface.""" @property def mac(self): """MAC address""" return self._mac @property def bin_mac(self): """MAC address""" return mac_pton(self._mac) @property def ip4(self): """IPv4 address - string""" return self._ip4 @property def ip4n(self): """IPv4 address of remote host - raw, suitable as API parameter.""" return socket.inet_pton(socket.AF_INET, self._ip4) @property def ip6(self): """IPv6 address - string""" return self._ip6 @property def ip6n(self): """IPv6 address of remote host - raw, suitable as API parameter.""" return socket.inet_pton(socket.AF_INET6, self._ip6) @property def ip6_ll(self): """IPv6 link-local address - string""" return self._ip6_ll @property def ip6n_ll(self): """IPv6 link-local address of remote host - raw, suitable as API parameter.""" return socket.inet_pton(socket.AF_INET6, self._ip6_ll) def __eq__(self, other): if isinstance(other, Host): return ( self.mac == other.mac and self.ip4 == other.ip4 and self.ip6 == other.ip6 and self.ip6_ll == other.ip6_ll ) else: return False def __ne__(self, other): return not self.__eq__(other) def __repr__(self): return "Host { mac:%s ip4:%s ip6:%s ip6_ll:%s }" % ( self.mac, self.ip4, sel
/* 
 *------------------------------------------------------------------
 * Copyright (c) 1997-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.
 */

extern char *getprop (char *name);
extern char *getprop_default (char *name, char *def);
ex