diff options
author | Martin Mathieson <martin.mathieson@keysight.com> | 2023-03-06 15:41:30 +0000 |
---|---|---|
committer | Martin Mathieson <martin.r.mathieson@googlemail.com> | 2023-03-06 16:44:51 +0000 |
commit | d91b2448c9e3eeeffb0e5caf406ff85e225146da (patch) | |
tree | 9312da96cf1cbe08d33fb0a8d00841ec884dcc5c /epan/dissectors | |
parent | 2ae0c1eadcf1288a63a7ca89ecf0b93f8c4d1b86 (diff) |
ORAN FH CUS: Also configure ext11 using ext12 settings
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-oran.c | 138 |
1 files changed, 106 insertions, 32 deletions
diff --git a/epan/dissectors/packet-oran.c b/epan/dissectors/packet-oran.c index e73b59bcc4..491711b99c 100644 --- a/epan/dissectors/packet-oran.c +++ b/epan/dissectors/packet-oran.c @@ -566,21 +566,28 @@ static const value_string sidelobe_suppression_vals[] = { /* Config (and worked-out allocations) bundles for ext11 (dynamic BFW) */ typedef struct { - /* Ext 6 settings */ + /* Ext 6 config */ gboolean ext6_set; guint8 ext6_num_bits_set; guint8 ext6_bits_set[28]; guint8 ext6_rbg_size; - /* Ext 13 settings */ + /* Ext 12 config */ + gboolean ext12_set; + guint ext12_num_pairs; +#define MAX_BFW_EXT12_PAIRS 128 + struct { + guint8 off_start_prb; + guint8 num_prb; + } ext12_pairs[MAX_BFW_EXT12_PAIRS]; + + /* Ext 13 config */ gboolean ext13_set; guint ext13_num_start_prbs; -#define MAX_BFW_EXT3_ALLOCATIONS 128 - guint ext13_start_prbs[MAX_BFW_EXT3_ALLOCATIONS]; +#define MAX_BFW_EXT13_ALLOCATIONS 128 + guint ext13_start_prbs[MAX_BFW_EXT13_ALLOCATIONS]; /* TODO: store nextSymbolId here too? */ - /* TODO: Can also depend upon ext12 */ - /* Results (after calling ext11_work_out_bundles()) */ guint32 num_bundles; #define MAX_BFW_BUNDLES 512 @@ -591,8 +598,8 @@ typedef struct { } bundles[MAX_BFW_BUNDLES]; } ext11_settings_t; -/* Work out bundle allocation for ext 11. Take into account ext6 or ext13 in this section before ext 11. - * TODO: Can also depend upon ext12 info */ + +/* Work out bundle allocation for ext 11. Take into account ext6, ext12 or ext13 in this section before ext 11. */ static void ext11_work_out_bundles(guint startPrbc, guint numPrbc, guint numBundPrb, /* number of PRBs pre (full) bundle */ @@ -610,13 +617,13 @@ static void ext11_work_out_bundles(guint startPrbc, /* For each bundle within identified rbgSize block */ for (guint m=0; m < bundles_per_entry; m++) { settings->bundles[bundles_set].start = prb_start+(m*numBundPrb); - /* Start already past end, so doesn't count. */ + /* Start already beyond end, so doesn't count. */ if (settings->bundles[bundles_set].start > (startPrbc+numPrbc)) { break; } settings->bundles[bundles_set].end = prb_start+((m+1)*numBundPrb)-1; if (settings->bundles[bundles_set].end > numPrbc) { - /* End past end, so counts but is an orphan bundle */ + /* Extends beyond end, so counts but is an orphan bundle */ settings->bundles[bundles_set].end = numPrbc; settings->bundles[bundles_set].is_orphan = TRUE; } @@ -629,6 +636,55 @@ static void ext11_work_out_bundles(guint startPrbc, settings->num_bundles = bundles_set; } + /* Allocation configured by ext 6 */ + else if (settings->ext12_set) { + /* First, allocate normally from startPrbc, numPrbc */ + settings->num_bundles = (numPrbc+numBundPrb-1) / numBundPrb; + + /* Don't overflow settings->bundles[] ! */ + settings->num_bundles = MIN(MAX_BFW_BUNDLES, settings->num_bundles); + + for (guint32 n=0; n < settings->num_bundles; n++) { + settings->bundles[n].start = startPrbc + n*numBundPrb; + settings->bundles[n].end = settings->bundles[n].start + numBundPrb-1; + /* Does it go beyond the end? */ + if (settings->bundles[n].end > startPrbc+numPrbc) { + settings->bundles[n].end = numPrbc+numPrbc; + settings->bundles[n].is_orphan = TRUE; + } + } + if (settings->num_bundles == MAX_BFW_BUNDLES) { + return; + } + + guint prb_offset = startPrbc + numPrbc; + + /* Loop over pairs, adding bundles for each */ + for (guint p=0; p < settings->ext12_num_pairs; p++) { + prb_offset += settings->ext12_pairs[p].off_start_prb; + guint pair_bundles = (settings->ext12_pairs[p].num_prb+numBundPrb-1) / numBundPrb; + + for (guint32 n=0; n < pair_bundles; n++) { + guint idx = settings->num_bundles; + + settings->bundles[idx].start = prb_offset + n*numBundPrb; + settings->bundles[idx].end = settings->bundles[idx].start + numBundPrb-1; + /* Does it go beyond the end? */ + if (settings->bundles[idx].end > prb_offset + settings->ext12_pairs[p].num_prb) { + settings->bundles[idx].end = prb_offset + settings->ext12_pairs[p].num_prb; + settings->bundles[idx].is_orphan = TRUE; + } + /* Range check / return */ + settings->num_bundles++; + if (settings->num_bundles == MAX_BFW_BUNDLES) { + return; + } + } + + prb_offset += settings->ext12_pairs[p].num_prb; + } + } + /* Allocation configured by ext 13 */ else if (settings->ext13_set) { guint alloc_size = (numPrbc+numBundPrb-1) / numBundPrb; @@ -1774,12 +1830,12 @@ static int dissect_oran_c_section(tvbuff_t *tvb, proto_tree *tree, packet_info * proto_tree_add_item(extension_tree, hf_oran_symbolMask, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - /* There are now 'R' pairs of (offStartPrb, numPrb) values. Not sure where R comes from, - but for now assume that entire space in extLen should be filled with pairs. - N.B. this suggests that 'R' would always be an even number.. */ + /* There are now 'R' pairs of (offStartPrb, numPrb) values. Fill extlen bytes with values. If last one is not set, + should be populated with 0s. */ guint32 extlen_remaining_bytes = (extlen*4) - 4; guint8 prb_index; + ext11_settings.ext12_set = TRUE; for (prb_index = 1; extlen_remaining_bytes > 0; prb_index++) { /* Create a subtree for each pair */ @@ -1797,11 +1853,21 @@ static int dissect_oran_c_section(tvbuff_t *tvb, proto_tree *tree, packet_info * proto_tree_add_item_ret_uint(pair_tree, hf_oran_num_prb, tvb, offset, 1, ENC_BIG_ENDIAN, &num_prb); offset++; - /* Add summary to pair root item */ - proto_item_append_text(pair_ti, "(%u) offStartPrb=%3u, numPrb=%u", - prb_index, off_start_prb, num_prb); - extlen_remaining_bytes -= 2; + + /* Last pair may be 0,0 if not used. Check for this */ + if ((extlen_remaining_bytes == 0) && (off_start_prb == 0) && (num_prb == 0)) { + proto_item_append_text(pair_ti, " (not used)"); + } + /* Add summary to pair root item, and configure details in ext11_settings */ + else { + proto_item_append_text(pair_ti, "(%u) offStartPrb=%3u, numPrb=%u", + prb_index, off_start_prb, num_prb); + if (ext11_settings.ext12_num_pairs < MAX_BFW_EXT12_PAIRS) { + ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs].off_start_prb = off_start_prb; + ext11_settings.ext12_pairs[ext11_settings.ext12_num_pairs++].num_prb = num_prb; + } + } } break; } @@ -1845,7 +1911,7 @@ static int dissect_oran_c_section(tvbuff_t *tvb, proto_tree *tree, packet_info * } else { /* Add entry for configuring ext11. don't store out of range */ - if (ext11_settings.ext13_num_start_prbs < MAX_BFW_EXT3_ALLOCATIONS) { + if (ext11_settings.ext13_num_start_prbs < MAX_BFW_EXT13_ALLOCATIONS) { ext11_settings.ext13_start_prbs[ext11_settings.ext13_num_start_prbs++] = next_start_prbc; } } @@ -2370,24 +2436,32 @@ dissect_oran_u(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _ proto_item *timingHeader; proto_tree *timing_header_tree = proto_tree_add_subtree(oran_tree, tvb, offset, 4, ett_oran_u_timing, &timingHeader, "Timing header"); + /* dataDirection */ guint32 direction; proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_data_direction, tvb, offset, 1, ENC_NA, &direction); + /* payloadVersion */ proto_tree_add_item(timing_header_tree, hf_oran_payload_version, tvb, offset, 1, ENC_NA); + /* filterIndex */ proto_tree_add_item(timing_header_tree, hf_oran_filter_index, tvb, offset, 1, ENC_NA); offset += 1; gint ref_a_offset = offset; + + /* frameId */ guint32 frameId = 0; proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_frame_id, tvb, offset, 1, ENC_NA, &frameId); offset += 1; + /* subframeId */ guint32 subframeId = 0; proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_subframe_id, tvb, offset, 1, ENC_NA, &subframeId); + /* slotId */ guint32 slotId = 0; proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_slot_id, tvb, offset, 2, ENC_BIG_ENDIAN, &slotId); - guint32 startSymbolId = 0; offset++; - proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_start_symbol_id, tvb, offset, 1, ENC_NA, &startSymbolId); + /* symbolId */ + guint32 symbolId = 0; + proto_tree_add_item_ret_uint(timing_header_tree, hf_oran_symbolId, tvb, offset, 1, ENC_NA, &symbolId); offset++; char id[16]; @@ -2395,8 +2469,8 @@ dissect_oran_u(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _ proto_item *pi = proto_tree_add_string(timing_header_tree, hf_oran_refa, tvb, ref_a_offset, 3, id); proto_item_set_generated(pi); - proto_item_append_text(timingHeader, " %s, Frame: %d, Subframe: %d, Slot: %d, StartSymbol: %d", - val_to_str(direction, data_direction_vals, "Unknown"), frameId, subframeId, slotId, startSymbolId); + proto_item_append_text(timingHeader, " %s, Frame: %d, Subframe: %d, Slot: %d, Symbol: %d", + val_to_str(direction, data_direction_vals, "Unknown"), frameId, subframeId, slotId, symbolId); guint sample_bit_width; gint compression; @@ -2988,7 +3062,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.10 */ + /* Section 7.5.3.10 */ {&hf_oran_ueId, {"UE ID", "oran_fh_cus.ueId", FT_UINT16, BASE_HEX_DEC, @@ -3001,7 +3075,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.11 */ + /* Section 7.5.3.11 */ {&hf_oran_freqOffset, {"Frequency Offset", "oran_fh_cus.freqOffset", FT_UINT24, BASE_DEC, @@ -3017,7 +3091,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.12 */ + /* Section 7.5.3.12 */ {&hf_oran_regularizationFactor, {"Regularization Factor", "oran_fh_cus.regularizationFactor", FT_INT16, BASE_DEC, @@ -3028,7 +3102,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.14 */ + /* Section 7.5.3.14 */ {&hf_oran_laaMsgType, {"LAA Message Type", "oran_fh_cus.laaMsgType", FT_UINT8, BASE_DEC | BASE_RANGE_STRING, @@ -3037,7 +3111,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.15 */ + /* Section 7.5.3.15 */ {&hf_oran_laaMsgLen, {"LAA Message Length", "oran_fh_cus.laaMsgLen", FT_UINT8, BASE_DEC, @@ -3048,7 +3122,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.16 */ + /* Section 7.5.3.16 */ {&hf_oran_lbtHandle, {"LBT Handle", "oran_fh_cus.lbtHandle", FT_UINT16, BASE_HEX, @@ -3060,7 +3134,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.17 */ + /* Section 7.5.3.17 */ {&hf_oran_lbtDeferFactor, {"Defer Factor", "oran_fh_cus.lbtDeferFactor", FT_UINT8, BASE_DEC, @@ -3072,7 +3146,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.18 */ + /* Section 7.5.3.18 */ {&hf_oran_lbtBackoffCounter, {"Backoff Counter", "oran_fh_cus.lbtBackoffCounter", FT_UINT16, BASE_DEC, @@ -3085,7 +3159,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.19 */ + /* Section 7.5.3.19 */ {&hf_oran_lbtOffset, {"LBT Offset", "oran_fh_cus.lbtOffset", FT_UINT16, BASE_DEC, @@ -3095,7 +3169,7 @@ proto_register_oran(void) HFILL} }, - /* Section 5.4.5.20 */ + /* Section 7.5.3.20 */ {&hf_oran_MCOT, {"Maximum Channel Occupancy Time", "oran_fh_cus.MCOT", FT_UINT8, BASE_DEC, |