Libnet11関数を使用しようとしています:
int libnet_write_raw_ipv6 (libnet_t *l, u_int8_t *packet, u_int32_t size)
ネットワーク層にIPv6パケットを注入します。IPv6 パケットを作成し、Wireshark でキャプチャしました。Wireshark が報告: 不正な形式のパケット(Wireshark は、IPv6 の次のヘッダー値が正しくなく、私の意見ではペイロード サイズが大きすぎると言っています)
libnet11 (libnet_write_raw_ipv6()) を使用してIPv6 パケット (ICMPv6 拡張ヘッダーを使用) を手動で構築する方法を示す、最小限のコード例で誰かが私を助けてくれることを願っています。
最小限のコードは次のようになると思います。
packet_len = 40 + 16; // 40B ~ IPv6 packet, 16B ~ ICMPv6 header
u_char *buf = NULL;
struct ip6_hdr *ip6 = NULL;
struct icmp6_hdr *icmp6 = NULL;
l = libnet_init();
if ( (buf = malloc(packet_len)) == NULL ) {
// error
}
// create IPv6 header
ip6 = (struct ip6_hdr *) buf;
ip6->ip6_flow = 0;
ip6->ip6_vfc = 6 << 4;
ip6->ip6_plen = 16; // ICMPv6 packet size
ip6->ip6_nxt = IPPROTO_ICMPV6; // 0x3a
ip6->ip6_hlim = 64;
memcpy(&(ip6->ip6_src), &src_addr, sizeof(struct in6_addr));
memcpy(&(ip6->ip6_dst), &dst_addr, sizeof(struct in6_addr));
// create ICMPv6 header
icmp6 = (struct icmp6_hdr *) (buf + 40); // 40B ~ IPv6 packet size
icmp6->icmp6_type = ICMP6_ECHO_REQUEST;
icmp6->icmp6_code = 0;
icmp6->icmp6_cksum= 0;
icmp6->icmp6_data32[0] = 0;
libnet_do_checksum(l, (u_int8_t *)buf, IPPROTO_ICMPV6, packet_len);
written = libnet_write_raw_ipv6(l, buf, packet_len);
if ( written != packet_len )
perror("Failed to send packet");
libnet_destroy(l);
free(buf);
コード例を見つけようとしましたが、成功しませんでした。前もって感謝します。
マーティン