代码调用:
char filter_exp[] = "port 80";
1 "port 80" 作为字符串 参与编译 pcap_compile(handle, &fp, filter_exp, 0, net)
2 netmask = mask; // 全局变量网络淹码赋值
bpf_pcap = handle; //内部的全局变量指针
snaplen = snaplen_arg; // capture最大的报文长度
in_buffer =filter_exp; // flex变量赋值,flex就是解析in_buffer的tokens,然后调用yacc(bison)的语法对应的规则
3 init_linktype(linktype_arg);
linktype =linktype_arg; //全局变量,链路层是什么?
off_linktype = 12; //上层协议的类型, 6(源mac)+6(目的mac)+(linktype 上层协议类型)
off_nl = 14; //上层链路的偏移, 网络层开始 ip
4 (void)pcap_parse(); // 调用yacc 解析过滤语法 yacc->lex(flex)返回token
port 80 ==>根据 80 (是一个NUM) ==>id ==> gen_ncode
调用一个生成数字的指令输出
gen_ncode (根据$0 发先前面的修饰符是 port)
==> gen_port
==> gen_linktype(ETHERTYPE_IP)
==> gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
==> s = new_stmt(BPF_LD|BPF_ABS|BPF_H);
绝对位置加载指令
s->s.k = off_linktype;
加载的位子是12 以太王报文头的上层协议字段 加载两个字节
b =
new_block(JMP(BPF_JEQ));
b->stmts
= s;
b->s.k = #800;
--------------------------------------------------------------------------------------------------------------------------------------
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 23
--------------------------------------------------------------------------------------------------------------------------------------
...
流图
program->bf_insns = icode_to_fcode(root, &len);
指令数组
libpcap 与 “port 80”,布布扣,bubuko.com
原文:http://www.cnblogs.com/kwingmei/p/3632064.html