diff --git a/src/test/igmp/igmpTest.py b/src/test/igmp/igmpTest.py
index 9a6bf09..441e845 100644
--- a/src/test/igmp/igmpTest.py
+++ b/src/test/igmp/igmpTest.py
@@ -44,6 +44,7 @@
     MGROUP2 = '239.2.2.3'
     MMACGROUP1 = "01:00:5e:01:02:03"
     MMACGROUP2 = "01:00:5e:02:02:03"
+    MINVALIDGROUP1 = "255.255.255.255"
     IGMP_DST_MAC = "01:00:5e:00:01:01"
     IGMP_SRC_MAC = "5a:e1:ac:ec:4d:a1"
     IP_SRC = '1.2.3.4'
@@ -757,3 +758,158 @@
         reactor.callLater(0, igmp_join_sourceip_0_0_0_0_functionality)
         return df
 
+    def igmp_invalid_join_packet_functionality(self, df = None):
+        groups1 = (self.MGROUP1,)
+        groups2 = (self.MINVALIDGROUP1,)
+        groups = groups1 + groups2
+        ip_src = '1.1.1.1'
+        self.igmp_send_joins_different_groups_srclist(groups,
+                                                      (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
+                                                      intf = self.V_INF1, delay = 2, ip_src = ip_src)
+        ip_src = self.IP_SRC
+        dst_mac = '01:00:5e:02:02:03'
+        src_ip = '5.5.5.5'
+        if df is None:
+              df = defer.Deferred()
+        igmpState1 = IGMPTestState(groups = groups2, df = df)
+        igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
+        mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
+                                     src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
+        mcastTraffic1.start()
+        join_state1 = IGMPTestState(groups = groups2)
+        target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
+        assert target1==1, 'EXPECTED FAILURE'
+        log.info('Interface is not receiving from multicast groups %s when we sent invalid join packet ' %groups2)
+        mcastTraffic1.stop()
+        self.onos_ctrl.deactivate()
+
+    @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
+    def test_igmp_invalid_join_packet_functionality(self):
+        '''This test is sending invalid join with source list A,B,C and exclude D,F,G with multicast group as 255.255.255.255'''
+        df = defer.Deferred()
+        def igmp_invalid_join_packet_functionality():
+              self.igmp_invalid_join_packet_functionality(df = df)
+              df.callback(0)
+        reactor.callLater(0, igmp_invalid_join_packet_functionality)
+        return df
+
+    def igmp_join_data_receiving_during_subscriber_link_down_up_functionality(self, df = None):
+        groups1 = (self.MGROUP1,)
+        groups2 = (self.MGROUP2,)
+        groups = groups1 + groups2
+        ip_src = '1.1.1.1'
+        self.igmp_send_joins_different_groups_srclist(groups,
+                                                      (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
+                                                      intf = self.V_INF1, delay = 2, ip_src = ip_src)
+        ip_src = self.IP_SRC
+        dst_mac = '01:00:5e:02:02:03'
+        src_ip = '5.5.5.5'
+        if df is None:
+              df = defer.Deferred()
+        igmpState1 = IGMPTestState(groups = groups2, df = df)
+        igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
+        mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
+                                     src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
+        mcastTraffic1.start()
+        join_state1 = IGMPTestState(groups = groups2)
+        target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
+        log.info('Interface is receiving data from multicast groups, before bringing it down self.V_INF1=%s  ' %self.V_INF1)
+        os.system('ifconfig '+self.V_INF1+' down')
+        log.info(' the self.V_INF1 %s is down now  ' %self.V_INF1)
+        os.system('ifconfig '+self.V_INF1)
+        time.sleep(10)
+        #target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
+        #assert target1==1, 'EXPECTED FAILURE'
+        #log.info('Interface is not receiving from multicast groups %s when we shutdown the subscriber interface ' %groups2)
+        os.system('ifconfig '+self.V_INF1+' up')
+        os.system('ifconfig '+self.V_INF1)
+        log.info(' the self.V_INF1 %s is up now  ' %self.V_INF1)
+        #target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
+        #assert target1==0, 'EXPECTED FAILURE'
+        #log.info('Interface is not receiving from multicast groups %s when we shutdown the subscriber interface ' %groups2)
+        target1 = self.igmp_recv_task(self.V_INF1, groups2, join_state1)
+        log.info('Interface is receiving data from multicast groups %s when we bring up interface  ' %groups2)
+        mcastTraffic1.stop()
+        self.onos_ctrl.deactivate()
+
+
+    @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
+    def test_igmp_join_data_receiving_during_subscriber_link_down_up_functionality(self):
+        '''This test is sending join with source list A,B,C and exclude D,F,G with valid multicast group during receiving data shutdown the data receiving port  '''
+        df = defer.Deferred()
+        def igmp_join_data_receiving_during_subscriber_link_down_up_functionality():
+            self.igmp_join_data_receiving_during_subscriber_link_down_up_functionality(df = df)
+            df.callback(0)
+        reactor.callLater(0, igmp_join_data_receiving_during_subscriber_link_down_up_functionality)
+        return df
+
+
+    def igmp_invalidClassDIP_join_packet_functionality(self, df = None):
+        groups1 = (self.MGROUP1,)
+        groups2 = (self.MINVALIDGROUP2,)
+        groups = groups1 + groups2
+        ip_src = '1.1.1.1'
+        self.igmp_send_joins_different_groups_srclist(groups,
+                                                      (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['5.5.5.5']),
+                                                      intf = self.V_INF1, delay = 2, ip_src = ip_src)
+        ip_src = self.IP_SRC
+        dst_mac = '01:00:5e:02:02:03'
+        src_ip = '5.5.5.5'
+        if df is None:
+              df = defer.Deferred()
+        igmpState1 = IGMPTestState(groups = groups2, df = df)
+        igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
+        mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
+                                     src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
+        mcastTraffic1.start()
+        join_state1 = IGMPTestState(groups = groups2)
+        target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
+        assert target1==1, 'EXPECTED FAILURE'
+        log.info('Interface is not receiving from multicast groups %s when we sent invalid join packet ' %groups2)
+        mcastTraffic1.stop()
+        self.onos_ctrl.deactivate()
+
+    @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
+    def test_igmp_invalidClassDIP_join_packet_functionality(self):
+        '''This test is sending invalid join with source list A,B,C and exclude D,F,G with multicast group as 239.255.255.255'''
+        df = defer.Deferred()
+        def igmp_invalidClassDIP_join_packet_functionality():
+              self.igmp_invalidClassDIP_join_packet_functionality(df = df)
+              df.callback(0)
+        reactor.callLater(0, igmp_invalidClassDIP_join_packet_functionality)
+        return df
+
+    def igmp_invalidClassDIP_as_srclistIP_join_packet_functionality(self, df = None):
+        groups1 = (self.MGROUP1,)
+        groups2 = (self.MGROUP2,)
+        groups = groups1 + groups2
+        ip_src = '1.1.1.1'
+        self.igmp_send_joins_different_groups_srclist(groups,
+                                                      (['2.2.2.2', '3.3.3.3', '4.4.4.4'], ['239.5.5.5']),
+                                                      intf = self.V_INF1, delay = 2, ip_src = ip_src)
+        ip_src = self.IP_SRC
+        dst_mac = '01:00:5e:02:02:03'
+        src_ip = '5.5.5.5'
+        if df is None:
+              df = defer.Deferred()
+        igmpState1 = IGMPTestState(groups = groups2, df = df)
+        igmpStateRecv1 = IGMPTestState(groups = groups2, df = df)
+        mcastTraffic1 = McastTraffic(groups2, iface= 'veth2', dst_mac = dst_mac,
+                                     src_ip = src_ip, cb = self.send_mcast_cb, arg = igmpState1)
+        mcastTraffic1.start()
+        join_state1 = IGMPTestState(groups = groups2)
+        target1 = self.igmp_not_recv_task(self.V_INF1, groups2, join_state1)
+        assert target1==1, 'EXPECTED FAILURE'
+        log.info('Interface is not receiving from multicast groups %s when we sent invalid join packet ' %groups2)
+        mcastTraffic1.stop()
+        self.onos_ctrl.deactivate()
+
+    @deferred(timeout=MCAST_TRAFFIC_TIMEOUT+20)
+    def test_igmp_invalidClassDIP_as_srclistIP_join_packet_functionality(self):
+        '''This test is sending invalid join with source list A,B,C and exclude D,F,G with source list as  239.5.5.5'''
+        df = defer.Deferred()
+        def igmp_invalidClassDIP_as_srclistIP_join_packet_functionality():
+            self.igmp_invalidClassDIP_as_srclistIP_join_packet_functionality(df = df)
+            df.callback(0)
+        reactor.callLater(0, igmp_invalidClassDIP_as_srclistIP_join_packet_functionality)
+        return df 
