6e3e939f3b
The 802.1X EAPOL handshake hostapd does requires knowing whether the frame was ack'ed by the peer. Currently, we fudge this pretty badly by not even transmitting the frame as a normal data frame but injecting it with radiotap and getting the status out of radiotap monitor as well. This is rather complex, confuses users (mon.wlan0 presence) and doesn't work with all hardware. To get rid of that hack, introduce a real wifi TX status option for data frame transmissions. This works similar to the existing TX timestamping in that it reflects the SKB back to the socket's error queue with a SCM_WIFI_STATUS cmsg that has an int indicating ACK status (0/1). Since it is possible that at some point we will want to have TX timestamping and wifi status in a single errqueue SKB (there's little point in not doing that), redefine SO_EE_ORIGIN_TIMESTAMPING to SO_EE_ORIGIN_TXSTATUS which can collect more than just the timestamp; keep the old constant as an alias of course. Currently the internal APIs don't make that possible, but it wouldn't be hard to split them up in a way that makes it possible. Thanks to Neil Horman for helping me figure out the functions that add the control messages. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
48 lines
933 B
C
48 lines
933 B
C
#ifndef _LINUX_ERRQUEUE_H
|
|
#define _LINUX_ERRQUEUE_H 1
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct sock_extended_err {
|
|
__u32 ee_errno;
|
|
__u8 ee_origin;
|
|
__u8 ee_type;
|
|
__u8 ee_code;
|
|
__u8 ee_pad;
|
|
__u32 ee_info;
|
|
__u32 ee_data;
|
|
};
|
|
|
|
#define SO_EE_ORIGIN_NONE 0
|
|
#define SO_EE_ORIGIN_LOCAL 1
|
|
#define SO_EE_ORIGIN_ICMP 2
|
|
#define SO_EE_ORIGIN_ICMP6 3
|
|
#define SO_EE_ORIGIN_TXSTATUS 4
|
|
#define SO_EE_ORIGIN_TIMESTAMPING SO_EE_ORIGIN_TXSTATUS
|
|
|
|
#define SO_EE_OFFENDER(ee) ((struct sockaddr*)((ee)+1))
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
#include <net/ip.h>
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
#include <linux/ipv6.h>
|
|
#endif
|
|
|
|
#define SKB_EXT_ERR(skb) ((struct sock_exterr_skb *) ((skb)->cb))
|
|
|
|
struct sock_exterr_skb {
|
|
union {
|
|
struct inet_skb_parm h4;
|
|
#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
|
|
struct inet6_skb_parm h6;
|
|
#endif
|
|
} header;
|
|
struct sock_extended_err ee;
|
|
u16 addr_offset;
|
|
__be16 port;
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif
|