summaryrefslogtreecommitdiffstats
path: root/src/receive.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/receive.c')
-rw-r--r--src/receive.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/src/receive.c b/src/receive.c
index e5c1aeb..6009030 100644
--- a/src/receive.c
+++ b/src/receive.c
@@ -223,23 +223,11 @@ void fastd_receive(fastd_socket_t *sock) {
handle_socket_receive(sock, &local_addr, &recvaddr, buffer);
}
-static inline void handle_forward(fastd_peer_t *source_peer, fastd_buffer_t buffer) {
- fastd_eth_addr_t dest_addr = fastd_get_dest_address(buffer);
-
- if (fastd_eth_addr_is_unicast(dest_addr)) {
- fastd_peer_t *dest_peer = fastd_peer_find_by_eth_addr(dest_addr);
-
- if (dest_peer) {
- if (dest_peer != source_peer)
- conf.protocol->send(dest_peer, buffer);
- else
- fastd_buffer_free(buffer);
-
- return;
- }
- }
-
- fastd_send_all(source_peer, buffer);
+/** Returns the source address of an ethernet packet */
+static inline fastd_eth_addr_t get_source_address(const fastd_buffer_t buffer) {
+ fastd_eth_addr_t ret;
+ memcpy(&ret, buffer.data+offsetof(struct ethhdr, h_source), ETH_ALEN);
+ return ret;
}
/** Handles a received and decrypted payload packet */
@@ -251,7 +239,7 @@ void fastd_handle_receive(fastd_peer_t *peer, fastd_buffer_t buffer) {
return;
}
- fastd_eth_addr_t src_addr = fastd_get_source_address(buffer);
+ fastd_eth_addr_t src_addr = get_source_address(buffer);
if (fastd_eth_addr_is_unicast(src_addr))
fastd_peer_eth_addr_add(peer, src_addr);
@@ -263,7 +251,7 @@ void fastd_handle_receive(fastd_peer_t *peer, fastd_buffer_t buffer) {
fastd_tuntap_write(buffer);
if (conf.mode == MODE_TAP && conf.forward) {
- handle_forward(peer, buffer);
+ fastd_send_data(buffer, peer);
return;
}