Пример #1
0
ssize_t dst_entry_tcp::slow_send(const iovec* p_iov, size_t sz_iov, bool b_blocked /*= true*/, bool is_rexmit /*= false*/, int flags /*= 0*/, socket_fd_api* sock /*= 0*/, tx_call_t call_type /*= 0*/)
{
	ssize_t ret_val = -1;

	NOT_IN_USE(sock);
	NOT_IN_USE(call_type);
	NOT_IN_USE(flags);

	m_slow_path_lock.lock();

	prepare_to_send(true);

	if (m_b_is_offloaded) {
		if (!is_valid()) { // That means that the neigh is not resolved yet
			//there is a copy inside so we should not update any ref-counts
			ret_val = pass_buff_to_neigh(p_iov, sz_iov);
		}
		else {
			ret_val = fast_send(p_iov, sz_iov, b_blocked, is_rexmit);
		}
	}
	else {
		dst_tcp_logdbg("Dst_entry is not offloaded, bug?");
	}
	m_slow_path_lock.unlock();
	return ret_val;
}
Пример #2
0
ssize_t dst_entry_tcp::slow_send(const iovec* p_iov, size_t sz_iov, bool b_blocked /*= true*/, bool is_rexmit /*= false*/, int flags /*= 0*/, socket_fd_api* sock /*= 0*/, tx_call_t call_type /*= 0*/)
{
	ssize_t ret_val = -1;

	NOT_IN_USE(sock);
	NOT_IN_USE(call_type);
	NOT_IN_USE(flags);

	m_slow_path_lock.lock();

	prepare_to_send(true);

	if (m_b_is_offloaded) {
		if (!is_valid()) { // That means that the neigh is not resolved yet
			if(is_rexmit){
				//drop retransmit packet, and don't save in neigh. if we will want to save in neigh, we need to make copy in save_iovec..()
				m_slow_path_lock.unlock();
				return ret_val;
			}
			ret_val = pass_buff_to_neigh(p_iov, sz_iov);
		}
		else {
			ret_val = fast_send(p_iov, sz_iov, b_blocked, is_rexmit);
		}
	}
	else {
		dst_tcp_logdbg("Dst_entry is not offloaded, bug?");
	}
	m_slow_path_lock.unlock();
	return ret_val;
}
Пример #3
0
ssize_t dst_entry_udp::slow_send(const iovec* p_iov, size_t sz_iov, bool b_blocked /*= true*/, bool is_rexmit /*= false*/, int flags /*= 0*/, socket_fd_api* sock /*= 0*/, tx_call_t call_type /*= 0*/)
{
	NOT_IN_USE(is_rexmit);

	ssize_t ret_val = 0;

	dst_udp_logdbg("In slow send");

	prepare_to_send();

	if (m_b_force_os || !m_b_is_offloaded) {
		struct sockaddr_in to_saddr;
		to_saddr.sin_port = m_dst_port;
		to_saddr.sin_addr.s_addr = m_dst_ip.get_in_addr();
		to_saddr.sin_family = AF_INET;
		dst_udp_logdbg("Calling to tx_os");
		ret_val = sock->tx_os(call_type, p_iov, sz_iov, flags, (const struct sockaddr*)&to_saddr, sizeof(struct sockaddr_in));
	}
	else {
		if (!is_valid()) { // That means that the neigh is not resolved yet
			ret_val = pass_buff_to_neigh(p_iov, sz_iov);
		}
		else {
			ret_val = fast_send(p_iov, sz_iov, b_blocked);
		}
	}

	return ret_val;
}
Пример #4
0
void t_write(void* sock)
{
    int* sockfd = (int*) &sock;
    size_t number_of_bytes;
    char buffer[BUFFER_SIZE];
    char *message = (char *)malloc(BUFFER_SIZE);
    int error = 0;
    char destiny[7];
    char data[80];
    
    while(1)
    {
        printf("%s>", user);
        scanf("%s", buffer);
        if (strncasecmp(buffer, "connect", 7) == 0)
        {
            package send_msn = new_package(user, "server", 'C', "CONEXION");
            message = prepare_to_send(send_msn);
        }
        else if (strncasecmp(buffer, "exit", 4) == 0)
        {
            package send_msn = new_package(user, "server", 'Q', "QUIT");
            message = prepare_to_send(send_msn);
        }
        else if (strncasecmp(buffer, "show", 10) == 0)
        {
            scanf("%s", destiny);
            package send_msn = new_package(user, "server", 'L', "PETICION LISTA USUARIOS");
            message = prepare_to_send(send_msn);
        }
        else if (strncasecmp(buffer, "send", 4) == 0)
        {
            scanf("%s", destiny);
            fgets(data, 80, stdin);
            package send_msn = new_package(user, destiny, 'S', data);
            message = prepare_to_send(send_msn);
        }
        else if (strncasecmp(buffer, "broadcast", 9) == 0)
        {
            fgets(data, 80, stdin);
            package send_msn = new_package(user, "server", 'B', data);
            message = prepare_to_send(send_msn);
        }else{
            package send_msn = new_package(user, "server", 'E', "Error. El comando no existe");
            message = prepare_to_send(send_msn);
            printf("Error.El comando no existe.\n");
            error =1;
        }
        number_of_bytes = write(*sockfd, message, BUFFER_SIZE);
        
        /*if (number_of_bytes < 0)
        {
        panic_with_system_message("Error al escribir datos en el servidor.");
        }*/
        
    }
    pthread_exit(0);
}
Пример #5
0
ssize_t dst_entry_tcp::slow_send_neigh(const iovec* p_iov, size_t sz_iov)
{
	ssize_t ret_val = -1;

	m_slow_path_lock.lock();

	prepare_to_send(true);

	if (m_b_is_offloaded) {
		ret_val = pass_buff_to_neigh(p_iov, sz_iov);
	}
	else {
		dst_tcp_logdbg("Dst_entry is not offloaded, bug?");
	}

	m_slow_path_lock.unlock();
	return ret_val;
}