net/xfrm/xfrm_input.c
Source file repositories/reference/linux-study-clean/net/xfrm/xfrm_input.c
File Facts
- System
- Linux kernel
- Corpus path
net/xfrm/xfrm_input.c- Extension
.c- Size
- 20497 bytes
- Lines
- 867
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bottom_half.hlinux/cache.hlinux/interrupt.hlinux/slab.hlinux/module.hlinux/netdevice.hlinux/percpu.hnet/dst.hnet/ip.hnet/xfrm.hnet/ip_tunnels.hnet/ip6_tunnel.hnet/dst_metadata.hnet/hotdata.hxfrm_inout.h
Detected Declarations
struct xfrm_trans_taskletstruct xfrm_trans_cbfunction xfrm_input_register_afinfofunction xfrm_input_unregister_afinfofunction xfrm_rcv_cbfunction xfrm_parse_spifunction xfrm4_remove_beet_encapfunction ipip_ecn_decapsulatefunction xfrm4_remove_tunnel_encapfunction ipip6_ecn_decapsulatefunction xfrm6_remove_tunnel_encapfunction xfrm6_remove_beet_encapfunction xfrm_inner_mode_encap_removefunction xfrm_prepare_inputfunction skb_network_headerfunction xfrm6_transport_inputfunction xfrm_inner_mode_inputfunction xfrm_inputfunction xfrm_input_resumefunction xfrm_trans_reinjectfunction xfrm_trans_queue_netfunction xfrm_trans_queuefunction xfrm_input_initfunction for_each_possible_cpuexport xfrm_input_register_afinfoexport xfrm_input_unregister_afinfoexport secpath_setexport xfrm_parse_spiexport xfrm_inputexport xfrm_input_resumeexport xfrm_trans_queue_netexport xfrm_trans_queue
Annotated Snippet
struct xfrm_trans_tasklet {
struct work_struct work;
spinlock_t queue_lock;
struct sk_buff_head queue;
};
struct xfrm_trans_cb {
union {
struct inet_skb_parm h4;
#if IS_ENABLED(CONFIG_IPV6)
struct inet6_skb_parm h6;
#endif
} header;
int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb);
struct net *net;
};
#define XFRM_TRANS_SKB_CB(__skb) ((struct xfrm_trans_cb *)&((__skb)->cb[0]))
static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
static struct xfrm_input_afinfo const __rcu *xfrm_input_afinfo[2][AF_INET6 + 1];
static struct gro_cells gro_cells;
static struct net_device *xfrm_napi_dev;
static DEFINE_PER_CPU(struct xfrm_trans_tasklet, xfrm_trans_tasklet);
int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo)
{
int err = 0;
if (WARN_ON(afinfo->family > AF_INET6))
return -EAFNOSUPPORT;
spin_lock_bh(&xfrm_input_afinfo_lock);
if (unlikely(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family]))
err = -EEXIST;
else
rcu_assign_pointer(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family], afinfo);
spin_unlock_bh(&xfrm_input_afinfo_lock);
return err;
}
EXPORT_SYMBOL(xfrm_input_register_afinfo);
int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo)
{
int err = 0;
spin_lock_bh(&xfrm_input_afinfo_lock);
if (likely(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family])) {
const struct xfrm_input_afinfo *cur;
cur = rcu_access_pointer(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family]);
if (unlikely(cur != afinfo))
err = -EINVAL;
else
RCU_INIT_POINTER(xfrm_input_afinfo[afinfo->is_ipip][afinfo->family], NULL);
}
spin_unlock_bh(&xfrm_input_afinfo_lock);
synchronize_rcu();
return err;
}
EXPORT_SYMBOL(xfrm_input_unregister_afinfo);
static const struct xfrm_input_afinfo *xfrm_input_get_afinfo(u8 family, bool is_ipip)
{
const struct xfrm_input_afinfo *afinfo;
if (WARN_ON_ONCE(family > AF_INET6))
return NULL;
rcu_read_lock();
afinfo = rcu_dereference(xfrm_input_afinfo[is_ipip][family]);
if (unlikely(!afinfo))
rcu_read_unlock();
return afinfo;
}
static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol,
int err)
{
bool is_ipip = (protocol == IPPROTO_IPIP || protocol == IPPROTO_IPV6);
const struct xfrm_input_afinfo *afinfo;
int ret;
afinfo = xfrm_input_get_afinfo(family, is_ipip);
if (!afinfo)
return -EAFNOSUPPORT;
ret = afinfo->callback(skb, protocol, err);
Annotation
- Immediate include surface: `linux/bottom_half.h`, `linux/cache.h`, `linux/interrupt.h`, `linux/slab.h`, `linux/module.h`, `linux/netdevice.h`, `linux/percpu.h`, `net/dst.h`.
- Detected declarations: `struct xfrm_trans_tasklet`, `struct xfrm_trans_cb`, `function xfrm_input_register_afinfo`, `function xfrm_input_unregister_afinfo`, `function xfrm_rcv_cb`, `function xfrm_parse_spi`, `function xfrm4_remove_beet_encap`, `function ipip_ecn_decapsulate`, `function xfrm4_remove_tunnel_encap`, `function ipip6_ecn_decapsulate`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.