コード例 #1
0
    void
    vita_iq_source_2_impl::handle_read(const boost::system::error_code& error,
                                 size_t bytes_transferred)
    {

      GR_LOG_WARN(d_logger, "handle_read.");
      if(!error) {
        {
          boost::lock_guard<gr::thread::mutex> lock(d_udp_mutex);
          // Make sure we never go beyond the boundary of the
          // residual buffer.  This will just drop the last bit of
          // data in the buffer if we've run out of room.
          if((int)(d_residual + bytes_transferred) >= (50*d_packetSize)) {
            char msg[100];
            sprintf(msg,"d_packetSize %d bytes_transferred %d",
                (int)d_packetSize, (int)bytes_transferred);
            GR_LOG_WARN(d_logger, msg);
            GR_LOG_WARN(d_logger, "TOO much data; dropping packet.");
          }
          else {
            // otherwise, copy received data into local buffer for
            // copying later.
            memcpy(d_residbuf+d_residual, d_rxbuf, bytes_transferred);
            d_residual += bytes_transferred;
          }
          d_cond_wait.notify_one();
        }
      }
      start_receive();
    }
コード例 #2
0
ファイル: Server.cpp プロジェクト: sush/Live-Jamming
void	Server::CallBack_handle_receive(boost::system::error_code const & error, std::size_t recv_count)
{
  if (!error || error == boost::asio::error::message_size)
    {
      ////////// THREAD SAFE//////////////////////
      // !!! to implement !!!
      // this lock should have a very high priority for locking
      // the main receiver thread shouldn t be waiting for all thread workers finishing to treat
      // packets
      ///////////////////////////////////////////////////////
      // MOVED THE LOCK INSIDE CLASS: ADD INT PARAMETER FOR LOCKING PRIORITY

      try {
	Packet * p = reinterpret_cast<Packet *>(_serverManager->Cond_new_Packet(*_remote_endpoint, *_recv_buffer, recv_count));
	_packetQueue->PushPacket(p);
	_pool->schedule(boost::bind(&Server::Thread_TreatPacket, this));
      }
      catch (std::runtime_error &e)
	{
	  std::cerr << e.what() << ":" << Packet_v1::peekComponentId(*_recv_buffer) << std::endl;
	  delete _recv_buffer;
	  _recv_buffer = 0;
	}
	start_receive();
      ////////////////////////////////////////////
    }
}
コード例 #3
0
ファイル: 3c505.c プロジェクト: smx-smx/dsl-n55u
static inline void adapter_reset(struct net_device *dev)
{
	unsigned long timeout;
	elp_device *adapter = dev->priv;
	unsigned char orig_hcr = adapter->hcr_val;

	outb_control(0, dev);

	if (inb_status(dev->base_addr) & ACRF) {
		do {
			inb_command(dev->base_addr);
			timeout = jiffies + 2*HZ/100;
			while (time_before_eq(jiffies, timeout) && !(inb_status(dev->base_addr) & ACRF));
		} while (inb_status(dev->base_addr) & ACRF);
		set_hsf(dev, HSF_PCB_NAK);
	}
	outb_control(adapter->hcr_val | ATTN | DIR, dev);
	mdelay(10);
	outb_control(adapter->hcr_val & ~ATTN, dev);
	mdelay(10);
	outb_control(adapter->hcr_val | FLSH, dev);
	mdelay(10);
	outb_control(adapter->hcr_val & ~FLSH, dev);
	mdelay(10);

	outb_control(orig_hcr, dev);
	if (!start_receive(dev, &adapter->tx_pcb))
		printk(KERN_ERR "%s: start receive command failed \n", dev->name);
}
コード例 #4
0
ファイル: UdpOnce.cpp プロジェクト: highlander12rus/CloudsRIS
        void UdpOnce::handle_receive(const boost::system::error_code& error,
                std::size_t bytes_transferred) {
            if (socket_.get_io_service().stopped())
                return;

            if (!error || error == boost::asio::error::message_size) {
                UdpReceiveOtherServer reciver = *((UdpReceiveOtherServer*) recv_buffer_);
                BOOST_LOG_TRIVIAL(debug) << "handle_receive Udp Once, fileSize=" << reciver.freeSpace;

                {
                    //critial section
                    boost::lock_guard<boost::recursive_mutex> lock(m_guard);
                    std::string ip = this->remote_endpoint_.address().to_string();
                    //std::string localIp = listenAddress.address().to_string();
                    BOOST_LOG_TRIVIAL(debug) << "critical section;ip=" << ip;

                    //if (ip != localIp) {
                        ServersResponce responce = ServersResponce(ip, reciver.freeSpace);
                        this->servers_.push_back(responce);
                    //}
                }


                start_receive();
            }
        }
コード例 #5
0
void UdpServer::handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    if (!error)
    {
      try{
		  qDebug()<<"packet size is: " << bytes_transferred;
        //meta.size_ = bytes_transferred;
        //vbuffer_->Enqueue(meta);
      }
      catch(std::exception ex) {
        std::cout << "handle_receive: Error parsing incoming message:" << ex.what() <<std::endl;
      }
      catch (...) {
        std::cout << "handle_receive: Unknown error while parsing incoming message"<<std::endl;
        };

    }
    else
    {
       std::cout << "handle_receive: error: " << error.message() <<std::endl;
    }
    
    
    start_receive();
}
コード例 #6
0
ファイル: networkManager.cpp プロジェクト: HarounH/spaceRash
void NetworkManager::handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred){
	if (!error)
	{
	   	ClientMessage message = ClientMessage(std::string(recv_buffer.data(), recv_buffer.data() + bytes_transferred),  get_client_id(remote_endpoint));
		if (!message.first.empty())
		{
			boost::mutex::scoped_lock lock(mutex);
			messages.push(message);
			if(timeLeft.find(message.second) != timeLeft.end())
				timeLeft[message.second] = (int) clock();
			else
				timeLeft[nextClientID + 1] = (int) clock();
			cout << message.first <<"\n";
		}
		else
		{
			cout << "empty message\n";
		}
	    receivedBytes += bytes_transferred;
	    receivedMessages++;
	}
	else
	{
		cout << "error!" <<"\n";
	}

	start_receive();
}
コード例 #7
0
ファイル: client.cpp プロジェクト: Szperak/sAudio-receiver
    void handle_receive(const boost::system::error_code& error, std::size_t recv_len){
        if (!error || error == boost::asio::error::message_size){

            if(recv_len > 5){

                int sequenceId = *((int32_t*) &recv_arr[0]);
                if(sequenceId == 0){
                    std::cout << "Reader placed\n";
                    audiobuf->readerIndex = BUFFER_SIZE-1;
                    //synchronized = true;
                }else{
                    if(sequenceId != audiobuf->lastSequenceId+1){
                        std::cout << "Packet loss/displacement\n";
                    }
                }
                audiobuf->lastSequenceId = sequenceId;
                int audioLen = recv_len-4;
                int writerIndex = sequenceId % BUFFER_SIZE;
                if(writerIndex == audiobuf->readerIndex){
                    audiobuf->readerIndex = (BUFFER_SIZE+writerIndex-1)%BUFFER_SIZE;
                    std::cout << "Synchronizing\n";
                }

                audiobuf->length[writerIndex] = audioLen;
                unsigned char* audio = &recv_arr[4];
                memcpy(audiobuf->buffer[writerIndex], audio, audioLen);

                //std::cout << "recv_len: " << recv_len << "\n";


                //std::cout <<  opus_packet_get_nb_samples(audio, recv_len, SAMPLE_RATE) << "\n";

                /*
                for(int i = 0; i<BUFFER_SIZE; i++){

                    if(sequenceId % BUFFER_SIZE == i){
                        std::cout << "+";
                    }else if(audiobuf->readerIndex == i){
                        std::cout << "-";
                    }else if(audiobuf->length[i] != 0){
                        std::cout << "=";
                    }else{
                        std::cout << " ";
                    }


                }
                std::cout << "\n";*/

                //std::cout << sequenceId << "\n";*/
                std::cout.flush();
            }
            /**/
            start_receive();
        }else{
            std::cout << error.message() << "\n";
        }

    }
コード例 #8
0
ファイル: 3c505.c プロジェクト: smx-smx/dsl-n55u
/* Check to see if the receiver needs restarting, and kick it if so */
static inline void prime_rx(struct net_device *dev)
{
	elp_device *adapter = dev->priv;
	while (adapter->rx_active < ELP_RX_PCBS && netif_running(dev)) {
		if (!start_receive(dev, &adapter->itx_pcb))
			break;
	}
}
コード例 #9
0
ファイル: UdpServer.cpp プロジェクト: derrod/masebc2
UdpServer::UdpServer(asio::io_service& io_service, int type, int port) : socket_(io_service, udp::endpoint(udp::v4(), port))
{
	this->type = type;
	this->port = port;

	start_receive();
	debug->notification(1, type, "Created UDP Socket (listening on port %i)", port);
}
コード例 #10
0
ファイル: Server.cpp プロジェクト: sush/Live-Jamming
void		Server::Run()
{
  std::cerr << "* ";
  Time::Print();
  std::cerr << " Server started..." << std::endl;
  
  start_receive();
  _io_service->run();
}
コード例 #11
0
ファイル: UdpBroatcast.cpp プロジェクト: titan445/CloudsRIS
 UdpBroatcast::UdpBroatcast(boost::asio::io_service& io_service,
         udp::endpoint& listenAddress) :
 socket_(io_service, listenAddress) {
     socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
     boost::asio::socket_base::broadcast option(true);
     socket_.set_option(option);
     recv_buffer_ = new char[sizeof (UdpBroatcastRecive)];
     start_receive();
 }
コード例 #12
0
ファイル: SerialConnection.cpp プロジェクト: xeedjr/ModBus
void SerialConnection::service_io_thread(void) {
	///asio::read(*port_, asio::buffer(response_adu));

	recv_raw_data_.clear();
	start_receive();

	while (true) {
		io_.run();
	}
}
コード例 #13
0
void NLSocket::start_receive()
{
    socket_.async_receive_from
        (asio::buffer(recv_buffer_), remote_endpoint_,
         [this](const std::error_code &error, std::size_t bytes_xferred)
         {
             process_receive(bytes_xferred, 0, 0);
             start_receive();
         });
}
コード例 #14
0
ファイル: UdpServer.cpp プロジェクト: derrod/masebc2
void UdpServer::handle_receive(const system::error_code& error, size_t bytes_transferred)
{
	if(!error && bytes_transferred > 0)
	{
		ProcessData(DataToPacket(bytes_transferred));
		socket_.async_send_to(asio::buffer(send_data, send_data.size()), remote_endpoint_,
								boost::bind(&UdpServer::handle_send, this, asio::placeholders::error, asio::placeholders::bytes_transferred));
		start_receive();
	}
}
コード例 #15
0
ファイル: UdpBroatcast.cpp プロジェクト: titan445/CloudsRIS
        void UdpBroatcast::handle_receive(const boost::system::error_code& error,
                std::size_t bytes_transferred) {
            BOOST_LOG_TRIVIAL(debug) << "broat cast recive";
            if (!error || error == boost::asio::error::message_size) {
                UdpBroatcastRecive reciver = *((UdpBroatcastRecive*) recv_buffer_); //hack преобразование из байтов в стурктуру
                sendFreeSpaceRequest(reciver);

                start_receive();
            }
        }
コード例 #16
0
ファイル: c_UDPasync.cpp プロジェクト: damianbb/crypto-test
void c_UDPasync::handle_receive (const boost::system::error_code &error, std::size_t bytes_transferred) {
	if (!error) {
		std::string message(recv_buffer.data(), recv_buffer.data() + bytes_transferred);
		incomingMessages.push(message);
		statistics.register_received_message(bytes_transferred);
	} else {
		Log::Error("c_UDPasync::handle_receive:", error);
	}

	start_receive();
}
コード例 #17
0
ファイル: Receiver.cpp プロジェクト: ChrisCarlsen/tortuga
void Receiver::handle_receive_from(const boost::system::error_code& err,
    size_t bytes_recvd)
{
    // Send the raw data to the handler
    if (!err && bytes_recvd > 0) {
        m_handler(m_data);
    }

    // Start new accept
    start_receive();
}
コード例 #18
0
ファイル: c_UDPasync.cpp プロジェクト: damianbb/crypto-test
void c_UDPasync::run_service () {
	start_receive();
	while (!io_service.stopped()) {
		try {
			io_service.run();
		} catch (const std::exception &e) {
			Log::Warning("Client: network exception: ", e.what());
		} catch (...) {
			Log::Error("Unknown exception in client network thread");
		}
	}
}
コード例 #19
0
ファイル: server.cpp プロジェクト: hamilok/funnel
void server::handle_receive(const boost::system::error_code& error, std::size_t bytes_recvd)
{
  //std::cout << boost::this_thread::get_id() << ": ";

  // Is error
  if (error || bytes_recvd == 0)
  {
    std::cout << "Unknown error" << std::endl;
    return start_receive();
  }

  // Data is not netflow version 5
  if (packet.hdr.get_version() != 5)
  {
    std::cout << "Error: received unknwon packet version" << std::endl;    
    return start_receive();
  }

  // Push packet
  packets.push_front(packet);

  start_receive();
}
コード例 #20
0
ファイル: networkManager.cpp プロジェクト: HarounH/spaceRash
void NetworkManager::run_service()
{
    start_receive();
    while (!io_service.stopped()){
        try {
            io_service.run();
        } catch( const std::exception& e ) {
            //LogMessage::error("NetworkManager network exception: ",e.what());
        }
        catch(...) {
            //LogMessage::error("Unknown exception in server network thread");
        }
    }
    //LogMessage::Debug("NetworkManager network thread stopped");
};
コード例 #21
0
NLSocket::NLSocket(asio::io_service &io_service)
: socket_(io_service), nlseq_(g_random_prng())
{
    initialized_ = false;
    socket_.open(nl_protocol(NETLINK_ROUTE));
    socket_.bind(nl_endpoint<nl_protocol>(RTMGRP_LINK));
    socket_.non_blocking(true);

    request_links();
    request_addrs();
    initialized_ = true;

    // Begin the main asynchronous receive loop.
    start_receive();
}
コード例 #22
0
void UdpServer::run_service()
{
    start_receive();
    while (!io_service.stopped()){
        try {
            io_service.run();
        } catch( const std::exception& e ) {
            std::cout << "Server network exception: " << e.what() <<std::endl;
        }
        catch(...) {
          std::cout << "Unknown exception in server network thread" << std::endl;
        }
    }
    std::cout << "Server network thread stopped" << std::endl;
};
コード例 #23
0
ファイル: client.cpp プロジェクト: Szperak/sAudio-receiver
    sAudioReceiver(boost::asio::io_service& io_service, sAudioBuffer* audiobuf, char* host, int port) : audiobuf(audiobuf), socket(io_service), ping_interval(boost::posix_time::seconds(1)) {
        printf("Creating sAudioReceiver on %s:%d\n", host, port);
        socket.open(boost::asio::ip::udp::v4());

        receiver_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string(host), port);


        std::string thx("ihazo");
        std::copy(thx.begin(), thx.end(), send_arr.begin());
        printf("Created sAudioReceiver\n");
        send_request();
        start_receive();
        printf("Sent request\n");

        ping_timer = new boost::asio::deadline_timer(socket.get_io_service(), ping_interval);
        start_timer();
    }
コード例 #24
0
ファイル: EventLogger.cpp プロジェクト: Astron/Astron
void EventLogger::bind(const std::string &addr)
{
    // We have to make sure our bind happens within the context of the main thread.
    assert(std::this_thread::get_id() == g_main_thread_id);

    m_log.info() << "Opening UDP socket..." << std::endl;
    auto addresses = resolve_address(addr, 7197, g_loop);

    if(addresses.size() == 0) {
        m_log.fatal() << "Failed to bind to EventLogger address " << addr << "\n";
        exit(1);
    }

    m_local = addresses.front();

    m_socket = g_loop->resource<uvw::UDPHandle>();
    m_socket->bind(m_local);
    start_receive();
}
コード例 #25
0
ファイル: server.cpp プロジェクト: nist-emntg/wiredto154
void Server::handle_receive(const boost::system::error_code& error,
		std::size_t read_size/*bytes_transferred*/) {
#ifdef DEBUG
	std::cout << "received a message on port "
			  << socket_.local_endpoint().port()
			  << " (" << read_size << " bytes)"
			  << std::endl;
#endif /* DEBUG */
	recv_buffer_.resize(read_size);

	if (error)
		throw boost::system::system_error(error);
	// parse the frame and determine what to do with it
	Dispatcher::dispatch(socket_.local_endpoint().port(), recv_buffer_, socket_);

	recv_buffer_.resize(UDP_MAX_FRAME_SIZE);

	start_receive(); /* make oneself ready for the next packet */
}
コード例 #26
0
ファイル: server.cpp プロジェクト: hamilok/funnel
server::server(const std::string& address, std::size_t port, std::size_t thread_cnt, std::size_t buffer_size, std::size_t update_int)
  :  socket(io_service, boost::asio::ip::udp::endpoint(boost::asio::ip::address::from_string(address), port)),
     zone_timer(io_service, boost::posix_time::seconds(update_int)),
     abonent_timer(io_service, boost::posix_time::seconds(update_int)),
     thread_cnt(thread_cnt),
     update_int(update_int),
     buffer_size(buffer_size),
     flows_cnt(0),
     bytes_cnt(0),
     running (true),
     packets(buffer_size)
{
  // Setup
  setup();

  // Start recv
  start_receive();

  // Start update
  zone_timer.async_wait(boost::bind(&server::handle_update_zones, this));
  abonent_timer.async_wait(boost::bind(&server::handle_update_abonents, this));
}
コード例 #27
0
ファイル: SerialConnection.cpp プロジェクト: xeedjr/ModBus
void SerialConnection::receiver_complete(const boost::system::error_code& error,
											size_t bytes_transferred) {
	if (recv_raw_data_.size() == 0)
		start_frame();

	recv_raw_data_.push_back(recv_byte_);

	start_receive();

	if (recv_timer_->expires_from_now(boost::posix_time::milliseconds(rtu_silence_interval_ms_)) > 0)
	{
		// We managed to cancel the timer. Start new asynchronous wait.
		recv_timer_->async_wait(boost::bind(&SerialConnection::timer_expired,
												this,
												boost::asio::placeholders::error));
	}
	else
	{
		// Too late, timer has already expired!
		recv_timer_->async_wait(boost::bind(&SerialConnection::timer_expired,
												this,
												boost::asio::placeholders::error));
	}
}
コード例 #28
0
void ClientICMP::measure_latency()
{
	start_send();
	start_receive();
}
コード例 #29
0
ファイル: BSocksClient.c プロジェクト: projectarkc/psiphon
void send_handler_done (BSocksClient *o)
{
    DebugObject_Access(&o->d_obj);
    ASSERT(o->buffer)
    
    switch (o->state) {
        case STATE_SENDING_HELLO: {
            BLog(BLOG_DEBUG, "sent hello");
            
            // allocate buffer for receiving hello
            bsize_t size = bsize_fromsize(sizeof(struct socks_server_hello));
            if (!reserve_buffer(o, size)) {
                goto fail;
            }
            
            // receive hello
            start_receive(o, (uint8_t *)o->buffer, size.value);
            
            // set state
            o->state = STATE_SENT_HELLO;
        } break;
        
        case STATE_SENDING_REQUEST: {
            BLog(BLOG_DEBUG, "sent request");
            
            // allocate buffer for receiving reply
            bsize_t size = bsize_add(
                bsize_fromsize(sizeof(struct socks_reply_header)),
                bsize_max(bsize_fromsize(sizeof(struct socks_addr_ipv4)), bsize_fromsize(sizeof(struct socks_addr_ipv6)))
            );
            if (!reserve_buffer(o, size)) {
                goto fail;
            }
            
            // receive reply header
            start_receive(o, (uint8_t *)o->buffer, sizeof(struct socks_reply_header));
            
            // set state
            o->state = STATE_SENT_REQUEST;
        } break;
        
        case STATE_SENDING_PASSWORD: {
            BLog(BLOG_DEBUG, "send password");
            
            // allocate buffer for receiving reply
            bsize_t size = bsize_fromsize(2);
            if (!reserve_buffer(o, size)) {
                goto fail;
            }
            
            // receive reply header
            start_receive(o, (uint8_t *)o->buffer, size.value);
            
            // set state
            o->state = STATE_SENT_PASSWORD;
        } break;
        
        default:
            ASSERT(0);
    }
    
    return;
    
fail:
    report_error(o, BSOCKSCLIENT_EVENT_ERROR);
}
コード例 #30
0
ファイル: BSocksClient.c プロジェクト: projectarkc/psiphon
void recv_handler_done (BSocksClient *o, int data_len)
{
    ASSERT(data_len >= 0)
    ASSERT(data_len <= o->control.recv_total - o->control.recv_len)
    DebugObject_Access(&o->d_obj);
    
    o->control.recv_len += data_len;
    
    if (o->control.recv_len < o->control.recv_total) {
        do_receive(o);
        return;
    }
    
    switch (o->state) {
        case STATE_SENT_HELLO: {
            BLog(BLOG_DEBUG, "received hello");
            
            struct socks_server_hello imsg;
            memcpy(&imsg, o->buffer, sizeof(imsg));
            
            if (ntoh8(imsg.ver) != SOCKS_VERSION) {
                BLog(BLOG_NOTICE, "wrong version");
                goto fail;
            }
            
            size_t auth_index;
            for (auth_index = 0; auth_index < o->num_auth_info; auth_index++) {
                if (o->auth_info[auth_index].auth_type == ntoh8(imsg.method)) {
                    break;
                }
            }
            
            if (auth_index == o->num_auth_info) {
                BLog(BLOG_NOTICE, "server didn't accept any authentication method");
                goto fail;
            }
            
            const struct BSocksClient_auth_info *ai = &o->auth_info[auth_index];
            
            switch (ai->auth_type) {
                case SOCKS_METHOD_NO_AUTHENTICATION_REQUIRED: {
                    BLog(BLOG_DEBUG, "no authentication");
                    
                    auth_finished(o);
                } break;
                
                case SOCKS_METHOD_USERNAME_PASSWORD: {
                    BLog(BLOG_DEBUG, "password authentication");
                    
                    if (ai->password.username_len == 0 || ai->password.username_len > 255 ||
                        ai->password.password_len == 0 || ai->password.password_len > 255
                    ) {
                        BLog(BLOG_NOTICE, "invalid username/password length");
                        goto fail;
                    }
                    
                    // allocate password packet
                    bsize_t size = bsize_fromsize(1 + 1 + ai->password.username_len + 1 + ai->password.password_len);
                    if (!reserve_buffer(o, size)) {
                        goto fail;
                    }
                    
                    // write password packet
                    char *ptr = o->buffer;
                    *ptr++ = 1;
                    *ptr++ = ai->password.username_len;
                    memcpy(ptr, ai->password.username, ai->password.username_len);
                    ptr += ai->password.username_len;
                    *ptr++ = ai->password.password_len;
                    memcpy(ptr, ai->password.password, ai->password.password_len);
                    ptr += ai->password.password_len;
                    
                    // start sending
                    PacketPassInterface_Sender_Send(o->control.send_if, (uint8_t *)o->buffer, size.value);
                    
                    // set state
                    o->state = STATE_SENDING_PASSWORD;
                } break;
                
                default: ASSERT(0);
            }
        } break;
        
        case STATE_SENT_REQUEST: {
            BLog(BLOG_DEBUG, "received reply header");
            
            struct socks_reply_header imsg;
            memcpy(&imsg, o->buffer, sizeof(imsg));
            
            if (ntoh8(imsg.ver) != SOCKS_VERSION) {
                BLog(BLOG_NOTICE, "wrong version");
                goto fail;
            }
            
            if (ntoh8(imsg.rep) != SOCKS_REP_SUCCEEDED) {
                BLog(BLOG_NOTICE, "reply not successful");
                goto fail;
            }
            
            int addr_len;
            switch (ntoh8(imsg.atyp)) {
                case SOCKS_ATYP_IPV4:
                    addr_len = sizeof(struct socks_addr_ipv4);
                    break;
                case SOCKS_ATYP_IPV6:
                    addr_len = sizeof(struct socks_addr_ipv6);
                    break;
                default:
                    BLog(BLOG_NOTICE, "reply has unknown address type");
                    goto fail;
            }
            
            // receive the rest of the reply
            start_receive(o, (uint8_t *)o->buffer + sizeof(imsg), addr_len);
            
            // set state
            o->state = STATE_RECEIVED_REPLY_HEADER;
        } break;
        
        case STATE_SENT_PASSWORD: {
            BLog(BLOG_DEBUG, "received password reply");
            
            if (o->buffer[0] != 1) {
                BLog(BLOG_NOTICE, "password reply has unknown version");
                goto fail;
            }
            
            if (o->buffer[1] != 0) {
                BLog(BLOG_NOTICE, "password reply is negative");
                goto fail;
            }
            
            auth_finished(o);
        } break;
        
        case STATE_RECEIVED_REPLY_HEADER: {
            BLog(BLOG_DEBUG, "received reply rest");
            
            // free buffer
            BFree(o->buffer);
            o->buffer = NULL;
            
            // free control I/O
            free_control_io(o);
            
            // init up I/O
            init_up_io(o);
            
            // set state
            o->state = STATE_UP;
            
            // call handler
            o->handler(o->user, BSOCKSCLIENT_EVENT_UP);
            return;
        } break;
        
        default:
            ASSERT(0);
    }
    
    return;
    
fail:
    report_error(o, BSOCKSCLIENT_EVENT_ERROR);
}