blob: 6e042077d6975a7ea65d780013f79ebb45e723b5 [file] [log] [blame]
ChetanGaonker3441faf2016-10-27 12:15:21 -07001#
2# Copyright 2016-present Ciena Corporation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16import unittest
17from threading import Timer
18from nose.tools import *
19from nose.twistedtools import reactor, deferred
20from twisted.internet import defer
21from scapy.all import *
22import time, monotonic
23import os, sys
24import tempfile
25import random
26import threading
27from IGMP import *
28from McastTraffic import *
29from Stats import Stats
30from OnosCtrl import OnosCtrl
31from OltConfig import OltConfig
32from Channels import IgmpChannel
33from EapTLS import TLSAuthTest
34from scapy_ssl_tls.ssl_tls import *
35from scapy_ssl_tls.ssl_tls_crypto import *
36log.setLevel('INFO')
37from EapolAAA import *
38from enum import *
39import noseTlsAuthHolder as tlsAuthHolder
40from tls_cert import Key
41from socket import *
42from CordTestServer import cord_test_radius_restart
43import struct
44import scapy
45from CordTestBase import CordTester
46from CordContainer import *
A R Karthick9313b762016-11-07 13:14:35 -080047from CordLogger import CordLogger
ChetanGaonker3441faf2016-10-27 12:15:21 -070048import re
49from random import randint
50from time import sleep
51
52import json
53from OnosFlowCtrl import OnosFlowCtrl
54from OltConfig import OltConfig
55from threading import current_thread
56import collections
57
58class IGMPTestState:
59
60 def __init__(self, groups = [], df = None, state = 0):
61 self.df = df
62 self.state = state
63 self.counter = 0
64 self.groups = groups
65 self.group_map = {} ##create a send/recv count map
66 for g in groups:
67 self.group_map[g] = (Stats(), Stats())
68
69 def update(self, group, tx = 0, rx = 0, t = 0):
70 self.counter += 1
71 index = 0 if rx == 0 else 1
72 v = tx if rx == 0 else rx
73 if self.group_map.has_key(group):
74 self.group_map[group][index].update(packets = v, t = t)
75
76 def update_state(self):
77 self.state = self.state ^ 1
78
A R Karthick9313b762016-11-07 13:14:35 -080079class netCondition_exchange(CordLogger):
ChetanGaonker3441faf2016-10-27 12:15:21 -070080
81 V_INF1 = 'veth0'
82 V_INF2 = 'veth1'
83 MGROUP1 = '239.1.2.3'
84 MGROUP2 = '239.2.2.3'
85 MINVALIDGROUP1 = '255.255.255.255'
86 MINVALIDGROUP2 = '239.255.255.255'
87 MMACGROUP1 = "01:00:5e:01:02:03"
88 MMACGROUP2 = "01:00:5e:02:02:03"
89 IGMP_DST_MAC = "01:00:5e:00:00:16"
90 IGMP_SRC_MAC = "5a:e1:ac:ec:4d:a1"
91 IP_SRC = '1.2.3.4'
92 IP_DST = '224.0.0.22'
93 NEGATIVE_TRAFFIC_STATUS = 1
94 igmp_eth = Ether(dst = IGMP_DST_MAC, type = ETH_P_IP)
95 igmp_ip = IP(dst = IP_DST)
96 IGMP_TEST_TIMEOUT = 5
97 IGMP_QUERY_TIMEOUT = 60
98 MCAST_TRAFFIC_TIMEOUT = 10
99 TEST_TIMEOUT_DELAY = 340
100 PORT_TX_DEFAULT = 2
101 PORT_RX_DEFAULT = 1
102 max_packets = 100
103 app_igmp = 'org.opencord.igmp'
104 olt_conf_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../setup/olt_config.json')
105 ROVER_TEST_TIMEOUT = 10 #3600*86
106 ROVER_TIMEOUT = (ROVER_TEST_TIMEOUT - 100)
107 ROVER_JOIN_TIMEOUT = 60
108
109 app_tls = 'org.opencord.aaa'
110 TLS_TIMEOUT = 20
111 CLIENT_CERT_INVALID = '''-----BEGIN CERTIFICATE-----
112MIIEyTCCA7GgAwIBAgIJAM6l2jUG56pLMA0GCSqGSIb3DQEBCwUAMIGLMQswCQYD
113VQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVNvbWV3aGVyZTETMBEGA1UE
114ChMKQ2llbmEgSW5jLjEeMBwGCSqGSIb3DQEJARYPYWRtaW5AY2llbmEuY29tMSYw
115JAYDVQQDEx1FeGFtcGxlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xNjAzMTEx
116ODUzMzVaFw0xNzAzMDYxODUzMzVaMIGLMQswCQYDVQQGEwJVUzELMAkGA1UECBMC
117Q0ExEjAQBgNVBAcTCVNvbWV3aGVyZTETMBEGA1UEChMKQ2llbmEgSW5jLjEeMBwG
118CSqGSIb3DQEJARYPYWRtaW5AY2llbmEuY29tMSYwJAYDVQQDEx1FeGFtcGxlIENl
119cnRpZmljYXRlIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
120ggEBAL9Jv54TkqycL3U2Fdd/y5NXdnPVXwAVV3m6I3eIffVCv8eS+mwlbl9dnbjo
121qqlGEgA3sEg5HtnKoW81l3PSyV/YaqzUzbcpDlgWlbNkFQ3nVxh61gSU34Fc4h/W
122plSvCkwGSbV5udLtEe6S9IflP2Fu/eXa9vmUtoPqDk66p9U/nWVf2H1GJy7XanWg
123wke+HpQvbzoSfPJS0e5Rm9KErrzaIkJpqt7soW+OjVJitUax7h45RYY1HHHlbMQ0
124ndWW8UDsCxFQO6d7nsijCzY69Y8HarH4mbVtqhg3KJevxD9UMRy6gdtPMDZLah1c
125LHRu14ucOK4aF8oICOgtcD06auUCAwEAAaOCASwwggEoMB0GA1UdDgQWBBQwEs0m
126c8HARTVp21wtiwgav5biqjCBwAYDVR0jBIG4MIG1gBQwEs0mc8HARTVp21wtiwga
127v5biqqGBkaSBjjCBizELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRIwEAYDVQQH
128EwlTb21ld2hlcmUxEzARBgNVBAoTCkNpZW5hIEluYy4xHjAcBgkqhkiG9w0BCQEW
129D2FkbWluQGNpZW5hLmNvbTEmMCQGA1UEAxMdRXhhbXBsZSBDZXJ0aWZpY2F0ZSBB
130dXRob3JpdHmCCQDOpdo1BueqSzAMBgNVHRMEBTADAQH/MDYGA1UdHwQvMC0wK6Ap
131oCeGJWh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZXhhbXBsZV9jYS5jcmwwDQYJKoZI
132hvcNAQELBQADggEBAK+fyAFO8CbH35P5mOX+5wf7+AeC+5pwaFcoCV0zlfwniANp
133jISgcIX9rcetLxeYRAO5com3+qLdd9dGVNL0kwufH4QhlSPErG7OLHHAs4JWVhUo
134bH3lK9lgFVlnCDBtQhslzqScR64SCicWcQEjv3ZMZsJwYLvl8unSaKz4+LVPeJ2L
135opCpmZw/V/S2NhBbe3QjTiRPmDev2gbaO4GCfi/6sCDU7UO3o8KryrkeeMIiFIej
136gfwn9fovmpeqCEyupy2JNNUTJibEuFknwx7JAX+htPL27nEgwV1FYtwI3qLiZqkM
137729wo9cFSslJNZBu+GsBP5LszQSuvNTDWytV+qY=
138-----END CERTIFICATE-----'''
139
140 def onos_aaa_config(self):
141 aaa_dict = {'apps' : { 'org.onosproject.aaa' : { 'AAA' : { 'radiusSecret': 'radius_password',
142 'radiusIp': '172.17.0.2' } } } }
143 radius_ip = os.getenv('ONOS_AAA_IP') or '172.17.0.2'
144 aaa_dict['apps']['org.onosproject.aaa']['AAA']['radiusIp'] = radius_ip
145 self.onos_ctrl.activate()
146 time.sleep(2)
147 self.onos_load_tls_config(aaa_dict)
148
149 def onos_load_tls_config(self, config):
150 status, code = OnosCtrl.config(config)
151 if status is False:
152 log.info('Configure request for AAA returned status %d' %code)
153 assert_equal(status, True)
154 time.sleep(3)
155
156 @classmethod
157 def setUpClass(cls):
158 cls.olt = OltConfig(olt_conf_file = cls.olt_conf_file)
159 cls.port_map, _ = cls.olt.olt_port_map()
160 OnosCtrl.cord_olt_config(cls.olt.olt_device_data())
161 cls.device_id = OnosCtrl.get_device_id()
162
163 @classmethod
164 def tearDownClass(cls): pass
165
166 def setUp_igmp(self):
167 ''' Activate the igmp app'''
168 apps = self.app_igmp
169 self.onos_ctrl = OnosCtrl(apps)
170# self.onos_ctrl = OnosCtrl(self.app_tls)
171 self.onos_aaa_config()
172 self.onos_ctrl.activate()
173 self.igmp_channel = IgmpChannel()
174
175 def setUp_tls(self):
176 ''' Activate the igmp app'''
177 apps = self.app_tls
178 self.onos_ctrl = OnosCtrl(apps)
179 self.onos_aaa_config()
180
181 def tearDown(self):
182 '''Deactivate the dhcp app'''
183 apps = [self.app_igmp, self.app_tls]
184 for app in apps:
185 onos_ctrl = OnosCtrl(app)
186 onos_ctrl.deactivate()
187# log.info('Restarting the Radius container in the setup after running every subscriber test cases by default')
188# rest = Container('cord-radius', 'cord-test/radius',)
189# rest.restart('cord-radius','10')
190# radius = Radius()
191# radius_ip = radius.ip()
192# print('Radius server is running with IP %s' %radius_ip)
193 #os.system('ifconfig '+INTF_RX_DEFAULT+' up')
194
195 def onos_load_igmp_config(self, config):
196 log.info('onos load config is %s'%config)
197 status, code = OnosCtrl.config(config)
198 if status is False:
199 log.info('JSON request returned status %d' %code)
200 assert_equal(status, True)
201 time.sleep(2)
202
203 def onos_ssm_table_load(self, groups, src_list = ['1.2.3.4'],flag = False):
204 ssm_dict = {'apps' : { 'org.onosproject.igmp' : { 'ssmTranslate' : [] } } }
205 ssm_xlate_list = ssm_dict['apps']['org.onosproject.igmp']['ssmTranslate']
206 if flag: #to maintain seperate group-source pair.
207 for i in range(len(groups)):
208 d = {}
209 d['source'] = src_list[i] or '0.0.0.0'
210 d['group'] = groups[i]
211 ssm_xlate_list.append(d)
212 else:
213 for g in groups:
214 for s in src_list:
215 d = {}
216 d['source'] = s or '0.0.0.0'
217 d['group'] = g
218 ssm_xlate_list.append(d)
219 self.onos_load_igmp_config(ssm_dict)
220 cord_port_map = {}
221 for g in groups:
222 cord_port_map[g] = (self.PORT_TX_DEFAULT, self.PORT_RX_DEFAULT)
223 self.igmp_channel.cord_port_table_load(cord_port_map)
224 time.sleep(2)
225
226 def mcast_ip_range(self,start_ip = '224.0.1.0', end_ip = '224.0.1.100'):
227 start = list(map(int, start_ip.split(".")))
228 end = list(map(int, end_ip.split(".")))
229 temp = start
230 ip_range = []
231 ip_range.append(start_ip)
232 while temp != end:
233 start[3] += 1
234 for i in (3, 2, 1):
235 if temp[i] == 255:
236 temp[i] = 0
237 temp[i-1] += 1
238 ip_range.append(".".join(map(str, temp)))
239 return ip_range
240
241 def random_mcast_ip(self,start_ip = '224.0.1.0', end_ip = '224.0.1.100'):
242 start = list(map(int, start_ip.split(".")))
243 end = list(map(int, end_ip.split(".")))
244 temp = start
245 ip_range = []
246 ip_range.append(start_ip)
247 while temp != end:
248 start[3] += 1
249 for i in (3, 2, 1):
250 if temp[i] == 255:
251 temp[i] = 0
252 temp[i-1] += 1
253 ip_range.append(".".join(map(str, temp)))
254 return random.choice(ip_range)
255
256 def source_ip_range(self,start_ip = '10.10.0.1', end_ip = '10.10.0.100'):
257 start = list(map(int, start_ip.split(".")))
258 end = list(map(int, end_ip.split(".")))
259 temp = start
260 ip_range = []
261 ip_range.append(start_ip)
262 while temp != end:
263 start[3] += 1
264 for i in (3, 2, 1):
265 if temp[i] == 255:
266 temp[i] = 0
267 temp[i-1] += 1
268 ip_range.append(".".join(map(str, temp)))
269 return ip_range
270
271 def randomsourceip(self,start_ip = '10.10.0.1', end_ip = '10.10.0.100'):
272 start = list(map(int, start_ip.split(".")))
273 end = list(map(int, end_ip.split(".")))
274 temp = start
275 ip_range = []
276 ip_range.append(start_ip)
277 while temp != end:
278 start[3] += 1
279 for i in (3, 2, 1):
280 if temp[i] == 255:
281 temp[i] = 0
282 temp[i-1] += 1
283 ip_range.append(".".join(map(str, temp)))
284 return random.choice(ip_range)
285
286 def get_igmp_intf(self):
287 inst = os.getenv('TEST_INSTANCE', None)
288 if not inst:
289 return 'veth0'
290 inst = int(inst) + 1
291 if inst >= self.port_map['uplink']:
292 inst += 1
293 if self.port_map.has_key(inst):
294 return self.port_map[inst]
295 return 'veth0'
296
297 def igmp_verify_join(self, igmpStateList):
298 sendState, recvState = igmpStateList
299 ## check if the send is received for the groups
300 for g in sendState.groups:
301 tx_stats = sendState.group_map[g][0]
302 tx = tx_stats.count
303 assert_greater(tx, 0)
304 rx_stats = recvState.group_map[g][1]
305 rx = rx_stats.count
306 assert_greater(rx, 0)
307 log.info('Receive stats %s for group %s' %(rx_stats, g))
308
309 log.info('IGMP test verification success')
310
311 def igmp_verify_leave(self, igmpStateList, leave_groups):
312 sendState, recvState = igmpStateList[0], igmpStateList[1]
313 ## check if the send is received for the groups
314 for g in sendState.groups:
315 tx_stats = sendState.group_map[g][0]
316 rx_stats = recvState.group_map[g][1]
317 tx = tx_stats.count
318 rx = rx_stats.count
319 assert_greater(tx, 0)
320 if g not in leave_groups:
321 log.info('Received %d packets for group %s' %(rx, g))
322 for g in leave_groups:
323 rx = recvState.group_map[g][1].count
324 assert_equal(rx, 0)
325
326 log.info('IGMP test verification success')
327
328 def mcast_traffic_timer(self):
329 self.mcastTraffic.stopReceives()
330
331 def send_mcast_cb(self, send_state):
332 for g in send_state.groups:
333 send_state.update(g, tx = 1)
334 return 0
335
336 ##Runs in the context of twisted reactor thread
337 def igmp_recv(self, igmpState, iface = 'veth0'):
338 p = self.recv_socket.recv()
339 try:
340 send_time = float(p.payload.load)
341 recv_time = monotonic.monotonic()
342 except:
343 log.info('Unexpected Payload received: %s' %p.payload.load)
344 return 0
345 #log.info( 'Recv in %.6f secs' %(recv_time - send_time))
346 igmpState.update(p.dst, rx = 1, t = recv_time - send_time)
347 return 0
348
349 def send_igmp_join(self, groups, src_list = ['1.2.3.4'], record_type=IGMP_V3_GR_TYPE_INCLUDE,
350 ip_pkt = None, iface = 'veth0', ssm_load = False, delay = 1):
351 if ssm_load is True:
352 self.onos_ssm_table_load(groups, src_list)
353 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
354 gaddr=self.IP_DST)
355 for g in groups:
356 gr = IGMPv3gr(rtype= record_type, mcaddr=g)
357 gr.sources = src_list
358 igmp.grps.append(gr)
359 if ip_pkt is None:
360 ip_pkt = self.igmp_eth/self.igmp_ip
361 pkt = ip_pkt/igmp
362 IGMPv3.fixup(pkt)
363 sendp(pkt, iface=iface)
364 if delay != 0:
365 time.sleep(delay)
366
367 def send_igmp_join_recvQuery(self, groups, rec_queryCount = None, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
368 self.onos_ssm_table_load(groups, src_list)
369 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
370 gaddr=self.IP_DST)
371 for g in groups:
372 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_INCLUDE, mcaddr=g)
373 gr.sources = src_list
374 gr.sources = src_list
375 igmp.grps.append(gr)
376 if ip_pkt is None:
377 ip_pkt = self.igmp_eth/self.igmp_ip
378 pkt = ip_pkt/igmp
379 IGMPv3.fixup(pkt)
380 if rec_queryCount == None:
381 log.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
382 resp = srp1(pkt, iface=iface)
383 else:
384 log.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
385 resp = srp1(pkt, iface=iface)
386# resp = srp1(pkt, iface=iface) if rec_queryCount else srp3(pkt, iface=iface)
387 resp[0].summary()
388 log.info('Sent IGMP join for group %s and received a query packet and printing packet' %groups)
389 if delay != 0:
390 time.sleep(delay)
391
392 def send_igmp_leave(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
393 log.info('entering into igmp leave function')
394 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
395 gaddr=self.IP_DST)
396 for g in groups:
397 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr=g)
398 gr.sources = src_list
399 igmp.grps.append(gr)
400 if ip_pkt is None:
401 ip_pkt = self.igmp_eth/self.igmp_ip
402 pkt = ip_pkt/igmp
403 IGMPv3.fixup(pkt)
404 sendp(pkt, iface = iface)
405 if delay != 0:
406 time.sleep(delay)
407
408 def send_igmp_leave_listening_group_specific_query(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
409 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
410 gaddr=self.IP_DST)
411 for g in groups:
412 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr=g)
413 gr.sources = src_list
414 igmp.grps.append(gr)
415 if ip_pkt is None:
416 ip_pkt = self.igmp_eth/self.igmp_ip
417 pkt = ip_pkt/igmp
418 IGMPv3.fixup(pkt)
419 log.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
420 resp = srp1(pkt, iface=iface)
421 resp[0].summary()
422 log.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
423 if delay != 0:
424 time.sleep(delay)
425
426 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+390)
427 def test_netCondition_with_delay_between_igmp_join_and_data_recv(self):
428 self.setUp_igmp()
429 randomDelay = randint(10,300)
430 groups = ['224.0.1.1', '225.0.0.1']
431 self.onos_ssm_table_load(groups)
432 df = defer.Deferred()
433 igmpState = IGMPTestState(groups = groups, df = df)
434 igmpStateRecv = IGMPTestState(groups = groups, df = df)
435 igmpStateList = (igmpState, igmpStateRecv)
436 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb, arg = igmpState)
437 self.df = df
438 self.mcastTraffic = mcastTraffic
439 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
440
441 def mcast_traffic_delay_start():
442 mcastTraffic.start()
443
444 def igmp_srp_task(stateList):
445 igmpSendState, igmpRecvState = stateList
446 if not mcastTraffic.isRecvStopped():
447 result = self.igmp_recv(igmpRecvState)
448 reactor.callLater(0, igmp_srp_task, stateList)
449 else:
450 self.mcastTraffic.stop()
451 self.recv_socket.close()
452 self.igmp_verify_join(stateList)
453 self.df.callback(0)
454
455 self.send_igmp_join(groups)
456 log.info('Holding multicast data for a period of random delay = {} secs'.format(randomDelay))
457 t = Timer(randomDelay, mcast_traffic_delay_start)
458 t.start()
459
460 self.test_timer = reactor.callLater(randomDelay+30, self.mcast_traffic_timer)
461 reactor.callLater(randomDelay+10, igmp_srp_task, igmpStateList)
462 return df
463
464 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+390)
465 def test_netCondition_with_delay_between_data_recv_and_igmp_join(self):
466 self.setUp_igmp()
467 randomDelay = randint(10,300)
468 groups = ['224.0.1.1', '225.0.0.1']
469 self.onos_ssm_table_load(groups)
470 df = defer.Deferred()
471 igmpState = IGMPTestState(groups = groups, df = df)
472 igmpStateRecv = IGMPTestState(groups = groups, df = df)
473 igmpStateList = (igmpState, igmpStateRecv)
474 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb, arg = igmpState)
475 self.df = df
476 self.mcastTraffic = mcastTraffic
477 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
478
479 def mcast_join_delay_start():
480 log.info('Holding channel join for a period of random delay = {} secs'.format(randomDelay))
481 self.send_igmp_join(groups)
482
483 def igmp_srp_task(stateList):
484 igmpSendState, igmpRecvState = stateList
485 if not mcastTraffic.isRecvStopped():
486 result = self.igmp_recv(igmpRecvState)
487 reactor.callLater(0, igmp_srp_task, stateList)
488 else:
489 self.mcastTraffic.stop()
490 self.recv_socket.close()
491 self.igmp_verify_join(stateList)
492 self.df.callback(0)
493
494 mcastTraffic.start()
495 t = Timer(randomDelay, mcast_join_delay_start)
496 t.start()
497
498 self.test_timer = reactor.callLater(randomDelay+30, self.mcast_traffic_timer)
499 reactor.callLater(randomDelay+10, igmp_srp_task, igmpStateList)
500 return df
501
502
503 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+340)
504 def test_netCondition_with_delay_between_igmp_leave_and_data(self):
505 self.setUp_igmp()
506 randomDelay = randint(10,300)
507 groups = ['224.0.1.10', '225.0.0.10']
508 leave_groups = ['224.0.1.10']
509 self.onos_ssm_table_load(groups)
510 df = defer.Deferred()
511 igmpState = IGMPTestState(groups = groups, df = df)
512 igmpStateRecv = IGMPTestState(groups = groups, df = df)
513 igmpStateList = (igmpState, igmpStateRecv)
514 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
515 arg = igmpState)
516 self.df = df
517 self.mcastTraffic = mcastTraffic
518 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
519
520 def mcast_leave_delay_start():
521 self.send_igmp_leave(leave_groups, delay = 3)
522 join_state = IGMPTestState(groups = leave_groups)
523 status = self.igmp_not_recv_task(self.V_INF1,leave_groups, join_state)
524 log.info('Verified status for igmp recv task %s'%status)
525 assert status == 1 , 'EXPECTED RESULT'
526 self.df.callback(0)
527
528 mcastTraffic.start()
529 self.send_igmp_join(groups)
530 log.info('Holding multicast leave packet for a period of random delay = {} secs'.format(randomDelay))
531 t = Timer(randomDelay+10, mcast_leave_delay_start)
532 t.start()
533 return df
534
535 def igmp_not_recv_task(self, intf, groups, join_state):
536 log.info('entering igmp not recv task loop')
537 recv_socket = L2Socket(iface = intf, type = ETH_P_IP)
538 group_map = {}
539 for g in groups:
540 group_map[g] = [0,0]
541
542 log.info('Verifying join interface should not receive any multicast data')
543 self.NEGATIVE_TRAFFIC_STATUS = 1
544 def igmp_recv_cb(pkt):
545 log.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
546 self.NEGATIVE_TRAFFIC_STATUS = 2
547 sniff(prn = igmp_recv_cb, count = 1, lfilter = lambda p: IP in p and p[IP].dst in groups,
548 timeout = 3, opened_socket = recv_socket)
549 recv_socket.close()
550 return self.NEGATIVE_TRAFFIC_STATUS
551
552 ## Its sample test case based on this test case we had added all below scenarios.
553 @deferred(TEST_TIMEOUT_DELAY+50)
554 def test_netCondition_in_eap_tls_with_delay_between_positive_IdReq_and_tlsHelloReq(self):
555 self.setUp_tls()
556 randomDelay = randint(10,300)
557 df = defer.Deferred()
558 tls = TLSAuthTest()
559 def eap_tls_eapTlsHelloReq_pkt_delay():
560 tls._eapTlsHelloReq()
561 tls._eapTlsCertReq()
562 tls._eapTlsChangeCipherSpec()
563 tls._eapTlsFinished()
564 df.callback(0)
565 def eap_tls_verify(df):
566 tls._eapSetup()
567 tls.tlsEventTable.EVT_EAP_SETUP
568 tls._eapStart()
569 tls.tlsEventTable.EVT_EAP_START
570 tls._eapIdReq()
571 tls.tlsEventTable.EVT_EAP_ID_REQ
572 log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
573 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
574 t.start()
575 reactor.callLater(0, eap_tls_verify, df)
576 return df
577
578 @deferred(TEST_TIMEOUT_DELAY+50)
579 def test_netCondition_in_eap_tls_with_delay_between_IdReq_and_tlsHelloReq(self):
580 self.setUp_tls()
581 randomDelay = randint(10,300)
582 df = defer.Deferred()
583 tls = TLSAuthTest()
584 def eap_tls_eapTlsHelloReq_pkt_delay():
585 log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
586 tls._eapTlsHelloReq()
587 tls._eapTlsCertReq()
588 tls._eapTlsChangeCipherSpec()
589 tls._eapTlsFinished()
590 df.callback(0)
591 def eap_tls_verify(df):
592 tls._eapSetup()
593 tls.tlsEventTable.EVT_EAP_SETUP
594 tls._eapStart()
595 tls.tlsEventTable.EVT_EAP_START
596 tls._eapIdReq()
597 tls.tlsEventTable.EVT_EAP_ID_REQ
598 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
599 t.start()
600 reactor.callLater(0, eap_tls_verify, df)
601 return df
602
603 @deferred(TEST_TIMEOUT_DELAY+100)
604 def test_netCondition_in_eap_tls_with_delay_between_tlsHelloReq_and_eapTlsCertReq(self):
605 self.setUp_tls()
606 randomDelay = randint(10,300)
607 df = defer.Deferred()
608 tls = TLSAuthTest()
609 def eap_tls_eapTlsCertReq_pkt_delay():
610 log.info('Holding eapTlsCertReq packet for a period of random delay = {} secs'.format(randomDelay))
611 tls._eapTlsCertReq_delay()
612 tls._eapTlsChangeCipherSpec()
613 tls._eapTlsFinished()
614 df.callback(0)
615 def eap_tls_verify(df):
616 tls._eapSetup()
617 tls.tlsEventTable.EVT_EAP_SETUP
618 tls._eapStart()
619 tls.tlsEventTable.EVT_EAP_START
620 tls._eapIdReq()
621 tls.tlsEventTable.EVT_EAP_ID_REQ
622 tls._eapTlsHelloReq()
623 while tls.server_hello_done_received == False:
624 r = tls.eapol_scapy_recv(cb = tls.eapol_server_hello_cb,
625 lfilter =
626 lambda pkt: EAP in pkt and pkt[EAP].type == EAP_TYPE_TLS and \
627 pkt[EAP].code == EAP.REQUEST)
628 if len(r) == 0:
629 tls.tlsFail()
630 t = Timer(randomDelay, eap_tls_eapTlsCertReq_pkt_delay)
631 t.start()
632 reactor.callLater(0, eap_tls_verify, df)
633 return df
634
635 @deferred(TEST_TIMEOUT_DELAY+50)
636 def test_netCondition_in_eap_tls_with_delay_between_TlsCertReq_and_TlsChangeCipherSpec(self):
637 self.setUp_tls()
638 randomDelay = randint(10,300)
639 df = defer.Deferred()
640 tls = TLSAuthTest()
641 def eap_tls_TlsChangeCipherSpec_pkt_delay():
642 log.info('Holding TlsChangeCipherSpec packet for a period of random delay = {} secs'.format(randomDelay))
643 tls._eapTlsChangeCipherSpec()
644 tls._eapTlsFinished()
645 df.callback(0)
646 def eap_tls_verify(df):
647 tls._eapSetup()
648 tls.tlsEventTable.EVT_EAP_SETUP
649 tls._eapStart()
650 tls.tlsEventTable.EVT_EAP_START
651 tls._eapIdReq()
652 tls.tlsEventTable.EVT_EAP_ID_REQ
653 tls._eapTlsHelloReq()
654 tls._eapTlsCertReq()
655 t = Timer(randomDelay, eap_tls_TlsChangeCipherSpec_pkt_delay)
656 t.start()
657 reactor.callLater(0, eap_tls_verify, df)
658 return df
659
660 @deferred(TEST_TIMEOUT_DELAY+50)
661 def test_netCondition_in_eap_tls_with_no_cert_delay_between_IdReq_and_HelloReq(self):
662 self.setUp_tls()
663 randomDelay = randint(10,300)
664 df = defer.Deferred()
665 def tls_no_cert_cb():
666 log.info('TLS authentication failed with no certificate')
667 tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
668 def eap_tls_eapTlsHelloReq_pkt_delay():
669 log.info('Holding HelloReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
670 tls._eapTlsHelloReq()
671 tls._eapTlsCertReq()
672 assert_equal(tls.failTest, True)
673 tls._eapTlsChangeCipherSpec()
674 tls._eapTlsFinished()
675 df.callback(0)
676 def eap_tls_no_cert(df):
677 tls._eapSetup()
678 tls.tlsEventTable.EVT_EAP_SETUP
679 tls._eapStart()
680 tls.tlsEventTable.EVT_EAP_START
681 tls._eapIdReq()
682 tls.tlsEventTable.EVT_EAP_ID_REQ
683 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
684 t.start()
685 reactor.callLater(0, eap_tls_no_cert, df)
686 return df
687
688 @deferred(TEST_TIMEOUT_DELAY+100)
689 def test_netCondition_in_eap_tls_with_delay_and_no_cert_between_tlsHelloReq_and_eapTlsCertReq(self):
690 self.setUp_tls()
691 randomDelay = randint(10,300)
692 df = defer.Deferred()
693 def tls_no_cert_cb():
694 log.info('TLS authentication failed with no certificate')
695 tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
696 def eap_tls_eapTlsHelloReq_pkt_delay():
697 log.info('Holding eapTlsCertReq packet with no cert for a period of random delay = {} secs'.format(randomDelay))
698 tls._eapTlsCertReq_delay()
699 assert_equal(tls.failTest, True)
700 tls._eapTlsChangeCipherSpec()
701 assert_equal(tls.failTest, True)
702 tls._eapTlsFinished()
703 df.callback(0)
704 def eap_tls_no_cert(df):
705 tls._eapSetup()
706 tls.tlsEventTable.EVT_EAP_SETUP
707 tls._eapStart()
708 tls.tlsEventTable.EVT_EAP_START
709 tls._eapIdReq()
710 tls.tlsEventTable.EVT_EAP_ID_REQ
711 tls._eapTlsHelloReq()
712 while tls.server_hello_done_received == False:
713 r = tls.eapol_scapy_recv(cb = tls.eapol_server_hello_cb,
714 lfilter =
715 lambda pkt: EAP in pkt and pkt[EAP].type == EAP_TYPE_TLS and \
716 pkt[EAP].code == EAP.REQUEST)
717 if len(r) == 0:
718 tls.tlsFail()
719 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
720 t.start()
721 reactor.callLater(0, eap_tls_no_cert, df)
722 return df
723
724
725 @deferred(TEST_TIMEOUT_DELAY+50)
726 def test_netCondition_in_eap_tls_with_delay_and_no_cert_between_TlsCertReq_and_TlsChangeCipherSpec(self):
727 self.setUp_tls()
728 randomDelay = randint(10,300)
729 df = defer.Deferred()
730 def tls_no_cert_cb():
731 log.info('TLS authentication failed with no certificate')
732 tls = TLSAuthTest(fail_cb = tls_no_cert_cb, client_cert = '')
733 def eap_tls_TlsChangeCipherSpec_pkt_delay():
734 tls._eapTlsChangeCipherSpec()
735 assert_equal(tls.failTest, True)
736 tls._eapTlsFinished()
737 df.callback(0)
738 def eap_tls_no_cert(df):
739 tls._eapSetup()
740 tls.tlsEventTable.EVT_EAP_SETUP
741 tls._eapStart()
742 tls._eapIdReq()
743 tls.tlsEventTable.EVT_EAP_ID_REQ
744 tls._eapTlsHelloReq()
745 tls._eapTlsCertReq()
746 log.info('Holding TlsChangeCipherSpec packet with no cert for a period of random delay = {} secs'.format(randomDelay))
747 t = Timer(randomDelay, eap_tls_TlsChangeCipherSpec_pkt_delay)
748 t.start()
749 reactor.callLater(0, eap_tls_no_cert, df)
750 return df
751
752 @deferred(TEST_TIMEOUT_DELAY+50)
753 def test_netCondition_in_eap_tls_with_invalid_cert_and_delay_between_IdReq_and_HelloReq(self):
754 self.setUp_tls()
755 randomDelay = randint(10,300)
756 df = defer.Deferred()
757 def tls_invalid_cert_cb():
758 log.info('TLS authentication failed with invalid certificate')
759 tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
760 def eap_tls_eapTlsHelloReq_pkt_delay():
761 tls._eapTlsHelloReq()
762 tls._eapTlsCertReq()
763 assert_equal(tls.failTest, True)
764 tls._eapTlsChangeCipherSpec()
765 tls._eapTlsFinished()
766 df.callback(0)
767 def eap_tls_invalid_cert(df):
768 tls._eapSetup()
769 tls.tlsEventTable.EVT_EAP_SETUP
770 tls._eapStart()
771 tls.tlsEventTable.EVT_EAP_START
772 tls._eapIdReq()
773 tls.tlsEventTable.EVT_EAP_ID_REQ
774 log.info('Holding HelloReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
775 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
776 t.start()
777 reactor.callLater(0, eap_tls_invalid_cert, df)
778 return df
779
780 @deferred(TEST_TIMEOUT_DELAY+100)
781 def test_netCondition_in_eap_tls_with_invalid_cert_and_delay_between_tlsHelloReq_and_eapTlsCertReq(self):
782 self.setUp_tls()
783 randomDelay = randint(10,300)
784 df = defer.Deferred()
785 def tls_invalid_cert_cb():
786 log.info('TLS authentication failed with invalid certificate')
787 tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
788 def eap_tls_eapTlsHelloReq_pkt_delay():
789 log.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} sec, delay ended'.format(randomDelay))
790 tls._eapTlsCertReq_delay()
791 tls._eapTlsChangeCipherSpec()
792 assert_equal(tls.failTest, True)
793 tls._eapTlsFinished()
794 df.callback(0)
795 def eap_tls_invalid_cert(df):
796 tls._eapSetup()
797 tls.tlsEventTable.EVT_EAP_SETUP
798 tls._eapStart()
799 tls.tlsEventTable.EVT_EAP_START
800 tls._eapIdReq()
801 tls.tlsEventTable.EVT_EAP_ID_REQ
802 tls._eapTlsHelloReq()
803 while tls.server_hello_done_received == False:
804 r = tls.eapol_scapy_recv(cb = tls.eapol_server_hello_cb,
805 lfilter =
806 lambda pkt: EAP in pkt and pkt[EAP].type == EAP_TYPE_TLS and \
807 pkt[EAP].code == EAP.REQUEST)
808 if len(r) == 0:
809 tls.tlsFail()
810
811 log.info('Holding eapTlsCertReq packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
812 t = Timer(randomDelay, eap_tls_eapTlsHelloReq_pkt_delay)
813 t.start()
814 reactor.callLater(0, eap_tls_invalid_cert, df)
815 return df
816
817
818 @deferred(TEST_TIMEOUT_DELAY+50)
819 def test_netCondition_in_eap_tls_with_invalid_cert_delay_between_TlsCertReq_and_TlsChangeCipherSpec(self):
820 self.setUp_tls()
821 randomDelay = randint(10,300)
822 df = defer.Deferred()
823 def tls_invalid_cert_cb():
824 log.info('TLS authentication failed with invalid certificate')
825 tls = TLSAuthTest(fail_cb = tls_invalid_cert_cb, client_cert = self.CLIENT_CERT_INVALID)
826 def eap_tls_TlsChangeCipherSpec_pkt_delay():
827 tls._eapTlsChangeCipherSpec()
828 assert_equal(tls.failTest, True)
829 tls._eapTlsFinished()
830 df.callback(0)
831 def eap_tls_invalid_cert(df):
832 tls._eapSetup()
833 tls.tlsEventTable.EVT_EAP_SETUP
834 tls._eapStart()
835 tls.tlsEventTable.EVT_EAP_START
836 tls._eapIdReq()
837 tls.tlsEventTable.EVT_EAP_ID_REQ
838 tls._eapTlsHelloReq()
839 tls._eapTlsCertReq()
840 log.info('Holding TlsChangeCipherSpec packet with invalid cert for a period of random delay = {} secs'.format(randomDelay))
841 t = Timer(randomDelay, eap_tls_TlsChangeCipherSpec_pkt_delay)
842 t.start()
843 reactor.callLater(0, eap_tls_invalid_cert, df)
844 return df
845
846 @deferred(TEST_TIMEOUT_DELAY+50)
847 def test_netCondition_in_multiple_eap_tls_requests_with_delay_between_IdReq_and_HelloReq(self):
848 self.setUp_tls()
849 df = defer.Deferred()
850 threads = []
851 clients = 10
852 def eap_tls_eapTlsHelloReq_pkt_delay(df):
853 def multiple_tls_random_delay():
854 randomDelay = randint(10,300)
855 tls = TLSAuthTest(src_mac = 'random')
856 tls._eapSetup()
857 tls.tlsEventTable.EVT_EAP_SETUP
858 tls._eapStart()
859 tls.tlsEventTable.EVT_EAP_START
860 tls._eapIdReq()
861 tls.tlsEventTable.EVT_EAP_ID_REQ
862 log.info('Holding tlsHelloReq packet for a period of random delay = {} secs'.format(randomDelay))
863 time.sleep(randomDelay)
864 tls._eapTlsHelloReq()
865 tls._eapTlsCertReq()
866 tls._eapTlsChangeCipherSpec()
867 tls._eapTlsFinished()
868 log.info('Authentication successfull for user %d'%i)
869 # Sending multiple tls clients and making random delay in between client and server packets.
870 for i in xrange(clients):
871 thread = threading.Thread(target = multiple_tls_random_delay)
872 time.sleep(randint(1,2))
873 thread.start()
874 threads.append(thread)
875 time.sleep(300)
876 for thread in threads:
877 thread.join()
878 #df.callback(0)
879 reactor.callLater(0, eap_tls_eapTlsHelloReq_pkt_delay, df)
880 return df
881
882 @deferred(TEST_TIMEOUT_DELAY+450)
883 def test_netCondition_multiple_authentications_tls_with_delay_between_every_auth_complete(self):
884 self.setUp_tls()
885 df = defer.Deferred()
886 threads = []
887 clients = 100
888 def eap_tls_eapTlsHelloReq_pkt_delay(df):
889 def multiple_tls_random_delay():
890 randomDelay = randint(10,300)
891 tls = TLSAuthTest(src_mac = 'random')
892 tls._eapSetup()
893 tls.tlsEventTable.EVT_EAP_SETUP
894 tls._eapStart()
895 tls.tlsEventTable.EVT_EAP_START
896 tls._eapIdReq()
897 tls.tlsEventTable.EVT_EAP_ID_REQ
898 tls._eapTlsHelloReq()
899 tls._eapTlsCertReq()
900 tls._eapTlsChangeCipherSpec()
901 tls._eapTlsFinished()
902 log.info('Authentication successfull for user %d'%i)
903 # Client authendicating multiple times one after other and making random delay in between authendication.
904 for i in xrange(clients):
905# thread = threading.Thread(target = multiple_tls_random_delay)
906 multiple_tls_random_delay()
907 time.sleep(randomDelay)
908 df.callback(0)
909 reactor.callLater(0, eap_tls_eapTlsHelloReq_pkt_delay, df)
910 return df
911
912 @deferred(TEST_TIMEOUT_DELAY+450)
913 def test_netCondition_multiple_authentications_tls_with_delay_between_every_100_tls_burst(self):
914 self.setUp_tls()
915 randomDelay = randint(10,300)
916 df = defer.Deferred()
917 threads = []
918 tls = []
919 clients = 10
920 def eap_tls_eapTlsHelloReq_pkt_delay(df):
921 def multiple_tls_random_delay():
922 #randomDelay = 3
923 for x in xrange(clients):
924 tls.append(TLSAuthTest(src_mac = 'random'))
925 for x in xrange(clients):
926 tls[x]._eapSetup()
927 tls[x].tlsEventTable.EVT_EAP_SETUP
928 for x in xrange(clients):
929 tls[x]._eapStart()
930 tls[x].tlsEventTable.EVT_EAP_START
931 for x in xrange(clients):
932 tls[x]._eapIdReq()
933 tls[x].tlsEventTable.EVT_EAP_ID_REQ
934 for x in xrange(clients):
935 tls[x]._eapTlsHelloReq()
936 for x in xrange(clients):
937 tls[x]._eapTlsCertReq()
938 for x in xrange(clients):
939 tls[x]._eapTlsChangeCipherSpec()
940 for x in xrange(clients):
941 tls[x]._eapTlsFinished()
942 for x in xrange(clients):
943 log.info('Authentication successfull for user %d'%i)
944 # Client authendicating multiple times one after other and making random delay in between authendication.
945 for i in xrange(2):
946 multiple_tls_random_delay()
947 time.sleep(randomDelay)
948 df.callback(0)
949 reactor.callLater(0, eap_tls_eapTlsHelloReq_pkt_delay, df)
950 return df
951
952 @deferred(TEST_TIMEOUT_DELAY+90)
953 def test_netCondition_with_delay_between_mac_flow_and_traffic(self):
954 df = defer.Deferred()
955 randomDelay = randint(10,300)
956 #self.setUpClass_flows()
957 egress = 1
958 ingress = 2
959 egress_mac = '00:00:00:00:00:01'
960 ingress_mac = '00:00:00:00:00:02'
961 pkt = Ether(src = ingress_mac, dst = egress_mac)/IP()
962 self.success = False
963
964 def mac_recv_task():
965 def recv_cb(pkt):
966 log.info('Pkt seen with ingress mac %s, egress mac %s' %(pkt.src, pkt.dst))
967 self.success = True
968 sniff(count=2, timeout=randomDelay+50, lfilter = lambda p: p.src == ingress_mac,
969 prn = recv_cb, iface = self.port_map[egress])
970
971 thread = threading.Thread(target = mac_recv_task)
972
973 def send_flow_pkt_delay():
974 sendp(pkt, count=50, iface = self.port_map[ingress])
975 thread.join()
976 assert_equal(self.success, True)
977 df.callback(0)
978
979 def creating_mac_flow(df):
980
981 flow = OnosFlowCtrl(deviceId = self.device_id,
982 egressPort = egress,
983 ingressPort = ingress,
984 ethSrc = ingress_mac,
985 ethDst = egress_mac)
986 result = flow.addFlow()
987 assert_equal(result, True)
988 ##wait for flows to be added to ONOS
989 time.sleep(1)
990 thread.start()
991 log.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
992 t = Timer(randomDelay, send_flow_pkt_delay)
993 t.start()
994 reactor.callLater(0, creating_mac_flow, df)
995 return df
996
997
998 @deferred(TEST_TIMEOUT_DELAY+90)
999 def test_netCondition_with_delay_between_ip_flow_and_traffic(self):
1000 df = defer.Deferred()
1001 randomDelay = randint(10,300)
1002 egress = 1
1003 ingress = 2
1004 egress_map = { 'ether': '00:00:00:00:00:03', 'ip': '192.168.30.1' }
1005 ingress_map = { 'ether': '00:00:00:00:00:04', 'ip': '192.168.40.1' }
1006 L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
1007 L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
1008 pkt = L2/L3
1009
1010 def mac_recv_task():
1011 def recv_cb(pkt):
1012 log.info('Pkt seen with ingress ip %s, egress ip %s' %(pkt[IP].src, pkt[IP].dst))
1013 self.success = True
1014 sniff(count=2, timeout= randomDelay + 30,
1015 lfilter = lambda p: IP in p and p[IP].dst == egress_map['ip'] and p[IP].src == ingress_map['ip'],
1016 prn = recv_cb, iface = self.port_map[egress])
1017
1018 thread = threading.Thread(target = mac_recv_task)
1019
1020 def send_flow_ip_pkt_delay():
1021 sendp(pkt, count=50, iface = self.port_map[ingress])
1022 thread.join()
1023 assert_equal(self.success, True)
1024 df.callback(0)
1025
1026 def creating_ip_flow(df):
1027 flow = OnosFlowCtrl(deviceId = self.device_id,
1028 egressPort = egress,
1029 ingressPort = ingress,
1030 ethType = '0x0800',
1031 ipSrc = ('IPV4_SRC', ingress_map['ip']+'/32'),
1032 ipDst = ('IPV4_DST', egress_map['ip']+'/32')
1033 )
1034 result = flow.addFlow()
1035 assert_equal(result, True)
1036 ##wait for flows to be added to ONOS
1037 time.sleep(1)
1038 self.success = False
1039 ##wait for flows to be added to ONOS
1040 time.sleep(1)
1041 thread.start()
1042 log.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
1043 t = Timer(randomDelay, send_flow_ip_pkt_delay)
1044 t.start()
1045 reactor.callLater(0, creating_ip_flow, df)
1046 return df
1047
1048 @deferred(TEST_TIMEOUT_DELAY+90)
1049 def test_netCondition_with_delay_between_tcp_port_flow_and_traffic(self):
1050 df = defer.Deferred()
1051 egress = 1
1052 ingress = 2
1053 egress_map = { 'ether': '00:00:00:00:00:03', 'ip': '192.168.30.1', 'tcp_port': 9500 }
1054 ingress_map = { 'ether': '00:00:00:00:00:04', 'ip': '192.168.40.1', 'tcp_port': 9000 }
1055 L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
1056 L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
1057 L4 = TCP(sport = ingress_map['tcp_port'], dport = egress_map['tcp_port'])
1058 pkt = L2/L3/L4
1059
1060 def mac_recv_task():
1061 def recv_cb(pkt):
1062 log.info('Pkt seen with ingress TCP port %s, egress TCP port %s' %(pkt[TCP].sport, pkt[TCP].dport))
1063 self.success = True
1064 sniff(count=2, timeout= randomDelay+30, lfilter = lambda p: TCP in p and p[TCP].dport == egress_map['tcp_port']
1065 and p[TCP].sport == ingress_map['tcp_port'], prn = recv_cb, iface = self.port_map[egress])
1066
1067 thread = threading.Thread(target = mac_recv_task)
1068
1069 def send_flow_tcp_pkt_delay():
1070 sendp(pkt, count=50, iface = self.port_map[ingress])
1071 thread.join()
1072 assert_equal(self.success, True)
1073 df.callback(0)
1074
1075 def creating_tcp_flow(df):
1076 flow = OnosFlowCtrl(deviceId = self.device_id,
1077 egressPort = egress,
1078 ingressPort = ingress,
1079 tcpSrc = ingress_map['tcp_port'],
1080 tcpDst = egress_map['tcp_port']
1081 )
1082 result = flow.addFlow()
1083 assert_equal(result, True)
1084 ##wait for flows to be added to ONOS
1085 time.sleep(1)
1086 self.success = False
1087 thread.start()
1088 randomDelay = randint(10,300)
1089 log.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
1090 t = Timer(randomDelay, send_flow_tcp_pkt_delay)
1091 t.start()
1092 df.callback(0)
1093 reactor.callLater(0, creating_tcp_flow, df)
1094 return df
1095
1096 @deferred(TEST_TIMEOUT_DELAY+90)
1097 def test_netCondition_with_delay_between_udp_port_flow_and_traffic(self):
1098 df = defer.Deferred()
1099 randomDelay = randint(10,300)
1100 egress = 1
1101 ingress = 2
1102 egress_map = { 'ether': '00:00:00:00:00:03', 'ip': '192.168.30.1', 'udp_port': 9500 }
1103 ingress_map = { 'ether': '00:00:00:00:00:04', 'ip': '192.168.40.1', 'udp_port': 9000 }
1104 L2 = Ether(src = ingress_map['ether'], dst = egress_map['ether'])
1105 L3 = IP(src = ingress_map['ip'], dst = egress_map['ip'])
1106 L4 = UDP(sport = ingress_map['udp_port'], dport = egress_map['udp_port'])
1107 pkt = L2/L3/L4
1108
1109 def mac_recv_task():
1110 def recv_cb(pkt):
1111 log.info('Pkt seen with ingress UDP port %s, egress UDP port %s' %(pkt[UDP].sport, pkt[UDP].dport))
1112 self.success = True
1113 sniff(count=2, timeout=randomDelay + 30,
1114 lfilter = lambda p: UDP in p and p[UDP].dport == egress_map['udp_port']
1115 and p[UDP].sport == ingress_map['udp_port'], prn = recv_cb, iface = self.port_map[egress])
1116
1117 thread = threading.Thread(target = mac_recv_task)
1118
1119 def send_flow_udp_pkt_delay():
1120 sendp(pkt, count=50, iface = self.port_map[ingress])
1121 thread.join()
1122 assert_equal(self.success, True)
1123 df.callback(0)
1124
1125 def creating_udp_flow(df):
1126 flow = OnosFlowCtrl(deviceId = self.device_id,
1127 egressPort = egress,
1128 ingressPort = ingress,
1129 udpSrc = ingress_map['udp_port'],
1130 udpDst = egress_map['udp_port']
1131 )
1132 result = flow.addFlow()
1133 assert_equal(result, True)
1134 ##wait for flows to be added to ONOS
1135 time.sleep(1)
1136 self.success = False
1137 thread.start()
1138 log.info('Holding a packet to verify if flows are active after {} secs'.format(randomDelay))
1139 t = Timer(randomDelay, send_flow_udp_pkt_delay)
1140 t.start()
1141
1142 df.callback(0)
1143 reactor.callLater(0, creating_udp_flow, df)
1144 return df
1145