Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将IPv4数据包转换为IPv6_C_Module_Linux Kernel_Network Programming_Linux Device Driver - Fatal编程技术网

C 将IPv4数据包转换为IPv6

C 将IPv4数据包转换为IPv6,c,module,linux-kernel,network-programming,linux-device-driver,C,Module,Linux Kernel,Network Programming,Linux Device Driver,我正在修改vyatta中的内核模块(称为map),以将IPv4数据包转换为IPv6 我可以通过删除IPv4头并添加新的IPv6头来进行对话,但在调用ip6\u local\u out()后,它不会返回任何错误,但数据包仍在我使用的结构sk\u buff skb中。当我使用tcpdump时,我看不到新的IPv6数据包。谁能告诉我哪里出了问题 skb_dst_drop(skb); skb_dst_set(skb, dst); memcpy(&orig_iph, iph, sizeof(o

我正在修改vyatta中的内核模块(称为map),以将IPv4数据包转换为IPv6

我可以通过删除IPv4头并添加新的IPv6头来进行对话,但在调用
ip6\u local\u out()
后,它不会返回任何错误,但数据包仍在我使用的结构sk\u buff skb中。当我使用tcpdump时,我看不到新的IPv6数据包。谁能告诉我哪里出了问题

skb_dst_drop(skb);
skb_dst_set(skb, dst);

memcpy(&orig_iph, iph, sizeof(orig_iph));
skb_pull(skb, orig_iph.ihl * 4);
skb_push(skb, sizeof(struct ipv6hdr));
skb_reset_network_header(skb);
skb->protocol = htons(ETH_P_IPV6);
ipv6h = ipv6_hdr(skb);

ipv6h->version = 6;
ipv6h->priority = 0; /* XXX: */
ipv6h->flow_lbl[0] = 0;
ipv6h->flow_lbl[1] = 0;
ipv6h->flow_lbl[2] = 0;
ipv6h->payload_len = htons(ntohs(orig_iph.tot_len) - orig_iph.ihl * 4);
ipv6h->hop_limit = orig_iph.ttl;
memcpy(&ipv6h->saddr, &fl6.saddr, sizeof(struct in6_addr));

ipv6h->nexthdr = orig_iph.protocol;

pkt_len = skb->len;

skb->local_df = 1;

if (df)
    err = ip6_local_out(skb);
else
    err = ip6_fragment(skb, ip6_local_out);

return 0;

我使用一个名为
map\u debug\u print\u skb(“map\u trans\u forward\u v4v6”,skb)的方法用于打印IP标头和传输标头。我可以从中看到所有新的IPv6报头详细信息,但数据包没有显示在tcpdump中。

如果您有IPv64数据包,我认为您需要在Tardis中后退一步……我可以告诉您的第一个问题是,如果您处理的IP数据包携带TCP负载,则必须重新计算TCP校验和。这可能是一个问题。