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)
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_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)