net/xfrm/xfrm_interface_core.c
Source file repositories/reference/linux-study-clean/net/xfrm/xfrm_interface_core.c
File Facts
- System
- Linux kernel
- Corpus path
net/xfrm/xfrm_interface_core.c- Extension
.c- Size
- 29052 bytes
- Lines
- 1242
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: operation-table or driver-model contract
- Status
- pattern 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 an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/capability.hlinux/errno.hlinux/types.hlinux/sockios.hlinux/icmp.hlinux/if.hlinux/in.hlinux/ip.hlinux/net.hlinux/in6.hlinux/netdevice.hlinux/if_link.hlinux/if_arp.hlinux/icmpv6.hlinux/init.hlinux/route.hlinux/rtnetlink.hlinux/netfilter_ipv6.hlinux/slab.hlinux/hash.hlinux/uaccess.hlinux/atomic.hnet/gso.hnet/icmp.hnet/ip.hnet/ipv6.hnet/ip6_route.hnet/ip_tunnels.hnet/addrconf.hnet/xfrm.hnet/net_namespace.h
Detected Declarations
struct xfrmi_netfunction xfrmi_destroy_statefunction xfrmi_fill_encap_infofunction xfrmi_encap_nlsizefunction xfrmi_encap_cmpfunction xfrmi_hashfunction for_each_xfrmi_rcufunction xfrmi_decode_sessionfunction xfrmi_linkfunction xfrmi_unlinkfunction xfrmi_dev_freefunction xfrmi_createfunction xfrmi_dev_uninitfunction xfrmi_scrub_packetfunction xfrmi_inputfunction xfrmi4_rcvfunction xfrmi6_rcvfunction xfrmi4_inputfunction xfrmi6_inputfunction xfrmi_rcv_cbfunction xfrmi_xmit2function xfrmi_xmitfunction xfrmi4_errfunction xfrmi6_errfunction xfrmi_changefunction xfrmi_updatefunction xfrmi_get_iflinkfunction xfrmi_dev_setupfunction xfrmi_dev_initfunction xfrmi_validatefunction xfrmi_netlink_parmsfunction xfrmi_newlinkfunction xfrmi_dellinkfunction xfrmi_changelinkfunction xfrmi_get_sizefunction xfrmi_fill_infofunction xfrmi_exit_rtnlfunction xfrmi6_rcv_tunnelfunction xfrmi4_rcv_tunnelfunction xfrmi4_initfunction xfrmi4_finifunction xfrmi6_initfunction xfrmi6_finifunction xfrmi_initfunction xfrmi_finimodule init xfrmi_init
Annotated Snippet
static const struct net_device_ops xfrmi_netdev_ops;
#define XFRMI_HASH_BITS 8
#define XFRMI_HASH_SIZE BIT(XFRMI_HASH_BITS)
struct xfrmi_net {
/* lists for storing interfaces in use */
struct xfrm_if __rcu *xfrmi[XFRMI_HASH_SIZE];
struct xfrm_if __rcu *collect_md_xfrmi;
};
static const struct nla_policy xfrm_lwt_policy[LWT_XFRM_MAX + 1] = {
[LWT_XFRM_IF_ID] = NLA_POLICY_MIN(NLA_U32, 1),
[LWT_XFRM_LINK] = NLA_POLICY_MIN(NLA_U32, 1),
};
static void xfrmi_destroy_state(struct lwtunnel_state *lwt)
{
}
static int xfrmi_build_state(struct net *net, struct nlattr *nla,
unsigned int family, const void *cfg,
struct lwtunnel_state **ts,
struct netlink_ext_ack *extack)
{
struct nlattr *tb[LWT_XFRM_MAX + 1];
struct lwtunnel_state *new_state;
struct xfrm_md_info *info;
int ret;
ret = nla_parse_nested(tb, LWT_XFRM_MAX, nla, xfrm_lwt_policy, extack);
if (ret < 0)
return ret;
if (!tb[LWT_XFRM_IF_ID]) {
NL_SET_ERR_MSG(extack, "if_id must be set");
return -EINVAL;
}
new_state = lwtunnel_state_alloc(sizeof(*info));
if (!new_state) {
NL_SET_ERR_MSG(extack, "failed to create encap info");
return -ENOMEM;
}
new_state->type = LWTUNNEL_ENCAP_XFRM;
info = lwt_xfrm_info(new_state);
info->if_id = nla_get_u32(tb[LWT_XFRM_IF_ID]);
if (tb[LWT_XFRM_LINK])
info->link = nla_get_u32(tb[LWT_XFRM_LINK]);
*ts = new_state;
return 0;
}
static int xfrmi_fill_encap_info(struct sk_buff *skb,
struct lwtunnel_state *lwt)
{
struct xfrm_md_info *info = lwt_xfrm_info(lwt);
if (nla_put_u32(skb, LWT_XFRM_IF_ID, info->if_id) ||
(info->link && nla_put_u32(skb, LWT_XFRM_LINK, info->link)))
return -EMSGSIZE;
return 0;
}
static int xfrmi_encap_nlsize(struct lwtunnel_state *lwtstate)
{
return nla_total_size(sizeof(u32)) + /* LWT_XFRM_IF_ID */
nla_total_size(sizeof(u32)); /* LWT_XFRM_LINK */
}
static int xfrmi_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b)
{
struct xfrm_md_info *a_info = lwt_xfrm_info(a);
struct xfrm_md_info *b_info = lwt_xfrm_info(b);
return memcmp(a_info, b_info, sizeof(*a_info));
}
static const struct lwtunnel_encap_ops xfrmi_encap_ops = {
.build_state = xfrmi_build_state,
.destroy_state = xfrmi_destroy_state,
.fill_encap = xfrmi_fill_encap_info,
.get_encap_size = xfrmi_encap_nlsize,
.cmp_encap = xfrmi_encap_cmp,
Annotation
- Immediate include surface: `linux/module.h`, `linux/capability.h`, `linux/errno.h`, `linux/types.h`, `linux/sockios.h`, `linux/icmp.h`, `linux/if.h`, `linux/in.h`.
- Detected declarations: `struct xfrmi_net`, `function xfrmi_destroy_state`, `function xfrmi_fill_encap_info`, `function xfrmi_encap_nlsize`, `function xfrmi_encap_cmp`, `function xfrmi_hash`, `function for_each_xfrmi_rcu`, `function xfrmi_decode_session`, `function xfrmi_link`, `function xfrmi_unlink`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: pattern 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.