基于Linux平台的libpcap源代码分析d

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  年。可通过  [email protected]   [email protected]  和他联系。
 

你可能感兴趣的:(linux,socket,filter,平台,代码分析,数据库建模)