From: Thomas Pedersen <tho...@noack.us>

Modify and add necessary fields to hostapd and wpa_supplicant data
structures required by mesh networks wpa_supplicant module.

Signed-off-by: Javier Lopez <jlo...@gmail.com>
Signed-off-by: Jason Mobarak <x...@jason.mobarak.name>
Signed-hostap: Thomas Pedersen <tho...@noack.us>

---
 src/ap/ap_config.h             |   29 ++++++++++++++++++++++++++++-
 src/ap/hostapd.h               |   10 ++++++++++
 src/ap/sta_info.h              |   18 ++++++++++++++++++
 src/common/ieee802_11_common.c |   22 ++++++++++++++++++++++
 src/common/ieee802_11_common.h |   10 ++++++++++
 src/common/ieee802_11_defs.h   |   36 ++++++++++++++++++++++++++++++++++++
 wpa_supplicant/config_ssid.h   |    3 +++
 7 files changed, 127 insertions(+), 1 deletion(-)

diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index dfbe626..4f6c163 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -15,6 +15,32 @@
 #include "common/ieee802_11_common.h"
 #include "wps/wps.h"
 
+#ifdef CONFIG_MESH
+/**
+ * mesh_conf - local MBSS state and settings
+ */
+struct mesh_conf {
+       u8 meshid[32];
+       u8 meshid_len;
+       /* Active Path Selection Protocol Identifier */
+       u8 mesh_pp_id;
+       /* Active Path Selection Metric Identifier */
+       u8 mesh_pm_id;
+       /* Congestion Control Mode Identifier */
+       u8 mesh_cc_id;
+       /* Synchronization Protocol Identifier */
+       u8 mesh_sp_id;
+       /* Authentication Protocol Identifier */
+       u8 mesh_auth_id;
+       u8 *ies;
+       int ie_len;
+#define MESH_CONF_SEC_NONE BIT(0)
+#define MESH_CONF_SEC_AUTH BIT(1)
+#define MESH_CONF_SEC_AMPE BIT(2)
+       int security;
+};
+#endif /* CONFIG_MESH */
+
 #define MAX_STA_COUNT 2007
 #define MAX_VLAN_ID 4094
 
@@ -396,7 +422,8 @@ struct hostapd_bss_config {
        u8 ip_addr_start[4];
        u8 ip_addr_end[4];
 #endif /* CONFIG_P2P */
-
+#define MESH_ENABLED BIT(0)
+       int mesh;
        int disassoc_low_ack;
        int skip_inactivity_poll;
 
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 090544d..e69cd43 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -22,6 +22,9 @@ struct ieee80211_ht_capabilities;
 struct full_dynamic_vlan;
 enum wps_event;
 union wps_event_data;
+#ifdef CONFIG_MESH
+struct mesh_conf;
+#endif /* CONFIG_MESH */
 
 struct hostapd_iface;
 
@@ -227,6 +230,9 @@ struct hostapd_data {
 #ifdef CONFIG_INTERWORKING
        size_t gas_frag_limit;
 #endif /* CONFIG_INTERWORKING */
+#ifdef CONFIG_MESH
+       int max_num_sta;
+#endif /* CONFIG_MESH */
 
 #ifdef CONFIG_SQLITE
        struct hostapd_eap_user tmp_eap_user;
@@ -264,6 +270,10 @@ struct hostapd_iface {
                HAPD_IFACE_ENABLED
        } state;
 
+#ifdef CONFIG_MESH
+       struct mesh_conf *mconf;
+#endif /* CONFIG_MESH */
+
        size_t num_bss;
        struct hostapd_data **bss;
 
diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h
index 2dbdeb1..6e9d3f6 100644
--- a/src/ap/sta_info.h
+++ b/src/ap/sta_info.h
@@ -9,6 +9,11 @@
 #ifndef STA_INFO_H
 #define STA_INFO_H
 
+#ifdef CONFIG_MESH
+/* needed for mesh_plink_state enum */
+#include "common/defs.h"
+#endif /* CONFIG_MESH */
+
 /* STA flags */
 #define WLAN_STA_AUTH BIT(0)
 #define WLAN_STA_ASSOC BIT(1)
@@ -49,6 +54,19 @@ struct sta_info {
        int supported_rates_len;
        u8 qosinfo; /* Valid when WLAN_STA_WMM is set */
 
+#ifdef CONFIG_MESH
+       enum mesh_plink_state plink_state;
+       u16 peer_lid;
+       u16 my_lid;
+       u16 mpm_close_reason;
+       int mpm_retries;
+       u8 my_nonce[32];
+       u8 peer_nonce[32];
+       u8 aek[32];     /* SHA256 digest length */
+       u8 mtk[16];
+       u8 mgtk[16];
+#endif /* CONFIG_MESH */
+
        unsigned int nonerp_set:1;
        unsigned int no_short_slot_time_set:1;
        unsigned int no_short_preamble_set:1;
diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c
index cdee6bc..89be726 100644
--- a/src/common/ieee802_11_common.c
+++ b/src/common/ieee802_11_common.c
@@ -249,6 +249,18 @@ ParseRes ieee802_11_parse_elems(const u8 *start, size_t 
len,
                        elems->ht_operation = pos;
                        elems->ht_operation_len = elen;
                        break;
+               case WLAN_EID_MESH_CONFIG:
+                       elems->mesh_config = pos;
+                       elems->mesh_config_len = elen;
+                       break;
+               case WLAN_EID_MESH_ID:
+                       elems->mesh_id = pos;
+                       elems->mesh_id_len = elen;
+                       break;
+               case WLAN_EID_PEER_MGMT:
+                       elems->peer_mgmt = pos;
+                       elems->peer_mgmt_len = elen;
+                       break;
                case WLAN_EID_VHT_CAP:
                        elems->vht_capabilities = pos;
                        elems->vht_capabilities_len = elen;
@@ -290,6 +302,16 @@ ParseRes ieee802_11_parse_elems(const u8 *start, size_t 
len,
                        elems->ssid_list = pos;
                        elems->ssid_list_len = elen;
                        break;
+               case WLAN_EID_AMPE:
+                       elems->ampe = pos;
+                       elems->ampe_len = elen;
+                       break;
+               case WLAN_EID_MIC:
+                       elems->mic = pos;
+                       elems->mic_len = elen;
+                       /* after mic everything is encrypted, so stop. */
+                       left = elen;
+                       break;
                default:
                        unknown++;
                        if (!show_errors)
diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h
index 9b8bbd1..507e480 100644
--- a/src/common/ieee802_11_common.h
+++ b/src/common/ieee802_11_common.h
@@ -28,6 +28,9 @@ struct ieee802_11_elems {
        const u8 *timeout_int;
        const u8 *ht_capabilities;
        const u8 *ht_operation;
+       const u8 *mesh_config;
+       const u8 *mesh_id;
+       const u8 *peer_mgmt;
        const u8 *vht_capabilities;
        const u8 *vht_operation;
        const u8 *vht_opmode_notif;
@@ -42,6 +45,8 @@ struct ieee802_11_elems {
        const u8 *bss_max_idle_period;
        const u8 *ssid_list;
        const u8 *osen;
+       const u8 *ampe;
+       const u8 *mic;
 
        u8 ssid_len;
        u8 supp_rates_len;
@@ -60,6 +65,9 @@ struct ieee802_11_elems {
        u8 timeout_int_len;
        u8 ht_capabilities_len;
        u8 ht_operation_len;
+       u8 mesh_config_len;
+       u8 mesh_id_len;
+       u8 peer_mgmt_len;
        u8 vht_capabilities_len;
        u8 vht_operation_len;
        u8 vendor_ht_cap_len;
@@ -71,6 +79,8 @@ struct ieee802_11_elems {
        u8 ext_capab_len;
        u8 ssid_list_len;
        u8 osen_len;
+       u8 ampe_len;
+       u8 mic_len;
 };
 
 typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes;
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index cb70130..b4feb64 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -194,6 +194,16 @@
 #define WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED 26
 /* IEEE 802.11e */
 #define WLAN_REASON_DISASSOC_LOW_ACK 34
+/* IEEE 802.11s */
+#define WLAN_REASON_MESH_PEERING_CANCELLED 52
+#define WLAN_REASON_MESH_MAX_PEERS 53
+#define WLAN_REASON_MESH_CONFIG_POLICY_VIOLATION 54
+#define WLAN_REASON_MESH_CLOSE_RCVD 55
+#define WLAN_REASON_MESH_MAX_RETRIES 56
+#define WLAN_REASON_MESH_CONFIRM_TIMEOUT 57
+#define WLAN_REASON_MESH_INVALID_GTK 58
+#define WLAN_REASON_MESH_INCONSISTENT_PARAMS 59
+#define WLAN_REASON_MESH_INVALID_SECURITY_CAP 60
 
 
 /* Information Element IDs */
@@ -249,7 +259,12 @@
 #define WLAN_EID_ADV_PROTO 108
 #define WLAN_EID_QOS_MAP_SET 110
 #define WLAN_EID_ROAMING_CONSORTIUM 111
+#define WLAN_EID_MESH_CONFIG 113
+#define WLAN_EID_MESH_ID 114
+#define WLAN_EID_PEER_MGMT 117
 #define WLAN_EID_EXT_CAPAB 127
+#define WLAN_EID_AMPE 139
+#define WLAN_EID_MIC 140
 #define WLAN_EID_CCKM 156
 #define WLAN_EID_VHT_CAP 191
 #define WLAN_EID_VHT_OPERATION 192
@@ -277,6 +292,7 @@
 #define WLAN_ACTION_WNM 10
 #define WLAN_ACTION_UNPROTECTED_WNM 11
 #define WLAN_ACTION_TDLS 12
+#define WLAN_ACTION_SELF_PROTECTED 15
 #define WLAN_ACTION_WMM 17 /* WMM Specification 1.1 */
 #define WLAN_ACTION_VENDOR_SPECIFIC 127
 
@@ -577,6 +593,10 @@ struct ieee80211_mgmt {
                                         * Entries (optional) */
                                        u8 variable[0];
                                } STRUCT_PACKED bss_tm_query;
+                               struct {
+                                       u8 action; /* 15 */
+                                       u8 variable[0];
+                               } STRUCT_PACKED slf_prot_action;
                        } u;
                } STRUCT_PACKED action;
        } u;
@@ -638,6 +658,15 @@ struct ieee80211_vht_operation {
        le16 vht_basic_mcs_set;
 } STRUCT_PACKED;
 
+struct ieee80211_ampe_ie {
+       u8 selected_pairwise_suite[4];
+       u8 local_nonce[32];
+       u8 peer_nonce[32];
+       u8 mgtk[16];
+       u8 key_rsc[8];
+       u8 key_expiration[4];
+} STRUCT_PACKED;
+
 #ifdef _MSC_VER
 #pragma pack(pop)
 #endif /* _MSC_VER */
@@ -1085,6 +1114,13 @@ enum wifi_display_subelem {
        WFD_SUBELEM_SESSION_INFO = 9
 };
 
+/* 802.11s */
+#define MESH_SYNC_METHOD_NEIGHBOR_OFFSET 1
+#define MESH_SYNC_METHOD_VENDOR                255
+#define MESH_PATH_PROTOCOL_HWMP                1
+#define MESH_PATH_PROTOCOL_VENDOR      255
+#define MESH_PATH_METRIC_AIRTIME       1
+#define MESH_PATH_METRIC_VENDOR                255
 
 #define OUI_BROADCOM 0x00904c /* Broadcom (Epigram) */
 
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index a458990..91a0065 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -316,6 +316,8 @@ struct wpa_ssid {
         * 4 = P2P Group Formation (used internally; not in configuration
         * files)
         *
+        * 5 = Mesh
+        *
         * Note: IBSS can only be used with key_mgmt NONE (plaintext and static
         * WEP) and WPA-PSK (with proto=RSN). In addition, key_mgmt=WPA-NONE
         * (fixed group key TKIP/CCMP) is available for backwards compatibility,
@@ -330,6 +332,7 @@ struct wpa_ssid {
                WPAS_MODE_AP = 2,
                WPAS_MODE_P2P_GO = 3,
                WPAS_MODE_P2P_GROUP_FORMATION = 4,
+               WPAS_MODE_MESH = 5,
        } mode;
 
        /**
-- 
1.7.10.4

_______________________________________________
Devel mailing list
Devel@lists.open80211s.org
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel

Reply via email to