]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
l2_packet: Allow initialization without RX handling
authorJouni Malinen <j@w1.fi>
Sun, 19 Apr 2020 13:36:47 +0000 (16:36 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 19 Apr 2020 14:42:41 +0000 (17:42 +0300)
This can be used to minimize resource use when receive path is not
needed.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/l2_packet/l2_packet.h
src/l2_packet/l2_packet_freebsd.c
src/l2_packet/l2_packet_linux.c
src/l2_packet/l2_packet_ndis.c
src/l2_packet/l2_packet_none.c
src/l2_packet/l2_packet_pcap.c
src/l2_packet/l2_packet_privsep.c
src/l2_packet/l2_packet_winpcap.c

index 53871774b4e75d486cfb6ff30d2af895c0d3e4b9..6a862806fc00bdf32be85ae8ae2530b7ad7b219e 100644 (file)
@@ -61,6 +61,10 @@ enum l2_packet_filter_type {
  * points to len bytes of the payload after the layer 2 header and similarly,
  * TX buffers start with payload. This behavior can be changed by setting
  * l2_hdr=1 to include the layer 2 header in the data buffer.
+ *
+ * IF rx_callback is NULL, receive operation is not opened at all, i.e., only
+ * the TX path and additional helper functions for fetching MAC and IP
+ * addresses can be used.
  */
 struct l2_packet_data * l2_packet_init(
        const char *ifname, const u8 *own_addr, unsigned short protocol,
index aa836482767bd6fe2ab713247bc930c59f448b14..60de9fe6bba960cfef2c2203eb530e0f820f3a91 100644 (file)
@@ -84,7 +84,7 @@ static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx)
 
        packet = pcap_next(pcap, &hdr);
 
-       if (packet == NULL || hdr.caplen < sizeof(*ethhdr))
+       if (!l2->rx_callback || !packet || hdr.caplen < sizeof(*ethhdr))
                return;
 
        ethhdr = (struct l2_ethhdr *) packet;
index 138dcafcf27a29d46fe3ee1f29e87a95d147c224..7897bc026a1bdbce6f0c1e5d8fd47ad42b9154a3 100644 (file)
@@ -312,7 +312,8 @@ struct l2_packet_data * l2_packet_init(
        ll.sll_family = PF_PACKET;
        ll.sll_ifindex = ifr.ifr_ifindex;
        ll.sll_protocol = htons(protocol);
-       if (bind(l2->fd, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
+       if (rx_callback &&
+           bind(l2->fd, (struct sockaddr *) &ll, sizeof(ll)) < 0) {
                wpa_printf(MSG_ERROR, "%s: bind[PF_PACKET]: %s",
                           __func__, strerror(errno));
                close(l2->fd);
@@ -329,7 +330,8 @@ struct l2_packet_data * l2_packet_init(
        }
        os_memcpy(l2->own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
 
-       eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
+       if (rx_callback)
+               eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
 
        return l2;
 }
index 716778164af4adc1672ea1d40bb3577875605853..4a4b639fd2204b6f702bb7274620d073070049d9 100644 (file)
@@ -294,7 +294,8 @@ static void l2_packet_callback(struct l2_packet_data *l2)
        }
        rx_src = ethhdr->h_source;
 
-       l2->rx_callback(l2->rx_callback_ctx, rx_src, rx_buf, rx_len);
+       if (l2->rx_callback)
+               l2->rx_callback(l2->rx_callback_ctx, rx_src, rx_buf, rx_len);
 #ifndef _WIN32_WCE
        l2_ndisuio_start_read(l2, 1);
 #endif /* _WIN32_WCE */
index 307fc6daa4039668689cbe56f8f6ea4326d21465..bc7a4e82d672d2f32a8eea4250582111facd2ac4 100644 (file)
@@ -84,7 +84,7 @@ struct l2_packet_data * l2_packet_init(
         * TODO: open connection for receiving frames
         */
        l2->fd = -1;
-       if (l2->fd >= 0)
+       if (rx_callback && l2->fd >= 0)
                eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
 
        return l2;
@@ -112,7 +112,7 @@ void l2_packet_deinit(struct l2_packet_data *l2)
                eloop_unregister_read_sock(l2->fd);
                /* TODO: close connection */
        }
-               
+
        os_free(l2);
 }
 
index 423c099fde88e9daa1953abf0d299f264593c8db..c2b17fcf809c760fde00459d505575f8bd8d8a4d 100644 (file)
@@ -127,7 +127,7 @@ static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx)
 
        packet = pcap_next(pcap, &hdr);
 
-       if (packet == NULL || hdr.caplen < sizeof(*ethhdr))
+       if (!l2->rx_callback || !packet || hdr.caplen < sizeof(*ethhdr))
                return;
 
        ethhdr = (struct l2_ethhdr *) packet;
@@ -152,7 +152,7 @@ static void l2_packet_receive_cb(u_char *user, const struct pcap_pkthdr *hdr,
        unsigned char *buf;
        size_t len;
 
-       if (pkt_data == NULL || hdr->caplen < sizeof(*ethhdr))
+       if (!l2->rx_callback || !pkt_data || hdr->caplen < sizeof(*ethhdr))
                return;
 
        ethhdr = (struct l2_ethhdr *) pkt_data;
index ce86802c23533badd7366abd5f2870f8cb04c9cb..014a45f342b47f9a0bc240eb55039a4f04712aa7 100644 (file)
@@ -216,7 +216,8 @@ struct l2_packet_data * l2_packet_init(
        }
        os_memcpy(l2->own_addr, reply, ETH_ALEN);
 
-       eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
+       if (rx_callback)
+               eloop_register_read_sock(l2->fd, l2_packet_receive, l2, NULL);
 
        return l2;
 
index 74085a3169af8309d9d82a48ea641fd3eda904e3..3452051f5493cdc288f25f9c5174b462ae7d938b 100644 (file)
@@ -224,6 +224,9 @@ struct l2_packet_data * l2_packet_init(
                return NULL;
        }
 
+       if (!rx_callback)
+               return l2;
+
        l2->rx_avail = CreateEvent(NULL, TRUE, FALSE, NULL);
        l2->rx_done = CreateEvent(NULL, TRUE, FALSE, NULL);
        l2->rx_notify = CreateEvent(NULL, TRUE, FALSE, NULL);