这个函数包含了连接跟踪中许多重要的步骤
n 调用ip_ct_get_tuple函数,把数据包转换为tuple;
n ip_conntrack_find_get函数,根据tuple查找连接跟踪表;
n init_conntrack函数,初始化一条连接;
n 判断连接方向,设置连接状态;
5.1数据包的转换
ip_ct_get_tuple实现数据包至tuple的转换,这个转换,主要是根据数据包的套接字对来进行转换的:
int ip_ct_get_tuple(const struct iphdr *iph,
const struct sk_buff *skb,
unsigned int dataoff,
struct ip_conntrack_tuple *tuple,
const struct ip_conntrack_protocol *protocol)
{
/* Never happen */
if (iph->frag_off & htons(IP_OFFSET)) {
printk("ip_conntrack_core: Frag of proto %u.\n",
iph->protocol);
return 0;
}
/*设置来源、目的地址*/
tuple->src.ip = iph->saddr;
tuple->dst.ip = iph->daddr;
tuple->dst.protonum = iph->protocol;
tuple->dst.dir = IP_CT_DIR_ORIGINAL;
return protocol->pkt_to_tuple(skb, dataoff, tuple);
}
回忆一下我们前面分析协议的初始化中协议初始化的部份,pkt_to_tuple函数指针,以每种协议的不同而不同,以TCP协议为例:
static int tcp_pkt_to_tuple(const struct sk_buff *skb,
unsigned int dataoff,
struct ip_conntrack_tuple *tuple)
{
struct tcphdr _hdr, *hp;
/* 获取TCP报头*/
hp = skb_header_pointer(skb, dataoff, 8, &_hdr);
if (hp == NULL)
return 0;
/*根据报头的端口信息,设置tuple对应成员*/
tuple->src.u.tcp.port = hp->source;
tuple->dst.u.tcp.port = hp->dest;
return 1;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31885-8.html
是否落后你也并不清楚
在伊拉克
骗子做山寨机