From cbd70793b710abe4e92e960f23c3286f7270dd65 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <tom@trondeau.com>
Date: Thu, 24 Sep 2015 21:59:36 -0400
Subject: fec: Adds MTU parameter to async and tagged stream blocks.

The maximum transmission unit (MTU, in bytes) sets up the encoders and
decoders with enough internal buffer space to accommodate frames of
varying sizes up to the MTU. Proections placed to make sure incoming
tagged streams and PDUs don't exceed this.

This also fixes a bug in the tagged stream encoder and decoder blocks
to properly use calculate_output_stream_length.
---
 gr-fec/lib/async_decoder_impl.cc | 44 ++++++++++++++++++++++------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

(limited to 'gr-fec/lib/async_decoder_impl.cc')

diff --git a/gr-fec/lib/async_decoder_impl.cc b/gr-fec/lib/async_decoder_impl.cc
index b5ae04be17..ed709e8c67 100644
--- a/gr-fec/lib/async_decoder_impl.cc
+++ b/gr-fec/lib/async_decoder_impl.cc
@@ -34,14 +34,16 @@ namespace gr {
 
     async_decoder::sptr
     async_decoder::make(generic_decoder::sptr my_decoder,
-                        bool packed, bool rev_pack)
+                        bool packed, bool rev_pack,
+                        int mtu)
     {
       return gnuradio::get_initial_sptr
-        (new async_decoder_impl(my_decoder, packed, rev_pack));
+        (new async_decoder_impl(my_decoder, packed, rev_pack, mtu));
     }
 
     async_decoder_impl::async_decoder_impl(generic_decoder::sptr my_decoder,
-                                           bool packed, bool rev_pack)
+                                           bool packed, bool rev_pack,
+                                           int mtu)
       : block("async_decoder",
               io_signature::make(0,0,0),
               io_signature::make(0,0,0)),
@@ -58,6 +60,7 @@ namespace gr {
 
       d_packed = packed;
       d_rev_pack = rev_pack;
+      d_mtu = mtu;
 
       message_port_register_in(d_in_port);
       message_port_register_out(d_out_port);
@@ -71,7 +74,7 @@ namespace gr {
       }
 
       // The maximum frame size is set by the initial frame size of the decoder.
-      d_max_bits_in = d_decoder->get_input_size();
+      d_max_bits_in = d_mtu*8 * 1.0/d_decoder->rate();
       d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float),
                                       volk_get_alignment());
 
@@ -81,7 +84,7 @@ namespace gr {
       }
 
       if(d_packed) {
-        int max_bits_out = d_decoder->get_output_size();
+        int max_bits_out = d_mtu*8;
         d_bits_out = (uint8_t*)volk_malloc(max_bits_out*sizeof(uint8_t),
                                            volk_get_alignment());
       }
@@ -114,7 +117,7 @@ namespace gr {
       int diff = d_decoder->rate()*d_decoder->get_input_size() - d_decoder->get_output_size();
 
       size_t nbits_in = pmt::length(bits);
-      size_t nbits_out = 0;        
+      size_t nbits_out = 0;
       size_t nblocks = 1;
       bool variable_frame_size = d_decoder->set_frame_size(nbits_out);
 
@@ -127,14 +130,14 @@ namespace gr {
       // set up nbits_out
       if(variable_frame_size){
         nbits_out = nbits_in*d_decoder->rate() - diff;
-        } else {
-            nblocks = nbits_in / d_decoder->get_input_size();
-            nbits_out = nblocks * d_decoder->get_output_size();
-            if(nblocks * d_decoder->get_input_size() != nbits_in){
-                throw std::runtime_error("bad block multiple in!");
-            }
+      }
+      else {
+        nblocks = nbits_in / d_decoder->get_input_size();
+        nbits_out = nblocks * d_decoder->get_output_size();
+        if(nblocks * d_decoder->get_input_size() != nbits_in){
+          throw std::runtime_error("bad block multiple in!");
         }
-
+      }
 
       size_t o0(0);
       const float* f32in = pmt::f32vector_elements(bits, o0);
@@ -148,11 +151,11 @@ namespace gr {
 
         // grow d_tmp_f32 if needed
         if(nbits_in > d_max_bits_in){
-            d_max_bits_in = nbits_in;
-            volk_free(d_tmp_f32);
-            d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float),
-                        volk_get_alignment());
-            }
+          d_max_bits_in = nbits_in;
+          volk_free(d_tmp_f32);
+          d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float),
+                                          volk_get_alignment());
+        }
         memcpy(d_tmp_f32, f32in, nbits_in*sizeof(float));
       }
 
@@ -170,8 +173,9 @@ namespace gr {
       }
       else {
         for(size_t i=0; i<nblocks; i++){
-          d_decoder->generic_work((void*)&d_tmp_f32[i*d_decoder->get_input_size()], (void*)&u8out[i*d_decoder->get_output_size()]);
-          }
+          d_decoder->generic_work((void*)&d_tmp_f32[i*d_decoder->get_input_size()],
+                                  (void*)&u8out[i*d_decoder->get_output_size()]);
+        }
       }
 
       meta = pmt::dict_add(meta, pmt::mp("iterations"), pmt::mp(d_decoder->get_iterations()) );
-- 
cgit v1.2.3


From 82dfb5b80f541c799e3ce810105bfb989bd5fca6 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <tom@trondeau.com>
Date: Fri, 25 Sep 2015 11:02:18 -0400
Subject: fec: removed logic that will never hit.

We prevent packets larger than the MTU now, so no need to adjust the
buffer size.
---
 gr-fec/lib/async_decoder_impl.cc | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

(limited to 'gr-fec/lib/async_decoder_impl.cc')

diff --git a/gr-fec/lib/async_decoder_impl.cc b/gr-fec/lib/async_decoder_impl.cc
index ed709e8c67..33aaacb2f4 100644
--- a/gr-fec/lib/async_decoder_impl.cc
+++ b/gr-fec/lib/async_decoder_impl.cc
@@ -148,14 +148,6 @@ namespace gr {
         volk_32f_s32f_multiply_32f(d_tmp_f32, f32in, 48.0f, nbits_in);
       }
       else {
-
-        // grow d_tmp_f32 if needed
-        if(nbits_in > d_max_bits_in){
-          d_max_bits_in = nbits_in;
-          volk_free(d_tmp_f32);
-          d_tmp_f32 = (float*)volk_malloc(d_max_bits_in*sizeof(float),
-                                          volk_get_alignment());
-        }
         memcpy(d_tmp_f32, f32in, nbits_in*sizeof(float));
       }
 
@@ -172,7 +164,7 @@ namespace gr {
         d_decoder->generic_work((void*)d_tmp_u8, (void*)u8out);
       }
       else {
-        for(size_t i=0; i<nblocks; i++){
+        for(size_t i = 0; i < nblocks; i++){
           d_decoder->generic_work((void*)&d_tmp_f32[i*d_decoder->get_input_size()],
                                   (void*)&u8out[i*d_decoder->get_output_size()]);
         }
-- 
cgit v1.2.3