author: jonathan
本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性。
Linux 连线跟踪流程整理(linux-2.6.31)
0 主要数据结构
0.1
/
*linux内核中抽象出一个net结构,代表了网络协议.其内部是协议族相关的数据结构.对于PF_INET来说,这里重点就是连线跟踪表
*/
struct net {
atomic_t
count;
...
#ifdef CONFIG_NETFILTER
struct netns_xt
xt; #if defined(CONFIG_NF_CONNTRACK) ||
defined(CONFIG_NF_CONNTRACK_MODULE)
struct netns_ct ct;
#endif
#endif
#ifdef CONFIG_XFRM
struct netns_xfrm xfrm;
#endif
struct net_generic *gen;
};
struct netns_ct {
atomic_t count;
unsigned int
expect_count;
struct hlist_nulls_head *hash;
struct hlist_head *expect_hash;
struct hlist_nulls_head unconfirmed;
struct hlist_nulls_head dying;
struct ip_conntrack_stat *stat;
....
int
hash_vmalloc;
int
expect_vmalloc;
};
struct hlist_nulls_node {
struct hlist_nulls_node *next, **pprev;
};
#define INIT_HLIST_NULLS_HEAD(ptr, nulls) \
((ptr)->first = (struct hlist_nulls_node *) (1UL |
(((long)nulls) << 1)))
static struct pernet_operations nf_conntrack_net_ops = {
.init = nf_conntrack_net_init,
.exit = nf_conntrack_net_exit,
};
static int __init nf_conntrack_standalone_init(void)
{
return
register_pernet_subsys(&nf_conntrack_net_ops);
}
0.2
struct nf_conntrack_tuple
{
struct nf_conntrack_man src;
struct {
union nf_inet_addr u3;
u_int8_t protonum;
u_int8_t dir;
} dst;
};
struct nf_conntrack_tuple {
struct nf_conntrack_man src;
struct {
union nf_inet_addr u3;
union {
__be16 all;
struct {
__be16 port;
} tcp;
struct {
__be16 port;
} udp;
struct {
u_int8_t type, code;
} icmp;
struct {
__be16 port;
} dccp;
struct {
__be16 port;
} sctp;
struct {
__be16 key;
} gre;
} u;
u_int8_t protonum;
u_i