mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-05 00:07:48 -04:00
Merge branch 'net-remove-some-skb_mac_header-assumptions'
Eric Dumazet says: ==================== net: remove some skb_mac_header assumptions Historically, we tried o maintain skb_mac_header available in most of networking paths. When reaching ndo_start_xmit() handlers, skb_mac_header() should always be skb->data. With recent additions of skb_mac_header_was_set() and DEBUG_NET_WARN_ON_ONCE() in skb_mac_header(), we can attempt to remove our reliance on skb_mac_header in TX paths. When this effort completes we will remove skb_reset_mac_header() from __dev_queue_xmit() and replace it by skb_unset_mac_header() on DEBUG_NET builds. ==================== Link: https://lore.kernel.org/r/20230321164519.1286357-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -3735,25 +3735,25 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
|
||||
* we add to pkt_len the headers size of all segments
|
||||
*/
|
||||
if (shinfo->gso_size && skb_transport_header_was_set(skb)) {
|
||||
unsigned int hdr_len;
|
||||
u16 gso_segs = shinfo->gso_segs;
|
||||
unsigned int hdr_len;
|
||||
|
||||
/* mac layer + network layer */
|
||||
hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
|
||||
hdr_len = skb_transport_offset(skb);
|
||||
|
||||
/* + transport layer */
|
||||
if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) {
|
||||
const struct tcphdr *th;
|
||||
struct tcphdr _tcphdr;
|
||||
|
||||
th = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
th = skb_header_pointer(skb, hdr_len,
|
||||
sizeof(_tcphdr), &_tcphdr);
|
||||
if (likely(th))
|
||||
hdr_len += __tcp_hdrlen(th);
|
||||
} else {
|
||||
struct udphdr _udphdr;
|
||||
|
||||
if (skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
if (skb_header_pointer(skb, hdr_len,
|
||||
sizeof(_udphdr), &_udphdr))
|
||||
hdr_len += sizeof(struct udphdr);
|
||||
}
|
||||
|
||||
@@ -295,7 +295,7 @@ TC_INDIRECT_SCOPE int tcf_mirred_act(struct sk_buff *skb,
|
||||
at_nh = skb->data == skb_network_header(skb);
|
||||
if (at_nh != expects_nh) {
|
||||
mac_len = skb_at_tc_ingress(skb) ? skb->mac_len :
|
||||
skb_network_header(skb) - skb_mac_header(skb);
|
||||
skb_network_offset(skb);
|
||||
if (expects_nh) {
|
||||
/* target device/action expect data at nh */
|
||||
skb_pull_rcsum(skb2, mac_len);
|
||||
|
||||
@@ -69,7 +69,7 @@ TC_INDIRECT_SCOPE int tcf_mpls_act(struct sk_buff *skb,
|
||||
skb_push_rcsum(skb, skb->mac_len);
|
||||
mac_len = skb->mac_len;
|
||||
} else {
|
||||
mac_len = skb_network_header(skb) - skb_mac_header(skb);
|
||||
mac_len = skb_network_offset(skb);
|
||||
}
|
||||
|
||||
ret = READ_ONCE(m->tcf_action);
|
||||
|
||||
@@ -1360,7 +1360,7 @@ static u32 cake_overhead(struct cake_sched_data *q, const struct sk_buff *skb)
|
||||
return cake_calc_overhead(q, len, off);
|
||||
|
||||
/* borrowed from qdisc_pkt_len_init() */
|
||||
hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
|
||||
hdr_len = skb_transport_offset(skb);
|
||||
|
||||
/* + transport layer */
|
||||
if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 |
|
||||
@@ -1368,14 +1368,14 @@ static u32 cake_overhead(struct cake_sched_data *q, const struct sk_buff *skb)
|
||||
const struct tcphdr *th;
|
||||
struct tcphdr _tcphdr;
|
||||
|
||||
th = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
th = skb_header_pointer(skb, hdr_len,
|
||||
sizeof(_tcphdr), &_tcphdr);
|
||||
if (likely(th))
|
||||
hdr_len += __tcp_hdrlen(th);
|
||||
} else {
|
||||
struct udphdr _udphdr;
|
||||
|
||||
if (skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
if (skb_header_pointer(skb, hdr_len,
|
||||
sizeof(_udphdr), &_udphdr))
|
||||
hdr_len += sizeof(struct udphdr);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user