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

Added RadioTap constructor from buffer. It's working, although some flags are not implemented yet.

This commit is contained in:
Matias Fontanini
2011-08-23 23:58:05 -03:00
parent 22b84e5df0
commit 2fa66c814d
2 changed files with 78 additions and 2 deletions

View File

@@ -33,17 +33,25 @@ namespace Tins {
class RadioTap : public PDU {
public:
/**
* Creates an instance of RadioTap.
* \brief Creates an instance of RadioTap.
* \param iface The name of the interface in which to send this PDU.
*/
RadioTap(const std::string &iface) throw (std::runtime_error);
/**
* Creates an instance of RadioTap.
* \brief Creates an instance of RadioTap.
* \param iface_index The index of the interface in which to send this PDU.
*/
RadioTap(uint32_t iface_index);
/**
* \brief Constructor which creates a RadioTap object from a buffer and adds all
* identifiable PDUs found in the buffer as children of this one.
* \param buffer The buffer from which this PDU will be constructed.
* \param total_sz The total size of the buffer.
*/
RadioTap(const uint8_t *buffer, uint32_t total_sz);
/* Setters */
/**

View File

@@ -40,6 +40,74 @@ Tins::RadioTap::RadioTap(uint32_t iface_index) : PDU(0xff), _iface_index(iface_i
std::memset(&_radio, 0, sizeof(_radio));
}
Tins::RadioTap::RadioTap(const uint8_t *buffer, uint32_t total_sz) : PDU(0xff) {
if(total_sz < sizeof(_radio))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
const uint8_t *buffer_start = buffer;
std::memcpy(&_radio, buffer, sizeof(_radio));
buffer += sizeof(_radio);
total_sz -= sizeof(_radio);
if(_radio.tsft) {
if(total_sz < sizeof(_tsft))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_tsft, buffer, sizeof(_tsft));
buffer += sizeof(_tsft);
total_sz -= sizeof(_tsft);
}
if(_radio.flags) {
if(total_sz < sizeof(_flags))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_flags, buffer, sizeof(_flags));
buffer += sizeof(_flags);
total_sz -= sizeof(_flags);
}
if(_radio.rate) {
if(total_sz < sizeof(_rate))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_rate, buffer, sizeof(_rate));
buffer += sizeof(_rate);
total_sz -= sizeof(_rate);
}
if(_radio.channel) {
if(((buffer_start - buffer) & 1) == 1) {
buffer++;
total_sz--;
}
if(total_sz < sizeof(uint32_t))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_channel_freq, buffer, sizeof(_channel_freq));
buffer += sizeof(_channel_freq);
memcpy(&_channel_type, buffer, sizeof(_channel_type));
buffer += sizeof(_channel_type);
total_sz -= sizeof(uint32_t);
}
if(_radio.dbm_signal) {
if(total_sz < sizeof(_dbm_signal))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_dbm_signal, buffer, sizeof(_dbm_signal));
buffer += sizeof(_dbm_signal);
total_sz -= sizeof(_dbm_signal);
}
if(_radio.antenna) {
if(total_sz < sizeof(_antenna))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_antenna, buffer, sizeof(_antenna));
buffer += sizeof(_antenna);
total_sz -= sizeof(_antenna);
}
if(_radio.rx_flags) {
if(((buffer_start - buffer) & 1) == 1) {
buffer++;
total_sz--;
}
if(total_sz < sizeof(_rx_flags))
throw std::runtime_error("Not enough size for an RadioTap header in the buffer.");
memcpy(&_rx_flags, buffer, sizeof(_rx_flags));
buffer += sizeof(_rx_flags);
total_sz -= sizeof(_rx_flags);
}
}
void Tins::RadioTap::version(uint8_t new_version) {
_radio.it_version = new_version;
}