ip_hdr和ipip_hdr有什么区别?

时间:2016-08-18 08:34:33

标签: linux networking kernel

在include / linux / ip.h中,

23 static inline struct iphdr *ip_hdr(const struct sk_buff *skb)
24 {
25         return (struct iphdr *)skb_network_header(skb);
26 }
27 
28 static inline struct iphdr *inner_ip_hdr(const struct sk_buff *skb)
29 {
30         return (struct iphdr *)skb_inner_network_header(skb);
31 }
32 
33 static inline struct iphdr *ipip_hdr(const struct sk_buff *skb)
34 {
35         return (struct iphdr *)skb_transport_header(skb);
36 }
37 #endif  /* _LINUX_IP_H */

如果我将sk_buff传递给ip_hdr和ipip_hdr

struct iphdr *ip_hdr ip_hdr_net = ip_hdr(skb);
struct iphdr *ip_hdr ip_hdr_trans = ipip_hdr(skb);

ip_hdr_net-> saddr和ip_hdr_trans-> saddr指向同样的事情?我试过代码。它没有。似乎只有ip_hdr_net-> saddr指向源IP地址。

所以问题:

(1)ip_hdr和ipip_hdr之间有什么区别?我们为什么拥有它们?没有文件可以解决它。

(2)我应该使用ntohX函数在访问时转换ip_hdr成员数据吗?例如,ip_hdr_net-> saddr。

1 个答案:

答案 0 :(得分:1)

ipip是ip over ip tunneling protocol。

有关协议的详细信息如下:

http://lartc.org/howto/lartc.tunnel.ip-ip.html

您可以在此处浏览有关其Linux实施的源代码:

ip over ip tunnel code xref in kernel