1 / 40
文档名称:

filter源码分析.doc

格式:doc   大小:242KB   页数:40页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

filter源码分析.doc

上传人:fy5186fy 2016/8/23 文件大小:242 KB

下载得到文件列表

filter源码分析.doc

相关文档

文档介绍

文档介绍:filter 源码分析内容基本上来自两篇文章: 《 Netfilter 源码分析》—(独孤九贱/ ) 《 filter 实现机制和扩展技术》——(杨沙洲国防科技大学计算机学院) 一、 IP 报文的接收到 hook 函数的调用 ip_rcv() 函数以接收到的报文为例,类似的还有 ip_forward() 和 ip_output() int ip_rcv(struct sk_buff *skb, _device *dev, struct packet_type *pt, _device *orig_dev) { struct iphdr *iph; // 定义一个 ip 报文的数据报头 u32 len; if (skb->pkt_type == PACKET_OTHERHOST) goto drop; // 数据包不是发给我们的 IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES); // 收到数据包统计量加 1 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { /* 如果数据报是共享的,则复制一个出来,此时复制而出的已经和 socket 脱离了关系*/ IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS); goto out; } if (!pskb_may_pull(skb, sizeof(struct iphdr))) goto inhdr_error; // 对数据报的头长度进行检查, iph = skb->; // 取得数据报的头部位置 if (iph->ihl <5 || iph->version != 4) // 版本号或者头长度不对, goto inhdr_error; // 头长度是以 4 字节为单位的,所以 5 表示的是 20 字节 if (!pskb_may_pull(skb, iph->ihl*4)) goto inhdr_error; if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl))) goto inhdr_error; // 检查报文的检验和字段 len = ntohs(iph->tot_len); if (skb->len < len || len < (iph->ihl*4)) goto inhdr_error; // 整个报文长度不可能比报头长度小 if (pskb_trim_rcsum(skb, len)) { // 对数据报进行裁减,这样可以分片发送过来的数据报不会有重复数据 IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS); goto drop; } return NF_HOOK(, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); // 通过回调函数调用 ip_rcv_finish inhdr_error: IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); drop: kfree_skb(skb); // 丢掉数据报 out: _RX_DROP; } include/ NF_HOOK 宏#ifdef FILTER_DEBUG #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \ nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN) #define NF_HOOK_THRESH nf_hook_slow #else #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \ (list_empty(&nf_hooks[(pf)][(hook)]) \ ? (okfn)(skb) \ : nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN)) #define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh) \ (list_empty(&nf_hooks[(pf)][(hook)]) \ ? (okfn)(skb) \ : nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), (thresh