红联Linux门户
Linux帮助

Linux和FreeBSD libnet发送机制对比

发布时间:2007-11-29 00:00:30来源:红联作者:Gifotce
研究libnet代码以及实际测试:
发现在Freebsd中,实际发送的数据帧不能超过2034,加上14字节正好是2048了
在Linux中,LibNet采取了RAW SOCKET的方式发送数据socket(PF_SOCKET,SOCK_RAW,htons(ETH_P_ALL))
Freebsd中换了机制,使用的是bpf驱动方式。
查看BPF源代码,发现内核实现时
bpf.c:248
if ((unsigned)len > MCLBYTES)
return (EIO);
而MCLBYTE宏缺省定义为2048,在内核配置文件sys/params.h:144行
/*
* Constants related to network buffer management.
* MCLBYTES must be no larger than PAGE_SIZE.
*/
#ifndef MSIZE
#define MSIZE 256 /* size of an mbuf */
#endif /* MSIZE */
#ifndef MCLSHIFT
#define MCLSHIFT 11 /* convert bytes to mbuf clusters */
#endif /* MCLSHIFT */
#define MCLBYTES (1 << MCLSHIFT) /* size of an mbuf cluster */
#define MJUMPAGESIZE PAGE_SIZE /* jumbo cluster 4k */
#define MJUM9BYTES (9 * 1024) /* jumbo cluster 9k */
#define MJUM16BYTES (16 * 1024) /* jumbo cluster 16k */
在配置内核时应该可以通过配置
MCLSHIFT 12 来将缓冲区提高到4096
但是我想发送8K的数据包怎么办?
/*
* Constants related to network buffer management.
* MCLBYTES must be no larger than PAGE_SIZE.
*/
专门有一个提示要求不能大于PAGE_SIZE,难道我还要改动PAGE_SIZE?改动后对系统会不会造成较大影响??
看了系统源码,在IA64中,PAGE_SIZE默认为8K,在其其他体系中,包括AMD64,都是4096
为何?待研究
看来RAW SOCKET性能是要高。
下来再研究bfp源码吧
文章评论

共有 0 条评论