aboutsummaryrefslogtreecommitdiffstats
path: root/src/l2_packet
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2015-02-25 14:36:37 -0800
committerDmitry Shmidt <dimitrysh@google.com>2015-03-10 11:04:32 -0700
commit7f65602d49069f96a7bb44da8bd79ffe8d4c6a98 (patch)
tree0f5470742861a3ea4efb80552c3f8282fb79092c /src/l2_packet
parent912d96b4e283c9bc0633a065901153bf74e1f911 (diff)
downloadandroid_external_wpa_supplicant_8-7f65602d49069f96a7bb44da8bd79ffe8d4c6a98.tar.gz
android_external_wpa_supplicant_8-7f65602d49069f96a7bb44da8bd79ffe8d4c6a98.tar.bz2
android_external_wpa_supplicant_8-7f65602d49069f96a7bb44da8bd79ffe8d4c6a98.zip
Cumulative patch from commit f51f54a007e0de1d413dee3523472d3bbeed2ecc
f51f54a nl80211: Resubscribe to nl80211 events on global nl_event socket 48ec694 Fix Linux packet socket workaround to not close the socket too easily 0d2030e Use estimated throughput to improve roaming selection 1d747e2 Add snr and est_throughput to the BSS entries a1b790e Select AP based on estimated maximum throughput ab647ff Add wpa_supplicant Makefile target libwpa_ctrl.a abae2d1 trace: Initialize alloc_list even without os_program_init() call 891dfb3 Add helper function to clear and free wpa_psk list 71d77ad Update current BSS level when signal change event occurs f1609f1 wpa_supplicant: Cancel sched_scan when stopping countermeasures abb8d08 nl80211: Add support for configuring P2P GO CTWindow 0b8bcaa P2P: Allow configuring CTWindow when working as GO c77ffc6 TDLS: Ignore extra padding in all packets 5ce6ac1 Inteworking: Add support to update the ANQP Capability List into the BSS 185ada4 HS 2.0: Add support to update the HS20 Capability List into the BSS 7fe7a3a wpa_gui: Debug enhancement 2b892d4 Add forgotten network profile parameters to config file writing 563ee18 IBSS: Add support for VHT80 configuration ada157f Make hostapd_set_freq_params() common 98479dc IBSS: Update operating frequency if joining an existing IBSS 4d9e6fb IBSS: Add fixed_freq network parameter 6f5e1b0 Use priority list instead of global for PNO 97fc2dc Allow libnl-3.0 include path be specified f92446f P2PS: Add P2PS interface info 59b416c Add optional reassoc-to-same-BSS optimization c4da67d Fix passive_scan config parameter writing 715d5c4 hs20-osu-client: Ensure NULL checks are done before dereferencing 58d405f Fix OCSP debug messages 710dfb4 OpenSSL: Fix OCSP error path bd7bb43 HTTP: Fix OCSP error path 946572c Android: Remove commented out non-Android build parameters 15ada7f Android: Remove libxml2 config defines ebe8d3f Android: Silence unused function parameter warnings dbd10da Android: Fix hs20-osu-client build on Android 5.0 a926295 HS 2.0R2: Fix permissions for SP/<fqdn> directory on Android 480994d nl80211: Allocate QCA vendor subcmds for DFS radar detected and CAC events c165cb4 Drop all hostapd STA entries on interface disabled event 106fa1e nl80211: Indicate interface-down event only for the main netdev eeb1cb2 VLAN: Clean up RTM_NEW/DELLINK processing 47e5fbd hostapd: Avoid sending client probe on removed client 3478273 Re-configure WPA2 group keys on hostapd interface re-enable f33c860 Re-enable beaconing on interface disable+enable fc99fab nl80211: Print a debug log entry on NL80211_CMD_PROBE_CLIENT failures 0d2f324 P2P: Fix send_action_in_progress clearing in corner cases 9ff8dda Add hostapd UPDATE_BEACON ctrl_iface command e0761c5 nl80211: Allocate QCA vendor subcmd for DFS CAC Start event 1db718b nl80211: Test vendor command and event 10263dc Add control interface commands for fetching wpa_config values f91a512 Add INTERWORKING_ADD_NETWORK command c612ae9 AP: Do not reply to Probe Request frames with DS Params mismatch 5b74e08 P2P: Document P2P_CONNECT-auto 99650ca Add STOP_AP control interface command 6b00512 P2P: Add event messages for P2P_CONNECT-fallback-to-GO-Neg b0e669b P2P: Fix P2P_CONNECT-auto fallback to GO Neg with group interface bf51f4f mesh: Fix remaining BLOCKED state after SAE auth failure 79ddb20 mesh: Add a monitor event on SAE authentication getting blocked dd2cbaf mesh: Add a monitor event for SAE authentication failure 0cb5f8d mesh: Fix inactivity timer for 32 bit system 11e2ddb mesh: Remove duplicated no_auto_peer update 1e52983 D-Bus: Fix network block type change 4fada12 Fix HT40 co-ex scanning issue on hostapd error path 23ed011 Fix Linux packat socket regression work around 663ae2f Don't write to wpa_supplicant.conf directly d9a9bc0 IBSS: Do not enable HT with WEP or TKIP 0d7eb43 ACS: Accept channel if any (rather than all) survey results are valid 68fa00c ACS: Allow specific channels to be preferred 6f41a25 ACS: Use weighted average for 2.4 GHz adjacent channel interference Change-Id: Ie1cabd28dcfdefafa02e81477e34badae6f7e629 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'src/l2_packet')
-rw-r--r--src/l2_packet/l2_packet_linux.c62
1 files changed, 56 insertions, 6 deletions
diff --git a/src/l2_packet/l2_packet_linux.c b/src/l2_packet/l2_packet_linux.c
index 68b20089..41de2f85 100644
--- a/src/l2_packet/l2_packet_linux.c
+++ b/src/l2_packet/l2_packet_linux.c
@@ -14,6 +14,8 @@
#include "common.h"
#include "eloop.h"
+#include "crypto/sha1.h"
+#include "crypto/crypto.h"
#include "l2_packet.h"
@@ -30,6 +32,9 @@ struct l2_packet_data {
/* For working around Linux packet socket behavior and regression. */
int fd_br_rx;
+ int last_from_br;
+ u8 last_hash[SHA1_MAC_LEN];
+ unsigned int num_rx, num_rx_br;
};
/* Generated by 'sudo tcpdump -s 3000 -dd greater 278 and ip and udp and
@@ -122,6 +127,7 @@ static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx)
struct sockaddr_ll ll;
socklen_t fromlen;
+ l2->num_rx++;
os_memset(&ll, 0, sizeof(ll));
fromlen = sizeof(ll);
res = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &ll,
@@ -132,15 +138,42 @@ static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx)
return;
}
- l2->rx_callback(l2->rx_callback_ctx, ll.sll_addr, buf, res);
+ wpa_printf(MSG_DEBUG, "%s: src=" MACSTR " len=%d",
+ __func__, MAC2STR(ll.sll_addr), (int) res);
if (l2->fd_br_rx >= 0) {
- wpa_printf(MSG_DEBUG, "l2_packet_receive: Main packet socket for %s seems to have working RX - close workaround bridge socket",
- l2->ifname);
- eloop_unregister_read_sock(l2->fd_br_rx);
- close(l2->fd_br_rx);
- l2->fd_br_rx = -1;
+ u8 hash[SHA1_MAC_LEN];
+ const u8 *addr[1];
+ size_t len[1];
+
+ /*
+ * Close the workaround socket if the kernel version seems to be
+ * able to deliver packets through the packet socket before
+ * authorization has been completed (in dormant state).
+ */
+ if (l2->num_rx_br <= 1) {
+ wpa_printf(MSG_DEBUG,
+ "l2_packet_receive: Main packet socket for %s seems to have working RX - close workaround bridge socket",
+ l2->ifname);
+ eloop_unregister_read_sock(l2->fd_br_rx);
+ close(l2->fd_br_rx);
+ l2->fd_br_rx = -1;
+ }
+
+ addr[0] = buf;
+ len[0] = res;
+ sha1_vector(1, addr, len, hash);
+ if (l2->last_from_br &&
+ os_memcmp(hash, l2->last_hash, SHA1_MAC_LEN) == 0) {
+ wpa_printf(MSG_DEBUG, "%s: Drop duplicate RX",
+ __func__);
+ return;
+ }
+ os_memcpy(l2->last_hash, hash, SHA1_MAC_LEN);
}
+
+ l2->last_from_br = 0;
+ l2->rx_callback(l2->rx_callback_ctx, ll.sll_addr, buf, res);
}
@@ -151,7 +184,11 @@ static void l2_packet_receive_br(int sock, void *eloop_ctx, void *sock_ctx)
int res;
struct sockaddr_ll ll;
socklen_t fromlen;
+ u8 hash[SHA1_MAC_LEN];
+ const u8 *addr[1];
+ size_t len[1];
+ l2->num_rx_br++;
os_memset(&ll, 0, sizeof(ll));
fromlen = sizeof(ll);
res = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &ll,
@@ -162,6 +199,19 @@ static void l2_packet_receive_br(int sock, void *eloop_ctx, void *sock_ctx)
return;
}
+ wpa_printf(MSG_DEBUG, "%s: src=" MACSTR " len=%d",
+ __func__, MAC2STR(ll.sll_addr), (int) res);
+
+ addr[0] = buf;
+ len[0] = res;
+ sha1_vector(1, addr, len, hash);
+ if (!l2->last_from_br &&
+ os_memcmp(hash, l2->last_hash, SHA1_MAC_LEN) == 0) {
+ wpa_printf(MSG_DEBUG, "%s: Drop duplicate RX", __func__);
+ return;
+ }
+ l2->last_from_br = 1;
+ os_memcpy(l2->last_hash, hash, SHA1_MAC_LEN);
l2->rx_callback(l2->rx_callback_ctx, ll.sll_addr, buf, res);
}