10 #include <arpa/inet.h> 
   11 #include <boost/crc.hpp> 
   38         int num_symbols = std::ceil(
 
   39                 double((16  + 8 * (length + 4 ) + 6 )) /
 
   40                 double(rate_params.
dbps));
 
   53         int length = payload.size();
 
   54         int num_symbols = std::ceil(
 
   55                 double((16  + 8 * (length + 4 ) + 6 )) /
 
   56                 double(rate_params.
dbps));
 
   67         std::vector<std::complex<double> > header_samples = 
encoder_header();
 
   68         std::vector<std::complex<double> > payload_samples = 
encode_data();
 
   69         std::vector<std::complex<double> > ppdu_samples = std::vector<std::complex<double> >(header_samples.size() + payload_samples.size());
 
   70         memcpy(&ppdu_samples[0], &header_samples[0], header_samples.size() * 
sizeof(std::complex<double>));
 
   71         memcpy(&ppdu_samples[48], payload_samples.data(), payload_samples.size() * 
sizeof(std::complex<double>));
 
   85         unsigned int header_field = 0;
 
   89         if(
parity(header_field) == 1) header_field |= 131072;
 
   93         unsigned char header_bytes[4];
 
   94         unsigned int h = htonl(header_field) >> 8;
 
   95         memcpy(header_bytes, &h, 3);
 
   98         std::vector<unsigned char> header_symbols(48 );
 
  100         v.
conv_encode(header_bytes, &header_symbols[0], 18 );
 
  118         int num_symbols = std::ceil(
 
  119                 double((16  + 8 * (
payload.size() + 4 ) + 6 )) /
 
  120                 double(rate_params.
dbps));
 
  123         int num_data_bits = num_symbols * rate_params.
dbps;
 
  124         int num_data_bytes = num_data_bits / 8;
 
  126         unsigned short service_field = 0;
 
  129         std::vector<unsigned char> data(num_data_bytes+1, 0);
 
  130         memcpy(&data[0], &service_field, 2);
 
  134         boost::crc_32_type crc;
 
  135         crc.process_bytes(&data[0], 2 + 
payload.size());
 
  136         unsigned int calculated_crc = crc.checksum();
 
  137         memcpy(&data[2 + 
payload.size()], &calculated_crc, 4);
 
  140         std::vector<unsigned char> scrambled(num_data_bytes+1, 0);
 
  141         int state = 93, feedback = 0;
 
  142         for(
int x = 0; x < num_data_bytes; x++)
 
  144            feedback = (!!(state & 64)) ^ (!!(state & 8));
 
  145            scrambled[x] = feedback ^ data[x];
 
  146            state = ((state << 1) & 0x7E) | feedback;
 
  148         data.swap(scrambled);
 
  151         std::vector<unsigned char> data_encoded(num_data_bits * 2, 0);
 
  153         v.
conv_encode(&data[0], data_encoded.data(), num_data_bits-6);
 
  164         return data_modulated;
 
  170         assert(samples.size() == 48);
 
  179         std::vector<unsigned char> header_bytes(4);
 
  181         v.
conv_decode(deinterleaved.data(), header_bytes.data(), 18 );
 
  184         unsigned int header_field;
 
  185         memcpy(&header_field, &header_bytes[0], 3);
 
  186         header_field = htonl(header_field) >> 8;
 
  187         int par = 
parity(header_field);
 
  194         unsigned char rate_field = ((header_field >> 19) & 0xF);
 
  195         unsigned int length = ((header_field >> 6) & 0xFFF);
 
  198         bool valid_rate = 
false;
 
  207         int num_symbols = std::ceil(
 
  208                 double((16  + 8 * (length + 4 ) + 6 )) /
 
  209                 double(rate_params.
dbps));
 
  229         int num_symbols = std::ceil(
 
  231                 double(rate_params.
dbps));
 
  234         int num_data_bits = num_symbols * rate_params.
dbps;
 
  235         int num_data_bytes = num_data_bits / 8;
 
  248         int data_bytes = data_bits / 8 + 1;
 
  249         data_bits = num_data_bits - 6;
 
  250         data_bytes = num_data_bytes;
 
  251         std::vector<unsigned char> decoded(data_bytes);
 
  253         v.
conv_decode(&depunctured[0], &decoded[0], data_bits);
 
  256         std::vector<unsigned char> descrambled(num_data_bytes+1, 0);
 
  257         int state = 93, feedback = 0;
 
  258         for(
int x = 0; x < num_data_bytes; x++)
 
  260            feedback = (!!(state & 64)) ^ (!!(state & 8));
 
  261            descrambled[x] = feedback ^ decoded[x];
 
  262            state = ((state << 1) & 0x7E) | feedback;
 
  264         decoded.swap(descrambled);
 
  267         boost::crc_32_type crc;
 
  269         unsigned int calculated_crc = crc.checksum();
 
  270         unsigned int given_crc = 0;
 
  274         if(given_crc != calculated_crc)
 
  276             std::cerr << 
"Invalid CRC (length " << 
header.
length << 
")" << std::endl;