Skip to content

Commit b166325

Browse files
committed
WIP
Signed-off-by: Dmytro Podgornyi <[email protected]>
1 parent 1227dc8 commit b166325

11 files changed

+245
-44
lines changed

src/core/event/event_handler_manager.cpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,21 @@ void event_handler_manager::unregister_timers_event_and_delete(timer_handler *ha
182182
post_new_reg_action(reg_action);
183183
}
184184

185-
void event_handler_manager::unregister_socket_timer_and_delete(sockinfo_tcp *sock_tcp)
185+
void event_handler_manager::unregister_socket_timer_event(sockinfo_tcp *sock_tcp)
186186
{
187187
evh_logdbg("Unregistering TCP socket timer: %p", sock_tcp);
188188
reg_action_t reg_action;
189189
memset(&reg_action, 0, sizeof(reg_action));
190+
reg_action.type = UNREGISTER_TCP_SOCKET_TIMER;
191+
reg_action.info.timer.user_data = sock_tcp;
192+
post_new_reg_action(reg_action);
193+
}
194+
195+
void event_handler_manager::unregister_socket_timer_and_delete(sockinfo_tcp *sock_tcp)
196+
{
197+
evh_logdbg("Unregistering TCP socket timer and destroying: %p", sock_tcp);
198+
reg_action_t reg_action;
199+
memset(&reg_action, 0, sizeof(reg_action));
190200
reg_action.type = UNREGISTER_TCP_SOCKET_TIMER_AND_DELETE;
191201
reg_action.info.timer.user_data = sock_tcp;
192202
post_new_reg_action(reg_action);
@@ -447,6 +457,8 @@ const char *event_handler_manager::reg_action_str(event_action_type_e reg_action
447457
switch (reg_action_type) {
448458
case REGISTER_TCP_SOCKET_TIMER:
449459
return "REGISTER_TCP_SOCKET_TIMER";
460+
case UNREGISTER_TCP_SOCKET_TIMER:
461+
return "UNREGISTER_TCP_SOCKET_TIMER";
450462
case UNREGISTER_TCP_SOCKET_TIMER_AND_DELETE:
451463
return "UNREGISTER_TCP_SOCKET_TIMER_AND_DELETE";
452464
case REGISTER_TIMER:
@@ -729,6 +741,10 @@ void event_handler_manager::handle_registration_action(reg_action_t &reg_action)
729741
sock = reinterpret_cast<sockinfo_tcp *>(reg_action.info.timer.user_data);
730742
sock->get_tcp_timer_collection()->add_new_timer(sock);
731743
break;
744+
case UNREGISTER_TCP_SOCKET_TIMER:
745+
sock = reinterpret_cast<sockinfo_tcp *>(reg_action.info.timer.user_data);
746+
sock->get_tcp_timer_collection()->remove_timer(sock);
747+
break;
732748
case UNREGISTER_TCP_SOCKET_TIMER_AND_DELETE:
733749
sock = reinterpret_cast<sockinfo_tcp *>(reg_action.info.timer.user_data);
734750
sock->get_tcp_timer_collection()->remove_timer(sock);

src/core/event/event_handler_manager.h

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ typedef std::map<void * /*event_handler_id*/, event_handler_rdma_cm * /*p_event_
5454

5555
typedef enum {
5656
REGISTER_TCP_SOCKET_TIMER,
57+
UNREGISTER_TCP_SOCKET_TIMER,
5758
UNREGISTER_TCP_SOCKET_TIMER_AND_DELETE,
5859
REGISTER_TIMER,
5960
WAKEUP_TIMER, /* NOT AVAILABLE FOR GROUPED TIMERS */
@@ -193,6 +194,7 @@ class event_handler_manager : public wakeup_pipe {
193194
void unregister_timers_event_and_delete(timer_handler *handler);
194195

195196
void register_socket_timer_event(sockinfo_tcp *sock_tcp);
197+
void unregister_socket_timer_event(sockinfo_tcp *sock_tcp);
196198
void unregister_socket_timer_and_delete(sockinfo_tcp *sock_tcp);
197199

198200
void register_ibverbs_event(int fd, event_handler_ibverbs *handler, void *channel,

src/core/event/poll_group.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ poll_group::poll_group(const struct xlio_poll_group_attr *attr)
5959
: m_socket_event_cb(attr->socket_event_cb)
6060
, m_socket_comp_cb(attr->socket_comp_cb)
6161
, m_socket_rx_cb(attr->socket_rx_cb)
62+
, m_socket_accept_cb(attr->socket_accept_cb)
6263
, m_group_flags(attr->flags)
6364
{
6465
/*
@@ -178,7 +179,7 @@ void poll_group::add_socket(sockinfo_tcp *si)
178179
g_p_fd_collection->set_socket(si->get_fd(), si);
179180
}
180181

181-
void poll_group::close_socket(sockinfo_tcp *si, bool force /*=false*/)
182+
void poll_group::remove_socket(sockinfo_tcp *si)
182183
{
183184
g_p_fd_collection->clear_socket(si->get_fd());
184185
m_sockets_list.erase(si);
@@ -187,6 +188,11 @@ void poll_group::close_socket(sockinfo_tcp *si, bool force /*=false*/)
187188
if (iter != std::end(m_dirty_sockets)) {
188189
m_dirty_sockets.erase(iter);
189190
}
191+
}
192+
193+
void poll_group::close_socket(sockinfo_tcp *si, bool force /*=false*/)
194+
{
195+
remove_socket(si);
190196

191197
bool closed = si->prepare_to_close(force);
192198
if (closed) {

src/core/event/poll_group.h

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class poll_group {
6161
void add_ring(ring *rng, ring_alloc_logic_attr *attr);
6262

6363
void add_socket(sockinfo_tcp *si);
64+
void remove_socket(sockinfo_tcp *si);
6465
void close_socket(sockinfo_tcp *si, bool force = false);
6566

6667
unsigned get_flags() const { return m_group_flags; }
@@ -71,6 +72,7 @@ class poll_group {
7172
xlio_socket_event_cb_t m_socket_event_cb;
7273
xlio_socket_comp_cb_t m_socket_comp_cb;
7374
xlio_socket_rx_cb_t m_socket_rx_cb;
75+
xlio_socket_accept_cb_t m_socket_accept_cb;
7476

7577
private:
7678
std::vector<ring *> m_rings;

src/core/sock/sock-extra.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,15 @@ struct xlio_api_t *extra_api()
379379
SET_EXTRA_API(xlio_poll_group_poll, xlio_poll_group_poll, XLIO_EXTRA_API_XLIO_SOCKET);
380380
SET_EXTRA_API(xlio_socket_create, xlio_socket_create, XLIO_EXTRA_API_XLIO_SOCKET);
381381
SET_EXTRA_API(xlio_socket_destroy, xlio_socket_destroy, XLIO_EXTRA_API_XLIO_SOCKET);
382+
SET_EXTRA_API(xlio_socket_update, xlio_socket_update, XLIO_EXTRA_API_XLIO_SOCKET);
382383
SET_EXTRA_API(xlio_socket_setsockopt, xlio_socket_setsockopt, XLIO_EXTRA_API_XLIO_SOCKET);
384+
SET_EXTRA_API(xlio_socket_getpeername, xlio_socket_getpeername, XLIO_EXTRA_API_XLIO_SOCKET);
383385
SET_EXTRA_API(xlio_socket_bind, xlio_socket_bind, XLIO_EXTRA_API_XLIO_SOCKET);
384386
SET_EXTRA_API(xlio_socket_connect, xlio_socket_connect, XLIO_EXTRA_API_XLIO_SOCKET);
387+
SET_EXTRA_API(xlio_socket_listen, xlio_socket_listen, XLIO_EXTRA_API_XLIO_SOCKET);
385388
SET_EXTRA_API(xlio_socket_get_pd, xlio_socket_get_pd, XLIO_EXTRA_API_XLIO_SOCKET);
389+
SET_EXTRA_API(xlio_socket_detach_group, xlio_socket_detach_group, XLIO_EXTRA_API_XLIO_SOCKET);
390+
SET_EXTRA_API(xlio_socket_attach_group, xlio_socket_attach_group, XLIO_EXTRA_API_XLIO_SOCKET);
386391
SET_EXTRA_API(xlio_socket_send, xlio_socket_send, XLIO_EXTRA_API_XLIO_SOCKET);
387392
SET_EXTRA_API(xlio_socket_sendv, xlio_socket_sendv, XLIO_EXTRA_API_XLIO_SOCKET);
388393
SET_EXTRA_API(xlio_poll_group_flush, xlio_poll_group_flush, XLIO_EXTRA_API_XLIO_SOCKET);
@@ -503,6 +508,12 @@ extern "C" int xlio_socket_destroy(xlio_socket_t sock)
503508
return 0;
504509
}
505510

511+
extern "C" int xlio_socket_update(xlio_socket_t sock, unsigned flags, uintptr_t userdata_sq)
512+
{
513+
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
514+
return si->update_xlio_socket(flags, userdata_sq);
515+
}
516+
506517
extern "C" int xlio_socket_setsockopt(xlio_socket_t sock, int level, int optname,
507518
const void *optval, socklen_t optlen)
508519
{
@@ -516,6 +527,13 @@ extern "C" int xlio_socket_setsockopt(xlio_socket_t sock, int level, int optname
516527
return rc;
517528
}
518529

530+
extern "C" int xlio_socket_getpeername(xlio_socket_t sock, struct sockaddr *addr,
531+
socklen_t *addrlen)
532+
{
533+
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
534+
return si->getpeername(addr, addrlen);
535+
}
536+
519537
extern "C" int xlio_socket_bind(xlio_socket_t sock, const struct sockaddr *addr, socklen_t addrlen)
520538
{
521539
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
@@ -542,6 +560,18 @@ extern "C" int xlio_socket_connect(xlio_socket_t sock, const struct sockaddr *to
542560
return rc;
543561
}
544562

563+
extern "C" int xlio_socket_listen(xlio_socket_t sock)
564+
{
565+
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
566+
poll_group *group = si->get_poll_group();
567+
568+
if (!group->m_socket_accept_cb) {
569+
errno = ENOTCONN;
570+
return -1;
571+
}
572+
return si->listen(-1);
573+
}
574+
545575
extern "C" struct ibv_pd *xlio_socket_get_pd(xlio_socket_t sock)
546576
{
547577
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
@@ -550,6 +580,21 @@ extern "C" struct ibv_pd *xlio_socket_get_pd(xlio_socket_t sock)
550580
return ctx ? ctx->get_ibv_pd() : nullptr;
551581
}
552582

583+
int xlio_socket_detach_group(xlio_socket_t sock)
584+
{
585+
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
586+
587+
return si->detach_xlio_group();
588+
}
589+
590+
int xlio_socket_attach_group(xlio_socket_t sock, xlio_poll_group_t group)
591+
{
592+
sockinfo_tcp *si = reinterpret_cast<sockinfo_tcp *>(sock);
593+
poll_group *grp = reinterpret_cast<poll_group *>(group);
594+
595+
return si->attach_xlio_group(grp);
596+
}
597+
553598
static void xlio_buf_free(struct xlio_buf *buf)
554599
{
555600
mem_buf_desc_t *desc = mem_buf_desc_t::from_xlio_buf(buf);

src/core/sock/sockinfo.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -969,9 +969,7 @@ bool sockinfo::attach_receiver(flow_tuple_with_local_if &flow_key)
969969
// Registered as receiver successfully
970970
si_logdbg("Attached %s to ring %p", flow_key.to_str().c_str(), p_nd_resources->p_ring);
971971

972-
/* Verify 5 tuple over 3 tuple
973-
* and replace flow rule with the strongest
974-
*/
972+
// Verify 5 tuple over 3 tuple and replace flow rule with the strongest
975973
if (flow_key.is_5_tuple()) {
976974
// Check and remove lesser 3 tuple
977975
flow_tuple_with_local_if flow_key_3t(

0 commit comments

Comments
 (0)