diff options
Diffstat (limited to 'gr-digital/lib/packet_header_ofdm.cc')
-rw-r--r-- | gr-digital/lib/packet_header_ofdm.cc | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/gr-digital/lib/packet_header_ofdm.cc b/gr-digital/lib/packet_header_ofdm.cc index f163657bab..4893b866e2 100644 --- a/gr-digital/lib/packet_header_ofdm.cc +++ b/gr-digital/lib/packet_header_ofdm.cc @@ -24,6 +24,7 @@ #endif #include <gnuradio/digital/packet_header_ofdm.h> +#include <gnuradio/digital/lfsr.h> namespace gr { namespace digital { @@ -46,11 +47,13 @@ namespace gr { const std::string &frame_len_tag_key, const std::string &num_tag_key, int bits_per_header_sym, - int bits_per_payload_sym) + int bits_per_payload_sym, + bool scramble_header) { return packet_header_ofdm::sptr( new packet_header_ofdm( - occupied_carriers, n_syms, len_tag_key, frame_len_tag_key, num_tag_key, bits_per_header_sym, bits_per_payload_sym + occupied_carriers, n_syms, len_tag_key, frame_len_tag_key, num_tag_key, + bits_per_header_sym, bits_per_payload_sym, scramble_header ) ); } @@ -62,8 +65,9 @@ namespace gr { const std::string &frame_len_tag_key, const std::string &num_tag_key, int bits_per_header_sym, - int bits_per_payload_sym) - : packet_header_default( + int bits_per_payload_sym, + bool scramble_header + ) : packet_header_default( _get_header_len_from_occupied_carriers(occupied_carriers, n_syms), len_tag_key, num_tag_key, @@ -71,23 +75,47 @@ namespace gr { d_frame_len_tag_key(pmt::string_to_symbol(frame_len_tag_key)), d_occupied_carriers(occupied_carriers), d_syms_per_set(0), - d_bits_per_payload_sym(bits_per_payload_sym) + d_bits_per_payload_sym(bits_per_payload_sym), + d_scramble_mask(d_header_len, 0) { for (unsigned i = 0; i < d_occupied_carriers.size(); i++) { d_syms_per_set += d_occupied_carriers[i].size(); } + + // Init scrambler mask + if (scramble_header) { + // These are just random values which already have OK PAPR: + gr::digital::lfsr shift_reg(0x8a, 0x6f, 7); + for (int i = 0; i < d_header_len; i++) { + for (int k = 0; k < bits_per_header_sym; k++) { + d_scramble_mask[i] ^= shift_reg.next_bit() << k; + } + } + } } packet_header_ofdm::~packet_header_ofdm() { } + bool packet_header_ofdm::header_formatter(long packet_len, unsigned char *out, const std::vector<tag_t> &tags) + { + bool ret_val = packet_header_default::header_formatter(packet_len, out, tags); + for (int i = 0; i < d_header_len; i++) { + out[i] ^= d_scramble_mask[i]; + } + return ret_val; + } bool packet_header_ofdm::header_parser( const unsigned char *in, std::vector<tag_t> &tags) { - if (!packet_header_default::header_parser(in, tags)) { + std::vector<unsigned char> in_descrambled(d_header_len, 0); + for (int i = 0; i < d_header_len; i++) { + in_descrambled[i] = in[i] ^ d_scramble_mask[i]; + } + if (!packet_header_default::header_parser(&in_descrambled[0], tags)) { return false; } int packet_len = 0; // # of bytes in this frame |