From ff6fdc0f9b206577dc389f7f5741550ac5277793 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 28 Dec 2012 21:05:49 +0000 Subject: [PATCH] mac80211: assume 2-byte aligning for 802.11 packets, slightly improves code size and performance git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34910 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../mac80211/patches/300-pending_work.patch | 378 ++++++++++++++++++ ...42-mac80211_optimize_wireless_struct.patch | 71 ++++ 2 files changed, 449 insertions(+) create mode 100644 package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index 9905a57d54..40331390e5 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -28,6 +28,33 @@ 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 @@ -826,3 +853,354 @@ 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 index 0000000000..6b62d12b42 --- /dev/null +++ b/package/mac80211/patches/542-mac80211_optimize_wireless_struct.patch @@ -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 */ +