void ring_bond::devide_buffers_helper(descq_t *rx_reuse, descq_t* buffer_per_ring) { int last_found_index = 0; while (!rx_reuse->empty()) { mem_buf_desc_t* buff = rx_reuse->front(); rx_reuse->pop_front(); uint32_t checked = 0; int index = last_found_index; while (checked < m_n_num_resources) { if (m_bond_rings[index] == buff->p_desc_owner) { buffer_per_ring[index].push_back(buff); last_found_index = index; break; } checked++; index++; index = index % m_n_num_resources; } //no owner if (checked == m_n_num_resources) { ring_logfunc("No matching ring %p to return buffer", buff->p_desc_owner); buffer_per_ring[m_n_num_resources].push_back(buff); } } }
void ring_bond::send_lwip_buffer(ring_user_id_t id, vma_ibv_send_wr* p_send_wqe, bool b_block) { mem_buf_desc_t* p_mem_buf_desc = (mem_buf_desc_t*)(p_send_wqe->wr_id); ring_simple* active_ring = m_active_rings[id]; if (likely(active_ring && p_mem_buf_desc->p_desc_owner == active_ring)) { active_ring->send_lwip_buffer(id, p_send_wqe, b_block); } else { ring_logfunc("active ring=%p, silent packet drop (%p), (HA event?)", active_ring, p_mem_buf_desc); p_mem_buf_desc->p_next_desc = NULL; /* no need to free the buffer here, as for lwip buffers we have 2 ref counts, */ /* one for caller, and one for completion. for completion, we ref count in */ /* send_lwip_buffer(). Since we are not going in, the caller will free the */ /* buffer. */ } }
void ring_bond::send_ring_buffer(ring_user_id_t id, vma_ibv_send_wr* p_send_wqe, vma_wr_tx_packet_attr attr) { mem_buf_desc_t* p_mem_buf_desc = (mem_buf_desc_t*)(p_send_wqe->wr_id); ring_simple* active_ring = m_active_rings[id]; if (likely(active_ring && p_mem_buf_desc->p_desc_owner == active_ring)) { active_ring->send_ring_buffer(id, p_send_wqe, attr); } else { ring_logfunc("active ring=%p, silent packet drop (%p), (HA event?)", active_ring, p_mem_buf_desc); p_mem_buf_desc->p_next_desc = NULL; active_ring = m_bond_rings[id]; if (likely(p_mem_buf_desc->p_desc_owner == active_ring)) { active_ring->mem_buf_tx_release(p_mem_buf_desc, true); } else { mem_buf_tx_release(p_mem_buf_desc, true); } } }