将IPv4数据包转换为IPv6

时间:2013-12-06 06:39:29

标签: c module linux-kernel network-programming linux-device-driver

我正在修改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中显示。

0 个答案:

没有答案