edge: Select implementation by mode in rlc_data_to_dl_append

Currently the GPRS data block encoding is applied to every
coding scheme, even if an MCS is selected.

This commit renames the actual encoding function to
rlc_data_to_dl_append_gprs (not exported) and puts
selection code into Encoding::rlc_data_to_dl_append. This
requires an additional cs argument.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2016-01-13 10:51:25 +01:00
parent fec94d1c5c
commit 5058bd6e9e
4 changed files with 39 additions and 22 deletions

View File

@ -752,7 +752,7 @@ unsigned int Encoding::rlc_copy_from_aligned_buffer(
return rdbi->data_len;
}
Encoding::AppendResult Encoding::rlc_data_to_dl_append(
static Encoding::AppendResult rlc_data_to_dl_append_gprs(
struct gprs_rlc_data_block_info *rdbi,
gprs_llc *llc, int *offset, int *num_chunks,
uint8_t *data_block,
@ -784,7 +784,7 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append(
/* return data block as message */
*offset = rdbi->data_len;
(*num_chunks)++;
return AR_NEED_MORE_BLOCKS;
return Encoding::AR_NEED_MORE_BLOCKS;
}
/* if FINAL chunk would fit precisely in space left */
if (chunk == space && is_final)
@ -801,7 +801,7 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append(
*offset = rdbi->data_len;
(*num_chunks)++;
rdbi->cv = 0;
return AR_COMPLETED_BLOCK_FILLED;
return Encoding::AR_COMPLETED_BLOCK_FILLED;
}
/* if chunk would fit exactly in space left */
if (chunk == space) {
@ -828,7 +828,7 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append(
/* return data block as message */
*offset = rdbi->data_len;
(*num_chunks)++;
return AR_NEED_MORE_BLOCKS;
return Encoding::AR_NEED_MORE_BLOCKS;
}
LOGP(DRLCMACDL, LOGL_DEBUG, "-- Chunk with length %d is less "
@ -856,7 +856,7 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append(
/* if we have more data and we have space left */
if (space > 0 && !is_final) {
li->m = 1; /* we indicate more frames to follow */
return AR_COMPLETED_SPACE_LEFT;
return Encoding::AR_COMPLETED_SPACE_LEFT;
}
/* if we don't have more LLC frames */
if (is_final) {
@ -864,11 +864,27 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append(
"done.\n");
li->e = 1; /* we cannot extend */
rdbi->cv = 0;
return AR_COMPLETED_BLOCK_FILLED;
return Encoding::AR_COMPLETED_BLOCK_FILLED;
}
/* we have no space left */
LOGP(DRLCMACDL, LOGL_DEBUG, "-- No space left, so we are "
"done.\n");
li->e = 1; /* we cannot extend */
return AR_COMPLETED_BLOCK_FILLED;
return Encoding::AR_COMPLETED_BLOCK_FILLED;
}
Encoding::AppendResult Encoding::rlc_data_to_dl_append(
struct gprs_rlc_data_block_info *rdbi, GprsCodingScheme cs,
gprs_llc *llc, int *offset, int *num_chunks,
uint8_t *data_block,
bool is_final)
{
if (cs.isGprs())
return rlc_data_to_dl_append_gprs(rdbi,
llc, offset, num_chunks, data_block, is_final);
LOGP(DRLCMACDL, LOGL_ERROR, "%s data block encoding not implemented\n",
cs.name());
return AR_NEED_MORE_BLOCKS;
}

View File

@ -22,6 +22,7 @@
#include <stdint.h>
#include <gsm_rlcmac.h>
#include <gprs_coding_scheme.h>
struct gprs_rlcmac_bts;
struct gprs_rlcmac_tbf;
@ -86,7 +87,7 @@ public:
};
static AppendResult rlc_data_to_dl_append(
struct gprs_rlc_data_block_info *rdbi,
struct gprs_rlc_data_block_info *rdbi, GprsCodingScheme cs,
gprs_llc *llc, int *offset, int *num_chunks,
uint8_t *data,
bool is_final);

View File

@ -484,7 +484,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, const uint8_t
is_final = llc_queue()->size() == 0 && !keep_open(fn);
ar = Encoding::rlc_data_to_dl_append(rdbi,
ar = Encoding::rlc_data_to_dl_append(rdbi, cs,
&m_llc, &write_offset, &num_chunks, data, is_final);
if (ar == Encoding::AR_NEED_MORE_BLOCKS)

View File

@ -509,7 +509,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 11);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
@ -520,7 +520,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 26);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
@ -531,7 +531,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 99);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
@ -556,7 +556,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 20);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
@ -575,7 +575,7 @@ static void test_rlc_unit_encoder()
OSMO_ASSERT(llc.chunk_size() == 1);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
@ -586,7 +586,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 99);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
@ -609,7 +609,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 7);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
@ -620,7 +620,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 11);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
@ -644,7 +644,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 99);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
@ -667,7 +667,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 20);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, true);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED);
@ -690,7 +690,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 30);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);
@ -708,7 +708,7 @@ static void test_rlc_unit_encoder()
OSMO_ASSERT(llc.chunk_size() == 10);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT);
@ -719,7 +719,7 @@ static void test_rlc_unit_encoder()
llc.reset();
llc.put_frame(llc_data, 99);
ar = Encoding::rlc_data_to_dl_append(&rdbi,
ar = Encoding::rlc_data_to_dl_append(&rdbi, cs,
&llc, &write_offset, &num_chunks, data, false);
OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS);