mac80211: assume 2-byte aligning for 802.11 packets, slightly improves code size...
authorFelix Fietkau <nbd@openwrt.org>
Fri, 28 Dec 2012 21:05:49 +0000 (21:05 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 28 Dec 2012 21:05:49 +0000 (21:05 +0000)
SVN-Revision: 34910

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch [new file with mode: 0644]

index 9905a57d54bde6e0e901ef8b84d8b4c49f1ce588..40331390e57b6ae6b47121c27124a69540906cc6 100644 (file)
        if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
 --- a/include/net/mac80211.h
 +++ b/include/net/mac80211.h
+@@ -173,7 +173,7 @@ struct ieee80211_chanctx_conf {
+       u8 rx_chains_static, rx_chains_dynamic;
+-      u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++      u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ /**
+@@ -1059,7 +1059,7 @@ struct ieee80211_vif {
+       u32 driver_flags;
+       /* must be last */
+-      u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++      u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
+@@ -1209,7 +1209,7 @@ struct ieee80211_sta {
+       u8 max_sp;
+       /* must be last */
+-      u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
++      u8 drv_priv[0] __aligned(sizeof(void *));
+ };
+ /**
 @@ -1369,6 +1369,10 @@ struct ieee80211_tx_control {
   * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
   *    P2P Interface. This will be honoured even if more than one interface
  
  void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
                                   struct ieee80211_chanctx *chanctx);
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -180,7 +180,7 @@ struct ieee80211_hdr {
+       u8 addr3[6];
+       __le16 seq_ctrl;
+       u8 addr4[6];
+-} __attribute__ ((packed));
++} __packed;
+ struct ieee80211_hdr_3addr {
+       __le16 frame_control;
+@@ -189,7 +189,7 @@ struct ieee80211_hdr_3addr {
+       u8 addr2[6];
+       u8 addr3[6];
+       __le16 seq_ctrl;
+-} __attribute__ ((packed));
++} __packed;
+ struct ieee80211_qos_hdr {
+       __le16 frame_control;
+@@ -199,7 +199,7 @@ struct ieee80211_qos_hdr {
+       u8 addr3[6];
+       __le16 seq_ctrl;
+       __le16 qos_ctrl;
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+@@ -576,7 +576,7 @@ struct ieee80211s_hdr {
+       __le32 seqnum;
+       u8 eaddr1[6];
+       u8 eaddr2[6];
+-} __attribute__ ((packed));
++} __packed;
+ /* Mesh flags */
+ #define MESH_FLAGS_AE_A4      0x1
+@@ -614,7 +614,7 @@ struct ieee80211_quiet_ie {
+       u8 period;
+       __le16 duration;
+       __le16 offset;
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * struct ieee80211_msrment_ie
+@@ -626,7 +626,7 @@ struct ieee80211_msrment_ie {
+       u8 mode;
+       u8 type;
+       u8 request[0];
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * struct ieee80211_channel_sw_ie
+@@ -637,7 +637,7 @@ struct ieee80211_channel_sw_ie {
+       u8 mode;
+       u8 new_ch_num;
+       u8 count;
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * struct ieee80211_tim
+@@ -650,7 +650,7 @@ struct ieee80211_tim_ie {
+       u8 bitmap_ctrl;
+       /* variable size: 1 - 251 bytes */
+       u8 virtual_map[1];
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * struct ieee80211_meshconf_ie
+@@ -665,7 +665,7 @@ struct ieee80211_meshconf_ie {
+       u8 meshconf_auth;
+       u8 meshconf_form;
+       u8 meshconf_cap;
+-} __attribute__ ((packed));
++} __packed;
+ /**
+  * enum mesh_config_capab_flags - Mesh Configuration IE capability field flags
+@@ -695,7 +695,7 @@ struct ieee80211_rann_ie {
+       __le32 rann_seq;
+       __le32 rann_interval;
+       __le32 rann_metric;
+-} __attribute__ ((packed));
++} __packed;
+ enum ieee80211_rann_flags {
+       RANN_FLAG_IS_GATE = 1 << 0,
+@@ -717,33 +717,33 @@ struct ieee80211_mgmt {
+                       __le16 status_code;
+                       /* possibly followed by Challenge text */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) auth;
++              } __packed auth;
+               struct {
+                       __le16 reason_code;
+-              } __attribute__ ((packed)) deauth;
++              } __packed deauth;
+               struct {
+                       __le16 capab_info;
+                       __le16 listen_interval;
+                       /* followed by SSID and Supported rates */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) assoc_req;
++              } __packed assoc_req;
+               struct {
+                       __le16 capab_info;
+                       __le16 status_code;
+                       __le16 aid;
+                       /* followed by Supported rates */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) assoc_resp, reassoc_resp;
++              } __packed assoc_resp, reassoc_resp;
+               struct {
+                       __le16 capab_info;
+                       __le16 listen_interval;
+                       u8 current_ap[6];
+                       /* followed by SSID and Supported rates */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) reassoc_req;
++              } __packed reassoc_req;
+               struct {
+                       __le16 reason_code;
+-              } __attribute__ ((packed)) disassoc;
++              } __packed disassoc;
+               struct {
+                       __le64 timestamp;
+                       __le16 beacon_int;
+@@ -751,11 +751,11 @@ struct ieee80211_mgmt {
+                       /* followed by some of SSID, Supported rates,
+                        * FH Params, DS Params, CF Params, IBSS Params, TIM */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) beacon;
++              } __packed beacon;
+               struct {
+                       /* only variable items: SSID, Supported rates */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) probe_req;
++              } __packed probe_req;
+               struct {
+                       __le64 timestamp;
+                       __le16 beacon_int;
+@@ -763,7 +763,7 @@ struct ieee80211_mgmt {
+                       /* followed by some of SSID, Supported rates,
+                        * FH Params, DS Params, CF Params, IBSS Params */
+                       u8 variable[0];
+-              } __attribute__ ((packed)) probe_resp;
++              } __packed probe_resp;
+               struct {
+                       u8 category;
+                       union {
+@@ -772,55 +772,55 @@ struct ieee80211_mgmt {
+                                       u8 dialog_token;
+                                       u8 status_code;
+                                       u8 variable[0];
+-                              } __attribute__ ((packed)) wme_action;
++                              } __packed wme_action;
+                               struct{
+                                       u8 action_code;
+                                       u8 element_id;
+                                       u8 length;
+                                       struct ieee80211_channel_sw_ie sw_elem;
+-                              } __attribute__((packed)) chan_switch;
++                              } __packed chan_switch;
+                               struct{
+                                       u8 action_code;
+                                       u8 dialog_token;
+                                       u8 element_id;
+                                       u8 length;
+                                       struct ieee80211_msrment_ie msr_elem;
+-                              } __attribute__((packed)) measurement;
++                              } __packed measurement;
+                               struct{
+                                       u8 action_code;
+                                       u8 dialog_token;
+                                       __le16 capab;
+                                       __le16 timeout;
+                                       __le16 start_seq_num;
+-                              } __attribute__((packed)) addba_req;
++                              } __packed addba_req;
+                               struct{
+                                       u8 action_code;
+                                       u8 dialog_token;
+                                       __le16 status;
+                                       __le16 capab;
+                                       __le16 timeout;
+-                              } __attribute__((packed)) addba_resp;
++                              } __packed addba_resp;
+                               struct{
+                                       u8 action_code;
+                                       __le16 params;
+                                       __le16 reason_code;
+-                              } __attribute__((packed)) delba;
++                              } __packed delba;
+                               struct {
+                                       u8 action_code;
+                                       u8 variable[0];
+-                              } __attribute__((packed)) self_prot;
++                              } __packed self_prot;
+                               struct{
+                                       u8 action_code;
+                                       u8 variable[0];
+-                              } __attribute__((packed)) mesh_action;
++                              } __packed mesh_action;
+                               struct {
+                                       u8 action;
+                                       u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
+-                              } __attribute__ ((packed)) sa_query;
++                              } __packed sa_query;
+                               struct {
+                                       u8 action;
+                                       u8 smps_control;
+-                              } __attribute__ ((packed)) ht_smps;
++                              } __packed ht_smps;
+                               struct {
+                                       u8 action_code;
+                                       u8 dialog_token;
+@@ -828,9 +828,9 @@ struct ieee80211_mgmt {
+                                       u8 variable[0];
+                               } __packed tdls_discover_resp;
+                       } u;
+-              } __attribute__ ((packed)) action;
++              } __packed action;
+       } u;
+-} __attribute__ ((packed));
++} __packed;
+ /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
+ #define BSS_MEMBERSHIP_SELECTOR_HT_PHY        127
+@@ -846,7 +846,7 @@ struct ieee80211_mmie {
+       __le16 key_id;
+       u8 sequence_number[6];
+       u8 mic[8];
+-} __attribute__ ((packed));
++} __packed;
+ struct ieee80211_vendor_ie {
+       u8 element_id;
+@@ -861,20 +861,20 @@ struct ieee80211_rts {
+       __le16 duration;
+       u8 ra[6];
+       u8 ta[6];
+-} __attribute__ ((packed));
++} __packed;
+ struct ieee80211_cts {
+       __le16 frame_control;
+       __le16 duration;
+       u8 ra[6];
+-} __attribute__ ((packed));
++} __packed;
+ struct ieee80211_pspoll {
+       __le16 frame_control;
+       __le16 aid;
+       u8 bssid[6];
+       u8 ta[6];
+-} __attribute__ ((packed));
++} __packed;
+ /* TDLS */
+@@ -967,7 +967,7 @@ struct ieee80211_bar {
+       __u8 ta[6];
+       __le16 control;
+       __le16 start_seq_num;
+-} __attribute__((packed));
++} __packed;
+ /* 802.11 BAR control masks */
+ #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL  0x0000
+@@ -992,7 +992,7 @@ struct ieee80211_mcs_info {
+       __le16 rx_highest;
+       u8 tx_params;
+       u8 reserved[3];
+-} __attribute__((packed));
++} __packed;
+ /* 802.11n HT capability MSC set */
+ #define IEEE80211_HT_MCS_RX_HIGHEST_MASK      0x3ff
+@@ -1031,7 +1031,7 @@ struct ieee80211_ht_cap {
+       __le16 extended_ht_cap_info;
+       __le32 tx_BF_cap_info;
+       u8 antenna_selection_info;
+-} __attribute__ ((packed));
++} __packed;
+ /* 802.11n HT capabilities masks (for cap_info) */
+ #define IEEE80211_HT_CAP_LDPC_CODING          0x0001
+@@ -1102,7 +1102,7 @@ struct ieee80211_ht_operation {
+       __le16 operation_mode;
+       __le16 stbc_param;
+       u8 basic_set[16];
+-} __attribute__ ((packed));
++} __packed;
+ /* for ht_param */
+ #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET             0x03
+@@ -1832,14 +1832,14 @@ struct ieee80211_country_ie_triplet {
+                       u8 first_channel;
+                       u8 num_channels;
+                       s8 max_power;
+-              } __attribute__ ((packed)) chans;
++              } __packed chans;
+               struct {
+                       u8 reg_extension_id;
+                       u8 reg_class;
+                       u8 coverage_class;
+-              } __attribute__ ((packed)) ext;
++              } __packed ext;
+       };
+-} __attribute__ ((packed));
++} __packed;
+ enum ieee80211_timeout_interval_type {
+       WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -1256,7 +1256,7 @@ struct cfg80211_bss {
+       u8 bssid[ETH_ALEN];
+-      u8 priv[0] __attribute__((__aligned__(sizeof(void *))));
++      u8 priv[0] __aligned(sizeof(void *));
+ };
+ /**
+@@ -2395,7 +2395,7 @@ struct wiphy {
+       const struct iw_handler_def *wext;
+ #endif
+-      char priv[0] __attribute__((__aligned__(NETDEV_ALIGN)));
++      char priv[0] __aligned(NETDEV_ALIGN);
+ };
+ static inline struct net *wiphy_net(struct wiphy *wiphy)
+--- a/net/wireless/core.h
++++ b/net/wireless/core.h
+@@ -86,7 +86,7 @@ struct cfg80211_registered_device {
+       /* must be last because of the way we do wiphy_priv(),
+        * and it should at least be aligned to NETDEV_ALIGN */
+-      struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN)));
++      struct wiphy wiphy __aligned(NETDEV_ALIGN);
+ };
+ static inline
diff --git a/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch b/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch
new file mode 100644 (file)
index 0000000..6b62d12
--- /dev/null
@@ -0,0 +1,71 @@
+--- a/include/linux/ieee80211.h
++++ b/include/linux/ieee80211.h
+@@ -180,7 +180,7 @@ struct ieee80211_hdr {
+       u8 addr3[6];
+       __le16 seq_ctrl;
+       u8 addr4[6];
+-} __packed;
++} __packed __aligned(2);
+ struct ieee80211_hdr_3addr {
+       __le16 frame_control;
+@@ -189,7 +189,7 @@ struct ieee80211_hdr_3addr {
+       u8 addr2[6];
+       u8 addr3[6];
+       __le16 seq_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ struct ieee80211_qos_hdr {
+       __le16 frame_control;
+@@ -199,7 +199,7 @@ struct ieee80211_qos_hdr {
+       u8 addr3[6];
+       __le16 seq_ctrl;
+       __le16 qos_ctrl;
+-} __packed;
++} __packed __aligned(2);
+ /**
+  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
+@@ -576,7 +576,7 @@ struct ieee80211s_hdr {
+       __le32 seqnum;
+       u8 eaddr1[6];
+       u8 eaddr2[6];
+-} __packed;
++} __packed __aligned(2);
+ /* Mesh flags */
+ #define MESH_FLAGS_AE_A4      0x1
+@@ -830,7 +830,7 @@ struct ieee80211_mgmt {
+                       } u;
+               } __packed action;
+       } u;
+-} __packed;
++} __packed __aligned(2);
+ /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
+ #define BSS_MEMBERSHIP_SELECTOR_HT_PHY        127
+@@ -861,20 +861,20 @@ struct ieee80211_rts {
+       __le16 duration;
+       u8 ra[6];
+       u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ struct ieee80211_cts {
+       __le16 frame_control;
+       __le16 duration;
+       u8 ra[6];
+-} __packed;
++} __packed __aligned(2);
+ struct ieee80211_pspoll {
+       __le16 frame_control;
+       __le16 aid;
+       u8 bssid[6];
+       u8 ta[6];
+-} __packed;
++} __packed __aligned(2);
+ /* TDLS */