struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
//ihl:表示Internet报头长度。IPv4报头的长度以4字节为单位。IPv6报头的长度固定为40字节,
//而IPv4报头的长度不固定。这是因为IPv4报头可包含可选的变长选项。IPv4报头最短为20字
//节(不包含任何选项时,对应的ihl值为5),最长为60字节(对应的ihl值为15)。IPv4报头的长度
//必须是4字节的整数倍。
ihl:4;
#else
#error "Please fix "
#endif
__u8 tos;
__be16 tot_len;
//id: IPv4报头标识。对于分段来说,id字样很重要。对SKB进行分段时,所有分段的id值都必须相同;
// 对于分段后的数据包,则要根据各个分段的id对其进行重组。
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/*The options start here. */
};
2.IPv4初始化
IPv4数据包的以太类型为0x0800(以太类型存储在14字节的以太网报头的开头的两个字节中)。每种协议都必须指定一个协议处理程序并进行初始化,以便让网络栈能够处理归属于该协议的数据包。
3.接收IPv4数据包