在阅读sk_buff的源代码时,我发现了以下有趣的事情:
__u16 inner_transport_header;
__u16 inner_network_header;
__u16 inner_mac_header;
__be16 protocol;
__u16 transport_header;
__u16 network_header;
__u16 mac_header;那么这里的inner_XXXX和XXXX有什么区别呢?
发布于 2020-07-25 02:53:35
不同之处在于inner_XXXX字段用于protocol encapsulation,例如XFRM加密/解密。
因此,skb允许维护原始和封装标头的指针。
您可以随时查看Linux内核源代码中的example:
/* Add encapsulation header.
*
* The top IP header will be constructed per RFC 2401.
*/
static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
{
struct dst_entry *dst = skb_dst(skb);
struct iphdr *top_iph;
int flags;
skb_set_inner_network_header(skb, skb_network_offset(skb));
skb_set_inner_transport_header(skb, skb_transport_offset(skb));
skb_set_network_header(skb, -x->props.header_len);
skb->mac_header = skb->network_header +
offsetof(struct iphdr, protocol);
skb->transport_header = skb->network_header + sizeof(*top_iph);
top_iph = ip_hdr(skb);
// ...https://stackoverflow.com/questions/63076982
复制相似问题