def fsmStateRecipientEnterStateEstablished(self, event): self.lastchangetime = time.time() self.SendHalMsg(L2tpv3Session.ADD_SESSION) self.updateSessionRecord() # if multicast session ,send mcast join for avp in self.avps_icrq: if isinstance(avp, L2tpv3CableLabsAvps.DepiRemoteMulticastJoin): address = (self.connection.localAddr, avp.src_ip, avp.group_ip, 0) try: mcast = Mcast.findMcastInstance(address=address) if mcast is None: mcast = Mcast(address=address) mcast.join(session=(self.connection.localAddr, self.connection.remoteAddr, self.localSessionId, self.remoteSessionId)) self.mcast.append(address) if mcast.status != Mcast.JOINED: self.logger.warn( "Session [%d, %d] mcast join failed %s:", self.localSessionId, self.remoteSessionId, address) except Exception as e: self.logger.warn( "Session [%d, %d] mcast join failed %s: %s", self.localSessionId, self.remoteSessionId, address, str(e))
def test_Mcast_error(self): session = ("127.0.0.1", "127.0.0.1", 1233, 12323) try: mcast = Mcast(address=("127.0.0.8", "5.5.5.1", "229.1.1.255", 0)) except Exception as e: self.assertIsInstance(e, McastException) try: mcast = Mcast(None) except Exception as e: self.assertIsInstance(e, McastException) try: mcast = Mcast(address=("127.0.0.1", "5.5.5.1")) except Exception as e: self.assertIsInstance(e, McastException) try: mcast = Mcast.findMcastInstance(address=("127.0.0.1", "5.5.5.1")) except McastException as e: self.assertEqual( str(e), "init address %s is not expected" % str( ("127.0.0.1", "5.5.5.1"))) mcast = Mcast(address=("127.0.0.1", "5.5.5.1", "229.1.1.255", 1)) mcast.join(session) self.assertEqual(mcast.status, Mcast.NOT_JOINED) mcast = Mcast(address=("127.0.0.1", "5.5.5.1", "229.1.1.255", 60002)) mcast.join(session) self.assertEqual(mcast.status, Mcast.JOINED) mcast.leave(session)
def fsmStateRecipientLeaveStateEstablished(self, event): self.SendHalMsg(L2tpv3Session.DEL_SESSION) # if multicast session ,send mcast leave for avp in self.avps_cdn: if isinstance(avp, L2tpv3CableLabsAvps.DepiRemoteMulticastLeave): address = (self.connection.localAddr, avp.src_ip, avp.group_ip, 0) if address in self.mcast: self.mcast.remove(address) try: mcast = Mcast.findMcastInstance(address=address) if mcast is not None: mcast.leave(session=(self.connection.localAddr, self.connection.remoteAddr, self.localSessionId, self.remoteSessionId)) except Exception as e: self.logger.warn( "Session [%d, %d] mcast join failed %s: %s", self.localSessionId, self.remoteSessionId, address, str(e)) else: self.logger.warn( "mcast address[%s] is not joined in session[0x%x]", address, self.localSessionId) while len(self.mcast): address = self.mcast.pop(0) self.logger.warn( "mcast address[%s] is not in session[0x%x] cdn avps", str(address), self.localSessionId) try: mcast = Mcast.findMcastInstance(address=address) if mcast is not None: mcast.leave(session=(self.connection.localAddr, self.connection.remoteAddr, self.localSessionId, self.remoteSessionId)) except Exception as e: self.logger.warn("Session [%d, %d] mcast join failed %s: %s", self.localSessionId, self.remoteSessionId, address, str(e))
def test_join_1(self): session = ("127.0.0.1", "127.0.0.1", 1233, 12323) address_1 = ("127.0.0.1", "5.5.5.1", "229.1.1.255", 0) address_2 = ("127.0.0.1", "7.5.5.2", "229.1.1.255", 0) address_3 = ("127.0.0.1", "3.5.5.2", "228.1.1.255", 0) mcast = Mcast(address=address_1) self.assertIn(("127.0.0.1", "5.5.5.1", "229.1.1.255", 0), Mcast.McastDb.keys()) self.assertIn(mcast, Mcast.McastDb.values()) mcast.rejoin() self.assertEqual(mcast.status, Mcast.NOT_JOINED) mcast.join(session) self.assertEqual(mcast.status, Mcast.JOINED) time.sleep(0.1) # no operation in joined status mcast.join(session) self.assertEqual(mcast.status, Mcast.JOINED) mcast_3 = Mcast(address=address_3) self.assertIn(address_3, Mcast.McastDb.keys()) time.sleep(0.1) # no operation in joined status mcast_3.join(session) self.assertEqual(mcast_3.status, Mcast.JOINED) try: mcast_test = Mcast.findMcastInstance(None) except McastException as e: pass mcast_test = Mcast.findMcastInstance(address_1) self.assertEqual(mcast_test.status, Mcast.JOINED) self.assertEqual(mcast_test, mcast) try: mcast = Mcast(address=address_1) except McastException as e: self.assertEqual( str(e), "init address %s was already initiated" % str(address_1)) mcast_test = Mcast.findMcastInstance(address_2) self.assertIsNone(mcast_test) mcast_2 = Mcast(address=address_2) self.assertIn(("127.0.0.1", "5.5.5.1", "229.1.1.255", 0), Mcast.McastDb.keys()) self.assertIn(mcast_2, Mcast.McastDb.values()) mcast_2.join(session) self.assertEqual(mcast_2.status, Mcast.JOINED) time.sleep(0.1) mcast_3.close() mcast.close() self.assertEqual(mcast.status, Mcast.LEAVED) time.sleep(1) self.assertNotIn(("127.0.0.1", "5.5.5.1", "229.1.1.255", 0), Mcast.McastDb.keys()) self.assertNotIn(Mcast, Mcast.McastDb.values()) for key in Mcast.McastDb.keys(): Mcast.McastDb[key].close() time.sleep(1) self.assertEqual(len(Mcast.McastDb), 0)