summaryrefslogtreecommitdiff
path: root/gr-digital/lib/packet_header_ofdm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/packet_header_ofdm.cc')
-rw-r--r--gr-digital/lib/packet_header_ofdm.cc40
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