This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Holger Freyther gerrit-no-reply at lists.osmocom.orgHolger Freyther has submitted this change and it was merged. Change subject: encoding/rlc_copy_from_aligned_buffer: export written payload bytes via an argument ...................................................................... encoding/rlc_copy_from_aligned_buffer: export written payload bytes via an argument Require to count statistics for rlc_dl_payload_bytes. Change-Id: I0e622acb1f13f7489946baf049de4ba1cde6a1fc Reviewed-on: https://gerrit.osmocom.org/142 Tested-by: Jenkins Builder Reviewed-by: Holger Freyther <holger at freyther.de> --- M src/encoding.cpp M src/encoding.h M src/tbf_dl.cpp M tests/edge/EdgeTest.cpp 4 files changed, 109 insertions(+), 36 deletions(-) Approvals: Jenkins Builder: Verified Holger Freyther: Looks good to me, approved diff --git a/src/encoding.cpp b/src/encoding.cpp index 9dba4f6..2102a1e 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -899,13 +899,13 @@ * \param num_chunks count the chunks (llc pdu data) within rlc/mac * \param data_block buffer holds rlc/mac data * \param is_final if this is the last rlc/mac within a TBF + * \param count_payload if not NULL save the written size of payload in bytes into it * \return the state of the rlc/mac like if there is more space for another chunk */ 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, - bool is_final) + uint8_t *data_block, bool is_final, int *count_payload) { int chunk; int space; @@ -930,6 +930,8 @@ *e_pointer |= 0x01; /* fill only space */ llc->consume(data, space); + if (count_payload) + *count_payload = space; /* return data block as message */ *offset = rdbi->data_len; (*num_chunks)++; @@ -947,6 +949,8 @@ *e_pointer |= 0x01; /* fill space */ llc->consume(data, space); + if (count_payload) + *count_payload = space; *offset = rdbi->data_len; (*num_chunks)++; rdbi->cv = 0; @@ -974,6 +978,8 @@ // no need to set e_pointer nor increase delimiter /* fill only space, which is 1 octet less than chunk */ llc->consume(data, space); + if (count_payload) + *count_payload = space; /* return data block as message */ *offset = rdbi->data_len; (*num_chunks)++; @@ -999,6 +1005,8 @@ (*num_chunks)++; /* copy (rest of) LLC frame to space and reset later */ llc->consume(data, chunk); + if (count_payload) + *count_payload = chunk; data += chunk; space -= chunk; (*offset) += chunk; @@ -1030,13 +1038,14 @@ * \param num_chunks count the chunks (llc pdu data) within rlc/mac * \param data_block buffer holds rlc/mac data * \param is_final if this is the last rlc/mac within a TBF + * \param count_payload if not NULL save the written size of payload in bytes into it * \return the state of the rlc/mac like if there is more space for another chunk */ static Encoding::AppendResult rlc_data_to_dl_append_egprs( struct gprs_rlc_data_block_info *rdbi, gprs_llc *llc, int *offset, int *num_chunks, uint8_t *data_block, - bool is_final) + bool is_final, int *count_payload) { int chunk; int space; @@ -1060,6 +1069,8 @@ chunk, space); /* fill only space */ llc->consume(data, space); + if (count_payload) + *count_payload = space; /* return data block as message */ *offset = rdbi->data_len; (*num_chunks)++; @@ -1074,6 +1085,8 @@ "header, and we are done\n", chunk, space); /* fill space */ llc->consume(data, space); + if (count_payload) + *count_payload = space; *offset = rdbi->data_len; (*num_chunks)++; rdbi->cv = 0; @@ -1088,6 +1101,8 @@ chunk, space); /* fill space */ llc->consume(data, space); + if (count_payload) + *count_payload = space; *offset = rdbi->data_len; (*num_chunks)++; return Encoding::AR_NEED_MORE_BLOCKS; @@ -1118,6 +1133,8 @@ (*num_chunks)++; /* copy (rest of) LLC frame to space and reset later */ llc->consume(data, chunk); + if (count_payload) + *count_payload = chunk; data += chunk; space -= chunk; (*offset) += chunk; @@ -1183,21 +1200,23 @@ * \param num_chunks count the chunks (llc pdu data) within rlc/mac * \param data_block buffer holds rlc/mac data * \param is_final if this is the last rlc/mac within a TBF + * \param count_payload if not NULL save the written size of payload in bytes into it * \return the state of the rlc/mac like if there is more space for another chunk */ 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) + uint8_t *data_block, bool is_final, int *count_payload) { if (cs.isGprs()) return rlc_data_to_dl_append_gprs(rdbi, - llc, offset, num_chunks, data_block, is_final); + llc, offset, num_chunks, data_block, is_final, + count_payload); if (cs.isEgprs()) return rlc_data_to_dl_append_egprs(rdbi, - llc, offset, num_chunks, data_block, is_final); + llc, offset, num_chunks, data_block, is_final, + count_payload); LOGP(DRLCMACDL, LOGL_ERROR, "%s data block encoding not implemented\n", cs.name()); diff --git a/src/encoding.h b/src/encoding.h index 94e9a02..710de78 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -91,6 +91,5 @@ static AppendResult 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, - bool is_final); + uint8_t *data, bool is_final, int *count_payload); }; diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index 0cd6b76..66f747b 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -540,7 +540,7 @@ is_final = llc_queue()->size() == 0 && !keep_open(fn); ar = Encoding::rlc_data_to_dl_append(rdbi, cs, - &m_llc, &write_offset, &num_chunks, data, is_final); + &m_llc, &write_offset, &num_chunks, data, is_final, NULL); if (ar == Encoding::AR_NEED_MORE_BLOCKS) break; diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp index 96ea0c1..68a0d0b 100644 --- a/tests/edge/EdgeTest.cpp +++ b/tests/edge/EdgeTest.cpp @@ -506,6 +506,7 @@ uint8_t llc_data[1500] = {0,}; int num_chunks = 0; int write_offset; + int count_payload; struct gprs_llc llc; Encoding::AppendResult ar; @@ -522,36 +523,42 @@ llc.reset(); llc.put_frame(llc_data, 11); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 11); + OSMO_ASSERT(count_payload == 11); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 26); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 2 + 11 + 26); + OSMO_ASSERT(count_payload == 26); OSMO_ASSERT(num_chunks == 2); llc.reset(); llc.put_frame(llc_data, 99); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv != 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == 11); OSMO_ASSERT(num_chunks == 3); OSMO_ASSERT(data[0] == ((11 << 2) | (1 << 1) | (0 << 0))); @@ -569,13 +576,15 @@ llc.reset(); llc.put_frame(llc_data, 20); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 19); + OSMO_ASSERT(count_payload == 19); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(data[0] == ((0 << 2) | (0 << 1) | (1 << 0))); @@ -589,23 +598,28 @@ OSMO_ASSERT(llc.chunk_size() == 1); + count_payload = -1; + ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 1); + OSMO_ASSERT(count_payload == 1); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 99); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 1 + 18); + OSMO_ASSERT(count_payload == 18); OSMO_ASSERT(num_chunks == 2); OSMO_ASSERT(data[0] == ((1 << 2) | (1 << 1) | (1 << 0))); @@ -622,24 +636,28 @@ llc.reset(); llc.put_frame(llc_data, 7); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 7); + OSMO_ASSERT(count_payload == 7); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 11); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 2 + 7 + 11); + OSMO_ASSERT(count_payload == 11); OSMO_ASSERT(num_chunks == 2); OSMO_ASSERT(data[0] == ((7 << 2) | (1 << 1) | (0 << 0))); @@ -657,13 +675,15 @@ llc.reset(); llc.put_frame(llc_data, 99); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 1); OSMO_ASSERT(write_offset == 20); + OSMO_ASSERT(count_payload == 20); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(rdbi.cv != 0); @@ -680,13 +700,15 @@ llc.reset(); llc.put_frame(llc_data, 20); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, true); + &llc, &write_offset, &num_chunks, data, true, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 1); OSMO_ASSERT(write_offset == 20); + OSMO_ASSERT(count_payload == 20); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(rdbi.cv == 0); @@ -703,13 +725,15 @@ llc.reset(); llc.put_frame(llc_data, 30); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 1); OSMO_ASSERT(write_offset == 20); + OSMO_ASSERT(count_payload == 20); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(data[0] == 0); @@ -721,24 +745,28 @@ memset(data, 0, sizeof(data)); OSMO_ASSERT(llc.chunk_size() == 10); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 10); + OSMO_ASSERT(count_payload == 10); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 99); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 10 + 9); + OSMO_ASSERT(count_payload == 9); OSMO_ASSERT(num_chunks == 2); OSMO_ASSERT(data[0] == ((10 << 2) | (1 << 1) | (1 << 0))); @@ -755,36 +783,42 @@ llc.reset(); llc.put_frame(llc_data, 11); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 11); + OSMO_ASSERT(count_payload == 11); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 26); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 2 + 11 + 26); + OSMO_ASSERT(count_payload == 26); OSMO_ASSERT(num_chunks == 2); llc.reset(); llc.put_frame(llc_data, 99); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv != 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == 5); OSMO_ASSERT(num_chunks == 3); OSMO_ASSERT(data[0] == ((11 << 1) | (0 << 0))); @@ -807,25 +841,30 @@ llc.reset(); llc.put_frame(llc_data, 15); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 15); + OSMO_ASSERT(count_payload == 15); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 12); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); + /* no LI here, becaues there are exact 12 bytes left. Put LI into next frame */ OSMO_ASSERT(ar == Encoding::AR_NEED_MORE_BLOCKS); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv != 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == 12); OSMO_ASSERT(num_chunks == 2); OSMO_ASSERT(data[0] == ((15 << 1) | (1 << 0))); @@ -838,37 +877,43 @@ memset(data, 0, sizeof(data)); OSMO_ASSERT(llc.chunk_size() == 0); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 0); + OSMO_ASSERT(count_payload == 0); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 7); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv != 0); OSMO_ASSERT(write_offset == 2 + 0 + 7); + OSMO_ASSERT(count_payload == 7); OSMO_ASSERT(num_chunks == 2); llc.reset(); llc.put_frame(llc_data, 18); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv != 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == 18); OSMO_ASSERT(num_chunks == 3); OSMO_ASSERT(data[0] == ((0 << 1) | (0 << 0))); @@ -884,25 +929,29 @@ llc.reset(); llc.put_frame(llc_data, 6); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, false); + &llc, &write_offset, &num_chunks, data, false, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_SPACE_LEFT); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(write_offset == 1 + 6); + OSMO_ASSERT(count_payload == 6); OSMO_ASSERT(num_chunks == 1); llc.reset(); llc.put_frame(llc_data, 12); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, true); + &llc, &write_offset, &num_chunks, data, true, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv == 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == 12); OSMO_ASSERT(num_chunks == 3); OSMO_ASSERT(data[0] == ((6 << 1) | (0 << 0))); @@ -924,14 +973,16 @@ llc.reset(); llc.put_frame(llc_data, rdbi.data_len); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, true); + &llc, &write_offset, &num_chunks, data, true, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 1); OSMO_ASSERT(rdbi.cv == 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == rdbi.data_len); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(data[0] == 0); @@ -948,14 +999,16 @@ llc.reset(); llc.put_frame(llc_data, rdbi.data_len - 1); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, true); + &llc, &write_offset, &num_chunks, data, true, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv == 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == rdbi.data_len - 1); OSMO_ASSERT(num_chunks == 1); OSMO_ASSERT(data[0] == (((rdbi.data_len-1) << 1) | (1 << 0))); @@ -973,14 +1026,16 @@ llc.reset(); llc.put_frame(llc_data, rdbi.data_len - 2); + count_payload = -1; ar = Encoding::rlc_data_to_dl_append(&rdbi, cs, - &llc, &write_offset, &num_chunks, data, true); + &llc, &write_offset, &num_chunks, data, true, &count_payload); OSMO_ASSERT(ar == Encoding::AR_COMPLETED_BLOCK_FILLED); OSMO_ASSERT(rdbi.e == 0); OSMO_ASSERT(rdbi.cv == 0); OSMO_ASSERT(write_offset == (int)rdbi.data_len); + OSMO_ASSERT(count_payload == rdbi.data_len - 2); OSMO_ASSERT(num_chunks == 2); OSMO_ASSERT(data[0] == (((rdbi.data_len-2) << 1) | (0 << 0))); -- To view, visit https://gerrit.osmocom.org/142 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: I0e622acb1f13f7489946baf049de4ba1cde6a1fc Gerrit-PatchSet: 4 Gerrit-Project: osmo-pcu Gerrit-Branch: master Gerrit-Owner: lynxis lazus <lynxis at fe80.eu> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Holger Freyther <holger at freyther.de> Gerrit-Reviewer: Jenkins Builder