示例#1
0
    def _handle_ue_ho_response(self, vbs, hdr, event, ho):
        """Handle an incoming UE_HO_RESPONSE message.
        Args:
            ho, a UE_HO_RESPONSE message
        Returns:
            None
        """

        addr = hex_to_ether(ho.origin_eNB)
        origin_vbs = RUNTIME.vbses[addr]
        ue = RUNTIME.find_ue_by_rnti(ho.origin_rnti, ho.origin_pci, origin_vbs)

        if event.op == EP_OPERATION_SUCCESS:

            # UE was removed from source eNB
            if ue.is_ho_in_progress_removing():
                ue.set_ho_in_progress_adding()
                return

            # UE was added to target eNB
            if ue.is_ho_in_progress_adding():
                ue._cell = vbs.get_cell_by_pci(hdr.cellid)
                ue.rnti = ho.target_rnti
                ue.set_active()
                return

        self.log.error("Error while performing handover")
        RUNTIME.remove_ue(ue.ue_id)
示例#2
0
    def _trigger_message(self, hdr):

        if hdr.type == E_TYPE_SINGLE:
            event = E_SINGLE.parse(self.__buffer[HEADER.sizeof():])
            offset = HEADER.sizeof() + E_SINGLE.sizeof()
        elif hdr.type == E_TYPE_SCHED:
            event = E_SCHED.parse(self.__buffer[HEADER.sizeof():])
            offset = HEADER.sizeof() + E_SCHED.sizeof()
        elif hdr.type == E_TYPE_TRIG:
            event = E_TRIG.parse(self.__buffer[HEADER.sizeof():])
            offset = HEADER.sizeof() + E_TRIG.sizeof()
        else:
            self.log.error("Unknown event %u", hdr.type)
            return

        msg_type = event.action

        if msg_type not in self.server.pt_types:
            self.log.error("Unknown message type %u", msg_type)
            return

        if self.server.pt_types[msg_type]:

            self.log.info("Got message type %u (%s)", msg_type,
                          self.server.pt_types[msg_type].name)

            msg = self.server.pt_types[msg_type].parse(self.__buffer[offset:])
            addr = hex_to_ether(hdr.enbid)

            try:
                vbs = RUNTIME.vbses[addr]
            except KeyError:
                self.log.error("Unknown VBS %s, closing connection", addr)
                self.stream.close()
                return

            name = self.server.pt_types[msg_type].name
            handler_name = "_handle_%s" % name

            if hasattr(self, handler_name):
                self.log.info("%s from %s VBS %s seq %u", name, self.addr[0],
                              vbs.addr, hdr.seq)
                handler = getattr(self, handler_name)
                handler(vbs, hdr, event, msg)

            if msg_type in self.server.pt_types_handlers:
                for handler in self.server.pt_types_handlers[msg_type]:
                    handler(vbs, hdr, event, msg)
    def _handle_hello(self, main_msg):
        """Handle an incoming HELLO message.

        Args:
            main_msg, a emage_msg containing HELLO message
        Returns:
            None
        """

        enb_id = main_msg.head.b_id
        vbs_id = hex_to_ether(enb_id)

        try:
            vbs = RUNTIME.vbses[vbs_id]
        except KeyError:
            LOG.error("Hello from unknown VBS (%s)", (vbs_id))
            return

        LOG.info("Hello from %s VBS %s seq %u", self.addr[0], vbs.addr,
                 main_msg.head.seq)

        # New connection
        if not vbs.connection:

            # set pointer to pnfdev object
            self.vbs = vbs

            # set connection
            vbs.connection = self

            # request registered UEs
            self.send_UEs_id_req()

            # generate register message
            self.send_register_message_to_self()

        # Update VBSP params
        vbs.period = main_msg.se.mHello.repl.period
        vbs.last_seen = main_msg.head.seq
        vbs.last_seen_ts = time.time()
    def _handle_hello(self, main_msg):
        """Handle an incoming HELLO message.

        Args:
            main_msg, a emage_msg containing HELLO message
        Returns:
            None
        """

        enb_id = main_msg.head.b_id
        vbs_id = hex_to_ether(enb_id)

        try:
            vbs = RUNTIME.vbses[vbs_id]
        except KeyError:
            LOG.error("Hello from unknown VBS (%s)", (vbs_id))
            return

        LOG.info("Hello from %s VBS %s seq %u", self.addr[0], vbs.addr,
                 main_msg.head.seq)

        # New connection
        if not vbs.connection:

            # set pointer to pnfdev object
            self.vbs = vbs

            # set connection
            vbs.connection = self

            # request registered UEs
            self.send_UEs_id_req()

            # generate register message
            self.send_register_message_to_self()

        # Update VBSP params
        vbs.period = main_msg.se.mHello.repl.period
        vbs.last_seen = main_msg.head.seq
        vbs.last_seen_ts = time.time()
    def _handle_UEs_id_repl(self, main_msg):
        """Handle an incoming UEs ID reply.

        Args:
            message, a emage_msg containing UE IDs (RNTIs)
        Returns:
            None
        """

        active_ues = {}
        inactive_ues = {}

        event_type = main_msg.WhichOneof("event_types")
        msg = protobuf_to_dict(main_msg)
        ues_id_msg_repl = msg[event_type]["mUEs_id"]["repl"]

        if ues_id_msg_repl["status"] != configs_pb2.CREQS_SUCCESS:
            return

        # List of active UEs
        if "active_ue_id" in ues_id_msg_repl:
            for ue in ues_id_msg_repl["active_ue_id"]:
                active_ues[ue["rnti"]] = {}
                if "imsi" in ue:
                    active_ues[ue["rnti"]]["imsi"] = ue["imsi"]
                else:
                    active_ues[ue["rnti"]]["imsi"] = None
                if "plmn_id" in ue:
                    active_ues[ue["rnti"]]["plmn_id"] = ue["plmn_id"]
                else:
                    active_ues[ue["rnti"]]["plmn_id"] = None

        # List of inactive UEs
        if "inactive_ue_id" in ues_id_msg_repl:
            for ue in ues_id_msg_repl["inactive_ue_id"]:
                inactive_ues[ue["rnti"]] = {}
                if "imsi" in ue:
                    inactive_ues[ue["rnti"]]["imsi"] = ue["imsi"]
                else:
                    inactive_ues[ue["rnti"]]["imsi"] = None
                if "plmn_id" in ue:
                    inactive_ues[ue["rnti"]]["plmn_id"] = ue["plmn_id"]
                else:
                    inactive_ues[ue["rnti"]]["plmn_id"] = None

        for rnti in active_ues:

            ue_id = hex_to_ether(rnti)

            if ue_id not in RUNTIME.ues:

                ue_id = hex_to_ether(rnti)
                imsi = active_ues[ue["rnti"]]["imsi"]
                new_ue = UE(ue_id, imsi, self.vbs)

                RUNTIME.ues[ue_id] = new_ue

            ue = RUNTIME.ues[ue_id]
            plmn_id = int(active_ues[rnti]["plmn_id"])

            if not ue.plmn_id and plmn_id:

                # setting tenant
                ue.tenant = RUNTIME.load_tenant_by_plmn_id(plmn_id)

                if ue.tenant:

                    # adding UE to tenant
                    LOG.info("Adding %s to tenant %s", ue.addr,
                             ue.tenant.plmn_id)
                    ue.tenant.ues[ue.addr] = ue

                    # Raise UE join
                    self.server.send_ue_join_message_to_self(ue)

            if ue.plmn_id and not plmn_id:

                # removing UE from tenant
                LOG.info("Removing %s from tenant %s", ue.addr,
                         ue.tenant.plmn_id)
                del ue.tenant.ues[ue.addr]

                # Raise UE leave
                self.server.send_ue_leave_message_to_self(ue)

                # setting tenant
                ue.tenant = None

        existing_ues = []
        existing_ues.extend(RUNTIME.ues.keys())

        for ue_id in existing_ues:
            if ether_to_hex(ue_id) not in active_ues:
                RUNTIME.remove_ue(ue_id)