blob: 88dae5ff035cc42a80c49e73da17df780cb51f8d [file] [log] [blame]
A.R Karthick95d044e2016-06-10 18:44:36 -07001#
Chetan Gaonkercfcce782016-05-10 10:10:42 -07002# 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
A.R Karthick95d044e2016-06-10 18:44:36 -07007#
Chetan Gaonkercfcce782016-05-10 10:10:42 -07008# http://www.apache.org/licenses/LICENSE-2.0
A.R Karthick95d044e2016-06-10 18:44:36 -07009#
Chetan Gaonkercfcce782016-05-10 10:10:42 -070010# 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#
Chetan Gaonker25470972016-02-26 08:52:15 -080016import unittest
17from nose.tools import *
18from nose.twistedtools import reactor, deferred
19from twisted.internet import defer
20from scapy.all import *
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080021import time, monotonic
Chetan Gaonker25470972016-02-26 08:52:15 -080022import os, sys
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080023import tempfile
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080024import random
25import threading
Chetan Gaonkere88c95c2016-03-02 05:21:47 -080026from IGMP import *
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080027from McastTraffic import *
28from Stats import Stats
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080029from OnosCtrl import OnosCtrl
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070030from OltConfig import OltConfig
Chetan Gaonker4eb12072016-03-28 15:04:15 -070031from Channels import IgmpChannel
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080032log.setLevel('INFO')
Chetan Gaonker25470972016-02-26 08:52:15 -080033
34class IGMPTestState:
35
36 def __init__(self, groups = [], df = None, state = 0):
37 self.df = df
38 self.state = state
39 self.counter = 0
40 self.groups = groups
41 self.group_map = {} ##create a send/recv count map
42 for g in groups:
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080043 self.group_map[g] = (Stats(), Stats())
A.R Karthick95d044e2016-06-10 18:44:36 -070044
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080045 def update(self, group, tx = 0, rx = 0, t = 0):
46 self.counter += 1
Chetan Gaonker25470972016-02-26 08:52:15 -080047 index = 0 if rx == 0 else 1
48 v = tx if rx == 0 else rx
49 if self.group_map.has_key(group):
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080050 self.group_map[group][index].update(packets = v, t = t)
Chetan Gaonker25470972016-02-26 08:52:15 -080051
52 def update_state(self):
53 self.state = self.state ^ 1
Chetan Gaonker25470972016-02-26 08:52:15 -080054
55class igmp_exchange(unittest.TestCase):
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080056
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -070057 V_INF1 = 'veth0'
58 V_INF2 = 'veth1'
59 MGROUP1 = '239.1.2.3'
60 MGROUP2 = '239.2.2.3'
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070061 MINVALIDGROUP1 = '255.255.255.255'
62 MINVALIDGROUP2 = '239.255.255.255'
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -070063 MMACGROUP1 = "01:00:5e:01:02:03"
64 MMACGROUP2 = "01:00:5e:02:02:03"
ChetanGaonkera7e2b412016-09-01 23:19:07 -070065 IGMP_DST_MAC = "01:00:5e:00:00:16"
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -070066 IGMP_SRC_MAC = "5a:e1:ac:ec:4d:a1"
67 IP_SRC = '1.2.3.4'
ChetanGaonkera7e2b412016-09-01 23:19:07 -070068 IP_DST = '224.0.0.22'
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070069 NEGATIVE_TRAFFIC_STATUS = 1
ChetanGaonkera7e2b412016-09-01 23:19:07 -070070 igmp_eth = Ether(dst = IGMP_DST_MAC, type = ETH_P_IP)
71 igmp_ip = IP(dst = IP_DST)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080072 IGMP_TEST_TIMEOUT = 5
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070073 IGMP_QUERY_TIMEOUT = 60
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080074 MCAST_TRAFFIC_TIMEOUT = 10
Chetan Gaonker4eb12072016-03-28 15:04:15 -070075 PORT_TX_DEFAULT = 2
76 PORT_RX_DEFAULT = 1
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -080077 max_packets = 100
A.R Karthick95d044e2016-06-10 18:44:36 -070078 app = 'org.opencord.igmp'
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070079 olt_conf_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../setup/olt_config.json')
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080080
Chetan Gaonker441c9ac2016-05-06 10:30:13 -070081 @classmethod
82 def setUpClass(cls):
83 cls.olt = OltConfig(olt_conf_file = cls.olt_conf_file)
84 OnosCtrl.cord_olt_config(cls.olt.olt_device_data())
85
86 @classmethod
87 def tearDownClass(cls): pass
A.R Karthick95d044e2016-06-10 18:44:36 -070088
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080089 def setUp(self):
ChetanGaonkera7e2b412016-09-01 23:19:07 -070090 ''' Activate the igmp app'''
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080091 self.onos_ctrl = OnosCtrl(self.app)
ChetanGaonkera7e2b412016-09-01 23:19:07 -070092 self.onos_ctrl.activate()
Chetan Gaonker4eb12072016-03-28 15:04:15 -070093 self.igmp_channel = IgmpChannel()
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080094
A R Karthick31152b22016-05-13 11:25:14 -070095 def tearDown(self): pass
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -080096
97 def onos_load_config(self, config):
ChetanGaonkera7e2b412016-09-01 23:19:07 -070098 log.info('onos load config is %s'%config)
Chetan Gaonkera2b87df2016-03-31 15:41:31 -070099 status, code = OnosCtrl.config(config)
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -0800100 if status is False:
101 log.info('JSON request returned status %d' %code)
102 assert_equal(status, True)
103 time.sleep(2)
A.R Karthick95d044e2016-06-10 18:44:36 -0700104
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700105 def onos_ssm_table_load(self, groups, src_list = ['1.2.3.4'],flag = False):
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800106 ssm_dict = {'apps' : { 'org.onosproject.igmp' : { 'ssmTranslate' : [] } } }
107 ssm_xlate_list = ssm_dict['apps']['org.onosproject.igmp']['ssmTranslate']
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700108 if flag: #to maintain seperate group-source pair.
109 for i in range(len(groups)):
110 d = {}
111 d['source'] = src_list[i] or '0.0.0.0'
112 d['group'] = groups[i]
113 ssm_xlate_list.append(d)
114 else:
115 for g in groups:
116 for s in src_list:
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800117 d = {}
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700118 d['source'] = s or '0.0.0.0'
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800119 d['group'] = g
120 ssm_xlate_list.append(d)
Chetan Gaonker4a25e2b2016-03-04 14:45:15 -0800121 self.onos_load_config(ssm_dict)
Chetan Gaonker4eb12072016-03-28 15:04:15 -0700122 cord_port_map = {}
123 for g in groups:
124 cord_port_map[g] = (self.PORT_TX_DEFAULT, self.PORT_RX_DEFAULT)
125 self.igmp_channel.cord_port_table_load(cord_port_map)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800126 time.sleep(2)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800127
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700128 def mcast_ip_range(self,start_ip = '224.0.1.0', end_ip = '224.0.1.100'):
129 start = list(map(int, start_ip.split(".")))
130 end = list(map(int, end_ip.split(".")))
131 temp = start
132 ip_range = []
133 ip_range.append(start_ip)
134 while temp != end:
135 start[3] += 1
136 for i in (3, 2, 1):
137 if temp[i] == 255:
138 temp[i] = 0
139 temp[i-1] += 1
140 ip_range.append(".".join(map(str, temp)))
141 return ip_range
142
143 def random_mcast_ip(self,start_ip = '224.0.1.0', end_ip = '224.0.1.100'):
144 start = list(map(int, start_ip.split(".")))
145 end = list(map(int, end_ip.split(".")))
146 temp = start
147 ip_range = []
148 ip_range.append(start_ip)
149 while temp != end:
150 start[3] += 1
151 for i in (3, 2, 1):
152 if temp[i] == 255:
153 temp[i] = 0
154 temp[i-1] += 1
155 ip_range.append(".".join(map(str, temp)))
156 return random.choice(ip_range)
157
158 def source_ip_range(self,start_ip = '10.10.0.1', end_ip = '10.10.0.100'):
159 start = list(map(int, start_ip.split(".")))
160 end = list(map(int, end_ip.split(".")))
161 temp = start
162 ip_range = []
163 ip_range.append(start_ip)
164 while temp != end:
165 start[3] += 1
166 for i in (3, 2, 1):
167 if temp[i] == 255:
168 temp[i] = 0
169 temp[i-1] += 1
170 ip_range.append(".".join(map(str, temp)))
171 return ip_range
172
173 def randomsourceip(self,start_ip = '10.10.0.1', end_ip = '10.10.0.100'):
174 start = list(map(int, start_ip.split(".")))
175 end = list(map(int, end_ip.split(".")))
176 temp = start
177 ip_range = []
178 ip_range.append(start_ip)
179 while temp != end:
180 start[3] += 1
181 for i in (3, 2, 1):
182 if temp[i] == 255:
183 temp[i] = 0
184 temp[i-1] += 1
185 ip_range.append(".".join(map(str, temp)))
186 return random.choice(ip_range)
187
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800188 def igmp_verify_join(self, igmpStateList):
189 sendState, recvState = igmpStateList
Chetan Gaonker25470972016-02-26 08:52:15 -0800190 ## check if the send is received for the groups
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800191 for g in sendState.groups:
A.R Karthick95d044e2016-06-10 18:44:36 -0700192 tx_stats = sendState.group_map[g][0]
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800193 tx = tx_stats.count
Chetan Gaonker25470972016-02-26 08:52:15 -0800194 assert_greater(tx, 0)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800195 rx_stats = recvState.group_map[g][1]
196 rx = rx_stats.count
197 assert_greater(rx, 0)
198 log.info('Receive stats %s for group %s' %(rx_stats, g))
A.R Karthick95d044e2016-06-10 18:44:36 -0700199
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800200 log.info('IGMP test verification success')
Chetan Gaonker25470972016-02-26 08:52:15 -0800201
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800202 def igmp_verify_leave(self, igmpStateList, leave_groups):
203 sendState, recvState = igmpStateList[0], igmpStateList[1]
204 ## check if the send is received for the groups
205 for g in sendState.groups:
206 tx_stats = sendState.group_map[g][0]
207 rx_stats = recvState.group_map[g][1]
208 tx = tx_stats.count
A.R Karthick95d044e2016-06-10 18:44:36 -0700209 rx = rx_stats.count
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800210 assert_greater(tx, 0)
211 if g not in leave_groups:
212 log.info('Received %d packets for group %s' %(rx, g))
213 for g in leave_groups:
214 rx = recvState.group_map[g][1].count
215 assert_equal(rx, 0)
A.R Karthick95d044e2016-06-10 18:44:36 -0700216
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800217 log.info('IGMP test verification success')
Chetan Gaonker25470972016-02-26 08:52:15 -0800218
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800219 def mcast_traffic_timer(self):
220 self.mcastTraffic.stopReceives()
221
222 def send_mcast_cb(self, send_state):
223 for g in send_state.groups:
224 send_state.update(g, tx = 1)
Chetan Gaonker25470972016-02-26 08:52:15 -0800225 return 0
226
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800227 ##Runs in the context of twisted reactor thread
Chetan Gaonker25470972016-02-26 08:52:15 -0800228 def igmp_recv(self, igmpState, iface = 'veth0'):
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800229 p = self.recv_socket.recv()
Chetan Gaonkerf1b9e322016-05-09 15:49:15 -0700230 try:
231 send_time = float(p.payload.load)
232 recv_time = monotonic.monotonic()
233 except:
234 log.info('Unexpected Payload received: %s' %p.payload.load)
235 return 0
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800236 #log.info( 'Recv in %.6f secs' %(recv_time - send_time))
237 igmpState.update(p.dst, rx = 1, t = recv_time - send_time)
Chetan Gaonker25470972016-02-26 08:52:15 -0800238 return 0
239
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700240 def send_igmp_join(self, groups, src_list = ['1.2.3.4'], record_type=IGMP_V3_GR_TYPE_INCLUDE,ip_pkt = None, iface = 'veth0', delay = 1):
241 #self.onos_ssm_table_load(groups, src_list)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800242 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700243 gaddr=self.IP_DST)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800244 for g in groups:
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700245 gr = IGMPv3gr(rtype= record_type, mcaddr=g)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800246 gr.sources = src_list
247 igmp.grps.append(gr)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700248 if ip_pkt is None:
249 ip_pkt = self.igmp_eth/self.igmp_ip
250 pkt = ip_pkt/igmp
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800251 IGMPv3.fixup(pkt)
252 sendp(pkt, iface=iface)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800253 if delay != 0:
254 time.sleep(delay)
255
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700256 def send_igmp_join_recvQuery(self, groups, rec_queryCount = None, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
257 self.onos_ssm_table_load(groups, src_list)
258 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
259 gaddr=self.IP_DST)
260 for g in groups:
Chetan Gaonker38737f82016-05-11 17:44:17 -0700261 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_INCLUDE, mcaddr=g)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700262 gr.sources = src_list
263 gr.sources = src_list
264 igmp.grps.append(gr)
265 if ip_pkt is None:
266 ip_pkt = self.igmp_eth/self.igmp_ip
267 pkt = ip_pkt/igmp
268 IGMPv3.fixup(pkt)
269 if rec_queryCount == None:
270 log.info('Sending IGMP join for group %s and waiting for one query packet and printing the packet' %groups)
271 resp = srp1(pkt, iface=iface)
272 else:
273 log.info('Sending IGMP join for group %s and waiting for periodic query packets and printing one packet' %groups)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700274 resp = srp1(pkt, iface=iface)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700275# resp = srp1(pkt, iface=iface) if rec_queryCount else srp3(pkt, iface=iface)
276 resp[0].summary()
277 log.info('Sent IGMP join for group %s and received a query packet and printing packet' %groups)
278 if delay != 0:
279 time.sleep(delay)
280
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700281 def send_igmp_leave(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700282 log.info('entering into igmp leave function')
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800283 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700284 gaddr=self.IP_DST)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800285 for g in groups:
Chetan Gaonker38737f82016-05-11 17:44:17 -0700286 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr=g)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800287 gr.sources = src_list
288 igmp.grps.append(gr)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700289 if ip_pkt is None:
290 ip_pkt = self.igmp_eth/self.igmp_ip
291 pkt = ip_pkt/igmp
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800292 IGMPv3.fixup(pkt)
293 sendp(pkt, iface = iface)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800294 if delay != 0:
295 time.sleep(delay)
Chetan Gaonker25470972016-02-26 08:52:15 -0800296
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700297 def send_igmp_leave_listening_group_specific_query(self, groups, src_list = ['1.2.3.4'], ip_pkt = None, iface = 'veth0', delay = 2):
298 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
299 gaddr=self.IP_DST)
300 for g in groups:
Chetan Gaonker38737f82016-05-11 17:44:17 -0700301 gr = IGMPv3gr(rtype=IGMP_V3_GR_TYPE_EXCLUDE, mcaddr=g)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700302 gr.sources = src_list
303 igmp.grps.append(gr)
304 if ip_pkt is None:
305 ip_pkt = self.igmp_eth/self.igmp_ip
306 pkt = ip_pkt/igmp
307 IGMPv3.fixup(pkt)
308 log.info('Sending IGMP leave for group %s and waiting for one group specific query packet and printing the packet' %groups)
309 resp = srp1(pkt, iface=iface)
310 resp[0].summary()
311 log.info('Sent IGMP leave for group %s and received a group specific query packet and printing packet' %groups)
312 if delay != 0:
313 time.sleep(delay)
314
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800315 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
316 def test_igmp_join_verify_traffic(self):
Chetan Gaonker25470972016-02-26 08:52:15 -0800317 groups = ['224.0.1.1', '225.0.0.1']
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700318 self.onos_ssm_table_load(groups)
Chetan Gaonker25470972016-02-26 08:52:15 -0800319 df = defer.Deferred()
320 igmpState = IGMPTestState(groups = groups, df = df)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800321 igmpStateRecv = IGMPTestState(groups = groups, df = df)
322 igmpStateList = (igmpState, igmpStateRecv)
323 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb, arg = igmpState)
324 self.df = df
325 self.mcastTraffic = mcastTraffic
326 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
327
328 def igmp_srp_task(stateList):
329 igmpSendState, igmpRecvState = stateList
330 if not mcastTraffic.isRecvStopped():
331 result = self.igmp_recv(igmpRecvState)
332 reactor.callLater(0, igmp_srp_task, stateList)
333 else:
334 self.mcastTraffic.stop()
335 self.recv_socket.close()
336 self.igmp_verify_join(stateList)
337 self.df.callback(0)
338
339 self.send_igmp_join(groups)
340 mcastTraffic.start()
341 self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
342 reactor.callLater(0, igmp_srp_task, igmpStateList)
Chetan Gaonker25470972016-02-26 08:52:15 -0800343 return df
344
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700345 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+40)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800346 def test_igmp_leave_verify_traffic(self):
347 groups = ['224.0.1.10', '225.0.0.10']
348 leave_groups = ['224.0.1.10']
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700349 self.onos_ssm_table_load(groups)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800350 df = defer.Deferred()
351 igmpState = IGMPTestState(groups = groups, df = df)
352 igmpStateRecv = IGMPTestState(groups = groups, df = df)
353 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -0700354 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800355 arg = igmpState)
356 self.df = df
357 self.mcastTraffic = mcastTraffic
358 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -0700359
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700360 mcastTraffic.start()
361 self.send_igmp_join(groups)
362 self.send_igmp_leave(leave_groups, delay = 3)
363 join_state = IGMPTestState(groups = leave_groups)
364 status = self.igmp_not_recv_task(self.V_INF1,leave_groups, join_state)
365 log.info('verified status for igmp recv task %s'%status)
366 assert status == 1 , 'EXPECTED RESULT'
367 self.df.callback(0)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800368 return df
369
370 @deferred(timeout=100)
371 def test_igmp_leave_join_loop(self):
372 self.groups = ['226.0.1.1', '227.0.0.1', '228.0.0.1', '229.0.0.1', '230.0.0.1' ]
373 self.src_list = ['3.4.5.6', '7.8.9.10']
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700374 self.onos_ssm_table_load(self.groups,src_list=self.src_list)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800375 df = defer.Deferred()
376 self.df = df
377 self.iterations = 0
378 self.num_groups = len(self.groups)
379 self.MAX_TEST_ITERATIONS = 10
380
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800381 def igmp_srp_task(v):
382 if self.iterations < self.MAX_TEST_ITERATIONS:
383 if v == 1:
384 ##join test
385 self.num_groups = random.randint(0, len(self.groups))
386 self.send_igmp_join(self.groups[:self.num_groups],
387 src_list = self.src_list,
388 iface = 'veth0', delay = 0)
389 else:
390 self.send_igmp_leave(self.groups[:self.num_groups],
391 src_list = self.src_list,
392 iface = 'veth0', delay = 0)
393 self.iterations += 1
394 v ^= 1
395 reactor.callLater(1.0 + 0.5*self.num_groups,
396 igmp_srp_task, v)
397 else:
398 self.df.callback(0)
399
400 reactor.callLater(0, igmp_srp_task, 1)
401 return df
402
403 def igmp_join_task(self, intf, groups, state, src_list = ['1.2.3.4']):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700404 #self.onos_ssm_table_load(groups, src_list)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800405 igmp = IGMPv3(type = IGMP_TYPE_V3_MEMBERSHIP_REPORT, max_resp_code=30,
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700406 gaddr=self.IP_DST)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800407 for g in groups:
Chetan Gaonker38737f82016-05-11 17:44:17 -0700408 gr = IGMPv3gr(rtype = IGMP_V3_GR_TYPE_INCLUDE, mcaddr = g)
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800409 gr.sources = src_list
410 igmp.grps.append(gr)
411
412 for g in groups:
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800413 state.group_map[g][0].update(1, t = monotonic.monotonic())
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800414
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700415 pkt = self.igmp_eth/self.igmp_ip/igmp
Chetan Gaonker5a5204e2016-03-02 01:35:13 -0800416 IGMPv3.fixup(pkt)
417 sendp(pkt, iface=intf)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800418 log.debug('Returning from join task')
419
420 def igmp_recv_task(self, intf, groups, join_state):
421 recv_socket = L3PacketSocket(iface = intf, type = ETH_P_IP)
422 group_map = {}
423 for g in groups:
424 group_map[g] = [0,0]
425
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700426 log.info('Verifying join interface should receive multicast data')
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800427 while True:
428 p = recv_socket.recv()
429 if p.dst in groups and group_map[p.dst][0] == 0:
430 group_map[p.dst][0] += 1
431 group_map[p.dst][1] = monotonic.monotonic()
432 c = 0
433 for g in groups:
434 c += group_map[g][0]
435 if c == len(groups):
436 break
437 for g in groups:
438 join_start = join_state.group_map[g][0].start
439 recv_time = group_map[g][1] * 1000000
440 delta = (recv_time - join_start)
441 log.info('Join for group %s received in %.3f usecs' %
442 (g, delta))
443
444 recv_socket.close()
445 log.debug('Returning from recv task')
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700446
447 def igmp_not_recv_task(self, intf, groups, join_state):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700448 log.info('entering igmp not recv task loop')
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700449 recv_socket = L2Socket(iface = intf, type = ETH_P_IP)
450 group_map = {}
451 for g in groups:
452 group_map[g] = [0,0]
453
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700454 log.info('Verifying join interface should not receive any multicast data')
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700455 self.NEGATIVE_TRAFFIC_STATUS = 1
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700456 def igmp_recv_cb(pkt):
457 log.info('Multicast packet %s received for left groups %s' %(pkt[IP].dst, groups))
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700458 self.NEGATIVE_TRAFFIC_STATUS = 2
Chetan Gaonker38737f82016-05-11 17:44:17 -0700459 sniff(prn = igmp_recv_cb, count = 1, lfilter = lambda p: IP in p and p[IP].dst in groups,
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700460 timeout = 3, opened_socket = recv_socket)
461 recv_socket.close()
A.R Karthick95d044e2016-06-10 18:44:36 -0700462 return self.NEGATIVE_TRAFFIC_STATUS
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700463
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800464 def group_latency_check(self, groups):
465 tasks = []
466 self.send_igmp_leave(groups = groups)
467 join_state = IGMPTestState(groups = groups)
468 tasks.append(threading.Thread(target=self.igmp_join_task, args = ('veth0', groups, join_state,)))
469 traffic_state = IGMPTestState(groups = groups)
A.R Karthick95d044e2016-06-10 18:44:36 -0700470 mcast_traffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800471 arg = traffic_state)
472 mcast_traffic.start()
473 tasks.append(threading.Thread(target=self.igmp_recv_task, args = ('veth0', groups, join_state)))
474 for t in tasks:
475 t.start()
476 for t in tasks:
477 t.join()
478
479 mcast_traffic.stop()
480 self.send_igmp_leave(groups = groups)
481 return
482
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700483 @deferred(timeout=IGMP_QUERY_TIMEOUT + 10)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800484 def test_igmp_1group_join_latency(self):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700485 groups = ['239.0.1.1']
486 df = defer.Deferred()
487 def igmp_1group_join_latency():
488 self.group_latency_check(groups)
489 df.callback(0)
490 reactor.callLater(0, igmp_1group_join_latency)
491 return df
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800492
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700493 @deferred(timeout=IGMP_QUERY_TIMEOUT + 10)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800494 def test_igmp_2group_join_latency(self):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700495 groups = ['239.0.1.1', '240.0.1.1']
496 df = defer.Deferred()
497 def igmp_2group_join_latency():
498 self.group_latency_check(groups)
499 df.callback(0)
500 reactor.callLater(0, igmp_2group_join_latency)
501 return df
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800502
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700503 @deferred(timeout=IGMP_QUERY_TIMEOUT + 10)
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800504 def test_igmp_Ngroup_join_latency(self):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700505 groups = ['239.0.1.1', '240.0.1.1', '241.0.1.1', '242.0.1.1']
506 df = defer.Deferred()
507 def igmp_Ngroup_join_latency():
508 self.group_latency_check(groups)
509 df.callback(0)
510 reactor.callLater(0, igmp_Ngroup_join_latency)
511 return df
Chetan Gaonkereb2b24b2016-03-01 14:04:45 -0800512
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800513 def test_igmp_join_rover(self):
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800514 s = (224 << 24) | 1
515 #e = (225 << 24) | (255 << 16) | (255 << 16) | 255
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700516 e = (224 << 24) | 10
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800517 for i in xrange(s, e+1):
518 if i&0xff:
519 ip = '%d.%d.%d.%d'%((i>>24)&0xff, (i>>16)&0xff, (i>>8)&0xff, i&0xff)
520 self.send_igmp_join([ip], delay = 0)
521
522 @deferred(timeout=IGMP_QUERY_TIMEOUT + 10)
523 def test_igmp_query(self):
524 groups = ['224.0.0.1'] ##igmp query group
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700525 self.onos_ssm_table_load(groups)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800526 df = defer.Deferred()
527 self.df = df
528 self.recv_socket = L2Socket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -0700529
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800530 def igmp_query_timeout():
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800531 def igmp_query_cb(pkt):
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700532 log.info('received igmp query packet is %s'%pkt.show())
Chetan Gaonkerbd4390f2016-03-09 18:56:52 -0800533 log.info('Got IGMP query packet from %s for %s' %(pkt[IP].src, pkt[IP].dst))
534 assert_equal(pkt[IP].dst, '224.0.0.1')
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700535 sniff(prn = igmp_query_cb, count=1, lfilter = lambda p: IP in p and p[IP].dst in groups,
Chetan Gaonkerbd4390f2016-03-09 18:56:52 -0800536 opened_socket = self.recv_socket)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800537 self.recv_socket.close()
538 self.df.callback(0)
539
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700540 #self.send_igmp_join(groups)
Chetan Gaonker1f7c3f82016-03-08 12:17:37 -0800541 self.test_timer = reactor.callLater(self.IGMP_QUERY_TIMEOUT, igmp_query_timeout)
542 return df
543
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700544 def igmp_send_joins_different_groups_srclist(self, groups, sources, intf = V_INF1, delay = 2, ip_src = None):
545 g1 = groups[0]
546 g2 = groups[1]
547 sourcelist1 = sources[0]
548 sourcelist2 = sources[1]
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700549 eth = Ether(dst = self.IGMP_DST_MAC,type = ETH_P_IP)
550 ip = IP(dst = self.IP_DST)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700551 log.info('Sending join message for the group %s' %g1)
552 self.send_igmp_join((g1,), src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
553 eth = Ether(dst = self.MMACGROUP2, src = self.IGMP_SRC_MAC, type = ETH_P_IP)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700554 ip = IP(dst = g2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700555 log.info('Sending join message for group %s' %g2)
556 self.send_igmp_join((g2,), src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700557 log.info('Done with igmp_send_joins_different_groups_srclist')
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700558
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700559 def igmp_send_joins_different_groups_srclist_wait_query_packets(self, groups, sources, intf = V_INF1, delay = 2, ip_src = None, query_group1 = None, query_group2 = None):
560 g1 = groups[0]
561 g2 = groups[1]
562 sourcelist1 = sources[0]
563 sourcelist2 = sources[1]
564 eth = Ether(dst = self.MMACGROUP1, src = self.IGMP_SRC_MAC, type = ETH_P_IP)
565 src_ip = ip_src or self.IP_SRC
566 ip = IP(dst = g1, src = src_ip)
567 if query_group1 is 'group1':
568 log.info('Sending join message for the group %s and waiting for a query packet on join interface' %g1)
569 self.send_igmp_join_recvQuery((g1,), None, src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -0700570 else:
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700571 log.info('Sending join message for the group %s' %g1)
572 self.send_igmp_join((g1,), src_list = sourcelist1, ip_pkt = eth/ip, iface = intf, delay = 2)
573 eth = Ether(dst = self.MMACGROUP2, src = self.IGMP_SRC_MAC, type = ETH_P_IP)
574 ip = IP(dst = g2, src = src_ip)
575 if query_group2 is 'group2':
576 log.info('Sending join message for the group %s and waiting for a query packet on join interface' %g2)
577 self.send_igmp_join_recvQuery((g2,), None, src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -0700578 else:
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700579 log.info('Sending join message for group %s' %g2)
580 self.send_igmp_join((g2,), src_list = sourcelist2, ip_pkt = eth/ip, iface = intf, delay = 2)
581
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700582 def igmp_joins_leave(self,groups,src_list,again_join = False, df = None):
583 groups1 = [groups[0]]
584 groups2 = [groups[1]]
585 src1 = [src_list[0]]
586 src2 = [src_list[1]]
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700587 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700588 (src1, src2), intf = self.V_INF1, delay = 2)
589
590 src_ip = src1[0]
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700591 if df is None:
592 df = defer.Deferred()
593 igmpState1 = IGMPTestState(groups = groups1, df = df)
594 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
595 igmpStateList1 = (igmpState1, igmpStateRecv1)
596
597 igmpState2 = IGMPTestState(groups = groups2, df = df)
598 igmpStateRecv2 = IGMPTestState(groups = groups2, df = df)
599 igmpStateList2 = (igmpState2, igmpStateRecv2)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700600 dst_mac = self.iptomac(groups1[0])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700601 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
602 src_ip = src_ip, cb = self.send_mcast_cb,
603 arg = igmpState1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700604 src_ip = src2[0]
605 dst_mac = self.iptomac(groups1[0])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700606 mcastTraffic2 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
607 src_ip = src_ip, cb = self.send_mcast_cb,
608 arg = igmpState2)
609 mcastTraffic1.start()
610 mcastTraffic2.start()
611 join_state1 = IGMPTestState(groups = groups1)
612 join_state2 = IGMPTestState(groups = groups2)
613 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
614 log.info('Interface is receiving multicast groups %s' %groups1)
615 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state2)
616 log.info('Interface is receiving multicast groups %s' %groups2)
617 log.info('Interface is sending leave message for groups %s now' %groups2)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700618 self.send_igmp_leave(groups = groups2, src_list = src2, iface = self.V_INF1, delay = 2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700619 target3 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
620 target4 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state2)
621 assert target4 == 1, 'EXPECTED FAILURE'
622 if again_join:
623 dst_mac = '01:00:5e:02:02:03'
624 ip_dst = '239.2.2.3'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700625 eth = Ether(dst = dst_mac, type = ETH_P_IP)
626 ip = IP(dst = ip_dst)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700627 log.info('Interface sending join message again for the groups %s' %groups2)
628 self.send_igmp_join(groups2, src_list = [src_ip], ip_pkt = eth/ip, iface = self.V_INF1, delay = 2)
629 target5 = self.igmp_recv_task(self.V_INF1, groups2, join_state2)
630 log.info('Interface is receiving multicast groups %s again' %groups2)
631 target6 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
632 log.info('Interface is still receiving from multicast groups %s' %groups1)
633 else:
634 log.info('Ended test case')
635 mcastTraffic1.stop()
636 mcastTraffic2.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700637
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700638
639 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700640 def test_igmp_2joins_1leave(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700641 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700642 def igmp_2joins_1leave():
643 groups = ['234.2.3.4','236.8.7.9']
644 src_list = ['2.3.4.5','5.4.3.2']
645 self.onos_ssm_table_load(groups,src_list = src_list)
646 self.igmp_joins_leave(groups,src_list,again_join = False, df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700647 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700648 reactor.callLater(0, igmp_2joins_1leave)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700649 return df
650
651 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+25)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700652 def test_igmp_2joins_1leave_and_join_again(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700653 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700654 def igmp_2joins_1leave_join_again():
655 groups = ['234.2.3.4','236.8.7.9']
656 src_list = ['2.3.4.5','5.4.3.2']
657 self.onos_ssm_table_load(groups,src_list = src_list)
658 self.igmp_joins_leave(groups,src_list,again_join = True, df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700659 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700660 reactor.callLater(0, igmp_2joins_1leave_join_again)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700661 return df
662
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700663 def igmp_not_in_src_list(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700664 groups1 = (self.MGROUP1,)
665 groups2 = (self.MGROUP2,)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700666 self.onos_ssm_table_load(groups1 + groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','2.2.2.2', '5.5.5.5'])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700667 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
668 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
669 intf = self.V_INF1, delay = 2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700670 src_ip = '6.6.6.6'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700671 dst_mac = self.iptomac(groups1[0])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700672 if df is None:
673 df = defer.Deferred()
674 igmpState1 = IGMPTestState(groups = groups1, df = df)
675 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
676 mcastTraffic1 = McastTraffic(groups1, iface = 'veth2', dst_mac = dst_mac,
677 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
678 mcastTraffic1.start()
679 join_state1 = IGMPTestState(groups = groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700680 log.info('Interface should not receive from multicast groups %s from an interface, which is expected' %groups1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700681 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700682 assert target1 == 2, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700683 log.info('Interface is not receiving traffic from multicast groups %s, working as expected' %groups1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700684 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700685
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700686 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700687 def test_igmp_not_in_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700688 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700689 def igmp_not_in_src_list():
690 self.igmp_not_in_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700691 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700692 reactor.callLater(0, igmp_not_in_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700693 return df
694
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700695 def igmp_change_to_exclude_src_list(self, df = None):
696 groups1 = [self.random_mcast_ip()]
697 groups2 = [self.random_mcast_ip()]
698 self.onos_ssm_table_load(groups1 + groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','2.2.2.2', '5.5.5.5'])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700699 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
700 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
701 intf = self.V_INF1, delay = 2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700702 src_ip = '2.2.2.2'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700703 dst_mac=self.iptomac(groups1[0])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700704 if df is None:
705 df = defer.Deferred()
706 igmpState1 = IGMPTestState(groups = groups1, df = df)
707 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
708 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
709 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
710 mcastTraffic1.start()
711 join_state1 = IGMPTestState(groups = groups1)
712 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
713 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2'], iface = self.V_INF1, delay =2)
714 target2 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700715 assert target2 == 2, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700716 log.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700717 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700718
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700719 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700720 def test_igmp_change_to_exclude_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700721 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700722 def igmp_change_to_exclude_src_list():
723 self.igmp_change_to_exclude_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700724 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700725 reactor.callLater(0, igmp_change_to_exclude_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700726 return df
727
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700728 def igmp_include_to_allow_src_list(self, df = None):
729 groups1 = [self.random_mcast_ip()] #(self.MGROUP1,)
730 self.onos_ssm_table_load(groups1,src_list = ['4.4.4.4','6.6.6.6'])
731 self.send_igmp_join(groups = groups1, src_list = ['4.4.4.4'],record_type = IGMP_V3_GR_TYPE_INCLUDE,
732 iface = self.V_INF1)
733 src_ip = '4.4.4.4'
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700734 if df is None:
735 df = defer.Deferred()
736 igmpState1 = IGMPTestState(groups = groups1, df = df)
737 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700738 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2',src_ip = src_ip,
739 cb = self.send_mcast_cb, arg = igmpState1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700740 mcastTraffic1.start()
741 join_state1 = IGMPTestState(groups = groups1)
742 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700743 mcastTraffic1.stop()
744 mcastTraffic2 = McastTraffic(groups1, iface= 'veth2',src_ip = '6.6.6.6',
745 cb = self.send_mcast_cb, arg = igmpState1)
746 self.send_igmp_join(groups = groups1, src_list = ['6.6.6.6'],record_type = IGMP_V3_GR_TYPE_ALLOW_NEW,
747 iface = self.V_INF1)
748 mcastTraffic2.start()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700749 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700750 mcastTraffic2.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700751
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700752 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+30)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700753 def test_igmp_include_to_allow_src_list(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700754 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700755 def igmp_include_to_allow_src_list():
756 self.igmp_include_to_allow_src_list(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700757 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700758 reactor.callLater(0, igmp_include_to_allow_src_list)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700759 return df
760
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700761 def igmp_include_to_block_src_list(self, df = None):
762 groups1 = [self.random_mcast_ip()] #groups1 = (self.MGROUP1,)
763 self.onos_ssm_table_load(groups1,src_list = ['4.4.4.4','6.6.6.6'])
764 self.send_igmp_join(groups = groups1, src_list = ['4.4.4.4','6.6.6.6'],record_type = IGMP_V3_GR_TYPE_INCLUDE,
765 iface = self.V_INF1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700766 if df is None:
767 df = defer.Deferred()
768 igmpState1 = IGMPTestState(groups = groups1, df = df)
769 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700770 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2',src_ip = '6.6.6.6',
771 cb = self.send_mcast_cb, arg = igmpState1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700772 mcastTraffic1.start()
773 join_state1 = IGMPTestState(groups = groups1)
774 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700775 mcastTraffic1.stop()
776 self.send_igmp_join(groups = groups1, src_list = ['6.6.6.6'],record_type = IGMP_V3_GR_TYPE_BLOCK_OLD,
777 iface = self.V_INF1)
778 mcastTraffic2 = McastTraffic(groups1, iface= 'veth2',src_ip = '6.6.6.6',
779 cb = self.send_mcast_cb, arg = igmpState1)
780 mcastTraffic2.start()
781 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
782 assert target1 == 1, 'EXPECTED FAILURE'
Chetan Gaonker717b2942016-05-13 17:42:59 -0700783 log.info('Interface is still receiving from old multicast group data %s even after we send block list' %groups1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700784 mcastTraffic2.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700785
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700786 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+30)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700787 def test_igmp_include_to_block_src_list(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700788 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700789 def igmp_include_to_block_src_list():
790 self.igmp_include_to_block_src_list(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700791 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700792 reactor.callLater(0, igmp_include_to_block_src_list)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700793 return df
794
795
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700796 def igmp_change_to_include_src_list(self, df = None):
797 groups1 = [self.random_mcast_ip()]
798 src_list = ['4.4.4.4','6.6.6.6']
799 self.onos_ssm_table_load(groups1,src_list = src_list)
800 self.send_igmp_leave(groups = groups1, src_list = src_list,
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700801 iface = self.V_INF1, delay = 2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700802 if df is None:
803 df = defer.Deferred()
804 igmpState1 = IGMPTestState(groups = groups1, df = df)
805 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700806 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2',src_ip = src_list[0],
807 cb = self.send_mcast_cb, arg = igmpState1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700808 mcastTraffic1.start()
809 join_state1 = IGMPTestState(groups = groups1)
810 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
811 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700812 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
813 mcastTraffic1.stop()
814 self.send_igmp_join(groups = groups1, src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
815 iface = self.V_INF1)
816 mcastTraffic2 = McastTraffic(groups1, iface= 'veth2',src_ip = src_list[1],
817 cb = self.send_mcast_cb, arg = igmpState1)
818 mcastTraffic2.start()
819 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
820 mcastTraffic2.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700821
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700822 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700823 def test_igmp_change_to_include_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700824 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700825 def igmp_change_to_include_src_list():
826 self.igmp_change_to_include_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700827 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700828 reactor.callLater(0, igmp_change_to_include_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700829 return df
830
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700831 #this test case failing because group in include receiving multicast traffic from any of the source
832 def igmp_exclude_to_allow_src_list(self, df = None):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700833 groups1 = (self.MGROUP1,)
834 groups2 = (self.MGROUP2,)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700835 self.onos_ssm_table_load(groups1+groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','6.6.6.6', '7.7.7.7', '8.8.8.8','5.5.5.5'])
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700836 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4'],
837 iface = self.V_INF1, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -0700838
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700839 dst_mac = '01:00:5e:01:02:03'
840 src_ip = '2.2.2.2'
841 if df is None:
842 df = defer.Deferred()
843 igmpState1 = IGMPTestState(groups = groups1, df = df)
844 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
845 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
846 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
847 mcastTraffic1.start()
848 join_state1 = IGMPTestState(groups = groups1)
849 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
850 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700851 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700852 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
853 (['6.6.6.6', '7.7.7.7', '8.8.8.8'], ['6.6.6.6', '5.5.5.5']),
854 intf = self.V_INF1, delay = 2)
855 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
856 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700857 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700858 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700859
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700860 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700861 def test_igmp_exclude_to_allow_src_list(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700862 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700863 def igmp_exclude_to_allow_src_list():
864 self.igmp_exclude_to_allow_src_list(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700865 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700866 reactor.callLater(0, igmp_exclude_to_allow_src_list)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700867 return df
868
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700869 def igmp_exclude_to_block_src_list(self, df = None):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700870 groups1 = (self.MGROUP1,)
871 groups2 = (self.MGROUP2,)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700872 self.onos_ssm_table_load(groups1+groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','7.7.7.7','5.5.5.5'])
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700873 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4'],
874 iface = self.V_INF1, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -0700875
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700876 dst_mac = '01:00:5e:01:02:03'
877 src_ip = '2.2.2.2'
878 if df is None:
879 df = defer.Deferred()
880 igmpState1 = IGMPTestState(groups = groups1, df = df)
881 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
882 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
883 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
884 mcastTraffic1.start()
885 join_state1 = IGMPTestState(groups = groups1)
886 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
887 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700888 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700889 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5', '7.7.7.7'],
890 iface = self.V_INF1, delay = 2)
891 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
892 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700893 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700894 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700895
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700896 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700897 def test_igmp_exclude_to_block_src_list(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700898 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700899 def igmp_exclude_to_block_src_list():
900 self.igmp_exclude_to_block_src_list(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700901 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700902 reactor.callLater(0, igmp_exclude_to_block_src_list)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700903 return df
904
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700905 #this test case failing because group in include mode recieves traffic from other sources also.
906 def igmp_new_src_list(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700907 groups1 = (self.MGROUP1,)
908 groups2 = (self.MGROUP2,)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700909 self.onos_ssm_table_load(groups1+groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','5.5.5.5','6.6.6.6'])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700910 self.igmp_send_joins_different_groups_srclist(groups1+groups2,
911 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
912 intf = self.V_INF1, delay = 2)
913 dst_mac = '01:00:5e:01:02:03'
914 src_ip = '6.6.6.6'
915 if df is None:
916 df = defer.Deferred()
917 igmpState1 = IGMPTestState(groups = groups1, df = df)
918 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
919 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
920 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
921 mcastTraffic1.start()
922 join_state1 = IGMPTestState(groups = groups1)
923 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
924 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700925 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700926 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -0700927 (['2.2.2.2', '6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700928 intf = self.V_INF1, delay = 2)
929 target2 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700930 log.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700931 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -0700932
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700933 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+10)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700934 def test_igmp_new_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700935 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700936 def igmp_new_src_list():
937 self.igmp_new_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700938 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700939 reactor.callLater(0, igmp_new_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700940 return df
941
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700942 def igmp_block_old_src_list(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700943 groups1 = (self.MGROUP1,)
944 groups2 = (self.MGROUP2,)
945 groups = groups1 + groups2
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700946 self.onos_ssm_table_load(groups1+groups2,src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4','5.5.5.5','6.6.6.6','7.7.7.7'])
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700947 self.igmp_send_joins_different_groups_srclist(groups,
948 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
949 intf = self.V_INF1, delay = 2)
950 dst_mac = '01:00:5e:02:02:03'
951 src_ip = '5.5.5.5'
952 if df is None:
953 df = defer.Deferred()
954 igmpState1 = IGMPTestState(groups = groups2, df = df)
955 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
956 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
957 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
958 mcastTraffic1.start()
959 join_state1 = IGMPTestState(groups = groups2)
960 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700961 log.info('Interface is receiving traffic from multicast groups %s' %groups2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700962 self.igmp_send_joins_different_groups_srclist(groups,
963 (['6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '7.7.7.7']),
964 intf = self.V_INF1, delay = 2)
965 target2 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
Chetan Gaonker7791bda2016-05-12 17:36:52 -0700966 assert target2 == 2, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700967 log.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700968 mcastTraffic1.stop()
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700969
970 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700971 def test_igmp_block_old_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700972 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700973 def igmp_block_old_src_list():
974 self.igmp_block_old_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700975 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700976 reactor.callLater(0, igmp_block_old_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700977 return df
978
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700979 def igmp_include_empty_src_list(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700980 groups1 = (self.MGROUP1,)
981 groups2 = (self.MGROUP2,)
982 groups = groups1 + groups2
983 self.igmp_send_joins_different_groups_srclist(groups,
984 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['']),
985 intf = self.V_INF1, delay = 2)
986 dst_mac = '01:00:5e:02:02:03'
987 src_ip = '5.5.5.5'
988 if df is None:
989 df = defer.Deferred()
990 igmpState1 = IGMPTestState(groups = groups2, df = df)
991 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
992 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
993 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
994 mcastTraffic1.start()
995 join_state1 = IGMPTestState(groups = groups2)
996 target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
997 assert target1==1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -0700998 log.info('Interface is not receiving traffic from multicast groups %s when we sent join with source list is empty' %groups2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -0700999 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001000
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001001 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001002 def test_igmp_include_empty_src_list(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001003 ## '''Disabling this test as scapy IGMP doesn't work with empty source lists'''
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001004 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001005 def igmp_include_empty_src_list():
1006 self.igmp_include_empty_src_list(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001007 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001008 reactor.callLater(0, igmp_include_empty_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001009 return df
1010
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001011 def igmp_exclude_empty_src_list(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001012 groups1 = (self.MGROUP1,)
1013 groups2 = (self.MGROUP2,)
1014 groups = groups1 + groups2
1015 self.send_igmp_leave(groups = groups2, src_list = [''], iface = self.V_INF1, delay = 2)
1016 dst_mac = '01:00:5e:02:02:03'
1017 src_ip = '5.5.5.5'
1018 if df is None:
1019 df = defer.Deferred()
1020 igmpState1 = IGMPTestState(groups = groups2, df = df)
1021 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1022 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1023 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1024 mcastTraffic1.start()
1025 join_state1 = IGMPTestState(groups = groups2)
1026 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
1027 log.info('Interface is receiving multicast groups %s' %groups2)
1028 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001029
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001030 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001031 def test_igmp_exclude_empty_src_list(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001032 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001033 def igmp_exclude_empty_src_list():
1034 self.igmp_exclude_empty_src_list()
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001035 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001036 reactor.callLater(0, igmp_exclude_empty_src_list)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001037 return df
1038
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001039 def igmp_join_sourceip_0_0_0_0(self, df = None):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001040 groups1 = (self.MGROUP1,)
1041 groups2 = (self.MGROUP2,)
1042 groups = groups1 + groups2
1043 ip_src = '0.0.0.0'
1044 self.igmp_send_joins_different_groups_srclist(groups,
1045 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
1046 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1047 ip_src = self.IP_SRC
1048 dst_mac = '01:00:5e:02:02:03'
1049 src_ip = '5.5.5.5'
1050 if df is None:
1051 df = defer.Deferred()
1052 igmpState1 = IGMPTestState(groups = groups2, df = df)
1053 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1054 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1055 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1056 mcastTraffic1.start()
1057 join_state1 = IGMPTestState(groups = groups2)
1058 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001059 log.info('Interface is receiving traffic from multicast groups %s when we sent join with source IP is 0.0.0.0' %groups2)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001060 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001061
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001062 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001063 def test_igmp_join_sourceip_0_0_0_0(self):
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001064 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001065 def igmp_join_sourceip_0_0_0_0():
1066 self.igmp_join_sourceip_0_0_0_0(df = df)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001067 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001068 reactor.callLater(0, igmp_join_sourceip_0_0_0_0)
Chetan Gaonker8bbc4d52016-03-29 16:59:45 -07001069 return df
1070
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001071 def igmp_invalid_join_packet(self, df = None):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001072 groups1 = (self.MGROUP1,)
1073 groups2 = (self.MINVALIDGROUP1,)
1074 groups = groups1 + groups2
1075 ip_src = '1.1.1.1'
1076 self.igmp_send_joins_different_groups_srclist(groups,
1077 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
1078 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1079 ip_src = self.IP_SRC
1080 dst_mac = '01:00:5e:02:02:03'
1081 src_ip = '5.5.5.5'
1082 if df is None:
1083 df = defer.Deferred()
1084 igmpState1 = IGMPTestState(groups = groups2, df = df)
1085 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1086 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1087 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1088 mcastTraffic1.start()
1089 join_state1 = IGMPTestState(groups = groups2)
1090 target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
1091 assert target1==1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001092 log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001093 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001094
Chetan Gaonker586fec32016-04-29 17:33:54 -07001095 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001096 def test_igmp_invalid_join_packet(self):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001097 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001098 def igmp_invalid_join_packet():
1099 self.igmp_invalid_join_packet(df = df)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001100 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001101 reactor.callLater(0, igmp_invalid_join_packet)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001102 return df
1103
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001104 def igmp_join_data_receiving_during_subscriber_link_toggle(self, df = None):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001105 groups1 = (self.MGROUP1,)
1106 groups2 = (self.MGROUP2,)
1107 groups = groups1 + groups2
1108 ip_src = '1.1.1.1'
1109 self.igmp_send_joins_different_groups_srclist(groups,
1110 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
1111 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1112 ip_src = self.IP_SRC
1113 dst_mac = '01:00:5e:02:02:03'
1114 src_ip = '5.5.5.5'
1115 if df is None:
1116 df = defer.Deferred()
1117 igmpState1 = IGMPTestState(groups = groups2, df = df)
1118 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1119 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1120 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1121 mcastTraffic1.start()
1122 join_state1 = IGMPTestState(groups = groups2)
1123 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001124 log.info('Interface is receiving traffic from multicast groups, before bring down the self.V_INF1=%s ' %self.V_INF1)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001125 os.system('ifconfig '+self.V_INF1+' down')
1126 log.info(' the self.V_INF1 %s is down now ' %self.V_INF1)
1127 os.system('ifconfig '+self.V_INF1)
1128 time.sleep(10)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001129 os.system('ifconfig '+self.V_INF1+' up')
1130 os.system('ifconfig '+self.V_INF1)
1131 log.info(' the self.V_INF1 %s is up now ' %self.V_INF1)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001132 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001133 log.info('Interface is receiving traffic from multicast groups %s when we nterface up after down ' %groups2)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001134 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001135
Chetan Gaonker586fec32016-04-29 17:33:54 -07001136 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001137 def test_igmp_join_data_received_during_subscriber_link_toggle(self):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001138 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001139 def igmp_join_data_received_during_subscriber_link_toggle():
1140 self.igmp_join_data_received_during_subscriber_link_toggle(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001141 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001142 reactor.callLater(0, igmp_join_data_received_during_subscriber_link_toggle)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001143 return df
1144
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001145 def igmp_join_data_received_during_channel_distributor_link_toggle(self, df = None):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001146 groups1 = (self.MGROUP1,)
1147 groups2 = (self.MGROUP2,)
1148 groups = groups1 + groups2
1149 ip_src = '1.1.1.1'
1150 self.igmp_send_joins_different_groups_srclist(groups,
1151 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5', '6.6.6.6']),
1152 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1153 ip_src = self.IP_SRC
1154 dst_mac1 = '01:00:5e:01:02:03'
1155 dst_mac2 = '01:00:5e:02:02:03'
1156 src_ip2 = '5.5.5.5'
1157 src_ip1 = '2.2.2.2'
1158 if df is None:
1159 df = defer.Deferred()
1160 igmpState1 = IGMPTestState(groups = groups1, df = df)
1161 igmpState2 = IGMPTestState(groups = groups2, df = df)
1162 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1163 igmpStateRecv2 = IGMPTestState(groups = groups2, df = df)
1164 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac1,
1165 src_ip = src_ip1, cb = self.send_mcast_cb, arg = igmpState1)
1166 mcastTraffic2 = McastTraffic(groups2, iface= 'veth3', dst_mac = dst_mac2,
1167 src_ip = src_ip2, cb = self.send_mcast_cb, arg = igmpState2)
1168 mcastTraffic1.start()
1169 mcastTraffic2.start()
1170 join_state1 = IGMPTestState(groups = groups1)
1171 join_state2 = IGMPTestState(groups = groups2)
1172 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1173 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001174 mcastTraffic1.stop()
1175 os.system('ifconfig '+'veth2'+' down')
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001176 os.system('ifconfig '+'veth2')
1177 time.sleep(10)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001178 target2 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001179 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1180 assert target1==1, 'EXPECTED FAILURE'
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001181 os.system('ifconfig '+'veth2'+' up')
1182 os.system('ifconfig '+'veth2')
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001183 time.sleep(10)
1184 mcastTraffic1.start()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001185 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1186 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state2)
1187 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001188 mcastTraffic2.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001189
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001190 ## This test case is failing to receive traffic from multicast data from defferent channel interfaces TO-DO
1191 ###### TO DO scenario #######
1192 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+60)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001193 def test_igmp_join_data_received_during_channel_distributors_link_toggle(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001194 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001195 def igmp_join_data_receiving_during_channel_distributor_link_toggle():
1196 self.igmp_join_data_receiving_during_channel_distributor_link_toggle(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001197 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001198 reactor.callLater(0, igmp_join_data_receiving_during_channel_distributor_link_toggle)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001199 return df
Chetan Gaonker586fec32016-04-29 17:33:54 -07001200
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001201 def igmp_invalidClassD_IP_join_packet(self, df = None):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001202 groups1 = (self.MGROUP1,)
1203 groups2 = (self.MINVALIDGROUP2,)
1204 groups = groups1 + groups2
1205 ip_src = '1.1.1.1'
1206 self.igmp_send_joins_different_groups_srclist(groups,
1207 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
1208 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1209 ip_src = self.IP_SRC
1210 dst_mac = '01:00:5e:02:02:03'
1211 src_ip = '5.5.5.5'
1212 if df is None:
1213 df = defer.Deferred()
1214 igmpState1 = IGMPTestState(groups = groups2, df = df)
1215 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1216 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1217 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1218 mcastTraffic1.start()
1219 join_state1 = IGMPTestState(groups = groups2)
1220 target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
1221 assert target1==1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001222 log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001223 mcastTraffic1.stop()
Chetan Gaonker586fec32016-04-29 17:33:54 -07001224
1225 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001226 def test_igmp_invalid_class_d_ip_for_join_packet(self):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001227 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001228 def igmp_invalidClass_D_IP_join_packet():
1229 self.igmp_invalidClass_D_IP_join_packet(df = df)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001230 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001231 reactor.callLater(0, igmp_invalidClassD_IP_join_packet)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001232 return df
1233
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001234 def igmp_invalidClassD_IP_as_srclistIP_join_packet(self, df = None):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001235 groups1 = (self.MGROUP1,)
1236 groups2 = (self.MGROUP2,)
1237 groups = groups1 + groups2
1238 ip_src = '1.1.1.1'
1239 self.igmp_send_joins_different_groups_srclist(groups,
1240 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['239.5.5.5']),
1241 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1242 ip_src = self.IP_SRC
1243 dst_mac = '01:00:5e:02:02:03'
1244 src_ip = '5.5.5.5'
1245 if df is None:
1246 df = defer.Deferred()
1247 igmpState1 = IGMPTestState(groups = groups2, df = df)
1248 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1249 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1250 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1251 mcastTraffic1.start()
1252 join_state1 = IGMPTestState(groups = groups2)
1253 target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
1254 assert target1==1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001255 log.info('Interface is not receiving traffic from multicast groups %s when we sent invalid join packet ' %groups2)
Chetan Gaonker586fec32016-04-29 17:33:54 -07001256 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001257
Chetan Gaonker586fec32016-04-29 17:33:54 -07001258 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001259 def test_igmp_invalid_class_d_ip_as_srclist_ip_for_join_packet(self):
Chetan Gaonker586fec32016-04-29 17:33:54 -07001260 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001261 def igmp_invalidClassD_IP_as_srclistIP_join_packet():
1262 self.igmp_invalidClassD_IP_as_srclistIP_join_packet(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001263 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001264 reactor.callLater(0, igmp_invalidClassD_IP_as_srclistIP_join_packet)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001265 return df
Chetan Gaonkerf72ca402016-05-02 16:29:32 -07001266
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001267 def igmp_general_query_recv_packet(self, df = None):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001268 groups1 = (self.MGROUP1,)
1269 groups2 = (self.MGROUP2,)
1270 groups = groups1 + groups2
1271 ip_src = '1.1.1.1'
1272 self.igmp_send_joins_different_groups_srclist(groups,
1273 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
1274 intf = self.V_INF1, delay = 2, ip_src = ip_src)
1275 ip_src = self.IP_SRC
1276 dst_mac = '01:00:5e:02:02:03'
1277 src_ip = '5.5.5.5'
1278 if df is None:
1279 df = defer.Deferred()
1280 igmpState1 = IGMPTestState(groups = groups2, df = df)
1281 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1282 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1283 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1284 mcastTraffic1.start()
1285 join_state1 = IGMPTestState(groups = groups2)
1286 log.info('Started delay to verify multicast data taraffic for group %s is received or not for 180 sec ' %groups2)
1287 time.sleep(100)
1288 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
1289 log.info('Verified that multicast data for group %s is received after 100 sec ' %groups2)
1290 time.sleep(50)
1291 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
1292 log.info('Verified that multicast data for group %s is received after 150 sec ' %groups2)
1293 time.sleep(30)
1294 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
1295 log.info('Verified that multicast data for group %s is received after 180 sec ' %groups2)
1296 time.sleep(10)
1297 target2 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
1298 log.info('Verified that multicast data for group %s is received after 190 sec ' %groups2)
1299 target3 = mcastTraffic1.isRecvStopped()
1300 assert target3==False, 'EXPECTED FAILURE'
1301 log.info('Verified that multicast data for a group %s is still transmitting from a data interface' %groups2)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001302 log.info('Now checking join interface is receiving a multicast data for group %s after 190 sec' %groups2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001303 target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
1304 assert target1==1, 'EXPECTED FAILURE'
1305 log.info('Interface is not receiving multicast data for group %s' %groups2)
1306 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001307
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001308 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+250)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001309 def test_igmp_general_query_received_traffic(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001310 df = defer.Deferred()
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001311 def igmp_general_query_recv_packet():
1312 self.igmp_general_query_recv_packet(df = df)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001313 df.callback(0)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001314 reactor.callLater(0, igmp_general_query_recv_packet)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001315 return df
A.R Karthick95d044e2016-06-10 18:44:36 -07001316
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001317 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+100)
1318 def test_igmp_query_received_on_joining_interface(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001319 groups = ['224.0.1.10', '225.0.0.10']
1320 leave_groups = ['224.0.1.10']
1321 df = defer.Deferred()
1322 igmpState = IGMPTestState(groups = groups, df = df)
1323 igmpStateRecv = IGMPTestState(groups = groups, df = df)
1324 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -07001325 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001326 arg = igmpState)
1327 self.df = df
1328 self.mcastTraffic = mcastTraffic
1329 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -07001330
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001331 def igmp_srp_task(stateList):
1332 igmpSendState, igmpRecvState = stateList
1333 if not mcastTraffic.isRecvStopped():
1334 result = self.igmp_recv(igmpRecvState)
1335 reactor.callLater(0, igmp_srp_task, stateList)
1336 else:
1337 self.mcastTraffic.stop()
1338 self.recv_socket.close()
1339 self.igmp_verify_leave(stateList, leave_groups)
1340 self.df.callback(0)
1341
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001342 log.info('Sending join packet and expect to receive on general query packet after 60 sec for multicast %s ' %groups)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001343 self.send_igmp_join_recvQuery(groups)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001344 log.info('Received a general query packet for multicast %s group on joing interface and sending traffic' %groups)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001345 mcastTraffic.start()
1346 self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
1347 reactor.callLater(0, igmp_srp_task, igmpStateList)
1348 return df
1349
1350 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+190)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001351 def test_igmp_for_periodic_query_received_on_joining_interface(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001352 groups = ['224.0.1.10', '225.0.0.10']
1353 leave_groups = ['224.0.1.10']
1354 df = defer.Deferred()
1355 igmpState = IGMPTestState(groups = groups, df = df)
1356 igmpStateRecv = IGMPTestState(groups = groups, df = df)
1357 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -07001358 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001359 arg = igmpState)
1360 self.df = df
1361 self.mcastTraffic = mcastTraffic
1362 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -07001363
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001364 def igmp_srp_task(stateList):
1365 igmpSendState, igmpRecvState = stateList
1366 if not mcastTraffic.isRecvStopped():
1367 result = self.igmp_recv(igmpRecvState)
1368 reactor.callLater(0, igmp_srp_task, stateList)
1369 else:
1370 self.mcastTraffic.stop()
1371 self.recv_socket.close()
1372 self.igmp_verify_leave(stateList, leave_groups)
1373 self.df.callback(0)
1374
1375 self.send_igmp_join_recvQuery(groups,3)
1376 return df
1377
1378 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+190)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001379 def test_igmp_for_periodic_query_received_and_checking_entry_deleted(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001380 groups = ['224.0.1.10', '225.0.0.10']
1381 leave_groups = ['224.0.1.10']
1382 df = defer.Deferred()
1383 igmpState = IGMPTestState(groups = groups, df = df)
1384 igmpStateRecv = IGMPTestState(groups = groups, df = df)
1385 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -07001386 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001387 arg = igmpState)
1388 self.df = df
1389 self.mcastTraffic = mcastTraffic
1390 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -07001391
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001392 def igmp_srp_task(stateList):
1393 igmpSendState, igmpRecvState = stateList
1394 if not mcastTraffic.isRecvStopped():
1395 result = self.igmp_recv(igmpRecvState)
1396 reactor.callLater(0, igmp_srp_task, stateList)
1397 else:
1398 self.mcastTraffic.stop()
1399 self.recv_socket.close()
1400 self.igmp_verify_leave(stateList, leave_groups)
1401 self.df.callback(0)
1402
1403 self.send_igmp_join_recvQuery(groups,3)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001404 log.info('Received periodic general query packets for multicast %s, now checking entry is deleted from tabel by sending traffic for that group' %groups)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001405 mcastTraffic.start()
1406 self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
1407 reactor.callLater(0, igmp_srp_task, igmpStateList)
1408 return df
1409
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001410 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+190)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001411 def test_igmp_member_query_interval_and_expiry_for_rejoining_interface(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001412 groups = ['224.0.1.10', '225.0.0.10']
1413 leave_groups = ['224.0.1.10']
1414 df = defer.Deferred()
1415 igmpState = IGMPTestState(groups = groups, df = df)
1416 igmpStateRecv = IGMPTestState(groups = groups, df = df)
1417 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -07001418 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001419 arg = igmpState)
1420 self.df = df
1421 self.mcastTraffic = mcastTraffic
1422 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -07001423
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001424 def igmp_srp_task(stateList):
1425 igmpSendState, igmpRecvState = stateList
1426 if not mcastTraffic.isRecvStopped():
1427 result = self.igmp_recv(igmpRecvState)
1428 reactor.callLater(0, igmp_srp_task, stateList)
1429 else:
1430 self.mcastTraffic.stop()
1431 self.recv_socket.close()
1432 self.igmp_verify_leave(stateList, leave_groups)
1433 self.df.callback(0)
1434
1435 self.send_igmp_join_recvQuery(groups,3)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001436 log.info('Received periodic general query packets for multicast %s, now sending join packet again and verifying traffic for that group is received or not on joining interface' %groups)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001437 self.send_igmp_join(groups)
1438 mcastTraffic.start()
1439 self.test_timer = reactor.callLater(self.MCAST_TRAFFIC_TIMEOUT, self.mcast_traffic_timer)
1440 reactor.callLater(0, igmp_srp_task, igmpStateList)
1441 return df
1442
1443 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+50)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001444 def test_igmp_leave_received_group_and_source_specific_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001445 groups = ['224.0.1.10', '225.0.0.10']
1446 leave_groups = ['224.0.1.10']
1447 df = defer.Deferred()
1448 igmpState = IGMPTestState(groups = groups, df = df)
1449 igmpStateRecv = IGMPTestState(groups = groups, df = df)
1450 igmpStateList = (igmpState, igmpStateRecv)
A.R Karthick95d044e2016-06-10 18:44:36 -07001451 mcastTraffic = McastTraffic(groups, iface= 'veth2', cb = self.send_mcast_cb,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001452 arg = igmpState)
1453 self.df = df
1454 self.mcastTraffic = mcastTraffic
1455 self.recv_socket = L3PacketSocket(iface = 'veth0', type = ETH_P_IP)
A.R Karthick95d044e2016-06-10 18:44:36 -07001456
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001457 def igmp_srp_task(stateList):
1458 igmpSendState, igmpRecvState = stateList
1459 if not mcastTraffic.isRecvStopped():
1460 result = self.igmp_recv(igmpRecvState)
1461 reactor.callLater(0, igmp_srp_task, stateList)
1462 else:
1463 self.mcastTraffic.stop()
1464 self.recv_socket.close()
1465 self.igmp_verify_leave(stateList, leave_groups)
1466 self.df.callback(0)
1467
1468 self.send_igmp_join(groups)
1469 self.send_igmp_leave_listening_group_specific_query(leave_groups, delay = 3)
1470 return df
1471
1472 def igmp_change_to_exclude_src_list_check_for_group_source_specific_query(self, df = None):
1473 groups1 = (self.MGROUP1,)
1474 groups2 = (self.MGROUP2,)
1475 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
1476 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1477 intf = self.V_INF1, delay = 2)
1478 dst_mac = '01:00:5e:01:02:03'
1479 src_ip = '2.2.2.2'
1480 if df is None:
1481 df = defer.Deferred()
1482 igmpState1 = IGMPTestState(groups = groups1, df = df)
1483 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1484 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1485 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1486 mcastTraffic1.start()
1487 join_state1 = IGMPTestState(groups = groups1)
1488 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1489 self.send_igmp_leave_listening_group_specific_query(groups = groups1, src_list = ['2.2.2.2'], iface = self.V_INF1, delay =2)
1490 time.sleep(10)
1491 target2 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1492 assert target2 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001493 log.info('Interface is not receiving traffic from multicast groups %s after sending CHANGE_TO_EXCLUDE' %groups2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001494 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001495
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001496 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+60)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001497 def test_igmp_change_to_exclude_src_list_and_check_for_group_source_specific_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001498 df = defer.Deferred()
1499 def igmp_change_to_exclude_src_list_check_for_group_source_specific_query():
1500 self.igmp_change_to_exclude_src_list_check_for_group_source_specific_query(df = df)
1501 df.callback(0)
1502 reactor.callLater(0, igmp_change_to_exclude_src_list_check_for_group_source_specific_query)
1503 return df
1504
1505 def igmp_change_to_include_src_list_check_for_general_query(self, df = None):
1506 groups1 = (self.MGROUP1,)
1507 groups2 = (self.MGROUP2,)
1508 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4'],
1509 iface = self.V_INF1, delay = 2)
1510 dst_mac = '01:00:5e:01:02:03'
1511 src_ip = '2.2.2.2'
1512 if df is None:
1513 df = defer.Deferred()
1514 igmpState1 = IGMPTestState(groups = groups1, df = df)
1515 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1516 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1517 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1518 mcastTraffic1.start()
1519 join_state1 = IGMPTestState(groups = groups1)
1520 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1521 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001522 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001523 self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,
1524 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['6.6.6.6', '5.5.5.5']),
1525 intf = self.V_INF1, delay = 2,query_group1 = 'group1', query_group2 = None)
1526 time.sleep(10)
1527 target2 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001528 log.info('Interface is receiving traffic from multicast groups %s after send Change to include message' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001529 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001530
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001531 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+80)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001532 def test_igmp_change_to_include_src_list_and_check_for_general_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001533 df = defer.Deferred()
1534 def igmp_change_to_include_src_list_check_for_general_query():
1535 self.igmp_change_to_include_src_list_check_for_general_query(df = df)
1536 df.callback(0)
1537 reactor.callLater(0, igmp_change_to_include_src_list_check_for_general_query)
1538 return df
1539
1540 def igmp_allow_new_src_list_check_for_general_query(self, df = None):
1541 groups1 = (self.MGROUP1,)
1542 groups2 = (self.MGROUP2,)
1543 self.igmp_send_joins_different_groups_srclist(groups1+groups2,
1544 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1545 intf = self.V_INF1, delay = 2)
1546 dst_mac = '01:00:5e:01:02:03'
1547 src_ip = '6.6.6.6'
1548 if df is None:
1549 df = defer.Deferred()
1550 igmpState1 = IGMPTestState(groups = groups1, df = df)
1551 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1552 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1553 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1554 mcastTraffic1.start()
1555 join_state1 = IGMPTestState(groups = groups1)
1556 target1 = self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1557 #assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001558 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001559 self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2, (['2.2.2.2', '6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1560 intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
1561 target2 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001562 log.info('Interface is receiving traffic from multicast groups %s after sending join with new source list' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001563 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001564
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001565 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+80)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001566 def test_igmp_allow_new_src_list_and_check_for_general_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001567 df = defer.Deferred()
1568 def igmp_allow_new_src_list_check_for_general_query():
1569 self.igmp_allow_new_src_list_check_for_general_query(df = df)
1570 df.callback(0)
1571 reactor.callLater(0, igmp_allow_new_src_list_check_for_general_query)
1572 return df
1573
1574 def igmp_block_old_src_list_check_for_group_source_specific_query(self, df = None):
1575 groups1 = (self.MGROUP1,)
1576 groups2 = (self.MGROUP2,)
1577 groups = groups1 + groups2
1578 self.igmp_send_joins_different_groups_srclist(groups,
1579 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1580 intf = self.V_INF1, delay = 2)
1581 dst_mac = '01:00:5e:02:02:03'
1582 src_ip = '5.5.5.5'
1583 if df is None:
1584 df = defer.Deferred()
1585 igmpState1 = IGMPTestState(groups = groups2, df = df)
1586 igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
1587 mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
1588 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1589 mcastTraffic1.start()
1590 join_state1 = IGMPTestState(groups = groups2)
1591 target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001592 log.info('Interface is receiving traffic from multicast groups %s' %groups2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001593 self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups,
1594 (['6.6.6.6', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '7.7.7.7']),
1595 intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
1596 target2 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
1597 assert target2 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001598 log.info('Interface is not receiving traffic from multicast groups %s after sending join with block old source list' %groups2)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001599 mcastTraffic1.stop()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001600
1601 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+90)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001602 def test_igmp_block_old_src_list_and_check_for_group_source_specific_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001603 df = defer.Deferred()
1604 def igmp_block_old_src_list_check_for_group_source_specific_query():
1605 self.igmp_block_old_src_list_check_for_group_source_specific_query(df = df)
1606 df.callback(0)
1607 reactor.callLater(0, igmp_block_old_src_list_check_for_group_source_specific_query)
1608 return df
1609
1610 def igmp_include_to_allow_src_list_check_for_general_query(self, df = None):
1611 groups1 = (self.MGROUP1,)
1612 groups2 = (self.MGROUP2,)
1613 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
1614 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1615 intf = self.V_INF1, delay = 2)
1616 dst_mac = '01:00:5e:01:02:03'
1617 src_ip = '2.2.2.2'
1618 if df is None:
1619 df = defer.Deferred()
1620 igmpState1 = IGMPTestState(groups = groups1, df = df)
1621 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1622 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1623 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1624 mcastTraffic1.start()
1625 join_state1 = IGMPTestState(groups = groups1)
1626 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1627 self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,(['2.2.2.2', '3.3.3.3', '4.4.4.4', '6.6.6.6'], ['2.2.2.2', '5.5.5.5']), intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
1628 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1629 mcastTraffic1.stop()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001630
1631 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+40)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001632 def test_igmp_include_to_allow_src_list_and_check_for_general_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001633 df = defer.Deferred()
1634 def igmp_include_to_allow_src_list_check_for_general_query():
1635 self.igmp_include_to_allow_src_list_check_for_general_query(df = df)
1636 df.callback(0)
1637 reactor.callLater(0, igmp_include_to_allow_src_list_check_for_general_query)
1638 return df
1639
1640 def igmp_include_to_block_src_list_check_for_group_source_specific_query(self, df = None):
1641 groups1 = (self.MGROUP1,)
1642 groups2 = (self.MGROUP2,)
1643 self.igmp_send_joins_different_groups_srclist(groups1 + groups2,
1644 (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['2.2.2.2', '5.5.5.5']),
1645 intf = self.V_INF1, delay = 2)
1646 dst_mac = '01:00:5e:01:02:03'
1647 src_ip = '2.2.2.2'
1648 if df is None:
1649 df = defer.Deferred()
1650 igmpState1 = IGMPTestState(groups = groups1, df = df)
1651 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1652 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1653 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1654 mcastTraffic1.start()
1655 join_state1 = IGMPTestState(groups = groups1)
1656 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1657 self.send_igmp_leave_listening_group_specific_query(groups = groups1, src_list = ['6.6.6.6','7.7.7.7'],
1658 iface = self.V_INF1, delay = 2)
1659 target1 = self.igmp_recv_task(self.V_INF1, groups1, join_state1)
1660 mcastTraffic1.stop()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001661
1662 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+40)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001663 def test_igmp_include_to_block_src_list_and_check_for_group_source_specific_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001664 df = defer.Deferred()
1665 def igmp_include_to_block_src_list_check_for_group_source_specific_query():
1666 self.igmp_include_to_block_src_list_check_for_group_source_specific_query(df = df)
1667 df.callback(0)
1668 reactor.callLater(0, igmp_include_to_block_src_list_check_for_group_source_specific_query)
1669 return df
1670
1671 def igmp_exclude_to_allow_src_list_check_for_general_query(self, df = None):
1672 groups1 = (self.MGROUP1,)
1673 groups2 = (self.MGROUP2,)
1674 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4'],
1675 iface = self.V_INF1, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -07001676
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001677 dst_mac = '01:00:5e:01:02:03'
1678 src_ip = '2.2.2.2'
1679 if df is None:
1680 df = defer.Deferred()
1681 igmpState1 = IGMPTestState(groups = groups1, df = df)
1682 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1683 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1684 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1685 mcastTraffic1.start()
1686 join_state1 = IGMPTestState(groups = groups1)
1687 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1688 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001689 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001690 self.igmp_send_joins_different_groups_srclist_wait_query_packets(groups1 + groups2,
1691 (['6.6.6.6', '7.7.7.7', '8.8.8.8'], ['6.6.6.6', '5.5.5.5']), intf = self.V_INF1, delay = 2, query_group1 = 'group1', query_group2 = None)
1692 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1693 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001694 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001695 mcastTraffic1.stop()
A.R Karthick95d044e2016-06-10 18:44:36 -07001696
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001697 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+90)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001698 def test_igmp_exclude_to_allow_src_list_and_check_for_general_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001699 df = defer.Deferred()
1700 def igmp_exclude_to_allow_src_list_check_for_general_query():
1701 self.igmp_exclude_to_allow_src_list_check_for_general_query(df = df)
1702 df.callback(0)
1703 reactor.callLater(0, igmp_exclude_to_allow_src_list_check_for_general_query)
1704 return df
1705
1706 def igmp_exclude_to_block_src_list_check_for_group_source_specific_query(self, df = None):
1707 groups1 = (self.MGROUP1,)
1708 groups2 = (self.MGROUP2,)
1709 self.send_igmp_leave(groups = groups1, src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4'],
1710 iface = self.V_INF1, delay = 2)
A.R Karthick95d044e2016-06-10 18:44:36 -07001711
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001712 dst_mac = '01:00:5e:01:02:03'
1713 src_ip = '2.2.2.2'
1714 if df is None:
1715 df = defer.Deferred()
1716 igmpState1 = IGMPTestState(groups = groups1, df = df)
1717 igmpStateRecv1 = IGMPTestState(groups = groups1, df = df)
1718 mcastTraffic1 = McastTraffic(groups1, iface= 'veth2', dst_mac = dst_mac,
1719 src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
1720 mcastTraffic1.start()
1721 join_state1 = IGMPTestState(groups = groups1)
1722 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1723 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001724 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
A.R Karthick95d044e2016-06-10 18:44:36 -07001725 self.send_igmp_leave_listening_group_specific_query(groups = groups1,
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001726 src_list = ['2.2.2.2', '3.3.3.3', '4.4.4.4', '5.5.5.5', '7.7.7.7'],
1727 iface = self.V_INF1, delay = 2)
1728 target1= self.igmp_not_recv_task(self.V_INF1, groups1, join_state1)
1729 assert target1 == 1, 'EXPECTED FAILURE'
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001730 log.info('Interface is not receiving traffic from multicast groups %s' %groups1)
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001731 mcastTraffic1.stop()
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001732
1733 @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+40)
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001734 def test_igmp_exclude_to_block_src_list_and_check_for_group_source_specific_query(self):
Chetan Gaonker441c9ac2016-05-06 10:30:13 -07001735 df = defer.Deferred()
1736 def igmp_exclude_to_block_src_list_check_for_group_source_specific_query():
1737 self.igmp_exclude_to_block_src_list_check_for_group_source_specific_query(df = df)
1738 df.callback(0)
1739 reactor.callLater(0, igmp_exclude_to_block_src_list_check_for_group_source_specific_query)
1740 return df
ChetanGaonkera7e2b412016-09-01 23:19:07 -07001741
1742 def iptomac(self, mcast_ip):
1743 mcast_mac = '01:00:5e:'
1744 octets = mcast_ip.split('.')
1745 second_oct = int(octets[1]) & 127
1746 third_oct = int(octets[2])
1747 fourth_oct = int(octets[3])
1748 mcast_mac = mcast_mac + format(second_oct,'02x') + ':' + format(third_oct, '02x') + ':' + format(fourth_oct, '02x')
1749 return mcast_mac
1750
1751 def send_multicast_data_traffic(self, group, intf= 'veth2',source = '1.2.3.4'):
1752 dst_mac = self.iptomac(group)
1753 eth = Ether(dst= dst_mac)
1754 ip = IP(dst=group,src=source)
1755 data = repr(monotonic.monotonic())
1756 sendp(eth/ip/data,count=20, iface = intf)
1757 pkt = (eth/ip/data)
1758 #log.info('multicast traffic packet %s'%pkt.show())
1759
1760 def verify_igmp_data_traffic(self, group, intf='veth0', source='1.2.3.4' ):
1761 log.info('verifying multicast traffic for group %s from source %s'%(group,source))
1762 self.success = False
1763 def recv_task():
1764 def igmp_recv_cb(pkt):
1765 #log.info('received multicast data packet is %s'%pkt.show())
1766 log.info('multicast data received for group %s from source %s'%(group,source))
1767 self.success = True
1768 sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group and p[IP].src == source, count=1,timeout = 2, iface='veth0')
1769 t = threading.Thread(target = recv_task)
1770 t.start()
1771 self.send_multicast_data_traffic(group,source=source)
1772 t.join()
1773 return self.success
1774
1775 def test_igmp_include_exclude_modes(self):
1776 groups = ['224.2.3.4','230.5.6.7']
1777 src_list = ['2.2.2.2','3.3.3.3']
1778 dst_mac1 = self.iptomac(groups[0])
1779 dst_mac2 = self.iptomac(groups[1])
1780 self.onos_ssm_table_load(groups, src_list=src_list)
1781 self.send_igmp_join(groups = [groups[0]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
1782 iface = self.V_INF1, delay = 2)
1783 self.send_igmp_join(groups = [groups[1]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_EXCLUDE,
1784 iface = self.V_INF1, delay = 2)
1785 status = self.verify_igmp_data_traffic(groups[0],intf=self.V_INF1,source=src_list[0])
1786 assert_equal(status,True)
1787 status = self.verify_igmp_data_traffic(groups[1],intf = self.V_INF1,source= src_list[1])
1788 assert_equal(status,False)
1789
1790 def test_igmp_allow_new_source_mode(self):
1791 group = ['224.8.9.3']
1792 src_list = ['2.2.2.2','3.3.3.3']
1793 #dst_mac = self.iptomac(group[0])
1794 self.onos_ssm_table_load(group, src_list)
1795 self.send_igmp_join(groups = group, src_list = src_list[0],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1796 iface = self.V_INF1, delay = 1)
1797 status = self.verify_igmp_data_traffic(group[0], intf=self.V_INF1,source = src_list[0])
1798 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
1799 self.send_igmp_join(groups = group, src_list = src_list[1],record_type = IGMP_V3_GR_TYPE_ALLOW_NEW,
1800 iface = self.V_INF1, delay = 1)
1801 for src in src_list:
1802 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1, source=src)
1803 assert_equal(status,True) # expecting igmp data traffic from both sources
1804
1805
1806 def test_igmp_include_to_exclude_mode_change(self):
1807 group = ['224.2.3.4']
1808 src_list = ['2.2.2.2','3.3.3.3']
1809 dst_mac = self.iptomac(group[0])
1810 self.onos_ssm_table_load(group, src_list)
1811 self.send_igmp_join(groups = group, src_list = src_list[0],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1812 iface = self.V_INF1, delay = 1)
1813 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source= src_list[0])
1814 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
1815 self.send_igmp_join(groups = group, src_list = src_list[1],record_type = IGMP_V3_GR_TYPE_EXCLUDE,
1816 iface = self.V_INF1, delay = 1)
1817 for src in src_list:
1818 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source= src)
1819 assert_equal(status,False) # expecting igmp data traffic from both sources
1820
1821 def test_igmp_exclude_to_include_mode_change(self):
1822 group = ['224.2.3.4']
1823 src = ['2.2.2.2']
1824 dst_mac = self.iptomac(group[0])
1825 self.onos_ssm_table_load(group, src)
1826 self.send_igmp_join(groups = group, src_list = src,record_type = IGMP_V3_GR_TYPE_EXCLUDE,
1827 iface = self.V_INF1, delay = 1)
1828 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
1829 assert_equal(status,False) # not expecting igmp data traffic from source src_list[0]
1830 self.send_igmp_join(groups = group, src_list = src,record_type = IGMP_V3_GR_TYPE_INCLUDE,
1831 iface = self.V_INF1, delay = 1)
1832 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source = src[0])
1833 assert_equal(status,True) # expecting igmp data traffic from both sources
1834
1835 #this test case wotks properly if the snooping device(ONOS) have multicast router connected.
1836 def test_igmp_to_include_mode_with_null_source(self):
1837 groups = ['224.2.3.4','230.7.9.8']
1838 src = ['192.168.12.34']
1839 dst_mac = []
1840 dst_mac.append(self.iptomac(groups[0]))
1841 dst_mac.append(self.iptomac(groups[1]))
1842 self.onos_ssm_table_load(groups, src)
1843 self.send_igmp_join(groups = groups, src_list = src,record_type = IGMP_V3_GR_TYPE_INCLUDE,
1844 iface = self.V_INF1, delay = 1)
1845 for grp in groups:
1846 status = self.verify_igmp_data_traffic(grp,intf=self.V_INF1,source= src[0])
1847 assert_equal(status,True) # not expecting igmp data traffic from source src_list[0]
1848 #sending leave packet for group groups[1]
1849 self.send_igmp_join(groups = [groups[1]], src_list = [],record_type = IGMP_V3_GR_TYPE_CHANGE_TO_INCLUDE,
1850 iface = self.V_INF1, delay = 1)
1851 for grp in groups:
1852 status = self.verify_igmp_data_traffic(grp,intf=self.V_INF1,source= src[0])
1853 if grp is groups[0]:
1854 assert_equal(status,True) # expecting igmp data traffic to group groups[0]
1855 else:
1856 assert_equal(status,False) # not expecting igmp data traffic to group groups[1]
1857
1858 def test_igmp_to_include_mode(self):
1859 group = ['229.9.3.6']
1860 src_list = ['192.168.12.34','192.18.1.34']
1861 dst_mac = []
1862 dst_mac = self.iptomac(group[0])
1863 self.onos_ssm_table_load(group, src_list)
1864 self.send_igmp_join(groups = group, src_list = [src_list[0]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1865 iface = self.V_INF1, delay = 1)
1866 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src_list[0])
1867 assert_equal(status,True) # not expecting igmp data traffic from source src_list[0]
1868 self.send_igmp_join(groups = group, src_list = src_list,record_type = IGMP_V3_GR_TYPE_CHANGE_TO_INCLUDE,
1869 iface = self.V_INF1, delay = 1)
1870 for src in src_list:
1871 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source= src)
1872 assert_equal(status,True) # expecting igmp data traffic to group groups[0]
1873
1874 #this test case passed only if mulitcast router connected to ONOS.
1875 def test_igmp_blocking_old_source_mode(self):
1876 group = ['224.2.3.4']
1877 src_list = ['2.2.2.2','3.3.3.3']
1878 dst_mac = self.iptomac(group[0])
1879 self.onos_ssm_table_load(group, src_list)
1880 self.send_igmp_join(groups = group, src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
1881 iface = self.V_INF1, delay = 1)
1882 for src in src_list:
1883 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1, source=src)
1884 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
1885 self.send_igmp_join(groups = group, src_list = [src_list[1]],record_type = IGMP_V3_GR_TYPE_BLOCK_OLD,
1886 iface = self.V_INF1, delay = 1)
1887 for src in src_list:
1888 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1, source=src)
1889 if src is src_list[0]:
1890 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
1891 else:
1892 assert_equal(status,False) # not expecting igmp data traffic from source src_list[1]
1893
1894 def test_igmp_multiple_joins_and_data_verification_with_100_groups(self):
1895 groups = []
1896 sources = []
1897 count = 1
1898 mcastips = self.mcast_ip_range(start_ip = '226.0.0.1',end_ip = '226.0.5.254')
1899 sourceips = self.source_ip_range(start_ip = '10.10.0.1',end_ip = '10.10.5.254')
1900 while count<=100:
1901 group = random.choice(mcastips)
1902 source = random.choice(sourceips)
1903 if group in groups:
1904 pass
1905 else:
1906 log.info('group and source are %s and %s'%(group,source))
1907 groups.append(group)
1908 sources.append(source)
1909 count += 1
1910 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
1911 for i in range(100):
1912 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1913 iface = self.V_INF1)
1914 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
1915 assert_equal(status, True)
1916 log.info('data received for group %s from source %s'%(groups[i],sources[i]))
1917
1918 def test_igmp_multiple_joins_with_data_verification_and_leaving_100_groups(self):
1919 groups = []
1920 sources = []
1921 count = 1
1922 mcastips = self.mcast_ip_range(start_ip = '226.0.0.1',end_ip = '226.0.5.254')
1923 sourceips = self.source_ip_range(start_ip = '10.10.0.1',end_ip = '10.10.5.254')
1924 while count<=100:
1925 group = random.choice(mcastips)
1926 source = random.choice(sourceips)
1927 if group in groups:
1928 pass
1929 else:
1930 log.info('group and source are %s and %s'%(group,source))
1931 groups.append(group)
1932 sources.append(source)
1933 count += 1
1934 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
1935 for i in range(100):
1936 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1937 iface = self.V_INF1)
1938 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
1939 assert_equal(status, True)
1940 log.info('data received for group %s from source %s'%(groups[i],sources[i]))
1941 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_CHANGE_TO_EXCLUDE,
1942 iface = self.V_INF1, delay = 1)
1943 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
1944 assert_equal(status, False)
1945 log.info("data not received for group %s from source %s after changing group mode to 'TO-EXCLUDE' mode"%(groups[i],sources[i]))
1946
1947 def test_igmp_group_source_for_only_config_with_1000_entries(self):
1948 groups = []
1949 sources = []
1950 count = 1
1951 mcastips = self.mcast_ip_range(start_ip = '229.0.0.1',end_ip = '229.0.50.254')
1952 sourceips = self.source_ip_range(start_ip = '10.10.0.1',end_ip = '10.10.50.254')
1953 while count<=1000:
1954 group = random.choice(mcastips)
1955 source = random.choice(sourceips)
1956 if group in groups:
1957 pass
1958 else:
1959 log.info('group and source are %s and %s'%(group,source))
1960 groups.append(group)
1961 sources.append(source)
1962 count += 1
1963 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
1964
1965 def test_igmp_from_exclude_to_include_mode_with_100_groups(self):
1966 groups = []
1967 sources = []
1968 count = 1
1969 mcastips = self.mcast_ip_range(start_ip = '229.0.0.1',end_ip = '229.0.10.254')
1970 sourceips = self.source_ip_range(start_ip = '10.10.0.1',end_ip = '10.10.10.254')
1971 while count<=100:
1972 group = random.choice(mcastips)
1973 source = random.choice(sourceips)
1974 if group in groups:
1975 pass
1976 else:
1977 log.info('group and source are %s and %s'%(group,source))
1978 groups.append(group)
1979 sources.append(source)
1980 count += 1
1981 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
1982 for i in range(100):
1983 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_EXCLUDE,
1984 iface = self.V_INF1)
1985 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
1986 assert_equal(status, False)
1987 log.info('data not received for group %s from source %s as expected'%(groups[i],sources[i]))
1988 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
1989 iface = self.V_INF1)
1990 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
1991 assert_equal(status, True)
1992 log.info("data received for group %s from source %s after changing group mode to 'TO-INCLUDE' mode"%(groups[i],sources[i]))
1993
1994 def test_igmp_with_multiple_joins_and_data_verify_with_1000_groups(self):
1995 groups = []
1996 sources = []
1997 count = 1
1998 mcastips = self.mcast_ip_range(start_ip = '229.0.0.1',end_ip = '229.0.30.254')
1999 sourceips = self.source_ip_range(start_ip = '10.10.0.1',end_ip = '10.10.30.254')
2000 while count<=1000:
2001 group = random.choice(mcastips)
2002 source = random.choice(sourceips)
2003 if group in groups:
2004 pass
2005 else:
2006 log.info('group and source are %s and %s'%(group,source))
2007 groups.append(group)
2008 sources.append(source)
2009 count += 1
2010 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
2011 for i in range(1000):
2012 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
2013 iface = self.V_INF1)
2014 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
2015 assert_equal(status, True)
2016 log.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
2017
2018 def test_igmp_with_multiple_joins_and_data_verify_with_5000_groups(self):
2019 groups = []
2020 sources = []
2021 count = 1
2022 mcastips = self.mcast_ip_range(start_ip = '231.39.19.121',end_ip = '231.40.30.25')
2023 sourceips = self.source_ip_range(start_ip = '192.168.56.43',end_ip = '192.169.110.30')
2024 while count<=5000:
2025 group = random.choice(mcastips)
2026 source = random.choice(sourceips)
2027 if group in groups:
2028 pass
2029 else:
2030 log.info('group and source are %s and %s'%(group,source))
2031 groups.append(group)
2032 sources.append(source)
2033 count += 1
2034 self.onos_ssm_table_load(groups,src_list=sources,flag=True)
2035 for i in range(5000):
2036 self.send_igmp_join(groups = [groups[i]], src_list = [sources[i]],record_type = IGMP_V3_GR_TYPE_INCLUDE,
2037 iface = self.V_INF1)
2038 status = self.verify_igmp_data_traffic(groups[i],intf=self.V_INF1,source=sources[i])
2039 assert_equal(status, True)
2040 log.info('data received for group %s from source %s - %d'%(groups[i],sources[i],i))
2041
2042 """def test_igmp_join_from_multiple_infts(self):
2043 groups = ['229.9.3.6','234.20.56.2']
2044 src_list = ['192.168.12.34','192.18.1.34']
2045 self.onos_ssm_table_load(groups, src_list=src_list)
2046 self.send_igmp_join(groups = [groups[0]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
2047 iface = 'veth0')
2048 self.send_igmp_join(groups = [groups[1]], src_list = src_list,record_type = IGMP_V3_GR_TYPE_INCLUDE,
2049 iface = 'veth2')
2050 status = self.verify_igmp_data_traffic(groups[0],intf='veth0',source=src_list[0])
2051 assert_equal(status,True)
2052 status = self.verify_igmp_data_traffic(groups[1],intf='veth2',source=src_list[1])
2053 assert_equal(status,True) # not expecting igmp data traffic from source src_list[0]
2054 """
2055
2056 def test_igmp_send_data_to_non_registered_group(self):
2057 group = ['224.2.3.4']
2058 src = ['2.2.2.2']
2059 self.onos_ssm_table_load(group,src_list= src)
2060 self.send_igmp_join(groups = ['239.0.0.1'], src_list = src,record_type = IGMP_V3_GR_TYPE_INCLUDE,
2061 iface = self.V_INF1, delay = 1)
2062 status = self.verify_igmp_data_traffic('239.0.0.1',intf=self.V_INF1,source=src[0])
2063 assert_equal(status,False) # not expecting igmp data traffic from source src_list[0]
2064
2065 def test_igmp_traffic_verification_for_registered_group_with_no_join_sent(self):
2066 group = ['227.12.3.40']
2067 src = ['190.4.19.67']
2068 self.onos_ssm_table_load(group,src_list= src)
2069 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
2070 assert_equal(status,False) # not expecting igmp data traffic from source src_list[0]
2071
2072 def test_igmp_toggling_app_activation(self):
2073 group = [self.random_mcast_ip()]
2074 src = [self.randomsourceip()]
2075 self.onos_ssm_table_load(group,src_list= src)
2076 self.send_igmp_join(groups = group, src_list = src,record_type = IGMP_V3_GR_TYPE_INCLUDE,
2077 iface = self.V_INF1)
2078 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
2079 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
2080 log.info('Multicast traffic received for group %s from source %s before the app is deactivated'%(group[0],src[0]))
2081 self.onos_ctrl.deactivate()
2082 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
2083 assert_equal(status,False) #not expecting igmp data traffic from source src_list[0]
2084 log.info('Multicast traffic not received for group %s from source %s after the app is deactivated'%(group[0],src[0]))
2085 self.onos_ctrl.activate()
2086 status = self.verify_igmp_data_traffic(group[0],intf=self.V_INF1,source=src[0])
2087 assert_equal(status,True) # expecting igmp data traffic from source src_list[0]
2088 log.info('Multicast traffic received for group %s from source %s the app is re-activated'%(group[0],src[0]))
2089
2090 def test_igmp_with_mismatch_for_dst_ip_and_mac_in_data_packets(self):
2091 group = ['228.18.19.29']
2092 source = [self.randomsourceip()]
2093 self.onos_ssm_table_load(group,src_list= source)
2094 self.send_igmp_join(groups = group, src_list = source,record_type = IGMP_V3_GR_TYPE_INCLUDE,
2095 iface = self.V_INF1)
2096 dst_mac = '01:00:5e:0A:12:09'
2097 eth = Ether(dst= dst_mac)
2098 ip = IP(dst=group[0],src=source[0])
2099 data = repr(monotonic.monotonic())
2100 pkt = (eth/ip/data)
2101 log.info('Multicast traffic packet %s'%pkt.show())
2102 self.success = False
2103 def recv_task():
2104 def igmp_recv_cb(pkt):
2105 #log.info('received multicast data packet is %s'%pkt.show())
2106 log.info('multicast data received for group %s from source %s'%(group[0],source[0]))
2107 self.success = True
2108 sniff(prn = igmp_recv_cb,lfilter = lambda p: IP in p and p[IP].dst == group[0] and p[IP].src == source[0], count=1,timeout = 2, iface='veth0')
2109 t = threading.Thread(target = recv_task)
2110 t.start()
2111 sendp(eth/ip/data,count=20, iface = 'veth2')
2112 t.join()
2113 assert_equal(status,False) # not expecting igmp data traffic from source src_list[0]
2114
2115 #test case failing, ONOS registering unicast ip also as an igmp join
2116 def test_igmp_registering_invalid_group(self):
2117 groups = ['218.18.19.29','240.10.34.94','224.19.256.10']
2118 source = [self.randomsourceip()]
2119 ssm_dict = {'apps' : { 'org.onosproject.igmp' : { 'ssmTranslate' : [] } } }
2120 ssm_xlate_list = ssm_dict['apps']['org.onosproject.igmp']['ssmTranslate']
2121 for g in groups:
2122 for s in source:
2123 d = {}
2124 d['source'] = s or '0.0.0.0'
2125 d['group'] = g
2126 ssm_xlate_list.append(d)
2127 log.info('onos load config is %s'%ssm_dict)
2128 status, code = OnosCtrl.config(ssm_dict)
2129 assert_equal(status,False)
2130
2131 def test_igmp_registering_invalid_source(self):
2132 groups = [self.random_mcast_ip()]
2133 sources = ['224.10.28.34','193.73.219.257']
2134 ssm_dict = {'apps' : { 'org.onosproject.igmp' : { 'ssmTranslate' : [] } } }
2135 ssm_xlate_list = ssm_dict['apps']['org.onosproject.igmp']['ssmTranslate']
2136 for g in groups:
2137 for s in sources:
2138 d = {}
2139 d['source'] = s or '0.0.0.0'
2140 d['group'] = g
2141 ssm_xlate_list.append(d)
2142 log.info('onos load config is %s'%ssm_dict)
2143 status, code = OnosCtrl.config(ssm_dict)
2144 assert_equal(status,False)
2145