Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1217949
  • 博文数量: 298
  • 博客积分: 10050
  • 博客等级: 上将
  • 技术积分: 3277
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-14 13:36
文章分类
文章存档

2015年(7)

2012年(1)

2010年(5)

2009年(55)

2008年(73)

2007年(160)

我的朋友

分类: 网络与安全

2007-09-22 12:57:33

linux 在安装和卸载过滤器时都使用了函数 setsockopt(),其中标志SOL_SOCKET 代表了对 socket 进行设置,而 SO_ATTACH_FILTER  SO_DETACH_FILTER 则分别对应了安装和卸载。下面是 linux 2.4.29 版本中的相关代码:



[net/core/sock.c]
#ifdef CONFIG_FILTER
case SO_ATTACH_FILTER:
……
/* 
把过滤条件结构从用户空间拷贝到内核空间 */
if (copy_from_user(&fprog, optval, sizeof(fprog)))
break;
/* 
 socket 上安装过滤器
 */
ret = sk_attach_filter(&fprog, sk);
                 ……

case SO_DETACH_FILTER:
/* 
使用自旋锁锁住
 socket */
spin_lock_bh(&sk->lock.slock);

filter = sk->filter;
/* 
如果在 socket 上有过滤器,则简单设置为空,并释放过滤器内存
 */
if (filter) {
sk->filter = NULL;
spin_unlock_bh(&sk->lock.slock);
sk_filter_release(sk, filter);
break;
}
spin_unlock_bh(&sk->lock.slock);
ret = -ENONET;
break;
#endif



上面出现的 sk_attach_filter() 定义在 net/core/filter.c,它把结构sock_fprog 转换为结构 sk_filter, 最后把此结构设置为 socket 的过滤器:sk->filter = fp


其他代码
libpcap 
还提供了其它若干函数,但基本上是提供辅助或扩展功能,重要性相对弱一点。我个人认为,函数 pcap_dump_open()  pcap_open_offline() 可能比较有用,使用它们能把在线的数据包写入文件并事后进行分析处理。

总结
1994 
 libpcap 的第一个版本被发布,到现在已有 11 年的历史,如今libpcap 被广泛的应用在各种网络监控软件中。Libpcap 最主要的优点在于平台无关性,用户程序几乎不需做任何改动就可移植到其它 unix 平台上;其次,libpcap也能适应各种过滤机制,特别对BPF的支持最好。分析它的源代码,可以学习开发者优秀的设计思想和实现技巧,也能了解到(linux)操作系统的网络内核实现,对个人能力的提高有很大帮助。

参考资料
A
:《Libpcap, winpcap, libdnet, and libnet applications and resources

B
:《UNIX网络编程(第一卷) W.Richard Stevens

C
:《使用 lex  yacc 编译代码》
 Peter Seebach

D
:《The BSD Packet Filter: A New Architecture for User-level Packet Capture 
 Steven McCanne and Van Jacobson

E
linux 联机帮助手册:socket(2)socket(7)packet


F
:《xPF Packet Filtering for Low-Cost Network Monitoring

G
:《Plab a packet capture and analysis architecture

H
:《A compiler for Packet Filters

关于作者
施聪,成都人,高级程序员、网络设计师。从事基于 UNIX/LINUX 下的 c/c++ 程序设计和数据库建模工作已 10 年。可通过 javer@163.com  memncmp@yahoo.com.cn 和他联系。
阅读(1493) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~