BFD: IPv6 support
[vpp.git] / test / util.py
1 import socket
2 import sys
3 from abc import abstractmethod, ABCMeta
4 from cStringIO import StringIO
5
6
7 def ppp(headline, packet):
8     """ Return string containing the output of scapy packet.show() call. """
9     o = StringIO()
10     old_stdout = sys.stdout
11     sys.stdout = o
12     print(headline)
13     packet.show()
14     sys.stdout = old_stdout
15     return o.getvalue()
16
17
18 def ppc(headline, capture, limit=10):
19     """ Return string containing ppp() printout for a capture.
20
21     :param headline: printed as first line of output
22     :param capture: packets to print
23     :param limit: limit the print to # of packets
24     """
25     if not capture:
26         return headline
27     tail = ""
28     if limit < len(capture):
29         tail = "\nPrint limit reached, %s out of %s packets printed" % (
30             len(capture), limit)
31         limit = len(capture)
32     body = "".join([ppp("Packet #%s:" % count, p)
33                     for count, p in zip(range(0, limit), capture)])
34     return "%s\n%s%s" % (headline, body, tail)
35
36
37 def ip4_range(ip4, s, e):
38     tmp = ip4.rsplit('.', 1)[0]
39     return ("%s.%d" % (tmp, i) for i in range(s, e))
40
41
42 def ip4n_range(ip4n, s, e):
43     ip4 = socket.inet_ntop(socket.AF_INET, ip4n)
44     return (socket.inet_pton(socket.AF_INET, ip)
45             for ip in ip4_range(ip4, s, e))
46
47
48 class NumericConstant(object):
49     __metaclass__ = ABCMeta
50
51     desc_dict = {}
52
53     @abstractmethod
54     def __init__(self, value):
55         self._value = value
56
57     def __int__(self):
58         return self._value
59
60     def __long__(self):
61         return self._value
62
63     def __str__(self):
64         if self._value in self.desc_dict:
65             return self.desc_dict[self._value]
66         return ""
67
68
69 class Host(object):
70     """ Generic test host "connected" to VPPs interface. """
71
72     @property
73     def mac(self):
74         """ MAC address """
75         return self._mac
76
77     @property
78     def ip4(self):
79         """ IPv4 address - string """
80         return self._ip4
81
82     @property
83     def ip4n(self):
84         """ IPv4 address of remote host - raw, suitable as API parameter."""
85         return socket.inet_pton(socket.AF_INET, self._ip4)
86
87     @property
88     def ip6(self):
89         """ IPv6 address - string """
90         return self._ip6
91
92     @property
93     def ip6n(self):
94         """ IPv6 address of remote host - raw, suitable as API parameter."""
95         return socket.inet_pton(socket.AF_INET6, self._ip6)
96
97     def __init__(self, mac=None, ip4=None, ip6=None):
98         self._mac = mac
99         self._ip4 = ip4
100         self._ip6 = ip6