def setup(self): print('New connection from ' + str(self.client_address[0])) while 1: data = self.request.recv(32) if not data: print("Connection closed by " + str(self.client_address[0])) break packet_length = diameter.decode_diameter_packet_length( data) #Calculate length of packet from start of packet data_sum = data + self.request.recv( packet_length - 32) #Recieve remainder of packet from buffer packet_vars, avps = diameter.decode_diameter_packet( data_sum ) #Decode packet into array of AVPs and Dict of Packet Variables (packet_vars) orignHost = diameter.get_avp_data(avps, 264)[0] #Get OriginHost from AVP orignHost = binascii.unhexlify(orignHost).decode( 'utf-8') #Format it #Send Capabilities Exchange Answer (CEA) response to Capabilites Exchange Request (CER) if packet_vars['command_code'] == 257 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": print("Received Request with command code 257 (CER) from " + orignHost + "\n\tSending response (CEA)") response = diameter.Answer_257( packet_vars, avps, str(yaml_config['hss']['bind_ip'] [0])) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Send Credit Control Answer (CCA) response to Credit Control Request (CCR) elif packet_vars['command_code'] == 272 and packet_vars[ 'ApplicationId'] == 16777238: print("Received 3GPP Credit-Control-Request from " + orignHost + "\n\tGenerating (CCA)") response = diameter.Answer_16777238_272( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Send Device Watchdog Answer (DWA) response to Device Watchdog Requests (DWR) elif packet_vars['command_code'] == 280 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": #print("Received Request with command code 280 (DWR) from " + orignHost + "\n\tSending response (DWA)") response = diameter.Answer_280(packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Send Disconnect Peer Answer (DPA) response to Disconnect Peer Request (DPR) elif packet_vars['command_code'] == 282 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": print("Received Request with command code 282 (DPR) from " + orignHost + "\n\tForwarding request...") response = diameter.Answer_282(packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #S6a Authentication Information Answer (AIA) response to Authentication Information Request (AIR) elif packet_vars['command_code'] == 318 and packet_vars[ 'ApplicationId'] == 16777251 and packet_vars[ 'flags'] == "c0": print( "Received Request with command code 318 (3GPP Authentication-Information-Request) from " + orignHost + "\n\tGenerating (AIA)") response = diameter.Answer_16777251_318( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #S6a Update Location Answer (ULA) response to Update Location Request (ULR) elif packet_vars['command_code'] == 316 and packet_vars[ 'ApplicationId'] == 16777251: print( "Received Request with command code 316 (3GPP Update Location-Request) from " + orignHost + "\n\tGenerating (ULA)") response = diameter.Answer_16777251_316( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #S6a Purge UE Answer (PUA) response to Purge UE Request (PUR) elif packet_vars['command_code'] == 321 and packet_vars[ 'ApplicationId'] == 16777251: print( "Received Request with command code 321 (3GPP Purge UE Request) from " + orignHost + "\n\tGenerating (PUA)") response = diameter.Answer_16777251_321( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #S6a Purge UE Answer (NOA) response to Notify Request (NOR) elif packet_vars['command_code'] == 323 and packet_vars[ 'ApplicationId'] == 16777251: print( "Received Request with command code 323 (3GPP Notify Request) from " + orignHost + "\n\tGenerating (NOA)") response = diameter.Answer_16777251_323( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Cx Authentication Answer elif packet_vars['command_code'] == 300 and packet_vars[ 'ApplicationId'] == 16777216: print( "Received Request with command code 300 (3GPP Cx User Authentication Request) from " + orignHost + "\n\tGenerating (MAA)") response = diameter.Answer_16777216_300( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Cx Server Assignment Answer elif packet_vars['command_code'] == 301 and packet_vars[ 'ApplicationId'] == 16777216: print( "Received Request with command code 301 (3GPP Cx Server Assignemnt Request) from " + orignHost + "\n\tGenerating (MAA)") response = diameter.Answer_16777216_301( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Cx Location Information Answer elif packet_vars['command_code'] == 302 and packet_vars[ 'ApplicationId'] == 16777216: print( "Received Request with command code 302 (3GPP Cx Location Information Request) from " + orignHost + "\n\tGenerating (MAA)") response = diameter.Answer_16777216_302( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #Cx Multimedia Authentication Answer elif packet_vars['command_code'] == 303 and packet_vars[ 'ApplicationId'] == 16777216: print( "Received Request with command code 303 (3GPP Cx Multimedia Authentication Request) from " + orignHost + "\n\tGenerating (MAA)") response = diameter.Answer_16777216_303( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it #S13 ME-Identity-Check Answer elif packet_vars['command_code'] == 324 and packet_vars[ 'ApplicationId'] == 16777252: print( "Received Request with command code 324 (3GPP S13 ME-Identity-Check Request) from " + orignHost + "\n\tGenerating (MICA)") response = diameter.Answer_16777252_324( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) else: print("\n\nRecieved unrecognised request with Command Code: " + str(packet_vars['command_code']) + ", ApplicationID: " + str(packet_vars['ApplicationId']) + " and flags " + str(packet_vars['flags'])) for keys in packet_vars: print(keys) print("\t" + str(packet_vars[keys])) print(avps) print("Sending negative response") packet_vars, avps response = diameter.Respond_Command_Unsupported( packet_vars, avps) #Generate Diameter packet self.request.sendall(bytes.fromhex(response)) #Send it
def on_new_client(clientsocket, client_address): import diameter #Initialize Diameter diameter = diameter.Diameter(str(yaml_config['hss']['OriginHost']), str(yaml_config['hss']['OriginRealm']), str(yaml_config['hss']['ProductName']), str(yaml_config['hss']['MNC']), str(yaml_config['hss']['MCC'])) HSS_Logger.debug('New connection from ' + str(client_address)) logtool.Manage_Diameter_Peer(client_address, client_address, "add") data_sum = b'' while True: try: data = clientsocket.recv(32) if not data: HSS_Logger.info("Connection closed by " + str(client_address)) logtool.Manage_Diameter_Peer(client_address, client_address, "remove") break packet_length = diameter.decode_diameter_packet_length( data) #Calculate length of packet from start of packet data_sum = data + clientsocket.recv( packet_length - 32) #Recieve remainder of packet from buffer packet_vars, avps = diameter.decode_diameter_packet( data_sum ) #Decode packet into array of AVPs and Dict of Packet Variables (packet_vars) orignHost = diameter.get_avp_data(avps, 264)[0] #Get OriginHost from AVP orignHost = binascii.unhexlify(orignHost).decode( 'utf-8') #Format it #Send Capabilities Exchange Answer (CEA) response to Capabilites Exchange Request (CER) if packet_vars['command_code'] == 257 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": HSS_Logger.info( "Received Request with command code 257 (CER) from " + orignHost + "\n\tSending response (CEA)") try: response = diameter.Answer_257( packet_vars, avps, str(yaml_config['hss']['bind_ip'] [0])) #Generate Diameter packet except: response = diameter.Respond_ResultCode( packet_vars, avps, 5012 ) #Generate Diameter response with "DIAMETER_UNABLE_TO_COMPLY" (5012) HSS_Logger.info("Generated CEA") logtool.Manage_Diameter_Peer(orignHost, client_address, "update") #Send Credit Control Answer (CCA) response to Credit Control Request (CCR) elif packet_vars['command_code'] == 272 and packet_vars[ 'ApplicationId'] == 16777238: HSS_Logger.info("Received 3GPP Credit-Control-Request from " + orignHost + "\n\tGenerating (CCA)") try: response = diameter.Answer_16777238_272( packet_vars, avps) #Generate Diameter packet except: response = diameter.Respond_ResultCode( packet_vars, avps, 5012 ) #Generate Diameter response with "DIAMETER_UNABLE_TO_COMPLY" (5012) HSS_Logger.info("Generated CCA") #Send Device Watchdog Answer (DWA) response to Device Watchdog Requests (DWR) elif packet_vars['command_code'] == 280 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": HSS_Logger.info( "Received Request with command code 280 (DWR) from " + orignHost + "\n\tSending response (DWA)") try: response = diameter.Answer_280( packet_vars, avps) #Generate Diameter packet except: response = diameter.Respond_ResultCode( packet_vars, avps, 5012 ) #Generate Diameter response with "DIAMETER_UNABLE_TO_COMPLY" (5012) HSS_Logger.info("Generated DWA") logtool.Manage_Diameter_Peer(orignHost, client_address, "update") #Send Disconnect Peer Answer (DPA) response to Disconnect Peer Request (DPR) elif packet_vars['command_code'] == 282 and packet_vars[ 'ApplicationId'] == 0 and packet_vars['flags'] == "80": HSS_Logger.info( "Received Request with command code 282 (DPR) from " + orignHost + "\n\tForwarding request...") response = diameter.Answer_282(packet_vars, avps) #Generate Diameter packet HSS_Logger.info("Generated DPA") logtool.Manage_Diameter_Peer(orignHost, client_address, "remove") #S6a Authentication Information Answer (AIA) response to Authentication Information Request (AIR) elif packet_vars['command_code'] == 318 and packet_vars[ 'ApplicationId'] == 16777251 and packet_vars[ 'flags'] == "c0": HSS_Logger.info( "Received Request with command code 318 (3GPP Authentication-Information-Request) from " + orignHost + "\n\tGenerating (AIA)") try: response = diameter.Answer_16777251_318( packet_vars, avps) #Generate Diameter packet HSS_Logger.info("Generated AIR") except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for AIR") HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info( "Generated DIAMETER_USER_DATA_NOT_AVAILABLE AIR") #S6a Update Location Answer (ULA) response to Update Location Request (ULR) elif packet_vars['command_code'] == 316 and packet_vars[ 'ApplicationId'] == 16777251: HSS_Logger.info( "Received Request with command code 316 (3GPP Update Location-Request) from " + orignHost + "\n\tGenerating (ULA)") try: response = diameter.Answer_16777251_316( packet_vars, avps) #Generate Diameter packet HSS_Logger.info("Generated ULA") except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for ULR") HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info( "Generated error DIAMETER_USER_DATA_NOT_AVAILABLE ULA") #S6a Purge UE Answer (PUA) response to Purge UE Request (PUR) elif packet_vars['command_code'] == 321 and packet_vars[ 'ApplicationId'] == 16777251: HSS_Logger.info( "Received Request with command code 321 (3GPP Purge UE Request) from " + orignHost + "\n\tGenerating (PUA)") try: response = diameter.Answer_16777251_321( packet_vars, avps) #Generate Diameter packet except: response = diameter.Respond_ResultCode( packet_vars, avps, 5012 ) #Generate Diameter response with "DIAMETER_UNABLE_TO_COMPLY" (5012) HSS_Logger.error("Failed to generate PUA") HSS_Logger.info("Generated PUA") #S6a Purge UE Answer (NOA) response to Notify Request (NOR) elif packet_vars['command_code'] == 323 and packet_vars[ 'ApplicationId'] == 16777251: HSS_Logger.info( "Received Request with command code 323 (3GPP Notify Request) from " + orignHost + "\n\tGenerating (NOA)") try: response = diameter.Answer_16777251_323( packet_vars, avps) #Generate Diameter packet except: response = diameter.Respond_ResultCode( packet_vars, avps, 5012 ) #Generate Diameter response with "DIAMETER_UNABLE_TO_COMPLY" (5012) HSS_Logger.error("Failed to generate NOA") HSS_Logger.info("Generated NOA") #Cx Authentication Answer elif packet_vars['command_code'] == 300 and packet_vars[ 'ApplicationId'] == 16777216: HSS_Logger.info( "Received Request with command code 300 (3GPP Cx User Authentication Request) from " + orignHost + "\n\tGenerating (MAA)") try: response = diameter.Answer_16777216_300( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for Cx Auth Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info("Generated Cx Auth Answer") #Cx Server Assignment Answer elif packet_vars['command_code'] == 301 and packet_vars[ 'ApplicationId'] == 16777216: HSS_Logger.info( "Received Request with command code 301 (3GPP Cx Server Assignemnt Request) from " + orignHost + "\n\tGenerating (MAA)") try: response = diameter.Answer_16777216_301( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for Cx Server Assignment Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info("Generated Cx Server Assignment Answer") #Cx Location Information Answer elif packet_vars['command_code'] == 302 and packet_vars[ 'ApplicationId'] == 16777216: HSS_Logger.info( "Received Request with command code 302 (3GPP Cx Location Information Request) from " + orignHost + "\n\tGenerating (MAA)") try: response = diameter.Answer_16777216_302( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for Cx Location Information Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info("Generated Cx Location Information Answer") #Cx Multimedia Authentication Answer elif packet_vars['command_code'] == 303 and packet_vars[ 'ApplicationId'] == 16777216: HSS_Logger.info( "Received Request with command code 303 (3GPP Cx Multimedia Authentication Request) from " + orignHost + "\n\tGenerating (MAA)") try: response = diameter.Answer_16777216_303( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for Cx Multimedia Authentication Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info( "Generated Cx Multimedia Authentication Answer") #S13 ME-Identity-Check Answer elif packet_vars['command_code'] == 324 and packet_vars[ 'ApplicationId'] == 16777252: HSS_Logger.info( "Received Request with command code 324 (3GPP S13 ME-Identity-Check Request) from " + orignHost + "\n\tGenerating (MICA)") try: response = diameter.Answer_16777252_324( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for S13 ME-Identity Check Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info("Generated S13 ME-Identity Check Answer") #SLh LCS-Routing-Info-Answer elif packet_vars['command_code'] == 8388622 and packet_vars[ 'ApplicationId'] == 16777291: HSS_Logger.info( "Received Request with command code 324 (3GPP SLh LCS-Routing-Info-Answer Request) from " + orignHost + "\n\tGenerating (MICA)") try: response = diameter.Answer_16777291_8388622( packet_vars, avps) #Generate Diameter packet except Exception as e: HSS_Logger.info( "Failed to generate Diameter Response for SLh LCS-Routing-Info-Answer" ) HSS_Logger.info(e) traceback.print_exc() response = diameter.Respond_ResultCode( packet_vars, avps, 4100) #DIAMETER_USER_DATA_NOT_AVAILABLE HSS_Logger.info("Generated SLh LCS-Routing-Info-Answer") else: HSS_Logger.error( "\n\nRecieved unrecognised request with Command Code: " + str(packet_vars['command_code']) + ", ApplicationID: " + str(packet_vars['ApplicationId']) + " and flags " + str(packet_vars['flags'])) for keys in packet_vars: HSS_Logger.error(keys) HSS_Logger.error("\t" + str(packet_vars[keys])) HSS_Logger.error(avps) HSS_Logger.error("Sending negative response") response = diameter.Respond_ResultCode( packet_vars, avps, 3001 ) #Generate Diameter response with "Command Unsupported" (3001) clientsocket.sendall(bytes.fromhex(response)) #Send it #Handle actual sending try: clientsocket.sendall(bytes.fromhex(response)) #Send it except Exception as e: HSS_Logger.info("Failed to send Diameter Response") HSS_Logger.debug("Diameter Response Body: " + str(response)) HSS_Logger.info(e) traceback.print_exc() except KeyboardInterrupt: #Clean up the connection on keyboard interupt response = diameter.Request_282( ) #Generate Disconnect Peer Request Diameter packet clientsocket.sendall(bytes.fromhex(response)) #Send it clientsocket.close() HSS_Logger.info( "Connection closed niceley due to keyboard interrupt") sys.exit()