我正在浏览 IOvisor 项目的幻灯片,https: //events.static.linuxfound.org/sites/events/files/slides/iovisor-lc-bof-2016.pdf
#include <bcc/proto.h>
struct IPKey { u32 dip; u32 sip; };
BPF_TABLE("hash", struct IPKey, int, mytable, 1024);
int recv_packet(struct __sk_buff *skb) {
struct IPKey key;
u8 *cursor = 0;
struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));
struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));
key.dip = ip->dst;
key.sip = ip->src;
int *leaf = mytable.lookup(&key);
if (leaf)
*(leaf)++;
return 0;
}
此代码是示例之一。我一直在使用cursor_advance()
,现在我试图弄清楚它到底是做什么的。我怀疑这cursor
是我们保存正在解析的数据包地址的指针。然后,cursor_advance()
我们将光标移动以太网标头的大小,因为ethernet_t
包含所有以太网标头信息。然后,光标现在位于数据包以太网标头末尾的地址,如果我们使用ethernet_t
标头中声明的变量,例如type
: ethernet->type
,我们可以访问保存在的信息,type
因为结构ethernet
会读取保存在的值那个地址?对不起,我的解释不是很好。我只是在寻找一般解释,或者我的理论是否正确。谢谢!