| 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | /* |
| 3 | * IEEE 802.11 mesh definitions |
| 4 | * |
| 5 | * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen |
| 6 | * <jkmaline@cc.hut.fi> |
| 7 | * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> |
| 8 | * Copyright (c) 2005, Devicescape Software, Inc. |
| 9 | * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> |
| 10 | * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH |
| 11 | * Copyright (c) 2016 - 2017 Intel Deutschland GmbH |
| 12 | * Copyright (c) 2018 - 2025 Intel Corporation |
| 13 | */ |
| 14 | |
| 15 | #ifndef LINUX_IEEE80211_MESH_H |
| 16 | #define LINUX_IEEE80211_MESH_H |
| 17 | |
| 18 | #include <linux/types.h> |
| 19 | #include <linux/if_ether.h> |
| 20 | |
| 21 | #define IEEE80211_MAX_MESH_ID_LEN 32 |
| 22 | |
| 23 | struct ieee80211s_hdr { |
| 24 | u8 flags; |
| 25 | u8 ttl; |
| 26 | __le32 seqnum; |
| 27 | u8 eaddr1[ETH_ALEN]; |
| 28 | u8 eaddr2[ETH_ALEN]; |
| 29 | } __packed __aligned(2); |
| 30 | |
| 31 | /* Mesh flags */ |
| 32 | #define MESH_FLAGS_AE_A4 0x1 |
| 33 | #define MESH_FLAGS_AE_A5_A6 0x2 |
| 34 | #define MESH_FLAGS_AE 0x3 |
| 35 | #define MESH_FLAGS_PS_DEEP 0x4 |
| 36 | |
| 37 | /** |
| 38 | * enum ieee80211_preq_flags - mesh PREQ element flags |
| 39 | * |
| 40 | * @IEEE80211_PREQ_PROACTIVE_PREP_FLAG: proactive PREP subfield |
| 41 | */ |
| 42 | enum ieee80211_preq_flags { |
| 43 | IEEE80211_PREQ_PROACTIVE_PREP_FLAG = 1<<2, |
| 44 | }; |
| 45 | |
| 46 | /** |
| 47 | * enum ieee80211_preq_target_flags - mesh PREQ element per target flags |
| 48 | * |
| 49 | * @IEEE80211_PREQ_TO_FLAG: target only subfield |
| 50 | * @IEEE80211_PREQ_USN_FLAG: unknown target HWMP sequence number subfield |
| 51 | */ |
| 52 | enum ieee80211_preq_target_flags { |
| 53 | IEEE80211_PREQ_TO_FLAG = 1<<0, |
| 54 | IEEE80211_PREQ_USN_FLAG = 1<<2, |
| 55 | }; |
| 56 | |
| 57 | /** |
| 58 | * struct ieee80211_mesh_chansw_params_ie - mesh channel switch parameters IE |
| 59 | * @mesh_ttl: Time To Live |
| 60 | * @mesh_flags: Flags |
| 61 | * @mesh_reason: Reason Code |
| 62 | * @mesh_pre_value: Precedence Value |
| 63 | * |
| 64 | * This structure represents the payload of the "Mesh Channel Switch |
| 65 | * Parameters element" as described in IEEE Std 802.11-2020 section |
| 66 | * 9.4.2.102. |
| 67 | */ |
| 68 | struct ieee80211_mesh_chansw_params_ie { |
| 69 | u8 mesh_ttl; |
| 70 | u8 mesh_flags; |
| 71 | __le16 mesh_reason; |
| 72 | __le16 mesh_pre_value; |
| 73 | } __packed; |
| 74 | |
| 75 | /** |
| 76 | * struct ieee80211_meshconf_ie - Mesh Configuration element |
| 77 | * @meshconf_psel: Active Path Selection Protocol Identifier |
| 78 | * @meshconf_pmetric: Active Path Selection Metric Identifier |
| 79 | * @meshconf_congest: Congestion Control Mode Identifier |
| 80 | * @meshconf_synch: Synchronization Method Identifier |
| 81 | * @meshconf_auth: Authentication Protocol Identifier |
| 82 | * @meshconf_form: Mesh Formation Info |
| 83 | * @meshconf_cap: Mesh Capability (see &enum mesh_config_capab_flags) |
| 84 | * |
| 85 | * This structure represents the payload of the "Mesh Configuration |
| 86 | * element" as described in IEEE Std 802.11-2020 section 9.4.2.97. |
| 87 | */ |
| 88 | struct ieee80211_meshconf_ie { |
| 89 | u8 meshconf_psel; |
| 90 | u8 meshconf_pmetric; |
| 91 | u8 meshconf_congest; |
| 92 | u8 meshconf_synch; |
| 93 | u8 meshconf_auth; |
| 94 | u8 meshconf_form; |
| 95 | u8 meshconf_cap; |
| 96 | } __packed; |
| 97 | |
| 98 | /** |
| 99 | * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags |
| 100 | * |
| 101 | * @IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS: STA is willing to establish |
| 102 | * additional mesh peerings with other mesh STAs |
| 103 | * @IEEE80211_MESHCONF_CAPAB_FORWARDING: the STA forwards MSDUs |
| 104 | * @IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING: TBTT adjustment procedure |
| 105 | * is ongoing |
| 106 | * @IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL: STA is in deep sleep mode or has |
| 107 | * neighbors in deep sleep mode |
| 108 | * |
| 109 | * Enumerates the "Mesh Capability" as described in IEEE Std |
| 110 | * 802.11-2020 section 9.4.2.97.7. |
| 111 | */ |
| 112 | enum mesh_config_capab_flags { |
| 113 | IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS = 0x01, |
| 114 | IEEE80211_MESHCONF_CAPAB_FORWARDING = 0x08, |
| 115 | IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING = 0x20, |
| 116 | IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL = 0x40, |
| 117 | }; |
| 118 | |
| 119 | #define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1 |
| 120 | |
| 121 | /* |
| 122 | * mesh channel switch parameters element's flag indicator |
| 123 | * |
| 124 | */ |
| 125 | #define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0) |
| 126 | #define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1) |
| 127 | #define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2) |
| 128 | |
| 129 | /** |
| 130 | * struct ieee80211_rann_ie - RANN (root announcement) element |
| 131 | * @rann_flags: Flags |
| 132 | * @rann_hopcount: Hop Count |
| 133 | * @rann_ttl: Element TTL |
| 134 | * @rann_addr: Root Mesh STA Address |
| 135 | * @rann_seq: HWMP Sequence Number |
| 136 | * @rann_interval: Interval |
| 137 | * @rann_metric: Metric |
| 138 | * |
| 139 | * This structure represents the payload of the "RANN element" as |
| 140 | * described in IEEE Std 802.11-2020 section 9.4.2.111. |
| 141 | */ |
| 142 | struct ieee80211_rann_ie { |
| 143 | u8 rann_flags; |
| 144 | u8 rann_hopcount; |
| 145 | u8 rann_ttl; |
| 146 | u8 rann_addr[ETH_ALEN]; |
| 147 | __le32 rann_seq; |
| 148 | __le32 rann_interval; |
| 149 | __le32 rann_metric; |
| 150 | } __packed; |
| 151 | |
| 152 | enum ieee80211_rann_flags { |
| 153 | RANN_FLAG_IS_GATE = 1 << 0, |
| 154 | }; |
| 155 | |
| 156 | /* Mesh action codes */ |
| 157 | enum ieee80211_mesh_actioncode { |
| 158 | WLAN_MESH_ACTION_LINK_METRIC_REPORT, |
| 159 | WLAN_MESH_ACTION_HWMP_PATH_SELECTION, |
| 160 | WLAN_MESH_ACTION_GATE_ANNOUNCEMENT, |
| 161 | WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION, |
| 162 | WLAN_MESH_ACTION_MCCA_SETUP_REQUEST, |
| 163 | WLAN_MESH_ACTION_MCCA_SETUP_REPLY, |
| 164 | WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST, |
| 165 | WLAN_MESH_ACTION_MCCA_ADVERTISEMENT, |
| 166 | WLAN_MESH_ACTION_MCCA_TEARDOWN, |
| 167 | WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST, |
| 168 | WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE, |
| 169 | }; |
| 170 | |
| 171 | /** |
| 172 | * enum ieee80211_mesh_sync_method - mesh synchronization method identifier |
| 173 | * |
| 174 | * @IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET: the default synchronization method |
| 175 | * @IEEE80211_SYNC_METHOD_VENDOR: a vendor specific synchronization method |
| 176 | * that will be specified in a vendor specific information element |
| 177 | */ |
| 178 | enum ieee80211_mesh_sync_method { |
| 179 | IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1, |
| 180 | IEEE80211_SYNC_METHOD_VENDOR = 255, |
| 181 | }; |
| 182 | |
| 183 | /** |
| 184 | * enum ieee80211_mesh_path_protocol - mesh path selection protocol identifier |
| 185 | * |
| 186 | * @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol |
| 187 | * @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will |
| 188 | * be specified in a vendor specific information element |
| 189 | */ |
| 190 | enum ieee80211_mesh_path_protocol { |
| 191 | IEEE80211_PATH_PROTOCOL_HWMP = 1, |
| 192 | IEEE80211_PATH_PROTOCOL_VENDOR = 255, |
| 193 | }; |
| 194 | |
| 195 | /** |
| 196 | * enum ieee80211_mesh_path_metric - mesh path selection metric identifier |
| 197 | * |
| 198 | * @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric |
| 199 | * @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be |
| 200 | * specified in a vendor specific information element |
| 201 | */ |
| 202 | enum ieee80211_mesh_path_metric { |
| 203 | IEEE80211_PATH_METRIC_AIRTIME = 1, |
| 204 | IEEE80211_PATH_METRIC_VENDOR = 255, |
| 205 | }; |
| 206 | |
| 207 | /** |
| 208 | * enum ieee80211_root_mode_identifier - root mesh STA mode identifier |
| 209 | * |
| 210 | * These attribute are used by dot11MeshHWMPRootMode to set root mesh STA mode |
| 211 | * |
| 212 | * @IEEE80211_ROOTMODE_NO_ROOT: the mesh STA is not a root mesh STA (default) |
| 213 | * @IEEE80211_ROOTMODE_ROOT: the mesh STA is a root mesh STA if greater than |
| 214 | * this value |
| 215 | * @IEEE80211_PROACTIVE_PREQ_NO_PREP: the mesh STA is a root mesh STA supports |
| 216 | * the proactive PREQ with proactive PREP subfield set to 0 |
| 217 | * @IEEE80211_PROACTIVE_PREQ_WITH_PREP: the mesh STA is a root mesh STA |
| 218 | * supports the proactive PREQ with proactive PREP subfield set to 1 |
| 219 | * @IEEE80211_PROACTIVE_RANN: the mesh STA is a root mesh STA supports |
| 220 | * the proactive RANN |
| 221 | */ |
| 222 | enum ieee80211_root_mode_identifier { |
| 223 | IEEE80211_ROOTMODE_NO_ROOT = 0, |
| 224 | IEEE80211_ROOTMODE_ROOT = 1, |
| 225 | IEEE80211_PROACTIVE_PREQ_NO_PREP = 2, |
| 226 | IEEE80211_PROACTIVE_PREQ_WITH_PREP = 3, |
| 227 | IEEE80211_PROACTIVE_RANN = 4, |
| 228 | }; |
| 229 | |
| 230 | #endif /* LINUX_IEEE80211_MESH_H */ |
| 231 | |