summaryrefslogtreecommitdiff
path: root/gr-digital/lib/packet_header_ofdm.cc
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2016-04-29 22:14:02 -0700
committerMartin Braun <martin.braun@ettus.com>2016-04-29 22:23:19 -0700
commit729a30046691496680f5f3602ff355dece8f59e0 (patch)
treef439cf8e1ab95e7d461f3a1391172b2d68d79231 /gr-digital/lib/packet_header_ofdm.cc
parent2e77960dd3607744981b5df4249883b77d17ac00 (diff)
digital: Fixes to packet_header_ofdm
- For unusual carrier allocations, the parser would report the wrong number of payload OFDM symbols => Fixed. - Updated QA code to track this use case. - Minor whitespace/indentation fixes
Diffstat (limited to 'gr-digital/lib/packet_header_ofdm.cc')
-rw-r--r--gr-digital/lib/packet_header_ofdm.cc55
1 files changed, 27 insertions, 28 deletions
diff --git a/gr-digital/lib/packet_header_ofdm.cc b/gr-digital/lib/packet_header_ofdm.cc
index 4893b866e2..7a9558640e 100644
--- a/gr-digital/lib/packet_header_ofdm.cc
+++ b/gr-digital/lib/packet_header_ofdm.cc
@@ -74,14 +74,9 @@ namespace gr {
bits_per_header_sym),
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_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:
@@ -108,36 +103,40 @@ namespace gr {
}
bool packet_header_ofdm::header_parser(
- const unsigned char *in,
- std::vector<tag_t> &tags)
- {
+ const unsigned char *in,
+ std::vector<tag_t> &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];
+ in_descrambled[i] = in[i] ^ d_scramble_mask[i];
}
if (!packet_header_default::header_parser(&in_descrambled[0], tags)) {
- return false;
+ return false;
}
- int packet_len = 0; // # of bytes in this frame
- for (unsigned i = 0; i < tags.size(); i++) {
- if (pmt::equal(tags[i].key, d_len_tag_key)) {
- // Convert bytes to complex symbols:
- packet_len = pmt::to_long(tags[i].value) * 8 / d_bits_per_payload_sym;
- if (pmt::to_long(tags[i].value) * 8 % d_bits_per_payload_sym) {
- packet_len++;
- }
- tags[i].value = pmt::from_long(packet_len);
- break;
- }
+ int packet_len = 0; // # of complex symbols in this frame
+ for (size_t i = 0; i < tags.size(); i++) {
+ if (pmt::equal(tags[i].key, d_len_tag_key)) {
+ // Convert bytes to complex symbols:
+ packet_len = pmt::to_long(tags[i].value) * 8 / d_bits_per_payload_sym;
+ if (pmt::to_long(tags[i].value) * 8 % d_bits_per_payload_sym) {
+ packet_len++;
+ }
+ tags[i].value = pmt::from_long(packet_len);
+ break;
+ }
}
- // frame_len == # of OFDM symbols in this frame
- int frame_len = packet_len / d_syms_per_set;
- int k = 0;
- int i = frame_len * d_syms_per_set;
- while (i < packet_len) {
- frame_len++;
- i += d_occupied_carriers[k].size();
+ // To figure out how many payload OFDM symbols there are in this frame,
+ // we need to go through the carrier allocation and count the number of
+ // allocated carriers per OFDM symbol.
+ // frame_len == # of payload OFDM symbols in this frame
+ int frame_len = 0;
+ size_t k = 0; // position in the carrier allocation map
+ int symbols_accounted_for = 0;
+ while (symbols_accounted_for < packet_len) {
+ frame_len++;
+ symbols_accounted_for += d_occupied_carriers[k].size();
+ k = (k + 1) % d_occupied_carriers.size();
}
tag_t tag;
tag.key = d_frame_len_tag_key;