From f29566d6d9266d5f28053488b67bab4001409c03 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Sun, 25 Feb 2018 10:42:16 -0800 Subject: [PATCH] Implement IPv6::recv_response --- include/tins/ipv6.h | 8 ++++++++ include/tins/packet_sender.h | 1 + src/ipv6.cpp | 13 +++++++------ src/packet_sender.cpp | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/include/tins/ipv6.h b/include/tins/ipv6.h index 0fbaaa7..6cb5f78 100644 --- a/include/tins/ipv6.h +++ b/include/tins/ipv6.h @@ -298,6 +298,14 @@ public: * \sa PDU::send() */ void send(PacketSender& sender, const NetworkInterface &); + + /** + * \brief Receives a matching response for this packet. + * + * \sa PDU::recv_response + * \param sender The packet sender which will receive the packet. + */ + PDU* recv_response(PacketSender& sender, const NetworkInterface &); #endif /** diff --git a/include/tins/packet_sender.h b/include/tins/packet_sender.h index afbf3ab..e7acc10 100644 --- a/include/tins/packet_sender.h +++ b/include/tins/packet_sender.h @@ -131,6 +131,7 @@ public: ARP_SOCKET, ICMP_SOCKET, IPV6_SOCKET, + ICMPV6_SOCKET, SOCKETS_END }; diff --git a/src/ipv6.cpp b/src/ipv6.cpp index 02967f3..fcb7c87 100644 --- a/src/ipv6.cpp +++ b/src/ipv6.cpp @@ -296,17 +296,18 @@ void IPv6::write_serialization(uint8_t* buffer, uint32_t total_sz) { #ifndef BSD void IPv6::send(PacketSender& sender, const NetworkInterface &) { - struct sockaddr_in6 link_addr; - PacketSender::SocketType type = PacketSender::IPV6_SOCKET; + sockaddr_in6 link_addr; + const PacketSender::SocketType type = PacketSender::IPV6_SOCKET; link_addr.sin6_family = AF_INET6; link_addr.sin6_port = 0; memcpy((uint8_t*)&link_addr.sin6_addr, header_.dst_addr, address_type::address_size); - if (inner_pdu() && inner_pdu()->pdu_type() == PDU::ICMP) { - type = PacketSender::ICMP_SOCKET; - } - sender.send_l3(*this, (struct sockaddr*)&link_addr, sizeof(link_addr), type); } + +PDU* IPv6::recv_response(PacketSender& sender, const NetworkInterface &) { + const PacketSender::SocketType type = PacketSender::ICMPV6_SOCKET; + return sender.recv_l3(*this, 0, sizeof(sockaddr_in6), type); +} #endif void IPv6::add_ext_header(const ext_header& header) { diff --git a/src/packet_sender.cpp b/src/packet_sender.cpp index 349084e..eb7a6db 100644 --- a/src/packet_sender.cpp +++ b/src/packet_sender.cpp @@ -108,6 +108,7 @@ PacketSender::PacketSender(const NetworkInterface& iface, types_[IP_RAW_SOCKET] = IPPROTO_RAW; types_[IPV6_SOCKET] = IPPROTO_RAW; types_[ICMP_SOCKET] = IPPROTO_ICMP; + types_[ICMPV6_SOCKET] = IPPROTO_ICMPV6; } PacketSender::~PacketSender() {