blob: 24e9af44b7d5b248ff4e84ce554b462d2ccd377d [file] [log] [blame]
Matej Klotton0178d522016-11-04 11:11:44 +01001import socket
Klement Sekera7bb873a2016-11-18 07:38:42 +01002import sys
Klement Sekera0e3c0de2016-09-29 14:43:44 +02003from abc import abstractmethod, ABCMeta
Klement Sekera7bb873a2016-11-18 07:38:42 +01004from cStringIO import StringIO
5
6
7def 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
Damjan Marionf56b77a2016-10-03 19:44:57 +020017
Klement Sekera9225dee2016-12-12 08:36:58 +010018def 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
Klement Sekeradab231a2016-12-21 08:50:14 +010027 tail = ""
Klement Sekera9225dee2016-12-12 08:36:58 +010028 if limit < len(capture):
Klement Sekeradab231a2016-12-21 08:50:14 +010029 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)
Klement Sekera9225dee2016-12-12 08:36:58 +010035
36
Eyal Barid81da8c2017-01-11 13:39:54 +020037def 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
42def ip4n_range(ip4n, s, e):
43 ip4 = socket.inet_ntop(socket.AF_INET, ip4n)
Klement Sekera72715ee2017-01-17 10:37:05 +010044 return (socket.inet_pton(socket.AF_INET, ip)
45 for ip in ip4_range(ip4, s, e))
Eyal Barid81da8c2017-01-11 13:39:54 +020046
47
Klement Sekera0e3c0de2016-09-29 14:43:44 +020048class 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
Matej Klotton0178d522016-11-04 11:11:44 +010069class Host(object):
70 """ Generic test host "connected" to VPPs interface. """
Damjan Marionf56b77a2016-10-03 19:44:57 +020071
Klement Sekeraf62ae122016-10-11 11:47:09 +020072 @property
73 def mac(self):
74 """ MAC address """
75 return self._mac
Damjan Marionf56b77a2016-10-03 19:44:57 +020076
Klement Sekeraf62ae122016-10-11 11:47:09 +020077 @property
78 def ip4(self):
Klement Sekera46a87ad2017-01-02 08:22:23 +010079 """ IPv4 address - string """
Klement Sekeraf62ae122016-10-11 11:47:09 +020080 return self._ip4
Damjan Marionf56b77a2016-10-03 19:44:57 +020081
Klement Sekeraf62ae122016-10-11 11:47:09 +020082 @property
Matej Klotton0178d522016-11-04 11:11:44 +010083 def ip4n(self):
Klement Sekera46a87ad2017-01-02 08:22:23 +010084 """ IPv4 address of remote host - raw, suitable as API parameter."""
Matej Klotton0178d522016-11-04 11:11:44 +010085 return socket.inet_pton(socket.AF_INET, self._ip4)
86
87 @property
Klement Sekeraf62ae122016-10-11 11:47:09 +020088 def ip6(self):
Klement Sekera46a87ad2017-01-02 08:22:23 +010089 """ IPv6 address - string """
Klement Sekeraf62ae122016-10-11 11:47:09 +020090 return self._ip6
Damjan Marionf56b77a2016-10-03 19:44:57 +020091
Klement Sekera46a87ad2017-01-02 08:22:23 +010092 @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
Klement Sekeraf62ae122016-10-11 11:47:09 +020097 def __init__(self, mac=None, ip4=None, ip6=None):
98 self._mac = mac
99 self._ip4 = ip4
100 self._ip6 = ip6