Esempio n. 1
0
    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
Esempio n. 2
0
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()