def init_idents(self, ind_gummei=None, ind_plmn=None, ind_gid=None, ind_mmec=None): # # initializing indexes for the MMEd instance if ind_gummei is not None and ind_gummei != self._ind_gummei: self._ind_gummei = ind_gummei self._log('WNG', 'changing MME GUMMEI index') if ind_plmn is not None and ind_plmn != self._ind_plmn: self._ind_plmn = ind_plmn self._log('WNG', 'changing MME PLMN index') if ind_gid is not None and ind_gid != self._ind_gid: self._ind_gid = ind_gid self._log('WNG', 'changing MME index') if ind_mmec is not None and ind_mmec != self._ind_mmec: self._ind_mmec = ind_mmec self._log('WNG', 'changing MME index') # # selecting the right identifier indexed and setting the right value # for the MMEd instance if self._ind_gummei >= len(self.ConfigS1['ServedGUMMEIs']): gummei = self.ConfigS1['ServedGUMMEIs'][0] self._log('WNG', 'invalid MME GUMMEI index') else: gummei = self.ConfigS1['ServedGUMMEIs'][self._ind_gummei] # if self._ind_plmn >= len(gummei['servedPLMNs']): self.MME_PLMN_BUF = gummei['servedPLMNs'][0] self._log('WNG', 'invalid MME PLMN index') else: self.MME_PLMN_BUF = gummei['servedPLMNs'][self._ind_plmn] plmn = PLMN() plmn.map(self.MME_PLMN_BUF) self.MME_PLMN = plmn.get_mccmnc() # if self._ind_gid >= len(gummei['servedGroupIDs']): self.MME_GID_BUF = gummei['servedGroupIDs'][0] self._log('WNG', 'invalid MME Group ID index') else: self.MME_GID_BUF = gummei['servedGroupIDs'][self._ind_gid] self.MME_GID = unpack('!H', self.MME_GID_BUF)[0] # if self._ind_mmec >= len(gummei['servedMMECs']): self.MME_MMEC_BUF = gummei['servedMMECs'][0] self._log('WNG', 'invalid MME Group ID index') else: self.MME_MMEC_BUF = gummei['servedMMECs'][self._ind_mmec] self.MME_MMEC = ord(self.MME_MMEC_BUF) # self.MME_GUMMEI = '{0}.{1}.{2}.{3}'.format(plmn.get_mcc(), plmn.get_mnc(), hexlify(self.MME_GID_BUF), hexlify(self.MME_MMEC_BUF))
def handle_s1setup(self, sk, pdu): # get protocolIEs' values protIEs = pdu[1]['value'][1]['protocolIEs'] # get the eNB Global ID plmn_id, enb_id = None, None for protIE in protIEs: if protIE['id'] == 59: enb_id_bitstr = protIE['value'][1]['eNB-ID'][1] plmn_id_octstr = protIE['value'][1]['pLMNidentity'] # convert to readable values: # 1) enb id if enb_id_bitstr[1] == 20: # macroENB-ID enb_id = '%.5x' % enb_id_bitstr[0] elif enb_id_bitstr[1] == 28: # homeENB-ID enb_id = '%.7x' % enb_id_bitstr[0] # 2) plmn id plmn_id = PLMN() plmn_id.map(plmn_id_octstr) plmn_id = plmn_id.get_mccmnc() # if plmn_id and enb_id: enb_gid = (plmn_id, enb_id) # create / reset the eNB handler instance ret = self.create_enb_handler(enb_gid, sk) if not ret: # eNB not allowed self.send_enb_err(sk, cause=('misc', 'unknown-PLMN')) self._log( 'WNG', '[eNB: {0}] eNB not allowed, closing S1AP stream'.format( enb_gid)) sk.close() return # self._log('INF', '[eNB: {0}] S1AP stream established'.format(enb_gid)) # process the PDU in the context of the eNB handler #''' try: ret_pdu = self.ENB[enb_gid].process_pdu(pdu) except Exception as err: self._exc = sys.exc_info() self._log( 'ERR', 'something went wrong in the ENBmgr code: {0}'.format(err)) print('ERROR: something went wrong in the ENBmgr code:\n{0}'. format(err)) traceback.print_tb(self._exc[2]) else: self.add_enb(enb_gid) for pdu in ret_pdu: self.send_enb(sk, pdu)
def init_idents(self, ind_gummei=None, ind_plmn=None, ind_gid=None, ind_mmec=None): # # initializing indexes for the MMEd instance if ind_gummei is not None and ind_gummei != self._ind_gummei: self._ind_gummei = ind_gummei self._log('WNG', 'changing MME GUMMEI index') if ind_plmn is not None and ind_plmn != self._ind_plmn: self._ind_plmn = ind_plmn self._log('WNG', 'changing MME PLMN index') if ind_gid is not None and ind_gid != self._ind_gid: self._ind_gid = ind_gid self._log('WNG', 'changing MME index') if ind_mmec is not None and ind_mmec != self._ind_mmec: self._ind_mmec = ind_mmec self._log('WNG', 'changing MME index') # # selecting the right identifier indexed and setting the right value for the MMEd instance if self._ind_gummei >= len(self.ConfigS1['ServedGUMMEIs']): gummei = self.ConfigS1['ServedGUMMEIs'][0] self._log('WNG', 'invalid MME GUMMEI index') else: gummei = self.ConfigS1['ServedGUMMEIs'][self._ind_gummei] # if self._ind_plmn >= len(gummei['servedPLMNs']): self.MME_PLMN_BUF = gummei['servedPLMNs'][0] self._log('WNG', 'invalid MME PLMN index') else: self.MME_PLMN_BUF = gummei['servedPLMNs'][self._ind_plmn] plmn = PLMN() plmn.map(self.MME_PLMN_BUF) self.MME_PLMN = plmn.get_mccmnc() # if self._ind_gid >= len(gummei['servedGroupIDs']): self.MME_GID_BUF = gummei['servedGroupIDs'][0] self._log('WNG', 'invalid MME Group ID index') else: self.MME_GID_BUF = gummei['servedGroupIDs'][self._ind_gid] self.MME_GID = unpack('!H', self.MME_GID_BUF)[0] # if self._ind_mmec >= len(gummei['servedMMECs']): self.MME_MMEC_BUF = gummei['servedMMECs'][0] self._log('WNG', 'invalid MME Group ID index') else: self.MME_MMEC_BUF = gummei['servedMMECs'][self._ind_mmec] self.MME_MMEC = ord(self.MME_MMEC_BUF) # self.MME_GUMMEI = '{0}.{1}.{2}.{3}'.format(plmn.get_mcc(), plmn.get_mnc(), hexlify(self.MME_GID_BUF), hexlify(self.MME_MMEC_BUF))
def handle_s1setup(self, sk, pdu): # get protocolIEs' values protIEs = pdu[1]['value'][1]['protocolIEs'] # get the eNB Global ID plmn_id, enb_id = None, None for protIE in protIEs: if protIE['id'] == 59: enb_id_bitstr = protIE['value'][1]['eNB-ID'][1] plmn_id_octstr = protIE['value'][1]['pLMNidentity'] # convert to readable values: # 1) enb id if enb_id_bitstr[1] == 20: # macroENB-ID enb_id = '%.5x' % enb_id_bitstr[0] elif enb_id_bitstr[1] == 28: # homeENB-ID enb_id = '%.7x' % enb_id_bitstr[0] # 2) plmn id plmn_id = PLMN() plmn_id.map(plmn_id_octstr) plmn_id = plmn_id.get_mccmnc() # if plmn_id and enb_id: enb_gid = (plmn_id, enb_id) # create / reset the eNB handler instance ret = self.create_enb_handler(enb_gid, sk) if not ret: # eNB not allowed self.send_enb_err(sk, cause=('misc', 'unknown-PLMN')) self._log('WNG', '[eNB: {0}] eNB not allowed, closing S1AP stream'.format(enb_gid)) sk.close() return # self._log('INF', '[eNB: {0}] S1AP stream established'.format(enb_gid)) # process the PDU in the context of the eNB handler #''' try: ret_pdu = self.ENB[enb_gid].process_pdu(pdu) except Exception as err: self._exc = sys.exc_info() self._log('ERR', 'something went wrong in the ENBmgr code: {0}'.format(err)) print('ERROR: something went wrong in the ENBmgr code:\n{0}'.format(err)) traceback.print_tb(self._exc[2]) else: self.add_enb(enb_gid) for pdu in ret_pdu: self.send_enb(sk, pdu)