def handle_client_handshake(self, protocol, addr):
        identification = protocol.identification
        if not self.profile.is_id_exist(identification):
            return
        name = self.profile.get_name_by_id(identification)
        traffic_remain = self.profile.get_traffic_remain_by_id(identification)
        if traffic_remain <= 0:
            LOGGER.info(
                "Controller recv client but traffic <= 0, name: %s, traffic_remain: %s"
                % (name, traffic_remain))
            return
        LOGGER.info("Controller recv client, name: %s, traffic_remain: %s" %
                    (name, traffic_remain))

        server = self.id_to_server.get(identification)
        if server:
            LOGGER.info(
                "Controller get registered client with tun_name: %s, tun_ip: %s, dst_ip: %s"
                % (server.tun.name, server.tun.tun_ip, server.tun.dst_ip))
            server.client_addr = addr
            protocol = Protocol()
            protocol.cmd = CMD_SERVER_HANDSHAKE
            protocol.tun_ip_raw = self.ip_str_to_raw(server.tun.tun_ip)
            protocol.dst_ip_raw = self.ip_str_to_raw(server.tun.dst_ip)
            self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr)
        else:
            tun_ip = self.alloc_ip()
            dst_ip = self.alloc_ip()
            tun_name = self.alloc_tun_name()
            if not tun_ip or not dst_ip or not tun_name:
                LOGGER.error(
                    "Controller tun_ip or dst_ip or tun_name cannot be alloced"
                )
                self.free_ip(tun_ip)
                self.free_ip(dst_ip)
                self.free_tun_name(tun_name)
                return
            server = Server(tun_name, tun_ip, dst_ip, addr, traffic_remain,
                            self.client_send_data_callback)
            server.run()
            LOGGER.info(
                "controller get unregistered client with tun_name: %s, tun_ip: %s, dst_ip: %s"
                % (tun_name, tun_ip, dst_ip))
            self.id_to_server[identification] = server
            protocol = Protocol()
            protocol.cmd = CMD_SERVER_HANDSHAKE
            protocol.tun_ip_raw = self.ip_str_to_raw(tun_ip)
            protocol.dst_ip_raw = self.ip_str_to_raw(dst_ip)
            self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr)
 def client_send_data_callback(self, data, addr):
     protocol = Protocol()
     protocol.cmd = CMD_SERVER_DATA
     protocol.data = data
     self.sock.sendto(self.wrap_data(protocol.get_bytes()), addr)