net/ipv4/tcp_offload.c
Source file repositories/reference/linux-study-clean/net/ipv4/tcp_offload.c
File Facts
- System
- Linux kernel
- Corpus path
net/ipv4/tcp_offload.c- Extension
.c- Size
- 11750 bytes
- Lines
- 479
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/indirect_call_wrapper.hlinux/skbuff.hnet/gro.hnet/gso.hnet/tcp.hnet/protocol.h
Detected Declarations
function tcp_gso_tstampfunction __tcpv4_gso_segment_csumfunction list_for_each_entryfunction tcp_gro_completefunction tcp4_check_fraglist_grofunction tcp4_gro_completefunction tcpv4_offload_initexport tcp_gro_complete
Annotated Snippet
if (before(ts_seq, seq + mss)) {
skb_shinfo(skb)->tx_flags |= flags;
skb_shinfo(skb)->tskey = ts_seq;
return;
}
skb = skb->next;
seq += mss;
}
}
static void __tcpv4_gso_segment_csum(struct sk_buff *seg,
__be32 *oldip, __be32 newip,
__be16 *oldport, __be16 newport)
{
struct tcphdr *th;
struct iphdr *iph;
if (*oldip == newip && *oldport == newport)
return;
th = tcp_hdr(seg);
iph = ip_hdr(seg);
inet_proto_csum_replace4(&th->check, seg, *oldip, newip, true);
inet_proto_csum_replace2(&th->check, seg, *oldport, newport, false);
*oldport = newport;
csum_replace4(&iph->check, *oldip, newip);
*oldip = newip;
}
static struct sk_buff *__tcpv4_gso_segment_list_csum(struct sk_buff *segs)
{
const struct tcphdr *th;
const struct iphdr *iph;
struct sk_buff *seg;
struct tcphdr *th2;
struct iphdr *iph2;
seg = segs;
th = tcp_hdr(seg);
iph = ip_hdr(seg);
th2 = tcp_hdr(seg->next);
iph2 = ip_hdr(seg->next);
if (!(*(const u32 *)&th->source ^ *(const u32 *)&th2->source) &&
iph->daddr == iph2->daddr && iph->saddr == iph2->saddr)
return segs;
while ((seg = seg->next)) {
th2 = tcp_hdr(seg);
iph2 = ip_hdr(seg);
__tcpv4_gso_segment_csum(seg,
&iph2->saddr, iph->saddr,
&th2->source, th->source);
__tcpv4_gso_segment_csum(seg,
&iph2->daddr, iph->daddr,
&th2->dest, th->dest);
}
return segs;
}
static struct sk_buff *__tcp4_gso_segment_list(struct sk_buff *skb,
netdev_features_t features)
{
skb = skb_segment_list(skb, features, skb_mac_header_len(skb));
if (IS_ERR(skb))
return skb;
return __tcpv4_gso_segment_list_csum(skb);
}
static struct sk_buff *tcp4_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{
if (!(skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4))
return ERR_PTR(-EINVAL);
if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
return ERR_PTR(-EINVAL);
if (skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST) {
struct tcphdr *th = tcp_hdr(skb);
if ((skb_pagelen(skb) - th->doff * 4 == skb_shinfo(skb)->gso_size) &&
!(skb_shinfo(skb)->gso_type & SKB_GSO_DODGY))
return __tcp4_gso_segment_list(skb, features);
Annotation
- Immediate include surface: `linux/indirect_call_wrapper.h`, `linux/skbuff.h`, `net/gro.h`, `net/gso.h`, `net/tcp.h`, `net/protocol.h`.
- Detected declarations: `function tcp_gso_tstamp`, `function __tcpv4_gso_segment_csum`, `function list_for_each_entry`, `function tcp_gro_complete`, `function tcp4_check_fraglist_gro`, `function tcp4_gro_complete`, `function tcpv4_offload_init`, `export tcp_gro_complete`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.