net/netfilter/nf_nat_proto.c
Source file repositories/reference/linux-study-clean/net/netfilter/nf_nat_proto.c
File Facts
- System
- Linux kernel
- Corpus path
net/netfilter/nf_nat_proto.c- Extension
.c- Size
- 28443 bytes
- Lines
- 1101
- 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/types.hlinux/export.hlinux/init.hlinux/udp.hlinux/tcp.hlinux/icmp.hlinux/icmpv6.hlinux/dccp.hlinux/sctp.hnet/sctp/checksum.hlinux/netfilter.hnet/netfilter/nf_nat.hlinux/ipv6.hlinux/netfilter_ipv6.hnet/checksum.hnet/ip6_checksum.hnet/ip6_route.hnet/xfrm.hnet/ipv6.hnet/pptp.hnet/netfilter/nf_conntrack_core.hnet/netfilter/nf_conntrack.hlinux/netfilter/nfnetlink_conntrack.h
Detected Declarations
function __udp_manip_pktfunction udp_manip_pktfunction sctp_manip_pktfunction tcp_manip_pktfunction icmp_manip_pktfunction icmpv6_manip_pktfunction gre_manip_pktfunction l4proto_manip_pktfunction nf_nat_ipv4_manip_pktfunction nf_nat_ipv6_manip_pktfunction nf_nat_manip_pktfunction nf_nat_ipv4_csum_updatefunction nf_nat_ipv6_csum_updatefunction nf_csum_updatefunction nf_nat_ipv4_csum_recalcfunction nf_nat_ipv6_csum_recalcfunction nf_nat_csum_recalcfunction nf_nat_icmp_reply_translationfunction nf_nat_ipv4_fnfunction nf_nat_ipv4_pre_routingfunction nf_xfrm_me_harderfunction nf_nat_inet_port_was_mangledfunction nf_nat_ipv4_local_infunction nf_nat_ipv4_outfunction nf_nat_ipv4_local_fnfunction nf_nat_ipv4_register_fnfunction nf_nat_ipv4_unregister_fnfunction nf_nat_icmpv6_reply_translationfunction nf_nat_ipv6_fnfunction nf_nat_ipv6_local_infunction nf_nat_ipv6_infunction nf_nat_ipv6_outfunction nf_nat_ipv6_local_fnfunction nf_nat_ipv6_register_fnfunction nf_nat_ipv6_unregister_fnfunction nf_nat_inet_register_fnfunction nf_nat_inet_unregister_fnexport nf_nat_icmp_reply_translationexport nf_nat_ipv4_register_fnexport nf_nat_ipv4_unregister_fnexport nf_nat_icmpv6_reply_translationexport nf_nat_ipv6_register_fnexport nf_nat_ipv6_unregister_fnexport nf_nat_inet_register_fnexport nf_nat_inet_unregister_fn
Annotated Snippet
if (ip_hdr(skb)->protocol == IPPROTO_ICMP) {
if (!nf_nat_icmp_reply_translation(skb, ct, ctinfo,
state->hook))
return NF_DROP;
else
return NF_ACCEPT;
}
}
return nf_nat_inet_fn(priv, skb, state);
}
static unsigned int
nf_nat_ipv4_pre_routing(void *priv, struct sk_buff *skb,
const struct nf_hook_state *state)
{
unsigned int ret;
__be32 daddr = ip_hdr(skb)->daddr;
ret = nf_nat_ipv4_fn(priv, skb, state);
if (ret == NF_ACCEPT && daddr != ip_hdr(skb)->daddr)
skb_dst_drop(skb);
return ret;
}
#ifdef CONFIG_XFRM
static int nf_xfrm_me_harder(struct net *net, struct sk_buff *skb, unsigned int family)
{
struct sock *sk = skb->sk;
struct dst_entry *dst;
unsigned int hh_len;
struct flowi fl;
int err;
err = xfrm_decode_session(net, skb, &fl, family);
if (err < 0)
return err;
dst = skb_dst(skb);
if (dst->xfrm)
dst = ((struct xfrm_dst *)dst)->route;
if (!dst_hold_safe(dst))
return -EHOSTUNREACH;
if (sk && !net_eq(net, sock_net(sk)))
sk = NULL;
dst = xfrm_lookup(net, dst, &fl, sk, 0);
if (IS_ERR(dst))
return PTR_ERR(dst);
skb_dst_drop(skb);
skb_dst_set(skb, dst);
/* Change in oif may mean change in hh_len. */
hh_len = skb_dst(skb)->dev->hard_header_len;
if (skb_headroom(skb) < hh_len &&
pskb_expand_head(skb, hh_len - skb_headroom(skb), 0, GFP_ATOMIC))
return -ENOMEM;
return 0;
}
#endif
static bool nf_nat_inet_port_was_mangled(const struct sk_buff *skb, __be16 sport)
{
enum ip_conntrack_info ctinfo;
enum ip_conntrack_dir dir;
const struct nf_conn *ct;
ct = nf_ct_get(skb, &ctinfo);
if (!ct)
return false;
switch (nf_ct_protonum(ct)) {
case IPPROTO_TCP:
case IPPROTO_UDP:
break;
default:
return false;
}
dir = CTINFO2DIR(ctinfo);
if (dir != IP_CT_DIR_ORIGINAL)
return false;
return ct->tuplehash[!dir].tuple.dst.u.all != sport;
}
static unsigned int
Annotation
- Immediate include surface: `linux/types.h`, `linux/export.h`, `linux/init.h`, `linux/udp.h`, `linux/tcp.h`, `linux/icmp.h`, `linux/icmpv6.h`, `linux/dccp.h`.
- Detected declarations: `function __udp_manip_pkt`, `function udp_manip_pkt`, `function sctp_manip_pkt`, `function tcp_manip_pkt`, `function icmp_manip_pkt`, `function icmpv6_manip_pkt`, `function gre_manip_pkt`, `function l4proto_manip_pkt`, `function nf_nat_ipv4_manip_pkt`, `function nf_nat_ipv6_manip_pkt`.
- 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.