[SK_BUFF]: Introduce skb_copy_from_linear_data{_offset}
To clearly state the intent of copying from linear sk_buffs, _offset being a overly long variant but interesting for the sake of saving some bytes. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
David S. Miller

parent
2a123b86e2
commit
d626f62b11
@@ -933,12 +933,14 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
||||
if (frag == 0) {
|
||||
/* copy first fragment (including full headers) into
|
||||
* beginning of the fragment cache skb */
|
||||
memcpy(skb_put(frag_skb, flen), skb->data, flen);
|
||||
skb_copy_from_linear_data(skb, skb_put(frag_skb, flen),
|
||||
flen);
|
||||
} else {
|
||||
/* append frame payload to the end of the fragment
|
||||
* cache skb */
|
||||
memcpy(skb_put(frag_skb, flen), skb->data + hdrlen,
|
||||
flen);
|
||||
skb_copy_from_linear_data_offset(skb, hdrlen,
|
||||
skb_put(frag_skb,
|
||||
flen), flen);
|
||||
}
|
||||
dev_kfree_skb(skb);
|
||||
skb = NULL;
|
||||
@@ -1044,8 +1046,9 @@ void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
|
||||
skb->len >= ETH_HLEN + ETH_ALEN) {
|
||||
/* Non-standard frame: get addr4 from its bogus location after
|
||||
* the payload */
|
||||
memcpy(skb->data + ETH_ALEN,
|
||||
skb->data + skb->len - ETH_ALEN, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, skb->len - ETH_ALEN,
|
||||
skb->data + ETH_ALEN,
|
||||
ETH_ALEN);
|
||||
skb_trim(skb, skb->len - ETH_ALEN);
|
||||
}
|
||||
|
||||
|
@@ -146,7 +146,8 @@ int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
fc |= IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS;
|
||||
/* From&To DS: Addr1 = RA, Addr2 = TA, Addr3 = DA,
|
||||
* Addr4 = SA */
|
||||
memcpy(&hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, ETH_ALEN,
|
||||
&hdr.addr4, ETH_ALEN);
|
||||
hdr_len += ETH_ALEN;
|
||||
} else {
|
||||
/* bogus 4-addr format to workaround Prism2 station
|
||||
@@ -159,7 +160,8 @@ int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
/* SA from skb->data + ETH_ALEN will be added after
|
||||
* frame payload; use hdr.addr4 as a temporary buffer
|
||||
*/
|
||||
memcpy(&hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, ETH_ALEN,
|
||||
&hdr.addr4, ETH_ALEN);
|
||||
need_tailroom += ETH_ALEN;
|
||||
}
|
||||
|
||||
@@ -174,24 +176,27 @@ int hostap_data_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
else
|
||||
memcpy(&hdr.addr1, local->bssid, ETH_ALEN);
|
||||
memcpy(&hdr.addr2, dev->dev_addr, ETH_ALEN);
|
||||
memcpy(&hdr.addr3, skb->data, ETH_ALEN);
|
||||
skb_copy_from_linear_data(skb, &hdr.addr3, ETH_ALEN);
|
||||
} else if (local->iw_mode == IW_MODE_MASTER && !to_assoc_ap) {
|
||||
fc |= IEEE80211_FCTL_FROMDS;
|
||||
/* From DS: Addr1 = DA, Addr2 = BSSID, Addr3 = SA */
|
||||
memcpy(&hdr.addr1, skb->data, ETH_ALEN);
|
||||
skb_copy_from_linear_data(skb, &hdr.addr1, ETH_ALEN);
|
||||
memcpy(&hdr.addr2, dev->dev_addr, ETH_ALEN);
|
||||
memcpy(&hdr.addr3, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, ETH_ALEN, &hdr.addr3,
|
||||
ETH_ALEN);
|
||||
} else if (local->iw_mode == IW_MODE_INFRA || to_assoc_ap) {
|
||||
fc |= IEEE80211_FCTL_TODS;
|
||||
/* To DS: Addr1 = BSSID, Addr2 = SA, Addr3 = DA */
|
||||
memcpy(&hdr.addr1, to_assoc_ap ?
|
||||
local->assoc_ap_addr : local->bssid, ETH_ALEN);
|
||||
memcpy(&hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
memcpy(&hdr.addr3, skb->data, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, ETH_ALEN, &hdr.addr2,
|
||||
ETH_ALEN);
|
||||
skb_copy_from_linear_data(skb, &hdr.addr3, ETH_ALEN);
|
||||
} else if (local->iw_mode == IW_MODE_ADHOC) {
|
||||
/* not From/To DS: Addr1 = DA, Addr2 = SA, Addr3 = BSSID */
|
||||
memcpy(&hdr.addr1, skb->data, ETH_ALEN);
|
||||
memcpy(&hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
|
||||
skb_copy_from_linear_data(skb, &hdr.addr1, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, ETH_ALEN, &hdr.addr2,
|
||||
ETH_ALEN);
|
||||
memcpy(&hdr.addr3, local->bssid, ETH_ALEN);
|
||||
}
|
||||
|
||||
|
@@ -1277,8 +1277,8 @@ static char * ap_auth_make_challenge(struct ap_data *ap)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(tmpbuf, skb->data + ap->crypt->extra_mpdu_prefix_len,
|
||||
WLAN_AUTH_CHALLENGE_LEN);
|
||||
skb_copy_from_linear_data_offset(skb, ap->crypt->extra_mpdu_prefix_len,
|
||||
tmpbuf, WLAN_AUTH_CHALLENGE_LEN);
|
||||
dev_kfree_skb(skb);
|
||||
|
||||
return tmpbuf;
|
||||
|
@@ -1838,13 +1838,14 @@ static int prism2_tx_80211(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
/* skb->data starts with txdesc->frame_control */
|
||||
hdr_len = 24;
|
||||
memcpy(&txdesc.frame_control, skb->data, hdr_len);
|
||||
skb_copy_from_linear_data(skb, &txdesc.frame_control, hdr_len);
|
||||
fc = le16_to_cpu(txdesc.frame_control);
|
||||
if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
|
||||
(fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS) &&
|
||||
skb->len >= 30) {
|
||||
/* Addr4 */
|
||||
memcpy(txdesc.addr4, skb->data + hdr_len, ETH_ALEN);
|
||||
skb_copy_from_linear_data_offset(skb, hdr_len, txdesc.addr4,
|
||||
ETH_ALEN);
|
||||
hdr_len += ETH_ALEN;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user