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