netfilter_netfilter 锁开销_netfilter iptables(8)

电脑杂谈  发布时间:2017-02-12 00:02:53  来源:网络整理

这个函数包含了连接跟踪中许多重要的步骤

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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...