之前说我我加入一个自己的协议,现在说一下我的协议的意思是每个数据包前加一个32位的数据,前16位是协议号,即ETH_IP_VNIC;
后16位的高八位是’w’(我的姓的第一字母),低八位是虚拟网卡号。所以VNIC_HLEN是4。可以看一下结构体struct vnic_ethhdr
/**
* struct vnic_ethhdr - vnic ethernet header (ethhdr + vnic_hdr)
* @h_dest: destination ethernet address
* @h_source: source ethernet address
* @h_vnic_proto: ethernet protocol (always ETH_P_VNIC)
*/
struct vnic_ethhdr {
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
__be16 h_vnic_proto;
__be16 h_vnic_data;
};
//vnic_put_tag主要是构建我的vnic头
static inline struct sk_buff *vnic_put_tag(struct sk_buff *skb, u16 vnic_data)
{
struct vnic_ethhdr *beth;
//skb_cow_head是看skb是否有足够的余量来装入vnic头,不够会重新分配。
if (skb_cow_head(skb, VNIC_HLEN) < 0)
{
kfree_skb(skb);
return NULL;
}
//skb_push之后会skb->data -= len;beth = skb->data;
b