mirror of
https://github.com/neocturne/fastd.git
synced 2025-05-13 20:15:07 +02:00
receive: merge handling of packets from known and unknown addresses
This commit is contained in:
parent
9bb78a5ab9
commit
8a5717e73e
1 changed files with 37 additions and 70 deletions
107
src/receive.c
107
src/receive.c
|
@ -141,79 +141,24 @@ static bool backoff_unknown(const fastd_peer_address_t *addr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Handles a packet received from a known peer address */
|
/** Returns true the peer is non-null and has an established connection with the correct local address */
|
||||||
static inline void handle_socket_receive_known(
|
static inline bool can_receive_data(const fastd_peer_t *peer, const fastd_peer_address_t *local_addr) {
|
||||||
fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr,
|
if (!peer || !fastd_peer_is_established(peer))
|
||||||
fastd_peer_t *peer, fastd_buffer_t *buffer) {
|
return false;
|
||||||
if (!fastd_peer_may_connect(peer)) {
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint8_t *packet_type = buffer->data;
|
return fastd_peer_address_equal(&peer->local_address, local_addr);
|
||||||
|
|
||||||
switch (*packet_type) {
|
|
||||||
case PACKET_DATA:
|
|
||||||
if (!fastd_peer_is_established(peer) || !fastd_peer_address_equal(&peer->local_address, local_addr)) {
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
|
|
||||||
if (!backoff_unknown(remote_addr)) {
|
|
||||||
pr_debug("unexpectedly received payload data from %P[%I]", peer, remote_addr);
|
|
||||||
conf.protocol->handshake_init(sock, local_addr, remote_addr, NULL);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
conf.protocol->handle_recv(peer, buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_HANDSHAKE:
|
|
||||||
fastd_handshake_handle(sock, local_addr, remote_addr, peer, buffer);
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
pr_debug("received packet with invalid type from %P[%I]", peer, remote_addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Determines if packets from known addresses are accepted */
|
/** Determines if packets from unknown addresses are accepted */
|
||||||
static inline bool allow_unknown_peers(void) {
|
static inline bool allow_unknown_peers(void) {
|
||||||
return ctx.has_floating || fastd_allow_verify();
|
return ctx.has_floating || fastd_allow_verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Handles a packet received from an unknown address */
|
|
||||||
static inline void handle_socket_receive_unknown(
|
|
||||||
fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr,
|
|
||||||
fastd_buffer_t *buffer) {
|
|
||||||
const uint8_t *packet_type = buffer->data;
|
|
||||||
|
|
||||||
switch (*packet_type) {
|
|
||||||
case PACKET_DATA:
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
|
|
||||||
if (!backoff_unknown(remote_addr)) {
|
|
||||||
pr_debug("unexpectedly received payload data from unknown address %I", remote_addr);
|
|
||||||
conf.protocol->handshake_init(sock, local_addr, remote_addr, NULL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_HANDSHAKE:
|
|
||||||
fastd_handshake_handle(sock, local_addr, remote_addr, NULL, buffer);
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
pr_debug("received packet with invalid type from unknown address %I", remote_addr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Handles a packet read from a socket */
|
/** Handles a packet read from a socket */
|
||||||
static inline void handle_socket_receive(
|
static void handle_socket_receive(
|
||||||
fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr,
|
fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr,
|
||||||
fastd_buffer_t *buffer) {
|
fastd_buffer_t *buffer) {
|
||||||
|
const uint8_t packet_type = *(const uint8_t *)buffer->data;
|
||||||
fastd_peer_t *peer = NULL;
|
fastd_peer_t *peer = NULL;
|
||||||
|
|
||||||
if (sock->peer) {
|
if (sock->peer) {
|
||||||
|
@ -227,14 +172,36 @@ static inline void handle_socket_receive(
|
||||||
peer = fastd_peer_hashtable_lookup(remote_addr);
|
peer = fastd_peer_hashtable_lookup(remote_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peer) {
|
if (packet_type == PACKET_DATA && can_receive_data(peer, local_addr)) {
|
||||||
handle_socket_receive_known(sock, local_addr, remote_addr, peer, buffer);
|
/* Consumes the buffer */
|
||||||
} else if (allow_unknown_peers()) {
|
conf.protocol->handle_recv(peer, buffer);
|
||||||
handle_socket_receive_unknown(sock, local_addr, remote_addr, buffer);
|
return;
|
||||||
} else {
|
|
||||||
pr_debug("received packet from unknown peer %I", remote_addr);
|
|
||||||
fastd_buffer_free(buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!peer && !allow_unknown_peers()) {
|
||||||
|
pr_debug("received packet from unknown address %I", remote_addr);
|
||||||
|
fastd_buffer_free(buffer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (packet_type) {
|
||||||
|
case PACKET_HANDSHAKE:
|
||||||
|
fastd_handshake_handle(sock, local_addr, remote_addr, peer, buffer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PACKET_DATA:
|
||||||
|
if (!backoff_unknown(remote_addr)) {
|
||||||
|
pr_debug("unexpectedly received payload data from %I", remote_addr);
|
||||||
|
conf.protocol->handshake_init(sock, local_addr, remote_addr, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
pr_debug("received packet with invalid type from %I", remote_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
fastd_buffer_free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reads a packet from a socket */
|
/** Reads a packet from a socket */
|
||||||
|
|
Loading…
Add table
Reference in a new issue