diff --git a/Makefile.in b/Makefile.in index d0466c1..0885244 100644 --- a/Makefile.in +++ b/Makefile.in @@ -58,8 +58,9 @@ subdir = . DIST_COMMON = README $(am__configure_deps) $(libtins_include_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libtins.pc.in $(top_srcdir)/configure \ - $(top_srcdir)/include/config.h.in AUTHORS INSTALL THANKS \ - config.guess config.sub depcomp install-sh ltmain.sh missing + $(top_srcdir)/include/config.h.in AUTHORS COPYING INSTALL \ + THANKS TODO config.guess config.sub depcomp install-sh \ + ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ diff --git a/include/radiotap.h b/include/radiotap.h index a5a6e1c..e4f2c41 100644 --- a/include/radiotap.h +++ b/include/radiotap.h @@ -187,12 +187,24 @@ namespace Tins { */ void dbm_noise(uint8_t new_dbm_noise); + /** + * \brief Setter for the signal quality field. + * \param new_antenna The signal quality signal. + */ + void signal_quality(uint8_t new_signal_quality); + /** * \brief Setter for the antenna field. * \param new_antenna The antenna signal. */ void antenna(uint8_t new_antenna); + /** + * \brief Setter for the db signal field. + * \param new_antenna The db signal signal. + */ + void db_signal(uint8_t new_db_signal); + /** * \brief Setter for the rx flag field. * \param new_rx_flag The antenna signal. @@ -261,11 +273,23 @@ namespace Tins { */ uint8_t dbm_noise() const { return _dbm_noise; } + /** + * \brief Getter for the signal quality field. + * \return The signal quality field. + */ + uint16_t signal_quality() const { return _signal_quality; } + /** * \brief Getter for the antenna field. * \return The antenna field. */ uint8_t antenna() const { return _antenna; } + + /** + * \brief Getter for the db signal field. + * \return The db signal field. + */ + uint8_t db_signal() const { return _db_signal; } /** * \brief Getter for the channel+ field. @@ -388,8 +412,8 @@ namespace Tins { // present fields... uint64_t _tsft; uint32_t _channel_type; - uint16_t _channel_freq, _rx_flags; - uint8_t _antenna, _flags, _rate, _dbm_signal, _dbm_noise, _channel, _max_power; + uint16_t _channel_freq, _rx_flags, _signal_quality; + uint8_t _antenna, _flags, _rate, _dbm_signal, _dbm_noise, _channel, _max_power, _db_signal; }; } diff --git a/src/radiotap.cpp b/src/radiotap.cpp index ac0dd73..02f9e99 100644 --- a/src/radiotap.cpp +++ b/src/radiotap.cpp @@ -103,9 +103,15 @@ RadioTap::RadioTap(const uint8_t *buffer, uint32_t total_sz) if(_radio.dbm_noise) read_field(buffer, radiotap_hdr_size, _dbm_noise); + if(_radio.lock_quality) + read_field(buffer, radiotap_hdr_size, _signal_quality); + if(_radio.antenna) read_field(buffer, radiotap_hdr_size, _antenna); + if(_radio.db_signal) + read_field(buffer, radiotap_hdr_size, _db_signal); + if(_radio.rx_flags) { if(((buffer - buffer_start) & 1) == 1) { buffer++; @@ -191,11 +197,21 @@ void RadioTap::dbm_noise(uint8_t new_dbm_noise) { _radio.dbm_noise = 1; } +void RadioTap::signal_quality(uint8_t new_signal_quality) { + _signal_quality = new_signal_quality; + _radio.lock_quality = 1; +} + void RadioTap::antenna(uint8_t new_antenna) { _antenna = new_antenna; _radio.antenna = 1; } +void RadioTap::db_signal(uint8_t new_db_signal) { + _db_signal = new_db_signal; + _radio.db_signal = 1; +} + void RadioTap::rx_flags(uint16_t new_rx_flag) { _rx_flags = Endian::host_to_le(new_rx_flag); _radio.rx_flags = 1; @@ -217,8 +233,14 @@ uint32_t RadioTap::header_size() const { total_bytes += sizeof(_dbm_signal); if(_radio.dbm_noise) total_bytes += sizeof(_dbm_noise); + if(_radio.lock_quality) { + total_bytes += (total_bytes & 1); + total_bytes += sizeof(_signal_quality); + } if(_radio.antenna) total_bytes += sizeof(_antenna); + if(_radio.db_signal) + total_bytes += sizeof(_db_signal); if(_radio.rx_flags) { total_bytes += (total_bytes & 1); total_bytes += sizeof(_rx_flags); @@ -284,8 +306,7 @@ void RadioTap::write_serialization(uint8_t *buffer, uint32_t total_sz, const PDU #ifdef TINS_DEBUG assert(total_sz >= sz); #endif - if(!_radio.it_len) - _radio.it_len = Endian::host_to_le(sz); + _radio.it_len = Endian::host_to_le(sz); memcpy(buffer, &_radio, sizeof(_radio)); buffer += sizeof(_radio); if(_radio.tsft) { @@ -317,10 +338,20 @@ void RadioTap::write_serialization(uint8_t *buffer, uint32_t total_sz, const PDU memcpy(buffer, &_dbm_noise, sizeof(_dbm_noise)); buffer += sizeof(_dbm_noise); } + if(_radio.lock_quality) { + if(((buffer - buffer_start) & 1) == 1) + *(buffer++) = 0; + memcpy(buffer, &_signal_quality, sizeof(_signal_quality)); + buffer += sizeof(_signal_quality); + } if(_radio.antenna) { memcpy(buffer, &_antenna, sizeof(_antenna)); buffer += sizeof(_antenna); } + if(_radio.db_signal) { + memcpy(buffer, &_db_signal, sizeof(_db_signal)); + buffer += sizeof(_db_signal); + } if(_radio.rx_flags) { if(((buffer - buffer_start) & 1) == 1) *(buffer++) = 0;