我正在修改vyatta中的内核模块(称为map)以将IPv4数据包转换为IPv6。
http://enog.jp/~masakazu/vyatta/map/
我可以通过删除IPv4标头并添加新的IPv6标头来进行对话,但是在我调用ip6_local_out()
之后,它没有返回任何错误,但是数据包仍然在我正在使用的struct sk_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_debug_print_skb("map_trans_forward_v4v6", skb);
的方法打印IP标头和传输标头。我可以从中看到所有新的IPv6标头详细信息,但数据包未在tcpdump中显示。