1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-27 04:11:35 +01:00

Added PacketSender::recv_l2. Ethernet packets can now expect a response packet. ARP response is working now.

This commit is contained in:
matias
2011-08-16 00:36:59 -03:00
parent 5b851a9142
commit a489eab8b9
9 changed files with 190 additions and 29 deletions

View File

@@ -24,6 +24,7 @@
#include <cassert>
#include <netinet/in.h>
#include "arp.h"
#include "rawpdu.h"
#include "utils.h"
@@ -37,6 +38,10 @@ Tins::ARP::ARP() : PDU(0x0608) {
_arp.ar_pln = 4;
}
Tins::ARP::ARP(arphdr *arp_ptr) : PDU(0x0608) {
memcpy(&_arp, arp_ptr, sizeof(arphdr));
}
void Tins::ARP::sender_hw_addr(uint8_t* new_snd_hw_addr) {
memcpy(this->_arp.ar_sha, new_snd_hw_addr, 6); //Should this use hardware address' length?
}
@@ -88,3 +93,28 @@ void Tins::ARP::write_serialization(uint8_t *buffer, uint32_t total_sz, const PD
memcpy(buffer, &_arp, sizeof(arphdr));
}
bool Tins::ARP::matches_response(uint8_t *ptr, uint32_t total_sz) {
if(total_sz < sizeof(arphdr))
return false;
arphdr *arp_ptr = (arphdr*)ptr;
return arp_ptr->ar_sip == _arp.ar_tip && arp_ptr->ar_tip == _arp.ar_sip;
}
Tins::PDU *Tins::ARP::clone_packet(uint8_t *ptr, uint32_t total_sz) {
if(total_sz < sizeof(arphdr))
return 0;
arphdr *arp_ptr = (arphdr*)ptr;
PDU *child = 0, *cloned;
if(total_sz > sizeof(arphdr)) {
if(inner_pdu()) {
child = inner_pdu()->clone_packet(ptr + sizeof(arphdr), total_sz - sizeof(arphdr));
if(!child)
return 0;
}
else
child = new RawPDU(ptr + sizeof(arphdr), total_sz - sizeof(arphdr));
}
cloned = new ARP(arp_ptr);
cloned->inner_pdu(child);
return cloned;
}