On 17 December 2015 at 11:12, Felix Fietkau <nbd@xxxxxxxxxxx> wrote: > On 2015-12-17 10:20, Janusz Dziedzic wrote: >> HW/driver should set NEED_ALIGNED4_SKBS flag in case require >> aligned skbs to four-byte boundaries. >> >> Before we have to do memmove() in the driver before >> pass this to HW and memmove() back in tx completion. >> This patch allow to save CPU and skip such memmoves. >> For each skb we called memmove(ieee80211_hdrsize()) twice. >> >> Currently this was tested with ath9k, both hw/sw crypt for >> tkip/ccmp. >> For sure more tests required. >> >> Signed-off-by: Janusz Dziedzic <janusz.dziedzic@xxxxxxxxx> >> --- >> include/net/mac80211.h | 4 ++++ >> net/mac80211/debugfs.c | 1 + >> net/mac80211/tkip.c | 15 ++++++++++++--- >> net/mac80211/tx.c | 21 +++++++++++++++++++-- >> net/mac80211/wep.c | 6 ++++++ >> net/mac80211/wpa.c | 35 +++++++++++++++++++++++++++-------- >> 6 files changed, 69 insertions(+), 13 deletions(-) >> >> diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c >> index 0ae2077..26b2663 100644 >> --- a/net/mac80211/tkip.c >> +++ b/net/mac80211/tkip.c >> @@ -204,9 +204,18 @@ void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, >> const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; >> struct tkip_ctx *ctx = &key->u.tkip.tx; >> struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; >> - const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); >> - u32 iv32 = get_unaligned_le32(&data[4]); >> - u16 iv16 = data[2] | (data[0] << 8); >> + unsigned int hdrlen; >> + const u8 *data; >> + u32 iv32; >> + u16 iv16; >> + >> + hdrlen = ieee80211_hdrlen(hdr->frame_control); >> + if (ieee80211_hw_check(&key->local->hw, NEEDS_ALIGNED4_SKBS)) >> + hdrlen += hdrlen & 3; > I think this check is duplicated way too often, maybe you should > implement a wrapper for ieee80211_hdrlen and convert all relevant call > sites. Makes it easier to spot places where this was forgotten. > Or other option is to add this to ieee80211_tx_data - while this param we pass to most of encrypt funtions ... >From other side I see ieee80211_tx_data skbs list could be used - seems only for fragmentation? @Johannes - will be safe add "real" hdrlen to ieee80211_tx_data? Other option I see is ieee80211_tx_info or like Felix suggest new hdrlen() function. BR Janusz > - Felix -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html