net/netfilter/nft_payload.c
Source file repositories/reference/linux-study-clean/net/netfilter/nft_payload.c
File Facts
- System
- Linux kernel
- Corpus path
net/netfilter/nft_payload.c- Extension
.c- Size
- 27289 bytes
- Lines
- 1055
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/if_vlan.hlinux/init.hlinux/module.hlinux/netlink.hlinux/netfilter.hlinux/netfilter/nf_tables.hnet/netfilter/nf_tables_core.hnet/netfilter/nf_tables.hnet/netfilter/nf_tables_offload.hlinux/tcp.hlinux/udp.hnet/gre.hlinux/icmpv6.hlinux/ip.hlinux/ipv6.hnet/sctp/checksum.h
Detected Declarations
struct nft_payload_setstruct nft_payload_vlan_hdrfunction Copyrightfunction nft_payload_copy_vlanfunction __nft_payload_inner_offsetfunction nft_payload_inner_offsetfunction nft_payload_need_vlan_adjustfunction nft_payload_evalfunction nft_payload_initfunction nft_payload_dumpfunction nft_payload_offload_maskfunction nft_payload_offload_llfunction nft_payload_offload_ipfunction nft_payload_offload_ip6function nft_payload_offload_nhfunction nft_payload_offload_tcpfunction nft_payload_offload_udpfunction nft_payload_offload_thfunction nft_payload_offloadfunction nft_payload_inner_evalfunction nft_payload_inner_initfunction nft_csum_replacefunction nft_payload_udp_checksumfunction nft_payload_l4csum_offsetfunction nft_payload_csum_sctpfunction nft_payload_l4csum_updatefunction nft_payload_csum_inetfunction nft_payload_set_vlanfunction nft_payload_set_evalfunction nft_payload_set_initfunction nft_payload_set_dumpfunction nft_payload_select_ops
Annotated Snippet
struct nft_payload_set {
enum nft_payload_bases base:8;
u16 offset;
u8 len;
u8 sreg;
u8 csum_type;
u8 csum_offset;
u8 csum_flags;
};
/* This is not struct vlan_hdr. */
struct nft_payload_vlan_hdr {
__be16 h_vlan_proto;
__be16 h_vlan_TCI;
};
static bool
nft_payload_set_vlan(const u32 *src, struct sk_buff *skb, u16 offset, u8 len,
int *vlan_hlen)
{
struct nft_payload_vlan_hdr *vlanh;
__be16 vlan_proto;
u16 vlan_tci;
if (offset >= offsetof(struct vlan_ethhdr, h_vlan_encapsulated_proto)) {
*vlan_hlen = VLAN_HLEN;
return true;
}
switch (offset) {
case offsetof(struct vlan_ethhdr, h_vlan_proto):
if (len == 2) {
vlan_proto = nft_reg_load_be16(src);
skb->vlan_proto = vlan_proto;
} else if (len == 4) {
vlanh = (struct nft_payload_vlan_hdr *)src;
__vlan_hwaccel_put_tag(skb, vlanh->h_vlan_proto,
ntohs(vlanh->h_vlan_TCI));
} else {
return false;
}
break;
case offsetof(struct vlan_ethhdr, h_vlan_TCI):
if (len != 2)
return false;
vlan_tci = ntohs(nft_reg_load_be16(src));
skb->vlan_tci = vlan_tci;
break;
default:
return false;
}
return true;
}
static void nft_payload_set_eval(const struct nft_expr *expr,
struct nft_regs *regs,
const struct nft_pktinfo *pkt)
{
const struct nft_payload_set *priv = nft_expr_priv(expr);
const u32 *src = ®s->data[priv->sreg];
int offset, csum_offset, vlan_hlen = 0;
struct sk_buff *skb = pkt->skb;
__wsum fsum, tsum;
switch (priv->base) {
case NFT_PAYLOAD_LL_HEADER:
if (!skb_mac_header_was_set(skb))
goto err;
if (skb_vlan_tag_present(skb) &&
nft_payload_need_vlan_adjust(priv->offset, priv->len)) {
if (!nft_payload_set_vlan(src, skb,
priv->offset, priv->len,
&vlan_hlen))
goto err;
if (!vlan_hlen)
return;
}
offset = skb_mac_header(skb) - skb->data - vlan_hlen;
break;
case NFT_PAYLOAD_NETWORK_HEADER:
offset = skb_network_offset(skb);
break;
case NFT_PAYLOAD_TRANSPORT_HEADER:
if (!(pkt->flags & NFT_PKTINFO_L4PROTO) || pkt->fragoff)
goto err;
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/if_vlan.h`, `linux/init.h`, `linux/module.h`, `linux/netlink.h`, `linux/netfilter.h`, `linux/netfilter/nf_tables.h`, `net/netfilter/nf_tables_core.h`.
- Detected declarations: `struct nft_payload_set`, `struct nft_payload_vlan_hdr`, `function Copyright`, `function nft_payload_copy_vlan`, `function __nft_payload_inner_offset`, `function nft_payload_inner_offset`, `function nft_payload_need_vlan_adjust`, `function nft_payload_eval`, `function nft_payload_init`, `function nft_payload_dump`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: source 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.