1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

Implement IPv6::recv_response

This commit is contained in:
Matias Fontanini
2018-02-25 10:42:16 -08:00
parent e4f747164c
commit f29566d6d9
4 changed files with 17 additions and 6 deletions

View File

@@ -298,6 +298,14 @@ public:
* \sa PDU::send() * \sa PDU::send()
*/ */
void send(PacketSender& sender, const NetworkInterface &); 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 #endif
/** /**

View File

@@ -131,6 +131,7 @@ public:
ARP_SOCKET, ARP_SOCKET,
ICMP_SOCKET, ICMP_SOCKET,
IPV6_SOCKET, IPV6_SOCKET,
ICMPV6_SOCKET,
SOCKETS_END SOCKETS_END
}; };

View File

@@ -296,16 +296,17 @@ void IPv6::write_serialization(uint8_t* buffer, uint32_t total_sz) {
#ifndef BSD #ifndef BSD
void IPv6::send(PacketSender& sender, const NetworkInterface &) { void IPv6::send(PacketSender& sender, const NetworkInterface &) {
struct sockaddr_in6 link_addr; sockaddr_in6 link_addr;
PacketSender::SocketType type = PacketSender::IPV6_SOCKET; const PacketSender::SocketType type = PacketSender::IPV6_SOCKET;
link_addr.sin6_family = AF_INET6; link_addr.sin6_family = AF_INET6;
link_addr.sin6_port = 0; link_addr.sin6_port = 0;
memcpy((uint8_t*)&link_addr.sin6_addr, header_.dst_addr, address_type::address_size); memcpy((uint8_t*)&link_addr.sin6_addr, header_.dst_addr, address_type::address_size);
if (inner_pdu() && inner_pdu()->pdu_type() == PDU::ICMP) { sender.send_l3(*this, (struct sockaddr*)&link_addr, sizeof(link_addr), type);
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 #endif

View File

@@ -108,6 +108,7 @@ PacketSender::PacketSender(const NetworkInterface& iface,
types_[IP_RAW_SOCKET] = IPPROTO_RAW; types_[IP_RAW_SOCKET] = IPPROTO_RAW;
types_[IPV6_SOCKET] = IPPROTO_RAW; types_[IPV6_SOCKET] = IPPROTO_RAW;
types_[ICMP_SOCKET] = IPPROTO_ICMP; types_[ICMP_SOCKET] = IPPROTO_ICMP;
types_[ICMPV6_SOCKET] = IPPROTO_ICMPV6;
} }
PacketSender::~PacketSender() { PacketSender::~PacketSender() {