diff options
author | Martin Willi <martin@revosec.ch> | 2014-11-21 11:43:20 +0100 |
---|---|---|
committer | Martin Willi <martin@revosec.ch> | 2014-11-21 12:02:07 +0100 |
commit | ed247660e81557261cd954e8b3ff19e410a347be (patch) | |
tree | 38cd98721ea65eee43f397ba95a760f69c25c7dd /src/libcharon/plugins/socket_default | |
parent | ce13ba62cc70fd6861ffc5e18f822cc3fb127841 (diff) | |
download | strongswan-ed247660e81557261cd954e8b3ff19e410a347be.tar.bz2 strongswan-ed247660e81557261cd954e8b3ff19e410a347be.tar.xz |
socket-default: Use round-robin selection of sockets to read from
If multiple sockets are ready, we previously preferred the IPv4 non-NAT socket
over others. To handle all with equal priority, use a round-robin selection.
Diffstat (limited to 'src/libcharon/plugins/socket_default')
-rw-r--r-- | src/libcharon/plugins/socket_default/socket_default_socket.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/libcharon/plugins/socket_default/socket_default_socket.c b/src/libcharon/plugins/socket_default/socket_default_socket.c index a0e4a54c5..30e50d2d2 100644 --- a/src/libcharon/plugins/socket_default/socket_default_socket.c +++ b/src/libcharon/plugins/socket_default/socket_default_socket.c @@ -141,6 +141,11 @@ struct private_socket_default_socket_t { * TRUE if the source address should be set on outbound packets */ bool set_source; + + /** + * A counter to implement round-robin selection of read sockets + */ + u_int rr_counter; }; METHOD(socket_t, receiver, status_t, @@ -150,7 +155,7 @@ METHOD(socket_t, receiver, status_t, chunk_t data; packet_t *pkt; host_t *source = NULL, *dest = NULL; - int i, bytes_read = 0, selected = -1; + int i, rr, index, bytes_read = 0, selected = -1; bool oldstate; u_int16_t port = 0; struct pollfd pfd[] = { @@ -164,7 +169,6 @@ METHOD(socket_t, receiver, status_t, this->port, this->natt, this->port, this->natt, }; - DBG2(DBG_NET, "waiting for data on sockets"); oldstate = thread_cancelability(TRUE); if (poll(pfd, countof(pfd), -1) <= 0) @@ -174,12 +178,16 @@ METHOD(socket_t, receiver, status_t, } thread_cancelability(oldstate); + rr = this->rr_counter++; for (i = 0; i < countof(pfd); i++) { - if (pfd[i].revents & POLLIN) + /* To serve all ports with equal priority, we use a round-robin + * scheme to choose the one to process in this invocation */ + index = (rr + i) % countof(pfd); + if (pfd[index].revents & POLLIN) { - selected = pfd[i].fd; - port = ports[i]; + selected = pfd[index].fd; + port = ports[index]; break; } } |