Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DOCA] Remove RX obsolete extra APIs #154

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ Example:
XLIO DETAILS: Num of UC ARPs 3 [XLIO_NEIGH_UC_ARP_QUATA]
XLIO DETAILS: UC ARP delay (msec) 10000 [XLIO_NEIGH_UC_ARP_DELAY_MSEC]
XLIO DETAILS: Num of neigh restart retries 1 [XLIO_NEIGH_NUM_ERR_RETRIES]
XLIO DETAILS: SocketXtreme mode Disabled [XLIO_SOCKETXTREME]
XLIO DETAILS: TSO support auto [XLIO_TSO]
XLIO DETAILS: UTLS RX support Disabled [XLIO_UTLS_RX]
XLIO DETAILS: UTLS TX support Enabled [XLIO_UTLS_TX]
Expand Down Expand Up @@ -1003,13 +1002,6 @@ This is, in practice, a very rudimentary dup2 support.
It only supports the case, where dup2 is used to close file descriptors,
Default value is 1 (Enabled)

XLIO_SOCKETXTREME
When this parameter is enabled, XLIO operates in SocketXtreme mode.
SocketXtreme mode brings latency down, eliminating copy operations and
increasing throughput allowing applications to further utilize true kernel
bypass architecture. An application should use a socket extension API named SocketXtreme.
Default value is 0 (Disabled)

XLIO_MTU
Size of each Rx and Tx data buffer (Maximum Transfer Unit).
This value sets the fragmentation size of the packets sent by the library.
Expand Down
18 changes: 0 additions & 18 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -220,24 +220,6 @@ DPCP_CAPABILITY_SETUP()
UTLS_CAPABILITY_SETUP()
DOCA_CAPABILITY_SETUP()

# Thread locking control
#
AC_ARG_ENABLE([thread-lock],
AS_HELP_STRING([--enable-thread-lock],
[Enable thread locking (default=yes)]))
AC_MSG_CHECKING(
[for thread locking support])
if test "x$enable_thread_lock" = "xno"; then
if test "x$enable_socketxtreme" = xyes; then
AC_DEFINE([DEFINED_NO_THREAD_LOCK], 1, [Define to 1 to disable thread locking])
AC_MSG_RESULT([no])
else
AC_MSG_RESULT([yes (socketxtreme is not enabled)])
fi
else
AC_MSG_RESULT([yes])
fi

# Enable tcp tx window availability
#
AC_ARG_ENABLE([tcp-tx-wnd-availability],
Expand Down
32 changes: 8 additions & 24 deletions contrib/jenkins_tests/gtest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,16 @@ eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app
rc=$(($rc+$?))

# Exclude EXTRA API tests IPv6
# eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=-xlio_* --gtest_output=xml:${WORKSPACE}/${prefix}/test-basic-ipv6.xml"
# rc=$(($rc+$?))
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=-xlio_* --gtest_output=xml:${WORKSPACE}/${prefix}/test-basic-ipv6.xml"
rc=$(($rc+$?))

# Verify Delegated TCP Timers tests
eval "${sudo_cmd} $timeout_exe env XLIO_RX_POLL_ON_TX_TCP=1 XLIO_TCP_ABORT_ON_CLOSE=1 XLIO_TCP_CTL_THREAD=delegate GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=-xlio* --gtest_output=xml:${WORKSPACE}/${prefix}/test-delegate.xml"
rc=$(($rc+$?))

# Verify Delegated TCP Timers tests IPv6
# eval "${sudo_cmd} $timeout_exe env XLIO_RX_POLL_ON_TX_TCP=1 XLIO_TCP_ABORT_ON_CLOSE=1 XLIO_TCP_CTL_THREAD=delegate GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=-xlio* --gtest_output=xml:${WORKSPACE}/${prefix}/test-delegate-ipv6.xml"
# rc=$(($rc+$?))
eval "${sudo_cmd} $timeout_exe env XLIO_RX_POLL_ON_TX_TCP=1 XLIO_TCP_ABORT_ON_CLOSE=1 XLIO_TCP_CTL_THREAD=delegate GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=-xlio* --gtest_output=xml:${WORKSPACE}/${prefix}/test-delegate-ipv6.xml"
rc=$(($rc+$?))

if [[ -z "${MANUAL_RUN}" ]]; then
make -C tests/gtest clean
Expand All @@ -100,36 +100,20 @@ if [[ -z "${MANUAL_RUN}" ]]; then
fi

# Verify XLIO EXTRA API tests
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=xlio_*:-socketxtreme_poll.*:socketxtreme_ring.*:xlio_send_zc.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-extra.xml"
rc=$(($rc+$?))

# Verify XLIO EXTRA API socketxtreme mode tests
eval "${sudo_cmd} $timeout_exe env XLIO_SOCKETXTREME=1 GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=socketxtreme_poll.*:socketxtreme_ring.*:sock_socket.*:tcp_bind.*:tcp_connect.*:tcp_sendto.*:tcp_set_get_sockopt*:udp_bind.*:udp_connect.*:udp_sendto.*:udp_socket.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-socketxtreme.xml"
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=xlio_*:xlio_send_zc.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-extra.xml"
rc=$(($rc+$?))

# Verify XLIO EXTRA API tests IPv6
# eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=xlio_*:-socketxtreme_poll.*:socketxtreme_ring.*:xlio_send_zc.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-extra-ipv6.xml"
# rc=$(($rc+$?))

# Verify XLIO EXTRA API socketxtreme mode tests IPv6
# eval "${sudo_cmd} $timeout_exe env XLIO_SOCKETXTREME=1 GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=socketxtreme_poll.*:socketxtreme_ring.*:sock_socket.*:tcp_bind.*:tcp_connect.*:tcp_sendto.*:tcp_set_get_sockopt*:udp_bind.*:udp_connect.*:udp_sendto.*:udp_socket.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-socketxtreme-ipv6.xml"
# rc=$(($rc+$?))

# Verify socketxtreme mode and Delegated TCP Timers tests
eval "${sudo_cmd} $timeout_exe env XLIO_SOCKETXTREME=1 XLIO_RX_POLL_ON_TX_TCP=1 XLIO_TCP_ABORT_ON_CLOSE=1 XLIO_TCP_CTL_THREAD=delegate GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=socketxtreme_poll.*:socketxtreme_ring.*:sock_socket.*:tcp_bind.*:tcp_connect.*:tcp_sendto.*:tcp_set_get_sockopt*:udp_bind.*:udp_connect.*:udp_sendto.*:udp_socket.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-socketxtreme-delegate.xml"
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=xlio_*:xlio_send_zc.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-extra-ipv6.xml"
rc=$(($rc+$?))

# Verify socketxtreme mode and Delegated TCP Timers tests IPv6
# eval "${sudo_cmd} $timeout_exe env XLIO_SOCKETXTREME=1 XLIO_RX_POLL_ON_TX_TCP=1 XLIO_TCP_ABORT_ON_CLOSE=1 XLIO_TCP_CTL_THREAD=delegate GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=socketxtreme_poll.*:socketxtreme_ring.*:sock_socket.*:tcp_bind.*:tcp_connect.*:tcp_sendto.*:tcp_set_get_sockopt*:udp_bind.*:udp_connect.*:udp_sendto.*:udp_socket.* --gtest_output=xml:${WORKSPACE}/${prefix}/test-socketxtreme-delegate-ipv6.xml"
# rc=$(($rc+$?))

# Verify keep_alive
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt --gtest_filter=keep_alive* --gtest_output=xml:${WORKSPACE}/${prefix}/test-keepalive_ipv4.xml"
rc=$(($rc+$?))

# Verify keep_alive IPv6
# eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=keep_alive* --gtest_output=xml:${WORKSPACE}/${prefix}/test-keepalive_ipv6.xml"
# rc=$(($rc+$?))
eval "${sudo_cmd} $timeout_exe env GTEST_TAP=2 LD_PRELOAD=$gtest_lib $gtest_app $gtest_opt_ipv6 --gtest_filter=keep_alive* --gtest_output=xml:${WORKSPACE}/${prefix}/test-keepalive_ipv6.xml"
rc=$(($rc+$?))

eval "${sudo_cmd} pkill -9 ${prj_service} 2>/dev/null || true"

Expand Down
36 changes: 0 additions & 36 deletions src/core/dev/cq_mgr_rx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,6 @@ cq_mgr_rx::~cq_mgr_rx()
{
cq_logdbg("Destroying Rx CQ");

if (m_rx_buffs_rdy_for_free_head) {
reclaim_recv_buffers(m_rx_buffs_rdy_for_free_head);
}

m_b_was_drained = true;
if (m_rx_queue.size() + m_rx_pool.size()) {
cq_logdbg("Returning %lu buffers to global Rx pool (ready queue %lu, free pool %lu))",
Expand Down Expand Up @@ -395,11 +391,6 @@ mem_buf_desc_t *cq_mgr_rx::cqe_process_rx(mem_buf_desc_t *p_mem_buf_desc, enum b
/* Assume locked!!! */
cq_logfuncall("");

/* we use context to verify that on reclaim rx buffer path we return the buffer to the right CQ
*/
p_mem_buf_desc->rx.is_xlio_thr = false;
p_mem_buf_desc->rx.context = nullptr;

if (unlikely(status != BS_OK)) {
m_p_next_rx_desc_poll = nullptr;
reclaim_recv_buffer_helper(p_mem_buf_desc);
Expand Down Expand Up @@ -489,10 +480,6 @@ void cq_mgr_rx::mem_buf_desc_return_to_owner(mem_buf_desc_t *p_mem_buf_desc,

bool cq_mgr_rx::reclaim_recv_buffers(mem_buf_desc_t *rx_reuse_lst)
{
if (m_rx_buffs_rdy_for_free_head) {
reclaim_recv_buffer_helper(m_rx_buffs_rdy_for_free_head);
m_rx_buffs_rdy_for_free_head = m_rx_buffs_rdy_for_free_tail = nullptr;
}
reclaim_recv_buffer_helper(rx_reuse_lst);
return_extra_buffers();

Expand All @@ -508,29 +495,6 @@ bool cq_mgr_rx::reclaim_recv_buffers_no_lock(mem_buf_desc_t *rx_reuse_lst)
return false;
}

int cq_mgr_rx::reclaim_recv_single_buffer(mem_buf_desc_t *rx_reuse)
{
int ret_val = 0;

ret_val = rx_reuse->lwip_pbuf_dec_ref_count();
if ((ret_val == 0) && (rx_reuse->get_ref_count() <= 0)) {
/*if ((safe_mce_sys().thread_mode > THREAD_MODE_SINGLE)) {
m_lock_ring_rx.lock();
}*/
if (!m_rx_buffs_rdy_for_free_head) {
m_rx_buffs_rdy_for_free_head = m_rx_buffs_rdy_for_free_tail = rx_reuse;
} else {
m_rx_buffs_rdy_for_free_tail->p_next_desc = rx_reuse;
m_rx_buffs_rdy_for_free_tail = rx_reuse;
}
m_rx_buffs_rdy_for_free_tail->p_next_desc = nullptr;
/*if ((safe_mce_sys().thread_mode > THREAD_MODE_SINGLE)) {
m_lock_ring_rx.lock();
}*/
}
return ret_val;
}

bool cq_mgr_rx::reclaim_recv_buffers(descq_t *rx_reuse)
{
cq_logfuncall("");
Expand Down
9 changes: 0 additions & 9 deletions src/core/dev/cq_mgr_rx.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,6 @@ class cq_mgr_rx {
*/
virtual int poll_and_process_element_rx(uint64_t *p_cq_poll_sn,
void *pv_fd_ready_array = nullptr) = 0;
virtual mem_buf_desc_t *poll_and_process_socketxtreme() { return nullptr; };

/**
* This will check if the cq was drained, and if it wasn't it will drain it.
Expand All @@ -154,7 +153,6 @@ class cq_mgr_rx {
bool reclaim_recv_buffers(descq_t *rx_reuse);
bool reclaim_recv_buffers(mem_buf_desc_t *rx_reuse_lst);
bool reclaim_recv_buffers_no_lock(mem_buf_desc_t *rx_reuse_lst);
int reclaim_recv_single_buffer(mem_buf_desc_t *rx_reuse);

void get_cq_event(int count = 1) { xlio_ib_mlx5_get_cq_event(&m_mlx5_cq, count); };

Expand Down Expand Up @@ -210,13 +208,6 @@ class cq_mgr_rx {
const uint32_t m_n_sysvar_rx_num_wr_to_post_recv;
descq_t m_rx_pool;

/* This fields are needed to track internal memory buffers
* represented as struct xlio_buff_t
* from user application by special XLIO extended API
*/
mem_buf_desc_t *m_rx_buffs_rdy_for_free_head = nullptr;
mem_buf_desc_t *m_rx_buffs_rdy_for_free_tail = nullptr;

private:
struct ibv_comp_channel *m_comp_event_channel;
bool m_b_notification_armed = false;
Expand Down
25 changes: 0 additions & 25 deletions src/core/dev/cq_mgr_rx_regrq.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,6 @@ int cq_mgr_rx_regrq::drain_and_proccess_helper(mem_buf_desc_t *buff, buff_status
bool procces_now = is_eth_tcp_frame(buff);

if (procces_now) { // We process immediately all non udp/ip traffic..
buff->rx.is_xlio_thr = true;
if ((++m_debt < (int)m_n_sysvar_rx_num_wr_to_post_recv) ||
!compensate_qp_poll_success(buff)) {
process_recv_buffer(buff, nullptr);
Expand Down Expand Up @@ -251,8 +250,6 @@ int cq_mgr_rx_regrq::drain_and_proccess(uintptr_t *p_recycle_buffers_last_wr_id
* Internal thread:
* Frequency of real polling can be controlled by
* PROGRESS_ENGINE_INTERVAL and PROGRESS_ENGINE_WCE_MAX.
* socketxtreme:
* User does socketxtreme_poll()
* Cleanup:
* QP down logic to release rx buffers should force polling to do this.
* Not null argument indicates one.
Expand Down Expand Up @@ -280,7 +277,6 @@ int cq_mgr_rx_regrq::drain_and_proccess(uintptr_t *p_recycle_buffers_last_wr_id

/* We process immediately all non udp/ip traffic.. */
if (procces_now) {
buff->rx.is_xlio_thr = true;
if ((++m_debt < (int)m_n_sysvar_rx_num_wr_to_post_recv) ||
!compensate_qp_poll_success(buff)) {
process_recv_buffer(buff, NULL);
Expand Down Expand Up @@ -319,27 +315,6 @@ int cq_mgr_rx_regrq::drain_and_proccess(uintptr_t *p_recycle_buffers_last_wr_id
return ret_total;
}

mem_buf_desc_t *cq_mgr_rx_regrq::poll_and_process_socketxtreme()
{
buff_status_e status = BS_OK;
mem_buf_desc_t *buff_wqe = poll(status);

if (buff_wqe) {
if (cqe_process_rx(buff_wqe, status)) {
if ((++m_debt < (int)m_n_sysvar_rx_num_wr_to_post_recv) ||
!compensate_qp_poll_success(buff_wqe)) {
return buff_wqe;
}
} else if (++m_debt >= (int)m_n_sysvar_rx_num_wr_to_post_recv) {
compensate_qp_poll_failed();
}
} else {
compensate_qp_poll_failed();
}

return nullptr;
}

int cq_mgr_rx_regrq::poll_and_process_element_rx(uint64_t *p_cq_poll_sn, void *pv_fd_ready_array)
{
/* Assume locked!!! */
Expand Down
1 change: 0 additions & 1 deletion src/core/dev/cq_mgr_rx_regrq.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ class cq_mgr_rx_regrq : public cq_mgr_rx {
virtual ~cq_mgr_rx_regrq() override;

virtual int drain_and_proccess(uintptr_t *p_recycle_buffers_last_wr_id = nullptr) override;
virtual mem_buf_desc_t *poll_and_process_socketxtreme() override;
virtual int poll_and_process_element_rx(uint64_t *p_cq_poll_sn,
void *pv_fd_ready_array = nullptr) override;

Expand Down
24 changes: 0 additions & 24 deletions src/core/dev/cq_mgr_rx_strq.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,6 @@ cq_mgr_rx_strq::~cq_mgr_rx_strq()
cq_logfunc("");
cq_logdbg("destroying CQ STRQ");

if (m_rx_buffs_rdy_for_free_head) {
reclaim_recv_buffer_helper(m_rx_buffs_rdy_for_free_head);
m_rx_buffs_rdy_for_free_head = m_rx_buffs_rdy_for_free_tail = nullptr;
}

if (m_rx_queue.size()) {
cq_logdbg("Clearing %zu stride objects)", m_rx_queue.size());

Expand Down Expand Up @@ -356,7 +351,6 @@ int cq_mgr_rx_strq::drain_and_proccess_helper(mem_buf_desc_t *buff, mem_buf_desc

// We process immediately all non udp/ip traffic..
if (procces_now) {
buff->rx.is_xlio_thr = true;
process_recv_buffer(buff, nullptr);
} else { // udp/ip traffic we just put in the cq's rx queue
m_rx_queue.push_back(buff);
Expand Down Expand Up @@ -425,11 +419,6 @@ mem_buf_desc_t *cq_mgr_rx_strq::process_strq_cq_element_rx(mem_buf_desc_t *p_mem
/* Assume locked!!! */
cq_logfuncall("");

/* we use context to verify that on reclaim rx buffer path we return the buffer to the right CQ
*/
p_mem_buf_desc->rx.is_xlio_thr = false;
p_mem_buf_desc->rx.context = nullptr;

if (unlikely(status != BS_OK)) {
reclaim_recv_buffer_helper(p_mem_buf_desc);
return nullptr;
Expand All @@ -444,19 +433,6 @@ mem_buf_desc_t *cq_mgr_rx_strq::process_strq_cq_element_rx(mem_buf_desc_t *p_mem
return p_mem_buf_desc;
}

mem_buf_desc_t *cq_mgr_rx_strq::poll_and_process_socketxtreme()
{
buff_status_e status = BS_OK;
mem_buf_desc_t *buff = nullptr;
mem_buf_desc_t *buff_wqe = poll(status, buff);

if ((buff_wqe && (++m_debt >= (int)m_n_sysvar_rx_num_wr_to_post_recv)) || !buff) {
compensate_qp_poll_failed(); // Reuse this method as success.
}

return (buff && cqe_process_rx(buff, status) ? buff : nullptr);
}

int cq_mgr_rx_strq::poll_and_process_element_rx(uint64_t *p_cq_poll_sn, void *pv_fd_ready_array)
{
/* Assume locked!!! */
Expand Down
1 change: 0 additions & 1 deletion src/core/dev/cq_mgr_rx_strq.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ class cq_mgr_rx_strq : public cq_mgr_rx {
virtual ~cq_mgr_rx_strq() override;

virtual int drain_and_proccess(uintptr_t *p_recycle_buffers_last_wr_id = NULL) override;
virtual mem_buf_desc_t *poll_and_process_socketxtreme() override;
virtual int poll_and_process_element_rx(uint64_t *p_cq_poll_sn,
void *pv_fd_ready_array = NULL) override;
virtual void add_hqrx(hw_queue_rx *qp) override;
Expand Down
2 changes: 0 additions & 2 deletions src/core/dev/net_device_table_mgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,6 @@ net_device_table_mgr::net_device_table_mgr()
g_p_netlink_handler->register_event(nlgrpLINK, this);
ndtm_logdbg("Registered to g_p_netlink_handler");

#ifndef DEFINED_NO_THREAD_LOCK
if (safe_mce_sys().progress_engine_interval_msec != MCE_CQ_DRAIN_INTERVAL_DISABLED &&
safe_mce_sys().progress_engine_wce_max != 0) {
ndtm_logdbg("registering timer for ring draining with %d msec intervales",
Expand All @@ -141,7 +140,6 @@ net_device_table_mgr::net_device_table_mgr()
PERIODIC_TIMER,
(void *)RING_ADAPT_CQ_MODERATION_TIMER);
}
#endif // DEFINED_NO_THREAD_LOCK

ndtm_logdbg("Done");
}
Expand Down
3 changes: 1 addition & 2 deletions src/core/dev/rfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@ class rfs {
virtual ~rfs();

/**
* Register/Unregister a sink with this rfs object
* Get notifications about incoming packets using the sockinfo callback api
* Register/Unregister a sink with this rfs object.
* The rfs will call ibv_attach on the QP once when at least one receiver sink is registered
* An ibv_detach is called when the last receiver sink is deleted from the registered list
*
Expand Down
1 change: 0 additions & 1 deletion src/core/dev/rfs_uc_tcp_gro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ void rfs_uc_tcp_gro::flush_gro_desc(void *pv_fd_ready_array)
m_gro_desc.p_first->lwip_pbuf.ref = 1;
m_gro_desc.p_first->lwip_pbuf.payload =
(u8_t *)(m_gro_desc.p_first->p_buffer + m_gro_desc.p_first->rx.n_transport_header_len);
m_gro_desc.p_first->rx.is_xlio_thr = m_gro_desc.p_last->rx.is_xlio_thr;

for (mem_buf_desc_t *p_desc = m_gro_desc.p_last; p_desc != m_gro_desc.p_first;
p_desc = p_desc->p_prev_desc) {
Expand Down
Loading