1 ##########################################################################
2 # Copyright (c) 2017, ETH Zurich.
5 # This file is distributed under the terms in the attached LICENSE file.
6 # If you do not find this file, copies can be found by writing to:
7 # ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 ##########################################################################
14 import socket, struct, fcntl
16 from common import TestCommon, TimeoutError
17 from results import RowResults, PassFailResult
19 TEST_TIMEOUT = datetime.timedelta(minutes=8)
21 mac = {'babybel1': 130587495626,
22 'babybel2': 130587510022,
23 'babybel3': 130587512798,
24 'babybel4': 130589790232,
25 'ziger2': 65817495764,
26 'ziger1': 116527143012, }
28 # Fallback if gethostip does not work
29 ip = {'babybel1': 174982272,
30 'babybel2': 174982270,
31 'babybel3': 174982271,
33 'ziger1': 174982183, }
36 class DevifTests(TestCommon):
38 def __init__(self, options):
39 super(DevifTests, self).__init__(options)
41 def get_module_name(self):
44 def boot(self, *args):
45 super(DevifTests, self).boot(*args)
46 self.set_timeout(TEST_TIMEOUT)
48 def get_decimal_ip(self, hostname):
50 iphex = subprocess.check_output('gethostip -x %s' % hostname, shell=True)
51 return '%d' % int(iphex, 16)
53 return ip[hostname.split('-')[0]]
55 def get_local_mac(self, ifname):
56 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
57 info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15]))
58 hexmac = ''.join(['%02x' % ord(char) for char in info[18:24]])
59 return '%d' % int(hexmac, 16)
61 def get_modules(self, build, machine):
62 self.machine = machine.name
63 modules = super(DevifTests, self).get_modules(build, machine)
64 modules.add_module("e10k", ["auto", "function=0"])
65 modules.add_module("net_sockets_server", ["auto"])
66 modules.add_module("sfn5122f", ["auto", "function=0"])
67 modules.add_module("devif_idc", ["core=1"])
69 hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
70 src_ip = self.get_decimal_ip(hostname)
72 if 'ziger2' in machine.name:
73 dst_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
75 dst_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
77 modules.add_module(self.get_module_name(), ["core=2", self.OP, src_ip, dst_ip, self.CARD])
80 def get_finish_string(self):
84 def thread_func (self, dummy, dummy2):
85 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
87 s.sendto("Data Data Data", (self.ip, 7))
90 self.thread = thread.start_new_thread(self.thread_func, (self, 0))
92 def process_line(self, line):
93 m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
99 def process_data(self, testdir, rawiter):
101 if "SUCCESS" in line:
102 return PassFailResult(True)
104 return PassFailResult(False)
108 class DevifNetTxSF(DevifTests):
109 ''' Devif Net TX Test'''
110 name = "devif_nettx_sf"
115 class DevifNetTxE10k(DevifTests):
116 ''' Devif Net TX Test'''
117 name = "devif_nettx_e10k"
122 class DevifNetRxSF(DevifTests):
123 ''' Devif Net RX Test'''
124 name = "devif_netrx_sf"
129 class DevifNetRxE10k(DevifTests):
130 ''' Devif Net RX Test'''
131 name = "devif_netrx_e10k"
136 class DevifIdcTest(DevifTests):
137 ''' Devif IDC Test'''
138 name = "devif_idc_test"
143 class DevifDebug(DevifTests):
144 ''' Devif Debug Backend Test'''
147 def get_modules(self, build, machine):
148 self.machine = machine.name
149 modules = super(DevifTests, self).get_modules(build, machine)
150 modules.add_module("devif_idc", ["core=1"])
151 modules.add_module("devif_debug_test")
156 class DevifUDP(DevifTests):
157 ''' Devif UDP Backend Test'''
159 data = ("Data Data Data Data")
161 def get_module_name(self):
164 def get_modules(self, build, machine):
165 self.machine = machine.name
166 modules = super(DevifTests, self).get_modules(build, machine)
167 modules.add_module("net_sockets_server", ["auto"])
168 hostname = '%s.in.barrelfish.org' % subprocess.check_output('hostname -s', shell=True).rstrip()
169 dst_ip = self.get_decimal_ip(hostname)
170 dst_mac = self.get_local_mac('eno2')
172 if 'ziger2' in machine.name:
173 src_ip = self.get_decimal_ip('%s-sf.in.barrelfish.org' % machine.name)
174 modules.add_module("sfn5122f", ["auto", "function=0"])
175 self.cardname = "sfn5122f"
177 modules.add_module("e10k", ["auto", "function=0"])
178 src_ip = self.get_decimal_ip('%s-e10k.in.barrelfish.org' % machine.name)
179 self.cardname = "e10k"
181 src_mac = mac[machine.name]
183 modules.add_module(self.get_module_name(), ["core=2", dst_ip, dst_mac, 20000, 20000, self.cardname])
186 def thread_func (self, dummy, dummy2):
187 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
189 s.sendto(self.data, (self.ip, 20000))
191 def start_loop(self):
192 self.thread = thread.start_new_thread(self.thread_func, (self, 0))
194 def process_line(self, line):
195 m = re.match(r'# IP Addr (\d+\.\d+\.\d+\.\d+)', line)
199 m1 = re.match(r'Testing receiving UDP packets', line)
203 def process_data(self, testdir, rawiter):
205 if "SUCCESS" in line:
206 return PassFailResult(True)
208 return PassFailResult(False)
211 #class DevifUPDecho(DevifUDP):
212 # ''' Devif Debug Backend Test'''
213 # name = "devif_udp_echo"
215 # def get_module_name(self):
216 # return "devif_echo"