diff options
| author | luwenpeng <[email protected]> | 2021-09-10 17:49:31 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2021-09-10 17:49:31 +0800 |
| commit | aa887fd382a4eb1b981280183a780649230d71e9 (patch) | |
| tree | 21814c93478d41ffdeed6aab663d384e1679fc0c | |
| parent | e667e19f02ee903a5e1574018c88199146f6f693 (diff) | |
bugfix: 外层为 IPv4 内层为 IPv6 时 IP socket 发送失败
| -rw-r--r-- | nfqnl_test.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/nfqnl_test.c b/nfqnl_test.c index 117fccb..a6b20c8 100644 --- a/nfqnl_test.c +++ b/nfqnl_test.c @@ -661,7 +661,6 @@ static int packet_handler_cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, st pkt_paser_t pkt_parser = {0}; unsigned char *packet_data = NULL; struct nfqnl_msg_packet_hdr *packet_hdr = NULL; - struct sockaddr_in saddr = {0}; packet_hdr = nfq_get_msg_packet_hdr(nfa); if (packet_hdr == NULL) @@ -726,20 +725,31 @@ static int packet_handler_cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, st } if (pkt_parser.external_ip_version == IPv4 && pkt_parser.internal_ip_version == IPv6) { - saddr.sin_family = AF_INET6; - saddr.sin_addr.s_addr = inet_addr(pkt_parser.internal_ipv6.dst_addr); + struct sockaddr_in6 saddr6 = {0}; + saddr6.sin6_family = PF_INET6; + memcpy(saddr6.sin6_addr.s6_addr, pkt_parser.internal_ipv6.hdr->ip6_hdrun2.ip6_un2.ip6_dst, sizeof(struct in6_addr)); + raw_ip_fd = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); + if (sendto(raw_ip_fd, packet_data + offest, packet_len - offest, 0, (struct sockaddr *)&saddr6, sizeof(saddr6)) == -1) + { + LOG_ERROR("Failed at send(), %d: %s", errno, strerror(errno)); + close(raw_ip_fd); + goto end; + } + close(raw_ip_fd); } else if (pkt_parser.external_ip_version == IPv6 && pkt_parser.internal_ip_version == IPv4) { - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = inet_addr(pkt_parser.internal_ipv4.dst_addr); - } - - raw_ip_fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW); - if (sendto(raw_ip_fd, packet_data + offest, packet_len - offest, 0, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) - { - LOG_ERROR("Failed at send(), %d: %s", errno, strerror(errno)); - goto end; + struct sockaddr_in saddr4 = {0}; + saddr4.sin_family = PF_INET; + saddr4.sin_addr.s_addr = inet_addr(pkt_parser.internal_ipv4.dst_addr); + raw_ip_fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW); + if (sendto(raw_ip_fd, packet_data + offest, packet_len - offest, 0, (struct sockaddr *)&saddr4, sizeof(saddr4)) == -1) + { + LOG_ERROR("Failed at send(), %d: %s", errno, strerror(errno)); + close(raw_ip_fd); + goto end; + } + close(raw_ip_fd); } return nfq_set_verdict(qh, pkt_parser.raw_pkt.id, NF_DROP, 0, NULL); } |
