Test: Changes to subscriber multitable changes for single channel, N subscriber tests.
Changes to subscriber onos app to remove metabuilder constraints for next flow objectives.

Change-Id: I6fb91e9706df122c42fce7eb4d6598f3a56b4d71
diff --git a/src/test/utils/Channels.py b/src/test/utils/Channels.py
index ccfebb5..f0f5960 100644
--- a/src/test/utils/Channels.py
+++ b/src/test/utils/Channels.py
@@ -1,12 +1,12 @@
-# 
+#
 # Copyright 2016-present Ciena Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 # http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -36,7 +36,7 @@
     IP_DST = '224.0.1.1'
     igmp_eth = Ether(dst = IGMP_DST_MAC, src = IGMP_SRC_MAC, type = ETH_P_IP)
     igmp_ip = IP(dst = IP_DST, src = IP_SRC)
-    ssm_list = [] 
+    ssm_list = []
 
     def __init__(self, iface = 'veth0', ssm_list = [], src_list = ['1.2.3.4'], delay = 2):
         self.iface = iface
@@ -45,7 +45,7 @@
         self.delay = delay
         self.onos_ctrl = OnosCtrl('org.onosproject.igmp')
         self.onos_ctrl.activate()
-    
+
     def igmp_load_ssm_config(self, ssm_list = []):
         if not ssm_list:
             ssm_list = self.ssm_list
@@ -124,13 +124,12 @@
         self.streams = None
         self.channel_states = {}
         self.last_chan = None
-        self.recv_sock = L2Socket(iface = iface, type = ETH_P_IP)
         self.iface_mcast = iface_mcast
         self.mcast_cb = mcast_cb
         for c in range(self.num):
             self.channel_states[c] = [self.Idle]
         IgmpChannel.__init__(self, ssm_list = self.channels, iface=iface)
-        
+
     def generate(self, num, channel_start = 0):
         start = (225 << 24) | ( ( (channel_start >> 16) & 0xff) << 16 ) | \
             ( ( (channel_start >> 8) & 0xff ) << 8 ) | (channel_start) & 0xff
@@ -187,7 +186,7 @@
         if chan == self.last_chan:
             self.last_chan = None
         return True
-    
+
     def join_next(self, chan = None):
         if chan is None:
             chan = self.last_chan
@@ -198,7 +197,7 @@
         else:
             leave = chan - 1
             join = chan
-        
+
         if join >= self.num:
             join = 0
 
@@ -238,7 +237,7 @@
         recv_time = monotonic.monotonic()
         log.debug('Packet received in %.3f usecs' %(recv_time - send_time))
 
-    def recv(self, chan, cb = None, count = 1):
+    def recv(self, chan, cb = None, count = 1, timeout = 5):
         if chan is None:
             return None
         if type(chan) == type([]) or type(chan) == type(()):
@@ -248,7 +247,8 @@
             groups = (self.gaddr(chan),)
         if cb is None:
             cb = self.recv_cb
-        sniff(prn = cb, count=count, lfilter = lambda p: IP in p and p[IP].dst in groups, opened_socket = self.recv_sock)
+        return sniff(prn = cb, count=count, timeout = timeout,
+                     lfilter = lambda p: IP in p and p[IP].dst in groups, iface = self.iface)
 
     def stop(self):
         if self.streams: