From df69809b82c28d1d75d98b4fc8bfecd25b046768 Mon Sep 17 00:00:00 2001 From: Tom Tsou Date: Mon, 11 Jul 2016 17:05:19 -0700 Subject: [PATCH] egprs: Use RLC/MAC headers from libosmocore EGPRS Type 1, 2, and 3 headers are used by OsmoPCU and OsmoBTS. Move the header definitions to libosmocore to be shared by both packages. Modify the struct variable naming to use *_hi/*_lo instead of *_a/*_b in order to be consistent with existing naming used in libosmocore. Change-Id: I98687ad981d27502aec42729611937ba1caf207c --- src/decoding.cpp | 19 ++++---- src/encoding.cpp | 38 +++++++++------- src/rlc.h | 99 ----------------------------------------- tests/edge/EdgeTest.cpp | 73 +++++++++++++++--------------- 4 files changed, 68 insertions(+), 161 deletions(-) diff --git a/src/decoding.cpp b/src/decoding.cpp index 7865be00..7c00ff71 100644 --- a/src/decoding.cpp +++ b/src/decoding.cpp @@ -24,6 +24,7 @@ extern "C" { #include #include +#include } #include @@ -381,13 +382,13 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_3( egprs3 = static_cast < struct gprs_rlc_ul_header_egprs_3 * > ((void *)data); - cps = (egprs3->cps_a << 0) | (egprs3->cps_b << 2); + cps = (egprs3->cps_hi << 0) | (egprs3->cps_lo << 2); gprs_rlc_mcs_cps_decode(cps, cs, &punct, &punct2, &with_padding); gprs_rlc_data_info_init_ul(rlc, cs, with_padding); rlc->r = egprs3->r; rlc->si = egprs3->si; - rlc->tfi = (egprs3->tfi_a << 0) | (egprs3->tfi_b << 2); + rlc->tfi = (egprs3->tfi_hi << 0) | (egprs3->tfi_lo << 2); rlc->cps = cps; rlc->rsb = egprs3->rsb; @@ -396,7 +397,7 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_3( rlc->block_info[0].pi = egprs3->pi; rlc->block_info[0].spb = egprs3->spb; rlc->block_info[0].bsn = - (egprs3->bsn1_a << 0) | (egprs3->bsn1_b << 5); + (egprs3->bsn1_hi << 0) | (egprs3->bsn1_lo << 5); cur_bit += rlc->data_offs_bits[0] - 2; offs = rlc->data_offs_bits[0] / 8; @@ -423,13 +424,13 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_2( egprs2 = static_cast < struct gprs_rlc_ul_header_egprs_2 * > ((void *)data); - cps = (egprs2->cps_a << 0) | (egprs2->cps_b << 2); + cps = (egprs2->cps_hi << 0) | (egprs2->cps_lo << 2); gprs_rlc_mcs_cps_decode(cps, cs, &punct, &punct2, &with_padding); gprs_rlc_data_info_init_ul(rlc, cs, with_padding); rlc->r = egprs2->r; rlc->si = egprs2->si; - rlc->tfi = (egprs2->tfi_a << 0) | (egprs2->tfi_b << 2); + rlc->tfi = (egprs2->tfi_hi << 0) | (egprs2->tfi_lo << 2); rlc->cps = cps; rlc->rsb = egprs2->rsb; @@ -437,7 +438,7 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_2( rlc->block_info[0].cv = egprs2->cv; rlc->block_info[0].pi = egprs2->pi; rlc->block_info[0].bsn = - (egprs2->bsn1_a << 0) | (egprs2->bsn1_b << 5); + (egprs2->bsn1_hi << 0) | (egprs2->bsn1_lo << 5); cur_bit += rlc->data_offs_bits[0] - 2; @@ -471,14 +472,14 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_1( rlc->r = egprs1->r; rlc->si = egprs1->si; - rlc->tfi = (egprs1->tfi_a << 0) | (egprs1->tfi_b << 2); + rlc->tfi = (egprs1->tfi_hi << 0) | (egprs1->tfi_lo << 2); rlc->cps = egprs1->cps; rlc->rsb = egprs1->rsb; rlc->num_data_blocks = 2; rlc->block_info[0].cv = egprs1->cv; rlc->block_info[0].pi = egprs1->pi; rlc->block_info[0].bsn = - (egprs1->bsn1_a << 0) | (egprs1->bsn1_b << 5); + (egprs1->bsn1_hi << 0) | (egprs1->bsn1_lo << 5); cur_bit += rlc->data_offs_bits[0] - 2; offs = rlc->data_offs_bits[0] / 8; @@ -492,7 +493,7 @@ int Decoding::rlc_parse_ul_data_header_egprs_type_1( rlc->block_info[1].cv = egprs1->cv; rlc->block_info[1].pi = egprs1->pi; rlc->block_info[1].bsn = rlc->block_info[0].bsn + - ((egprs1->bsn2_a << 0) | (egprs1->bsn2_b << 2)); + ((egprs1->bsn2_hi << 0) | (egprs1->bsn2_lo << 2)); rlc->block_info[1].bsn = rlc->block_info[1].bsn & (RLC_EGPRS_SNS - 1); if ((rlc->block_info[1].bsn != rlc->block_info[0].bsn) && diff --git a/src/encoding.cpp b/src/encoding.cpp index e174c80c..9f3b31d4 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -25,6 +25,10 @@ #include #include +extern "C" { +#include +} + #include #include @@ -745,20 +749,20 @@ int Encoding::rlc_write_dl_data_header(const struct gprs_rlc_data_info *rlc, egprs1->usf = rlc->usf; egprs1->es_p = rlc->es_p; egprs1->rrbp = rlc->rrbp; - egprs1->tfi_a = rlc->tfi >> 0; /* 1 bit LSB */ - egprs1->tfi_b = rlc->tfi >> 1; /* 4 bits */ + egprs1->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */ + egprs1->tfi_lo = rlc->tfi >> 1; /* 4 bits */ egprs1->pr = rlc->pr; egprs1->cps = rlc->cps; - egprs1->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ - egprs1->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */ - egprs1->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */ + egprs1->bsn1_hi = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ + egprs1->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */ + egprs1->bsn1_lo = rlc->block_info[0].bsn >> 10; /* 1 bit */ bsn_delta = (rlc->block_info[1].bsn - rlc->block_info[0].bsn) & (RLC_EGPRS_SNS - 1); - egprs1->bsn2_a = bsn_delta >> 0; /* 7 bits LSB */ - egprs1->bsn2_b = bsn_delta >> 7; /* 3 bits */ + egprs1->bsn2_hi = bsn_delta >> 0; /* 7 bits LSB */ + egprs1->bsn2_lo = bsn_delta >> 7; /* 3 bits */ /* first FBI/E header */ e_fbi_header = rlc->block_info[0].e ? 0x01 : 0; @@ -784,14 +788,14 @@ int Encoding::rlc_write_dl_data_header(const struct gprs_rlc_data_info *rlc, egprs2->usf = rlc->usf; egprs2->es_p = rlc->es_p; egprs2->rrbp = rlc->rrbp; - egprs2->tfi_a = rlc->tfi >> 0; /* 1 bit LSB */ - egprs2->tfi_b = rlc->tfi >> 1; /* 4 bits */ + egprs2->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */ + egprs2->tfi_lo = rlc->tfi >> 1; /* 4 bits */ egprs2->pr = rlc->pr; egprs2->cps = rlc->cps; - egprs2->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ - egprs2->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */ - egprs2->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */ + egprs2->bsn1_hi = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ + egprs2->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */ + egprs2->bsn1_lo = rlc->block_info[0].bsn >> 10; /* 1 bit */ e_fbi_header = rlc->block_info[0].e ? 0x01 : 0; e_fbi_header |= rlc->block_info[0].cv == 0 ? 0x02 : 0; /* FBI */ @@ -808,14 +812,14 @@ int Encoding::rlc_write_dl_data_header(const struct gprs_rlc_data_info *rlc, egprs3->usf = rlc->usf; egprs3->es_p = rlc->es_p; egprs3->rrbp = rlc->rrbp; - egprs3->tfi_a = rlc->tfi >> 0; /* 1 bit LSB */ - egprs3->tfi_b = rlc->tfi >> 1; /* 4 bits */ + egprs3->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */ + egprs3->tfi_lo = rlc->tfi >> 1; /* 4 bits */ egprs3->pr = rlc->pr; egprs3->cps = rlc->cps; - egprs3->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ - egprs3->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */ - egprs3->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */ + egprs3->bsn1_hi = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */ + egprs3->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */ + egprs3->bsn1_lo = rlc->block_info[0].bsn >> 10; /* 1 bit */ egprs3->spb = rlc->block_info[0].spb; diff --git a/src/rlc.h b/src/rlc.h index 082db898..057e838b 100644 --- a/src/rlc.h +++ b/src/rlc.h @@ -324,105 +324,6 @@ struct rlc_li_field_egprs { uint8_t e:1, li:7; } __attribute__ ((packed)); - -/* TS 44.060 10.3a.4.1.1 */ -struct gprs_rlc_ul_header_egprs_1 { - uint8_t r:1, - si:1, - cv:4, - tfi_a:2; - uint8_t tfi_b:3, - bsn1_a:5; - uint8_t bsn1_b:6, - bsn2_a:2; - uint8_t bsn2_b; - uint8_t cps:5, - rsb:1, - pi:1, - spare_a:1; - uint8_t spare_b:6, - dummy:2; -} __attribute__ ((packed)); - -/* TS 44.060 10.3a.4.2.1 */ -struct gprs_rlc_ul_header_egprs_2 { - uint8_t r:1, - si:1, - cv:4, - tfi_a:2; - uint8_t tfi_b:3, - bsn1_a:5; - uint8_t bsn1_b:6, - cps_a:2; - uint8_t cps_b:1, - rsb:1, - pi:1, - spare_a:5; - uint8_t spare_b:5, - dummy:3; -} __attribute__ ((packed)); - -/* TS 44.060 10.3a.4.3.1 */ -struct gprs_rlc_ul_header_egprs_3 { - uint8_t r:1, - si:1, - cv:4, - tfi_a:2; - uint8_t tfi_b:3, - bsn1_a:5; - uint8_t bsn1_b:6, - cps_a:2; - uint8_t cps_b:2, - spb:2, - rsb:1, - pi:1, - spare:1, - dummy:1; -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_1 { - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_a:1; - uint8_t tfi_b:4, - pr:2, - bsn1_a:2; - uint8_t bsn1_b:8; - uint8_t bsn1_c:1, - bsn2_a:7; - uint8_t bsn2_b:3, - cps:5; -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_2 { - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_a:1; - uint8_t tfi_b:4, - pr:2, - bsn1_a:2; - uint8_t bsn1_b:8; - uint8_t bsn1_c:1, - cps:3, - dummy:4; -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_3 { - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_a:1; - uint8_t tfi_b:4, - pr:2, - bsn1_a:2; - uint8_t bsn1_b:8; - uint8_t bsn1_c:1, - cps:4, - spb:2, - dummy:1; -} __attribute__ ((packed)); #else # error "Only little endian headers are supported yet. TODO: add missing structs" #endif diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp index 8b5746aa..807102c9 100644 --- a/tests/edge/EdgeTest.cpp +++ b/tests/edge/EdgeTest.cpp @@ -35,6 +35,7 @@ extern "C" { #include #include #include +#include } #include @@ -1196,12 +1197,12 @@ static void uplink_header_type_2_parsing_test(BTS *the_bts, egprs2->r = 1; egprs2->si = 1; egprs2->cv = 7; - egprs2->tfi_a = tfi & 0x03; - egprs2->tfi_b = (tfi & 0x1c) >> 2; - egprs2->bsn1_a = 0; - egprs2->bsn1_b = 0; - egprs2->cps_a = 3; - egprs2->cps_b = 0; + egprs2->tfi_hi = tfi & 0x03; + egprs2->tfi_lo = (tfi & 0x1c) >> 2; + egprs2->bsn1_hi = 0; + egprs2->bsn1_lo = 0; + egprs2->cps_hi = 3; + egprs2->cps_lo = 0; egprs2->rsb = 0; egprs2->pi = 0; data[4] = 0x20; /* Setting E field */ @@ -1220,12 +1221,12 @@ static void uplink_header_type_2_parsing_test(BTS *the_bts, egprs2->r = 1; egprs2->si = 1; egprs2->cv = 7; - egprs2->tfi_a = tfi & 0x03; - egprs2->tfi_b = (tfi & 0x1c) >> 2; - egprs2->bsn1_a = 0; - egprs2->bsn1_b = 0; - egprs2->cps_a = 3; - egprs2->cps_b = 0; + egprs2->tfi_hi = tfi & 0x03; + egprs2->tfi_lo = (tfi & 0x1c) >> 2; + egprs2->bsn1_hi = 0; + egprs2->bsn1_lo = 0; + egprs2->cps_hi = 3; + egprs2->cps_lo = 0; egprs2->rsb = 0; egprs2->pi = 0; data[10] = 0x20; /* Setting E field */ @@ -1241,12 +1242,12 @@ static void uplink_header_type_2_parsing_test(BTS *the_bts, egprs2->r = 1; egprs2->si = 1; egprs2->cv = 7; - egprs2->tfi_a = tfi & 0x03; - egprs2->tfi_b = (tfi & 0x1c) >> 2; - egprs2->bsn1_a = 1; - egprs2->bsn1_b = 0; - egprs2->cps_a = 2; - egprs2->cps_b = 0; + egprs2->tfi_hi = tfi & 0x03; + egprs2->tfi_lo = (tfi & 0x1c) >> 2; + egprs2->bsn1_hi = 1; + egprs2->bsn1_lo = 0; + egprs2->cps_hi = 2; + egprs2->cps_lo = 0; egprs2->rsb = 0; egprs2->pi = 0; data[10] = 0x20; /* Setting E field */ @@ -1305,12 +1306,12 @@ static void uplink_header_type_1_parsing_test(BTS *the_bts, egprs1->si = 1; egprs1->r = 1; egprs1->cv = 7; - egprs1->tfi_a = tfi & 0x03; - egprs1->tfi_b = (tfi & 0x1c) >> 2; - egprs1->bsn1_a = 0; - egprs1->bsn1_b = 0; - egprs1->bsn2_a = 1; - egprs1->bsn2_b = 0; + egprs1->tfi_hi = tfi & 0x03; + egprs1->tfi_lo = (tfi & 0x1c) >> 2; + egprs1->bsn1_hi = 0; + egprs1->bsn1_lo = 0; + egprs1->bsn2_hi = 1; + egprs1->bsn2_lo = 0; egprs1->cps = 15; egprs1->rsb = 0; egprs1->pi = 0; @@ -1332,12 +1333,12 @@ static void uplink_header_type_1_parsing_test(BTS *the_bts, egprs1->si = 1; egprs1->r = 1; egprs1->cv = 7; - egprs1->tfi_a = tfi & 0x03; - egprs1->tfi_b = (tfi & 0x1c) >> 2; - egprs1->bsn1_a = 0; - egprs1->bsn1_b = 0; - egprs1->bsn2_a = 1; - egprs1->bsn2_b = 0; + egprs1->tfi_hi = tfi & 0x03; + egprs1->tfi_lo = (tfi & 0x1c) >> 2; + egprs1->bsn1_hi = 0; + egprs1->bsn1_lo = 0; + egprs1->bsn2_hi = 1; + egprs1->bsn2_lo = 0; egprs1->cps = 15; egprs1->rsb = 0; egprs1->pi = 0; @@ -1359,12 +1360,12 @@ static void uplink_header_type_1_parsing_test(BTS *the_bts, egprs1->si = 1; egprs1->r = 1; egprs1->cv = 7; - egprs1->tfi_a = tfi & 0x03; - egprs1->tfi_b = (tfi & 0x1c) >> 2; - egprs1->bsn1_a = 0; - egprs1->bsn1_b = 0; - egprs1->bsn2_a = 1; - egprs1->bsn2_b = 0; + egprs1->tfi_hi = tfi & 0x03; + egprs1->tfi_lo = (tfi & 0x1c) >> 2; + egprs1->bsn1_hi = 0; + egprs1->bsn1_lo = 0; + egprs1->bsn2_hi = 1; + egprs1->bsn2_lo = 0; egprs1->cps = 15; egprs1->rsb = 0; egprs1->pi = 0;