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; }
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; }
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; }
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); }
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; }