summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2021-09-10 17:49:31 +0800
committerluwenpeng <[email protected]>2021-09-10 17:49:31 +0800
commitaa887fd382a4eb1b981280183a780649230d71e9 (patch)
tree21814c93478d41ffdeed6aab663d384e1679fc0c
parente667e19f02ee903a5e1574018c88199146f6f693 (diff)
bugfix: 外层为 IPv4 内层为 IPv6 时 IP socket 发送失败
-rw-r--r--nfqnl_test.c34
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);
}