diff --git a/common/public_inc/debug.h b/common/public_inc/debug.h index 05e9870..14f97a1 100644 --- a/common/public_inc/debug.h +++ b/common/public_inc/debug.h @@ -39,7 +39,8 @@ extern nfapi_trace_fn_t nfapi_trace_g; extern nfapi_trace_level_t nfapi_trace_level_g; /*! NFAPI trace macro */ -#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } +//#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } +#define NFAPI_TRACE(level, format, ...) { if (nfapi_trace_g) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } /*! Function to change the trace level * \param new_level The modified trace level diff --git a/nfapi/public_inc/nfapi_interface.h b/nfapi/public_inc/nfapi_interface.h index 2d58c2a..f665d11 100644 --- a/nfapi/public_inc/nfapi_interface.h +++ b/nfapi/public_inc/nfapi_interface.h @@ -1772,7 +1772,7 @@ typedef struct { uint8_t number_of_cc; struct { uint8_t ri_size; - uint8_t dl_cqi_pmi_size; + uint8_t dl_cqi_pmi_size[8]; } cc[NFAPI_MAX_CC]; } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t; diff --git a/nfapi/src/nfapi.c b/nfapi/src/nfapi.c index 0e06963..3f017bc 100644 --- a/nfapi/src/nfapi.c +++ b/nfapi/src/nfapi.c @@ -823,6 +823,10 @@ uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *e { NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); } + else + { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); + } } return 1; diff --git a/nfapi/src/nfapi_p7.c b/nfapi/src/nfapi_p7.c index a3b0141..69ff860 100644 --- a/nfapi/src/nfapi_p7.c +++ b/nfapi/src/nfapi_p7.c @@ -111,6 +111,8 @@ static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWrite { nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format); + return ( push8(value->dci_format, ppWritePackedMsg, end) && push8(value->cce_idx, ppWritePackedMsg, end) && push8(value->aggregation_level, ppWritePackedMsg, end) && @@ -234,6 +236,8 @@ static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePac { nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv; + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__); + return( push16(value->length, ppWritePackedMsg, end) && push16(value->pdu_index, ppWritePackedMsg, end) && push16(value->transmission_power, ppWritePackedMsg, end)); @@ -545,6 +549,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac { nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv; + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich); + if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) && push8(value->number_dci, ppWritePackedMsg, end) && push16(value->number_pdu, ppWritePackedMsg, end) && @@ -574,6 +580,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac { case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__); + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) && pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) && pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) && @@ -587,6 +595,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac break; case NFAPI_DL_CONFIG_BCH_PDU_TYPE: { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__); + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value))) return 0; } @@ -684,10 +694,21 @@ static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uin { nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg; - return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && - pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && - pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && + //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + { + uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); + uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value); + uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); + if (!x || !y || !z) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z); + } + + return x && y && z; + } } static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end) @@ -796,9 +817,10 @@ static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppW if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0) return 0; - if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) + uint8_t j; + for(j = 0; j < 8; ++j) { - if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, ppWritePackedMsg, end) == 0) + if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0) return 0; } } @@ -1518,7 +1540,21 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, for(j = 0; j < pdu->num_segments; ++j) { // Use -1 as it is unbounded - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) + // DJP - does not handle -1 + // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) + int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end); + + if (0 && pdu->segments[j].segment_length == 3) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, + pdu->segments[j].segment_data[0], + pdu->segments[j].segment_data[1], + pdu->segments[j].segment_data[2] + ); + } + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret); + + if (push_ret == 0) { return 0; } @@ -1532,9 +1568,13 @@ static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e { nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg; - return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && - pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value) && - pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); + int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value); + int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z); + + return x && y && z; } static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) @@ -1844,6 +1884,8 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP { nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv; + //printf("RX ULSCH BODY\n"); + if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) return 0; @@ -1851,21 +1893,26 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP uint16_t i = 0; uint16_t offset = 2; // taking into account the number_of_pdus uint16_t total_number_of_pdus = value->number_of_pdus; + //printf("ULSCH:pdus:%d\n", total_number_of_pdus); + for(i = 0; i < total_number_of_pdus; ++i) { nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) { + //printf("NFAPI_RX_UE_INFORMATION_TAG\n"); offset += 4 + 6; } if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) { + //printf("NFAPI_RX_INDICATION_REL8_TAG\n"); offset += 4 + 7; } if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) { + //printf("NFAPI_RX_INDICATION_REL9_TAG\n"); offset += 4 + 2; } } @@ -2592,11 +2639,16 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu return -1; } + if (pMessageHeader->message_id != NFAPI_TIMING_INFO) + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp); + } // look for the specific message uint8_t result = 0; switch (pMessageHeader->message_id) { case NFAPI_DL_CONFIG_REQUEST: + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__); result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config); break; @@ -2609,6 +2661,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu break; case NFAPI_TX_REQUEST: + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__); result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config); break; @@ -2621,6 +2674,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu break; case NFAPI_RX_ULSCH_INDICATION: + //printf("RX ULSCH\n"); result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config); break; @@ -3482,9 +3536,10 @@ static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppRe if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0) return 0; - if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) + uint8_t j; + for(j = 0; j < 8; ++j) { - if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, end) == 0) + if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0) return 0; } } @@ -4394,6 +4449,14 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void * { if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end)) return 0; + if (0 && pdu->segments[0].segment_length == 3) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, + pdu->segments[0].segment_data[0], + pdu->segments[0].segment_data[1], + pdu->segments[0].segment_data[2] + ); + } } else { diff --git a/pnf/public_inc/nfapi_pnf_interface.h b/pnf/public_inc/nfapi_pnf_interface.h index f93624d..b25caf2 100644 --- a/pnf/public_inc/nfapi_pnf_interface.h +++ b/pnf/public_inc/nfapi_pnf_interface.h @@ -319,10 +319,10 @@ typedef struct nfapi_pnf_config * 0 will be returned if it fails. * * \code - * nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void); * \endcode */ -nfapi_pnf_config_t* nfapi_pnf_config_create(); +nfapi_pnf_config_t* nfapi_pnf_config_create(void); /*! Delete a pnf configuration * \param config A pointer to a pnf configuraiton @@ -681,7 +681,7 @@ typedef struct nfapi_pnf_p7_config /*! Create and initialise a nfapi_pnf_p7_config structure * \return A pointer to a PNF P7 config structure */ -nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(); +nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(void); /*! Delete an nfapi_pnf_p7_config structure * \param config diff --git a/pnf/src/pnf.c b/pnf/src/pnf.c index d6cf364..d0a7fa6 100644 --- a/pnf/src/pnf.c +++ b/pnf/src/pnf.c @@ -412,10 +412,10 @@ void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) { nfapi_start_request_t req; - NFAPI_TRACE(NFAPI_TRACE_INFO, "START.request received\n"); - nfapi_pnf_config_t* config = &(pnf->_public); + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state); + // unpack the message if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) { diff --git a/pnf/src/pnf_interface.c b/pnf/src/pnf_interface.c index 74f29a0..7310fc0 100644 --- a/pnf/src/pnf_interface.c +++ b/pnf/src/pnf_interface.c @@ -76,6 +76,7 @@ int nfapi_pnf_start(nfapi_pnf_config_t* config) sleep(1); } + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__); return 0; } @@ -227,7 +228,7 @@ int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* res } else { - NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id); + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id); return -1; } diff --git a/pnf/src/pnf_p7.c b/pnf/src/pnf_p7.c index 0fd7828..02b828d 100644 --- a/pnf/src/pnf_p7.c +++ b/pnf/src/pnf_p7.c @@ -25,12 +25,64 @@ #include <unistd.h> #include <errno.h> #include <pthread.h> +#include <stdio.h> #include "pnf_p7.h" #define FAPI2_IP_DSCP 0 -uint32_t get_current_time_hr() +extern uint16_t sf_ahead; +//uint16_t sf_ahead=4; + +void add_sf(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + *frameP = *frameP + ((*subframeP + offset) / 10); + + *subframeP = ((*subframeP + offset) % 10); +} + +void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + if (*subframeP < offset) + { + *frameP = (*frameP+1024-1)%1024; + } + *subframeP = (*subframeP+10-offset)%10; +} + +uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset) +{ + uint16_t new_sfnsf; + uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); + uint16_t sf = NFAPI_SFNSF2SF(sfnsf); + + //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); + add_sf(&sfn, &sf, offset); + + new_sfnsf = sfn<<4|sf; + + //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); + + return new_sfnsf; +} + +uint16_t sfnsf_subtract_sf(uint16_t sfnsf, int offset) +{ + uint16_t new_sfnsf; + uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); + uint16_t sf = NFAPI_SFNSF2SF(sfnsf); + + //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); + subtract_sf(&sfn, &sf, offset); + + new_sfnsf = sfn<<4|sf; + + //printf("%s() offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); + + return new_sfnsf; +} + +uint32_t pnf_get_current_time_hr(void) { struct timeval now; (void)gettimeofday(&now, NULL); @@ -64,11 +116,14 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr) // todo : for now these just malloc/free need to move to a memory cache nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) { - return pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); + void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); + //printf("%s() ptr:%p\n", __FUNCTION__, ptr); + return ptr; } void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) { + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list); if(pnf_p7->_public.codec_config.deallocate) { (pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list); @@ -77,17 +132,21 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t { free(req->dl_config_request_body.dl_config_pdu_list); } + req->dl_config_request_body.dl_config_pdu_list=0; pnf_p7_free(pnf_p7, req); } nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) { - return pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); + void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); + //printf("%s() ptr:%p\n", __FUNCTION__, ptr); + return ptr; } void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) { + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); if(pnf_p7->_public.codec_config.deallocate) { (pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list); @@ -96,6 +155,7 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t { free(req->ul_config_request_body.ul_config_pdu_list); } + req->ul_config_request_body.ul_config_pdu_list=0; pnf_p7_free(pnf_p7, req); } @@ -107,6 +167,7 @@ nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) { + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); if(pnf_p7->_public.codec_config.deallocate) { (pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list); @@ -115,6 +176,7 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn { free(req->hi_dci0_request_body.hi_dci0_pdu_list); } + req->hi_dci0_request_body.hi_dci0_pdu_list=0; pnf_p7_free(pnf_p7, req); } @@ -127,6 +189,9 @@ nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) { int i = 0; + + //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data); + for(i = 0; i < req->tx_request_body.number_of_pdus; ++i) { void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data; @@ -139,6 +204,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) { free(data); } + data=0; } @@ -150,6 +216,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) { free(req->tx_request_body.tx_pdu_list); } + req->tx_request_body.tx_pdu_list=0; pnf_p7_free(pnf_p7, req); } @@ -169,6 +236,7 @@ void deallocate_nfapi_lbt_dl_config_request(nfapi_lbt_dl_config_request_t* req, { free(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list); } + req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list=0; pnf_p7_free(pnf_p7, req); } @@ -307,11 +375,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas } -uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) +static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) { if(now_hr < sf_start_hr) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier that start of subframe\n"); + NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier than start of subframe now_hr:%u sf_start_hr:%u\n", now_hr, sf_start_hr); return 0; } else @@ -482,29 +550,41 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7) void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf) { + struct timespec t; + clock_gettime( CLOCK_MONOTONIC, &t); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec); + + if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) + { + pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n"); + (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n"); + } if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) { pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n"); (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n"); } if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) { pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n"); (pnf_p7->_public.ul_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.ul_config_req); } if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) { pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n"); (pnf_p7->_public.hi_dci0_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.hi_dci0_req); } - if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) - { - pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; - (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); - } if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) { pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n"); (pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req); } } @@ -526,10 +606,14 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) return -1; } +#if 1 // save the curren time and sfn_sf - pnf_p7->sf_start_time_hr = get_current_time_hr(); + pnf_p7->sf_start_time_hr = pnf_get_current_time_hr(); pnf_p7->sfn_sf = sfn_sf; + uint32_t sfn_sf_tx = sfnsf_add_sf(sfn_sf, sf_ahead); + uint32_t tx_sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf_tx); + // If the subframe_buffer has been configured if(pnf_p7->_public.subframe_buffer_size != 0) { @@ -550,6 +634,10 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/sf (%d -> %d)\n", pnf_p7->sfn_sf_shift, NFAPI_SFNSF2DEC(sfn_sf), shifted_sfn_sf); sfn_sf = shifted_sfn_sf; + // + // DJP - why does the shift not apply to pnf_p7->sfn_sf??? + // + pnf_p7->sfn_sf_shift = 0; } @@ -558,77 +646,119 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]); + uint8_t tx_buffer_index = tx_sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + nfapi_pnf_p7_subframe_buffer_t* tx_subframe_buffer = &(pnf_p7->subframe_buffer[tx_buffer_index]); + + //printf("sfn_sf_dec:%d tx_sfn_sf_dec:%d\n", sfn_sf_dec, tx_sfn_sf_dec); + + if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d subframe_buffer->sfn_sf:%d tx_subframe_buffer->sfn_sf:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] " + "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", + __FUNCTION__, + pnf_p7->sfn_sf_shift, + NFAPI_SFNSF2DEC(subframe_buffer->sfn_sf), + NFAPI_SFNSF2DEC(tx_subframe_buffer->sfn_sf), + sfn_sf_dec, buffer_index, subframe_buffer->dl_config_req, subframe_buffer->tx_req, + tx_sfn_sf_dec, tx_buffer_index, tx_subframe_buffer->dl_config_req, tx_subframe_buffer->tx_req); + // if the subframe buffer sfn sf is set then we have atlease 1 message // from the vnf. // todo : how to handle the messages we don't have, send dummies for // now - if(subframe_buffer->sfn_sf == sfn_sf) + + //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx); + //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf); + if(tx_subframe_buffer->sfn_sf == sfn_sf_tx) { - if(subframe_buffer->dl_config_req != 0) + if(tx_subframe_buffer->tx_req != 0) { - if(pnf_p7->_public.dl_config_req) - (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), subframe_buffer->dl_config_req); + if(pnf_p7->_public.tx_req) + (pnf_p7->_public.tx_req)(&(pnf_p7->_public), tx_subframe_buffer->tx_req); - deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); + //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); } else { // send dummy - if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) + if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) { - pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; - (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); + pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); } } - if(subframe_buffer->ul_config_req != 0) + if(tx_subframe_buffer->dl_config_req != 0) { - if(pnf_p7->_public.ul_config_req) - (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); + if(pnf_p7->_public.dl_config_req) + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), tx_subframe_buffer->dl_config_req); - deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); + //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); } else { // send dummy - if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) + if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) { - pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; - (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); + pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); } } - if(subframe_buffer->hi_dci0_req != 0) + if(tx_subframe_buffer->hi_dci0_req != 0) { if(pnf_p7->_public.hi_dci0_req) - (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), subframe_buffer->hi_dci0_req); + (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), tx_subframe_buffer->hi_dci0_req); - deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); + //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); } else { //send dummy if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) { - pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; + pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf_tx; (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.hi_dci0_req); } } - if(subframe_buffer->tx_req != 0) + if(tx_subframe_buffer->dl_config_req != 0) + { + deallocate_nfapi_dl_config_request(tx_subframe_buffer->dl_config_req, pnf_p7); + tx_subframe_buffer->dl_config_req = 0; + } + if(tx_subframe_buffer->tx_req != 0) + { + deallocate_nfapi_tx_request(tx_subframe_buffer->tx_req, pnf_p7); + tx_subframe_buffer->tx_req = 0; + } + if(tx_subframe_buffer->hi_dci0_req != 0) + { + deallocate_nfapi_hi_dci0_request(tx_subframe_buffer->hi_dci0_req, pnf_p7); + tx_subframe_buffer->hi_dci0_req = 0; + } + } + else + { + // If we ever need to "send" a dummy ul_config this won't work!!! + send_dummy_subframe(pnf_p7, sfn_sf_tx); + } + + if(subframe_buffer->sfn_sf == sfn_sf) + { + + if(subframe_buffer->ul_config_req != 0) { - if(pnf_p7->_public.tx_req) - (pnf_p7->_public.tx_req)(&(pnf_p7->_public), subframe_buffer->tx_req); + if(pnf_p7->_public.ul_config_req) + (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); - deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); + //deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); } else { // send dummy - if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) + if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) { - pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; - (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); + pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; + (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); } } @@ -637,7 +767,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) if(pnf_p7->_public.lbt_dl_config_req) (pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), subframe_buffer->lbt_dl_config_req); - deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); + //deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); } else { @@ -650,14 +780,35 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) } - memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); - pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; - } - else - { - send_dummy_subframe(pnf_p7, sfn_sf); + //if(subframe_buffer->dl_config_req != 0) + //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); + //if(subframe_buffer->tx_req != 0) + //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); + if(subframe_buffer->ul_config_req != 0) + { + deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); + subframe_buffer->ul_config_req = 0; + + } + //if(subframe_buffer->hi_dci0_req != 0) + //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); + if(subframe_buffer->lbt_dl_config_req != 0) + { + deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); + subframe_buffer->lbt_dl_config_req = 0; + } + } // sfn_sf match + + if (subframe_buffer->dl_config_req == 0 && subframe_buffer->tx_req == 0 && subframe_buffer->ul_config_req == 0 && subframe_buffer->lbt_dl_config_req == 0) + { + memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); + pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; } + //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period); + //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send); + //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter); + // send the periodic timing info if configured if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period) { @@ -678,14 +829,15 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) } else { - send_dummy_subframe(pnf_p7, sfn_sf); + //send_dummy_subframe(pnf_p7, sfn_sf_tx); } + //printf("pnf_p7->tick:%d\n", pnf_p7->tick); if(pnf_p7->tick == 1000) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, @@ -694,6 +846,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats)); } pnf_p7->tick++; +#endif if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) { @@ -724,7 +877,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC)) { // out of window - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); } else { @@ -736,7 +889,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) else { // too late - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); } } @@ -751,8 +904,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) } else { - // to far in the future - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (%d) [%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); + // too far in the future + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); } } @@ -785,15 +938,35 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ return; } - if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) - { - uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); - uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + if ( + 0 && + (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 || + NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 + ) + ) + NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", + NFAPI_SFNSF2DEC(req->sfn_sf), + req->dl_config_request_body.number_pdcch_ofdm_symbols, + req->dl_config_request_body.number_dci, + req->dl_config_request_body.number_pdu, + req->dl_config_request_body.number_pdsch_rnti, + req->dl_config_request_body.transmission_power_pcfich + ); + + if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); // if there is already an dl_config_req make sure we free it. if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0) { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "HERE HERE HERE\n"); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index); //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", // pMyPhyInfo->sfnSf, bufferIdx, // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); @@ -860,6 +1033,11 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + if(pnf_p7->subframe_buffer[buffer_index].ul_config_req != 0) { //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", @@ -876,7 +1054,7 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ } else { - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf)); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SF %d\n", NFAPI_SFNSF2DEC(pnf_p7->sfn_sf), NFAPI_SFNSF2DEC(req->sfn_sf)); deallocate_nfapi_ul_config_request(req, pnf_p7); if(pnf_p7->_public.timing_info_mode_aperiodic) @@ -994,6 +1172,16 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + + if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n", + __FUNCTION__, + NFAPI_SFNSF2DEC(req->sfn_sf), + req->tx_request_body.number_of_pdus); + if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0) { //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", @@ -1010,6 +1198,8 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) } else { + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_REQUEST Request is outside of window REQ:SFN_SF:%d CURR:SFN_SF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), NFAPI_SFNSF2DEC(pnf_p7->sfn_sf)); + deallocate_nfapi_tx_request(req, pnf_p7); if(pnf_p7->_public.timing_info_mode_aperiodic) @@ -1126,12 +1316,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + if (0) + { + static uint32_t prev_t2 = 0; + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn_sf:%d sf_start_time_Hr:%u) sf_time_us:%u t2:%u prev_t2:%u diff:%u\n", + __FUNCTION__, + now_time_hr, NFAPI_SFNSF2DEC(sfn_sf), sf_start_time_hr, + sf_time_us, + t2, + prev_t2, + t2-prev_t2); + + prev_t2 = t2; + } + return t2; } uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr) { - uint32_t now_time_hr = get_current_time_hr(); + uint32_t now_time_hr = pnf_get_current_time_hr(); uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); @@ -1391,6 +1596,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) // read the segment recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size); + now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp??? + if(recvfrom_result > 0) { pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time); @@ -1417,7 +1624,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) // need to update the time as we would only use the value from the // select - now_hr_time = get_current_time_hr(); +#if 0 +// DJP - why do this here and not on return from recv??? + now_hr_time = pnf_get_current_time_hr(); +#endif } while(recvfrom_result > 0); } @@ -1512,7 +1722,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7) selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout); - uint32_t now_hr_time = get_current_time_hr(); + uint32_t now_hr_time = pnf_get_current_time_hr(); if(selectRetval == 0) { diff --git a/pnf_sim/src/main.cpp b/pnf_sim/src/main.cpp index 38767d8..e2622cf 100644 --- a/pnf_sim/src/main.cpp +++ b/pnf_sim/src/main.cpp @@ -1124,16 +1124,18 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) rx_ind.header.phy_id = data->p7_config->phy_id; rx_ind.sfn_sf = ind->sfn_sf; - if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + if(1)//((pnf_info*)(data->config->user_data))->wireshark_test_mode) { rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; - rx_ind.rx_indication_body.number_of_pdus = 8; + rx_ind.rx_indication_body.number_of_pdus = 1; uint8_t rx_data[1024]; nfapi_rx_indication_pdu_t pdus[rx_ind.rx_indication_body.number_of_pdus]; memset(&pdus, 0, sizeof(pdus)); + strcpy((char*)rx_data, (char*)"123456789"); + for(int i = 0; i < rx_ind.rx_indication_body.number_of_pdus;++i) { @@ -1142,13 +1144,13 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) pdus[i].rx_ue_information.rnti = rand_range(1, 65535); pdus[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; - pdus[i].rx_indication_rel8.length = rand_range(0, 1024); - pdus[i].rx_indication_rel8.offset = 1; + pdus[i].rx_indication_rel8.length = 10;//rand_range(0, 1024); + pdus[i].rx_indication_rel8.offset = 0;//djp - 1; pdus[i].rx_indication_rel8.ul_cqi = rand_range(0, 255); pdus[i].rx_indication_rel8.timing_advance = rand_range(0, 63); - pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; - pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); + //pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; + //pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); pdus[i].data = &rx_data[0]; } diff --git a/vnf/inc/vnf_p7.h b/vnf/inc/vnf_p7.h index ab9a335..fc2ab4e 100644 --- a/vnf/inc/vnf_p7.h +++ b/vnf/inc/vnf_p7.h @@ -116,7 +116,8 @@ typedef struct { } vnf_p7_t; -uint32_t get_current_time_hr(); +uint32_t vnf_get_current_time_hr(void); + uint16_t increment_sfn_sf(uint16_t sfn_sf); int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info); int send_mac_subframe_indications(vnf_p7_t* config); diff --git a/vnf/public_inc/nfapi_vnf_interface.h b/vnf/public_inc/nfapi_vnf_interface.h index 6659e5d..4629013 100644 --- a/vnf/public_inc/nfapi_vnf_interface.h +++ b/vnf/public_inc/nfapi_vnf_interface.h @@ -450,7 +450,7 @@ typedef struct nfapi_vnf_config /*! Creates and initialise the vnf config structure before use * \return A pointer to a vnf config structure */ -nfapi_vnf_config_t* nfapi_vnf_config_create(); +nfapi_vnf_config_t* nfapi_vnf_config_create(void); /*! Delete an vnf config */ @@ -864,7 +864,7 @@ typedef struct nfapi_vnf_p7_config /*! Creates and initializes the nfapi_vnf_p7_config structure before use * \return A pointer to an allocated vnf p7 configuration */ -nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(); +nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(void); /*! Cleanup and delete nfapi_vnf_p7_config structure * \param config A pointer to an vnf p7 configuration structure diff --git a/vnf/src/vnf.c b/vnf/src/vnf.c index fea3cf7..6800ee2 100644 --- a/vnf/src/vnf.c +++ b/vnf/src/vnf.c @@ -82,11 +82,18 @@ void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* no nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx) { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : config->pnf_list:%p\n", __FUNCTION__, config->pnf_list); + nfapi_vnf_pnf_info_t* curr = config->pnf_list; while(curr != 0) { if(curr->p5_idx == p5_idx) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx); return curr; + } + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next); curr = curr->next; } diff --git a/vnf/src/vnf_interface.c b/vnf/src/vnf_interface.c index e559730..0aba0a2 100644 --- a/vnf/src/vnf_interface.c +++ b/vnf/src/vnf_interface.c @@ -342,6 +342,7 @@ int nfapi_vnf_start(nfapi_vnf_config_t* config) { NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t)); + NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf); memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t)); pnf->p5_sock = p5Sock; pnf->p5_idx = p5_idx++; @@ -663,7 +664,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy info->p5_idx = p5_idx; info->phy_id = vnf->next_phy_id++; - info->timing_window = 10; + info->timing_window = 30; // This seems to override what gets set by the user - why??? info->timing_info_mode = 0x03; info->timing_info_period = 128; diff --git a/vnf/src/vnf_p7.c b/vnf/src/vnf_p7.c index 8630385..1304176 100644 --- a/vnf/src/vnf_p7.c +++ b/vnf/src/vnf_p7.c @@ -15,6 +15,8 @@ */ +#include <time.h> + #include <sys/time.h> #include <stdlib.h> #include <string.h> @@ -159,7 +161,7 @@ vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vn msg->sequence_number = sequence_number; msg->num_segments_expected = m ? 255 : segment_number + 1; msg->num_segments_received = 1; - msg->rx_hr_time = get_current_time_hr(); + msg->rx_hr_time = vnf_get_current_time_hr(); msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len); memcpy(msg->segments[segment_number].buffer, data, data_len); @@ -216,7 +218,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas vnf_p7_rx_message_t* iterator = queue->msg_queue; vnf_p7_rx_message_t* previous = 0; - uint32_t rx_hr_time = get_current_time_hr(); + uint32_t rx_hr_time = vnf_get_current_time_hr(); while(iterator != 0) { @@ -254,7 +256,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas } } -uint32_t get_current_time_hr() +uint32_t vnf_get_current_time_hr() { struct timeval now; (void)gettimeofday(&now, NULL); @@ -297,7 +299,7 @@ struct timespec timespec_delta(struct timespec start, struct timespec end) return temp; } -uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) +static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) { if(now_hr < sf_start_hr) { @@ -321,7 +323,7 @@ uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr) { - uint32_t now_time_hr = get_current_time_hr(); + uint32_t now_time_hr = vnf_get_current_time_hr(); uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); @@ -344,7 +346,7 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t uint32_t calculate_transmit_timestamp(uint16_t sfn_sf, uint32_t sf_start_time_hr) { - uint32_t now_time_hr = get_current_time_hr(); + uint32_t now_time_hr = vnf_get_current_time_hr(); uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); @@ -410,6 +412,8 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); + if(len < 0) { NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id); @@ -429,6 +433,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea int segment = 0; int offset = NFAPI_P7_HEADER_LENGTH; uint8_t tx_buffer[vnf_p7->_public.segment_size]; + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); for(segment = 0; segment < segment_count; ++segment) { uint8_t last = 0; @@ -851,7 +856,7 @@ void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) { - uint32_t now_time_hr = get_current_time_hr(); + uint32_t now_time_hr = vnf_get_current_time_hr(); if (pRecvMsg == NULL || vnf_p7 == NULL) { @@ -871,7 +876,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id); uint32_t t4 = calculate_t4(now_time_hr, phy->sfn_sf, vnf_p7->sf_start_time_hr); - uint32_t tx_2_rx = t4 - ind.t1; + uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSFDEC - ind.t1 ; uint32_t pnf_proc_time = ind.t3 - ind.t2; // divide by 2 using shift operator @@ -881,7 +886,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) { phy->latency[phy->min_sync_cycle_count] = latency; - NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, tx_2_rx, pnf_proc_time, latency); } @@ -923,15 +928,27 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) if(1) { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", - NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, - tx_2_rx, pnf_proc_time, latency, phy->sf_offset, phy->sf_offset_filtered, + tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered, (ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2)); } } + if (phy->filtered_adjust && (phy->sf_offset_filtered > 1e6 || phy->sf_offset_filtered < -1e6)) + { + phy->filtered_adjust = 0; + phy->zero_count=0; + phy->min_sync_cycle_count = 2; + phy->in_sync = 0; + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s - ADJUST TOO BAD - go out of filtered phy->sf_offset_filtered:%d\n", __FUNCTION__, phy->sf_offset_filtered); + } + if(phy->min_sync_cycle_count) phy->min_sync_cycle_count--; @@ -954,7 +971,6 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) phy->sf_offset = ind.t2 - (ind.t1 - phy->average_latency); sfn_sf_dec += (phy->sf_offset / 1000); - } else { @@ -976,12 +992,11 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) { phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf); - //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d\n", ind.header.phy_id, phy->adjustment); + NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend); phy->previous_t1 = 0; phy->previous_t2 = 0; - if(phy->previous_sf_offset_filtered > 0) { if( phy->sf_offset_filtered > phy->previous_sf_offset_filtered) @@ -1083,9 +1098,14 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) if(phy->insync_minor_adjustment != 0) { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (sf_offset_filtered:%d) %d %d %d\n", + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, - phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->sf_offset_filtered, insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, + phy->sf_offset_filtered, + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, + NFAPI_SFNSF2DEC(new_sfn_sf), + NFAPI_SFNSF2DEC(curr_sfn_sf), + phy->adjustment); } } } @@ -1121,10 +1141,13 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) // out of sync? } - NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, - insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, + NFAPI_SFNSF2DEC(new_sfn_sf), + NFAPI_SFNSF2DEC(curr_sfn_sf), + phy->adjustment); } else if(phy->adjustment < 0) @@ -1151,7 +1174,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) // out of sync? } - NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n", NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); @@ -1219,7 +1242,16 @@ void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) return; } - // todo : how to use this? + if (vnf_p7 && vnf_p7->p7_connections) + { + int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta); + if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf)); + } + } } void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) diff --git a/vnf/src/vnf_p7_interface.c b/vnf/src/vnf_p7_interface.c index ab4f00c..a35d8e3 100644 --- a/vnf/src/vnf_p7_interface.c +++ b/vnf/src/vnf_p7_interface.c @@ -142,6 +142,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n"); + //struct timespec original_pselect_timeout; struct timespec pselect_timeout; pselect_timeout.tv_sec = 0; pselect_timeout.tv_nsec = 1000000; // ns in a 1 us @@ -157,13 +158,13 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) struct timespec sf_duration; sf_duration.tv_sec = 0; - sf_duration.tv_nsec = 1000000; // ns in a 1 us + sf_duration.tv_nsec = 1e6; // We want 1ms pause struct timespec sf_start; clock_gettime(CLOCK_MONOTONIC, &sf_start); long millisecond = sf_start.tv_nsec / 1e6; sf_start = timespec_add(sf_start, sf_duration); - //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); + NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); while(vnf_p7->terminate == 0) { @@ -181,6 +182,8 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) ) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec); + if((pselect_start.tv_sec > sf_start.tv_sec) || ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec))) @@ -196,16 +199,26 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) { // still time before the end of the subframe wait pselect_timeout = timespec_sub(sf_start, pselect_start); + +#if 0 + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n", + __FUNCTION__, + sf_start.tv_sec, sf_start.tv_nsec, + pselect_start.tv_sec, pselect_start.tv_nsec, + pselect_timeout.tv_sec, pselect_timeout.tv_nsec); +#endif } +//original_pselect_timeout = pselect_timeout; + // detemine how long to sleep in ns before the start of the next 1ms //pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000); - //uint8_t underun_possiable =0; + //uint8_t underrun_possible =0; // if we are not sleeping until the next milisecond due to the // insycn minor adjment flag it so we don't consider it an error - //uint8_t underun_possiable =0; + //uint8_t underrun_possible =0; /* { nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; @@ -222,7 +235,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000); - //underun_possiable = 1; + //underrun_possible = 1; } else if(phy->insync_minor_adjustment < 0) { @@ -237,41 +250,98 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) */ +//long wraps = pselect_timeout.tv_nsec % 1e9; + + selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL); clock_gettime(CLOCK_MONOTONIC, &pselect_stop); + nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; + +if (selectRetval==-1 && errno == 22) +{ + NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", + pselect_timeout.tv_sec, pselect_timeout.tv_nsec, + phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, + sf_duration.tv_sec, sf_duration.tv_nsec); +} +#if 0 + if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0) + NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n", + selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, + original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec); +#endif + if(selectRetval == 0) { - // calcualte the start of the next subframe + // calculate the start of the next subframe sf_start = timespec_add(sf_start, sf_duration); //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); - nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0) { - NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %dus\n", phy->insync_minor_adjustment); + long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000); + + sf_start.tv_nsec -= insync_minor_adjustment_ns; + +#if 1 + if (sf_start.tv_nsec > 1e9) + { + sf_start.tv_sec++; + sf_start.tv_nsec-=1e9; + } + else if (sf_start.tv_nsec < 0) + { + sf_start.tv_sec--; + sf_start.tv_nsec+=1e9; + } +#else + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec); if(phy->insync_minor_adjustment > 0) { // decrease the subframe duration a little - sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); + if (sf_start.tv_nsec > insync_minor_adjustment_ns) + sf_start.tv_nsec -= insync_minor_adjustment_ns; + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns); + sf_start.tv_sec--; + sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns; + } } else if(phy->insync_minor_adjustment < 0) { // todo check we don't go below 0 // increase the subframe duration a little - sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); + sf_start.tv_nsec += insync_minor_adjustment_ns; + + if (sf_start.tv_nsec < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec); + sf_start.tv_sec++; + sf_start.tv_nsec += 1e9; + } } +#endif //phy->insync_minor_adjustment = 0; - phy->insync_minor_adjustment_duration--; + phy->insync_minor_adjustment_duration--; + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", + phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration); + + if (phy->insync_minor_adjustment_duration==0) + { + phy->insync_minor_adjustment = 0; + } } /* long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6; if(millisecond == pselect_stop_millisecond) { // we have woke up in the same subframe - if(underun_possiable == 0) + if(underrun_possible == 0) NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec); } else if(((millisecond + 1) % 1000) != pselect_stop_millisecond) @@ -298,7 +368,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) if(selectRetval == 0) { - vnf_p7->sf_start_time_hr = get_current_time_hr(); + vnf_p7->sf_start_time_hr = vnf_get_current_time_hr(); // pselect timed out nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; @@ -326,14 +396,18 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) else { // pselect error - if(selectRetval == EINTR) + if(selectRetval == -1 && errno == EINTR) { // a sigal was received. } else { - NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec); + NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond); // should we exit now? + if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration + { + usleep(100000); + } } } @@ -360,10 +434,12 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config) int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id) { - NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d pnf_addr:%s:%d)\n", __FUNCTION__, phy_id, pnf_p7_addr, pnf_p7_port); + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id, pnf_p7_addr, pnf_p7_port); if(config == 0) - return -1; + { + return -1; + } vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; @@ -411,6 +487,8 @@ int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id) } int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p req:%p)\n", __FUNCTION__, config, req); + if(config == 0 || req == 0) return -1; diff --git a/vnf_sim/src/mac.cpp b/vnf_sim/src/mac.cpp index aa97f72..fa6f487 100644 --- a/vnf_sim/src/mac.cpp +++ b/vnf_sim/src/mac.cpp @@ -743,7 +743,7 @@ extern "C" { cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1; cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = rand_range(0, 3); - cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size = rand_range(0, 255); + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0] = rand_range(0, 255); } cqi_ri_information.cqi_ri_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG; diff --git a/vnf_sim/src/main.cpp b/vnf_sim/src/main.cpp index b79ac40..5dc7161 100644 --- a/vnf_sim/src/main.cpp +++ b/vnf_sim/src/main.cpp @@ -428,6 +428,20 @@ void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) free(header); } +//static pthread_t vnf_start_pthread; +static pthread_t vnf_p7_start_pthread; +void* vnf_p7_start_thread(void *ptr) +{ + printf("%s()\n", __FUNCTION__); + + //std::shared_ptr<nfapi_vnf_p7_config> config = std::shared_ptr<nfapi_vnf_p7_config>(ptr); + nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr; + + nfapi_vnf_p7_start(config); + + return 0; +} + void set_thread_priority(int priority) { //printf("%s(priority:%d)\n", __FUNCTION__, priority); @@ -458,6 +472,8 @@ void set_thread_priority(int priority) void* vnf_p7_thread_start(void* ptr) { + printf("%s()\n", __FUNCTION__); + set_thread_priority(79); vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr; @@ -494,10 +510,10 @@ void* vnf_p7_thread_start(void* ptr) p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; - nfapi_vnf_p7_start(p7_vnf->config.get()); + printf("[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); + pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config.get()); return 0; - } int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) diff --git a/wireshark/packet-nfapi.c b/wireshark/packet-nfapi.c index da0edb0..7e0f23f 100755 --- a/wireshark/packet-nfapi.c +++ b/wireshark/packet-nfapi.c @@ -1,6069 +1,12284 @@ -/* +/* packet-nfapi.c +* Routines for Network Function Application Platform Interface (nFAPI) dissection * Copyright 2017 Cisco Systems, Inc. * -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at +* Wireshark - Network traffic analyzer +* By Gerald Combs <gerald@wireshark.org> +* Copyright 1998 Gerald Combs +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * -* http://www.apache.org/licenses/LICENSE-2.0 +* References: +* SCF082.09.04 http://scf.io/en/documents/082_-_nFAPI_and_FAPI_specifications.php * -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. */ - - -#include "config.h" - -#include <windows.h> -#include <stdio.h> -#include <stdint.h> - -#include <epan/packet.h> -#include <epan/exceptions.h> -#include <epan/prefs.h> -#include <epan/expert.h> -#include <epan/reassemble.h> - + +#include "config.h" + +#include <epan/packet.h> +#include <epan/exceptions.h> +#include <epan/expert.h> +#include <epan/reassemble.h> +#include <epan/wmem/wmem.h> + +#include <ptvcursor.h> + +void proto_register_nfapi(void); +void proto_reg_handoff_nfapi(void); + #define NFAPI_HEADER_LENGTH 8 -#define NFAPI_P7_HEADER_LENGTH 16 - -typedef int(*Decode_operation)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset); - -static const value_string nfapi_error_vals[] = { - { 0x0, "MSG_OK" }, - { 0x1, "MSG_INVALID_STATE" }, - { 0x2, "MSG_INVALID_CONFIG" }, - { 0x3, "SFN_OUT_OF_SYNC" }, - { 0x4, "MSG_SUBFRAME_ERR" }, - { 0x5, "MSG_BCH_MISSING" }, - { 0x6, "MSG_BCH_MISSING" }, - { 0x7, "MSG_HI_ERR" }, - { 0x8, "MSG_TX_ERR" }, - { 0, NULL }, -}; - -static const value_string nfapi_p4_error_vals[] = { - { 100, "MSG_OK" }, - { 101, "MSG_INVALID_STATE" }, - { 102, "MSG_INVALID_CONFIG" }, - { 103, "MSG_RAT_NOT_SUPPORTED" }, - { 200, "MSG_NMM_STOP_OK" }, - { 201, "MSG_NMM_STOP_IGNORED" }, - { 202, "MSG_NMM_STOP_INVALID_STATE" }, - { 300, "MSG_PROCEDURE_COMPLETE" }, - { 301, "MSG_PROCEDURE_STOPPED" }, - { 302, "MSG_PARTIAL_RESULTS" }, - { 303, "MSG_TIMEOUT" }, - { 0, NULL }, -}; - -static const value_string nfapi_rat_type_vals[] = { - { 0, "LTE" }, - { 1, "UTRAN" }, - { 2, "GERAN" }, - { 0, NULL }, -}; - -typedef enum{ - UN_ALIGNED_SYNCHRONIZATION = 0, - INTERNAL_PNF_FRAME_ALIGNMENT, - ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION -} nfapi_sync_mode_e; - -static const value_string nfapi_sync_mode_vals[] = { - { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, - { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, - { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" } -}; - -typedef enum { - NONE = 0, - GPS, - GLONASS, - BEIDOU -} location_mode_e; - -static const value_string location_mode_vals[] = { - { NONE, "NONE" }, - { GPS, "GPS" }, - { GLONASS, "GLONASS" }, - { BEIDOU, "BeiDou" }, - { 0, NULL } -}; - -static const value_string nfapi_uplink_rs_hopping_vals[] = { - { 0, "RS_NO_HOPPING" }, - { 1, "RS_GROUP_HOPPING" }, - { 2, "RS_SEQUENCE_HOPPING" }, - { 0, NULL } -}; - -static const value_string nfapi_laa_carrier_type_vals[] = { - { 0, "No multi carrier support" }, - { 1, "Mode A1" }, - { 2, "Mode A12" }, - { 3, "Mode B1" }, - { 4, "Mode B2" }, - { 0, NULL } -}; - -static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { - { 0, "Multi carrier Mode A1" }, - { 1, "Multi carrier Mode A2" }, - { 2, "Multi carrier Mode B1" }, - { 3, "Multi carrier Mode B2" }, - { 0, NULL } -}; - -static const value_string nfapi_lbt_dl_req_pdu_type[] = { - { 0, "LBT_PDSCH_REQ PDU" }, - { 1, "LBT_DRS_REQ PDU" }, - { 0, NULL } -}; - - -static const value_string nfapi_lbt_dl_ind_pdu_type[] = { - { 0, "LBT_PDSCH_RSP PDU" }, - { 1, "LBT_DRS_RSP PDU" }, - - { 0, NULL } -}; - - - - -/* These are definitions where data 0 & 1 represent/provide a string name*/ - -static const true_false_string true_false_strname = { - "TRUE", - "FALSE" -}; - -static const true_false_string nfapi_csi_report_type_strname = { - "Periodic", - "Aperiodic", -}; - -static const true_false_string nfapi_control_type_string_name = { - "CQI/PMI", - "RI", -}; - -static const true_false_string transport_block_to_codeword_swap_flag = { - "NO_SWAPPING", - "SWAPPED" -}; - -static const true_false_string virtual_resource_block_assignment_flag = { - "LOCALIZED", - "DISTRIBUTED" -}; - -static const true_false_string ngap_string_name = { - "N-GAP 1", - "N-GAP 2" -}; - -static const true_false_string nprb_strname = { - "= 2", - "= 3", -}; - -static const true_false_string cyclic_prefix_type_strname = { - "CP_NORMAL", - "CP_EXTENDED" -}; - -static const true_false_string support_strname = { - "No Support", - "Support" -}; - -static const true_false_string partial_sf_support_strname = -{ - "Start partial SF support", - "End partial SF support" -}; - -static const true_false_string phich_duration_strname = { - "PHICH_D_NORMAL", - "PHICH_D_EXTENDED" -}; - -static const true_false_string high_speed_flag_strname = { - "HS_UNRESTRICTED_SET", - "HS_RESTRICTED_SET" -}; - -static const true_false_string hopping_mode_strname = { - "HM_INTER_SF", - "HM_INTRA_INTER_SF" -}; - -static const true_false_string enabled_disabled_strname = { - "Enabled", - "Disabled" -}; - -static const true_false_string srs_simult_tx_strname = { - "No Simultaneous Transmission", - "Simultaneous Transmission" -}; - -static const true_false_string crc_flag_strname = { - "CRC_CORRECT", - "CRC_ERROR" -}; - -static const true_false_string hi_value_strname = { - "HI_NACK", - "HI_ACK" -}; - -static const true_false_string flag_tb2_strname = { - "HI_NOT_PRESENT", - "HI_PRESENT" -}; - -static const true_false_string nfapi_multi_carrier_tx_strname = { - "Mutual transmission (self-deferral support for current carrier)", - "Transmit on channel access win (no self-deferral)" -}; - -static const true_false_string nfapi_multi_carrier_freeze_strname = { - "Absence of other technology isn�t guaranteed", - "Absence of other technology is guaranteed" -}; - -static const value_string nfapi_dl_config_pdu_type_vals[] = { - { 0, "DL_CONFIG_DCI_DL_PDU" }, - { 1, "DL_CONFIG_BCH_PDU" }, - { 2, "DL_CONFIG_MCH_PDU" }, - { 3, "DL_CONFIG_DLSCH_PDU" }, - { 4, "DL_CONFIG_PCH_PDU" }, - { 5, "DL_CONFIG_PRS_PDU" }, - { 6, "DL_CONFIG_CSI_RS_PDU" }, - { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, - { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, - { 0, NULL } -}; - -static const value_string nfapi_duplex_mode_vals[] = { - { 0, "TDD" }, - { 1, "FDD" }, - { 2, "HD-FDD" }, - { 0, NULL } -}; - -static const value_string modulation_vals[] = { - { 2, "QPSK" }, - { 4, "16QAM" }, - { 6, "64QAM" }, - { 8, "256QAM" }, - { 0, NULL } -}; - -static const value_string pch_modulation_vals[] = { - { 0, "QPSK" }, - { 0, NULL } -}; - -static const value_string ue_mode_vals[] = { - { 0, "non LC/CE UE" }, - { 1, "LC/CE UE" }, - { 0, NULL } -}; - -static const value_string csi_rs_class_vals[] = { - { 0, "not used" }, - { 1, "Class A" }, - { 1, "Class B" }, - { 0, NULL } -}; - -static const value_string csi_rs_cdm_type_vals[] = { - { 0, "cdm 2" }, - { 1, "cdm 4" }, - { 0, NULL } -}; - -static const value_string antenna_ports_vals[] = { - { 0, "1 antenna ports" }, - { 1, "2 antenna ports" }, - { 2, "4 antenna ports" }, - { 0, NULL } -}; - -static const value_string combs_vals[] = { - { 0, "2 TC" }, - { 1, "4 TC" }, - { 0, NULL } -}; - -static const value_string resource_allocation_type_vals[] = { - { 0, "type 0" }, - { 1, "type 1" }, - { 2, "type 2 1A/1B/1D" }, - { 3, "type 2 1C" }, - { 4, "type 2 6-1A" }, - { 5, "type UEModeB" }, - { 0, NULL } -}; - -static const value_string transmission_scheme_vals[] = { - { 0, "SINGLE_ANTENNA_PORT_0" }, - { 1, "TX_DIVERSITY" }, - { 2, "LARGE_DELAY_CDD" }, - { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, - { 4, "MULTI_USER_MIMO" }, - { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, - { 6, "SINGLE_ANTENNA_PORT_5" }, - { 7, "SINGLE_ANTENNA_PORT_7" }, - { 8, "SINGLE_ANTENNA_PORT_8" }, - { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, - { 10, "UP_TO_8_LAYER_TX" }, - { 11, "SINGLE_ANTENNA_PORT_11" }, - { 12, "SINGLE_ANTENNA_PORT_13" }, - { 13, "SINGLE_ANTENNA_PORT_11_13" }, - { 0, NULL } -}; - -static const value_string ul_transmission_scheme_vals[] = { - { 0, "SINGLE_ANTENNA_PORT_10" }, - { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, -}; - -static const value_string dci_format_vals[] = { - { 0, "1" }, - { 1, "1A" }, - { 2, "1B" }, - { 3, "1C" }, - { 4, "1D" }, - { 5, "2" }, - { 6, "2A" }, - { 7, "2B" }, - { 8, "2C" }, - { 9, "2D" }, - { 0, NULL } -}; - -static const value_string pa_vals[] = { - { 0, "-6dB" }, - { 1, "-4.77dB" }, - { 2, "-3dB" }, - { 3, "-1.77dB" }, - { 4, "0dB" }, - { 5, "1dB" }, - { 6, "2dB" }, - { 7, "3dB" }, - { 0, NULL } -}; - -static const value_string transmission_mode_vals[] = { - { 1, "Mode 1" }, - { 2, "Mode 2" }, - { 3, "Mode 3" }, - { 4, "Mode 4" }, - { 5, "Mode 5" }, - { 6, "Mode 6" }, - { 7, "Mode 7" }, - { 8, "Mode 8" }, - { 9, "Mode 9" }, - { 10, "Mode 10" }, - { 0, NULL } -}; - -static const value_string nfapi_ul_config_pdu_type_vals[] = { - { 0, "ULSCH" }, - { 1, "ULSCH_CQI_RI" }, - { 2, "ULSCH_HARQ" }, - { 3, "ULSCH_CQI_HARQ_RI" }, - { 4, "UCI_CQI" }, - { 5, "UCI_SR" }, - { 6, "UCI_HARQ" }, - { 7, "UCI_SR_HARQ" }, - { 8, "UCI_CQI_HARQ" }, - { 9, "UCI_CQI_SR" }, - { 10, "UCI_CQI_SR_HARQ" }, - { 11, "SRS" }, - { 12, "HARQ_BUFFER" }, - { 13, "ULSCH_UCI_CSI" }, - { 14, "ULSCH_UCI_HARQ" }, - { 15, "ULSCH_CSI_UCI_HARQ" }, - { 0, NULL } -}; - -typedef enum { - NFAPI_ACK_NACK_MODE_BUNDLING = 0, - NFAPI_ACK_NACK_MODE_MULTIPLEXING, - NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, - NFAPI_ACK_NACK_MODE_FORMAT_3, -} nfapi_ack_nack_mode_e; - -static const value_string nfapi_ack_nack_mode_vals[] = { - { NFAPI_ACK_NACK_MODE_BUNDLING, "Bundling" }, - { NFAPI_ACK_NACK_MODE_MULTIPLEXING, "Multiplexing" }, - { NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, "Format 1b with channel selection" }, - { NFAPI_ACK_NACK_MODE_FORMAT_3, "Format 3" }, - { 0, NULL } -}; - -typedef enum { - NFAPI_ANTENNA_PORT1 = 0, - NFAPI_ANTENNA_PORT2, - NFAPI_ANTENNA_PORT4, -} nfapi_ack_nack_mode_e; - -static const value_string nfapi_antenna_port_vals[] = { - { NFAPI_ANTENNA_PORT1, "1 " }, - { NFAPI_ANTENNA_PORT2, "2 " }, - { NFAPI_ANTENNA_PORT4, "4 " }, - { 0, NULL } -}; - -typedef enum{ - PHICH_R_ONE_SIXTH = 0, - PHICH_R_HALF, - PHICH_R_ONE, - PHICH_R_TWO -} nfapi_phich_resource_e; - -static const value_string nfapi_phich_resource_vals[] = { - { PHICH_R_ONE_SIXTH, "PHICH_R_ONE_SIXTH " }, - { PHICH_R_HALF, "PHICH_R_HALF" }, - { PHICH_R_ONE, "PHICH_R_ONE" }, - { PHICH_R_TWO, "PHICH_R_TWO" }, - { 0, NULL } -}; - -static const value_string local_distributed_vals[] = { - { 0, "localized" }, - { 1, "distributed" }, - { 0, NULL } -}; - -static const value_string transport_block_to_codeword_swap_flag_vals[] = { - { 0, "no swapping" }, - { 1, "swapped" }, - { 0, NULL } -}; - -static const value_string ngap_vals[] = { - { 0, "Ngap1" }, - { 1, "Ngap2" }, - { 0, NULL } -}; - -static const value_string true_false_vals[] = { - { 0, "false" }, - { 1, "true" }, - { 0, NULL } -}; - -static const value_string exhustive_search_vals[] = { - { 0, "non-exhaustive search" }, - { 1, "exhaustive search" }, - { 0, NULL } -}; - -static const value_string not_used_enabled_vals[] = { - { 0, "not used" }, - { 1, "enabled" }, - { 0, NULL } -}; - -static const value_string hopping_vals[] = { - { 0, "no hopping" }, - { 1, "hopping enabled" }, - { 0, NULL } -}; - - -static const value_string rnti_type_vals[] = { - { 1, "C-RNTI" }, - { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, - { 3, "SPS-CRNTI" }, - { 0, NULL } -}; - -static const value_string primary_cells_type_vals[] = { - { 1, "TDD" }, - { 2, "FDD" }, - { 3, "HD_FDD" }, - { 0, NULL } -}; - -static const value_string ul_rssi_supported_vals[] = { - { 0, "Uplink RSSI not supported" }, - { 1, "Uplink RSSI supported" }, - { 0, NULL} -}; - - -typedef enum -{ - NMM_NONE = 0, - NMM_ONLY, - NMM_IN_CONFIGURED_STATE, - NMM_IN_RUNNING_STATE, - NMM_IN_CONFIGURED_AND_RUNNING_STATE -} nmm_modes_supported_e; - -static const value_string nmm_modes_supported_vals[] = -{ - { NMM_NONE, "NONE" }, - { NMM_ONLY, "NMM_ONLY" }, - { NMM_IN_CONFIGURED_STATE, "NMM_IN_CONFIGURED_STATE" }, - { NMM_IN_RUNNING_STATE, "NMM_IN_RUNNING_STATE" }, - { NMM_IN_CONFIGURED_AND_RUNNING_STATE, "NMM_IN_CONFIGURED_AND_RUNNING_STAT" }, - { 0, NULL } -}; - - - - - -static int proto_nfapi = -1; - -/* These are for the subtrees */ -static gint ett_nfapi_message_tree = -1; -static gint ett_nfapi_p4_p5_message_header = -1; -static gint ett_nfapi_p7_message_header = -1; -static gint ett_nfapi_tlv_tree = -1; -static gint ett_nfapi_tl = -1; -static gint ett_nfapi_pnf_param_response = -1; -static gint ett_nfapi_pnf_phy = -1; -static gint ett_nfapi_pnf_phy_rel10 = -1; -static gint ett_nfapi_pnf_phy_rel11 = -1; -static gint ett_nfapi_pnf_phy_rel12 = -1; -static gint ett_nfapi_pnf_phy_rel13 = -1; -static gint ett_nfapi_pnf_rf = -1; -static gint ett_nfapi_phy_rf_config_info = -1; -static gint ett_nfapi_pnf_phy_rf_config = -1; -static gint ett_nfapi_pnf_phy_rf_config_instance = -1; -static gint ett_nfapi_phy_state = -1; -static gint ett_nfapi_l1_status = -1; -static gint ett_nfapi_rf_bands = -1; -static gint ett_nfapi_tx_antenna_ports = -1; -static gint ett_nfapi_harq_ack_nack_data = -1; -static gint ett_nfapi_harq_data = -1; -static gint ett_nfapi_cc = -1; -static gint ett_nfapi_rbs = -1; -static gint ett_nfapi_antennas = -1; -static gint ett_nfapi_dl_config_dci_dl_pdu_rel8 = -1; -static gint ett_nfapi_dl_config_dci_dl_pdu_rel9 = -1; -static gint ett_nfapi_dl_config_dci_dl_pdu_rel10 = -1; -static gint ett_nfapi_dl_config_dci_dl_pdu = -1; -static gint ett_nfapi_dl_config_request_pdu = -1; -static gint ett_nfapi_dl_config_request_body = -1; -static gint ett_nfapi_dl_config_request_pdu_list = -1; -static gint ett_nfapi_ul_config_request_pdu_list = -1; -static gint ett_nfapi_hi_dci0_request_pdu_list = -1; -static gint ett_nfapi_tx_request_pdu_list = -1; -static gint ett_nfapi_rx_indication_pdu_list = -1; -static gint ett_nfapi_harq_indication_pdu_list = -1; -static gint ett_nfapi_crc_indication_pdu_list = -1; -static gint ett_nfapi_sr_indication_pdu_list = -1; -static gint ett_nfapi_cqi_indication_pdu_list = -1; -static gint ett_nfapi_preamble_indication_pdu_list = -1; -static gint ett_nfapi_srs_indication_pdu_list = -1; -static gint ett_nfapi_lbt_dl_config_pdu_list = -1; -static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; -static gint ett_nfapi_dl_node_sync = -1; -static gint ett_nfapi_ul_node_sync = -1; -static gint ett_nfapi_timing_info = -1; -static gint ett_nfapi_dl_config_request_dlsch_pdu_rel8 = -1; -static gint ett_nfapi_subbands = -1; -static gint ett_nfapi_dl_config_request_dlsch_pdu_rel9 = -1; -static gint ett_nfapi_dl_config_request_dlsch_pdu_rel10 = -1; -static gint ett_nfapi_dl_config_bch_pdu_rel8 = -1; -static gint ett_nfapi_dl_config_mch_pdu_rel8 = -1; -static gint ett_nfapi_dl_config_pch_pdu_rel8 = -1; -static gint ett_nfapi_dl_config_prs_pdu_rel9 = -1; -static gint ett_nfapi_dl_config_csi_rs_pdu_rel10 = -1; -static gint ett_nfapi_ul_config_request_body = -1; -static gint ett_nfapi_ul_config_harq_buffer_pdu = -1; -static gint ett_nfapi_ul_config_ue_information_rel8 = -1; -static gint ett_nfapi_ul_config_sr_information_pdu_rel8 = -1; -static gint ett_nfapi_ul_config_ulsch_pdu_rel8 = -1; -static gint ett_nfapi_ul_config_ulsch_pdu_rel10 = -1; -static gint ett_nfapi_ul_config_cqi_ri_information_rel8 = -1; -static gint ett_nfapi_ul_config_cqi_ri_information_rel9 = -1; -static gint ett_nfapi_ul_config_ulsch_harq_information_rel10 = -1; -static gint ett_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; -static gint ett_nfapi_ul_config_cqi_information_rel8 = -1; -static gint ett_nfapi_ul_config_cqi_information_rel10 = -1; -static gint ett_nfapi_ul_config_sr_information_rel8 = -1; -static gint ett_nfapi_ul_config_sr_information_rel10 = -1; -static gint ett_nfapi_ul_config_harq_information_rel10_tdd = -1; -static gint ett_nfapi_ul_config_harq_information_rel8_fdd = -1; -static gint ett_nfapi_ul_config_harq_information_rel9_fdd = -1; -static gint ett_nfapi_ul_config_srs_pdu_rel8 = -1; -static gint ett_nfapi_ul_config_srs_pdu_rel10 = -1; -static gint ett_nfapi_crc_indication_body = -1; -static gint ett_nfapi_bf_vector_antennas = -1; -static gint ett_nfapi_bf_vectors = -1; -static gint ett_nfapi_csi_rs_resource_configs = -1; -static gint ett_nfapi_csi_rs_bf_vector = -1; -static gint ett_nfapi_epdcch_prbs = -1; -static gint ett_nfapi_precoding = -1; -static gint ett_nfapi_earfcn_list = -1; -static gint ett_nfapi_uarfcn_list = -1; -static gint ett_nfapi_arfcn_list = -1; -static gint ett_nfapi_rssi_list = -1; -static gint ett_nfapi_pci_list = -1; -static gint ett_nfapi_psc_list = -1; -static gint ett_nfapi_lte_cells_found_list = -1; -static gint ett_nfapi_utran_cells_found_list = -1; -static gint ett_nfapi_geran_cells_found_list = -1; -static gint ett_nfapi_si_periodicity_list = -1; - -static expert_field ei_invalid_range = EI_INIT; -static expert_field ei_power_invalid = EI_INIT; -static expert_field ei_ref_sig_power_invalid = EI_INIT; - - -static int hf_nfapi_message_tree = -1; - -static int hf_nfapi_p4_p5_message_header = -1; -static int hf_nfapi_p4_p5_message_header_phy_id = -1; -static int hf_nfapi_p4_p5_message_header_message_id = -1; -static int hf_nfapi_p4_p5_message_header_message_length = -1; -static int hf_nfapi_p4_p5_message_header_spare = -1; - -static int hf_nfapi_p7_message_header = -1; -static int hf_nfapi_p7_message_header_phy_id = -1; -static int hf_nfapi_p7_message_header_message_id = -1; -static int hf_nfapi_p7_message_header_message_length = -1; -static int hf_nfapi_p7_message_header_m = -1; -static int hf_nfapi_p7_message_header_segment = -1; -static int hf_nfapi_p7_message_header_sequence_number = -1; -static int hf_nfapi_p7_message_header_checksum = -1; -static int hf_nfapi_p7_message_header_transmit_timestamp = -1; - -static int hf_nfapi_tlv_tree = -1; - -static int hf_nfapi_tl = -1; -static int hf_nfapi_tl_tag = -1; -static int hf_nfapi_tl_length = -1; -static int hf_nfapi_tag_uint8_value = -1; -static int hf_nfapi_tag_uint16_value = -1; - -static int hf_nfapi_pnf_param_general = -1; -static int hf_nfapi_sync_mode = -1; -static int hf_nfapi_location_mode = -1; -static int hf_nfapi_location_coordinates = -1; -static int hf_nfapi_location_coordinates_length = -1; -static int hf_nfapi_dl_config_timing = -1; -static int hf_nfapi_tx_timing = -1; -static int hf_nfapi_ul_config_timing = -1; -static int hf_nfapi_hi_dci0_timing = -1; -static int hf_nfapi_maximum_number_phys = -1; -static int hf_nfapi_maximum_total_bandwidth = -1; -static int hf_nfapi_maximum_total_number_dl_layers = -1; -static int hf_nfapi_maximum_total_number_ul_layers = -1; -static int hf_nfapi_shared_bands = -1; -static int hf_nfapi_shared_pa = -1; -static int hf_nfapi_maximum_total_power = -1; -static int hf_nfapi_oui= -1; - -static int hf_nfapi_pdu = -1; - -static int hf_nfapi_pnf_phy = -1; -static int hf_nfapi_pnf_phy_nfapi_tl = -1; /* structure hf_nfapi_tl*/ -static int hf_nfapi_pnf_phy_number_phy = -1; -static int hf_nfapi_pnf_phy_config_index = -1; -static int hf_nfapi_number_of_rf_exclusions = -1; -static int hf_nfapi_dl_bandwidth_support = -1; -static int hf_nfapi_ul_bandwidth_support = -1; -static int hf_nfapi_downlink_channel_bandwidth_supported = -1; -static int hf_nfapi_uplink_channel_bandwidth_supported = -1; -static int hf_nfapi_number_of_dl_layers_supported = -1; -static int hf_nfapi_number_of_ul_layers_supported = -1; -static int hf_nfapi_maximum_3gpp_release_supported = -1; -static int hf_nfapi_nmm_modes_supported = -1; - - -static int hf_nfapi_pnf_rf = -1; -static int hf_nfapi_pnf_rf_nfapi_tl = -1; -static int hf_nfapi_number_of_rfs = -1; -static int hf_nfapi_rf_config_index = -1; -static int hf_nfapi_band = -1; -static int hf_nfapi_maximum_transmit_power = -1; -static int hf_nfapi_earfcn = -1; -static int hf_nfapi_minimum_transmit_power = -1; -static int hf_nfapi_number_of_antennas_suppported = -1; -static int hf_nfapi_minimum_downlink_frequency = -1; -static int hf_nfapi_maximum_downlink_frequency = -1; -static int hf_nfapi_minimum_uplink_frequency = -1; -static int hf_nfapi_maximum_uplink_frequency = -1; - -static int hf_nfapi_number_of_rf_bands = -1; -static int hf_nfapi_nmm_uplink_rssi_supported = -1; - -static int hf_nfapi_phy_rf_config_info = -1; -static int hf_nfapi_phy_rf_config_info_phy_id = -1; -static int hf_nfapi_phy_rf_config_info_band = -1; - -static int hf_nfapi_pnf_phy_rf_config = -1; -static int hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info = -1; -static int hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info = -1; - -static int hf_nfapi_pnf_phy_rel10 = -1; -static int hf_nfapi_transmission_mode7_supported = -1; -static int hi_nfapi_transmission_mode8_supported = -1; -static int hi_nfapi_two_antennas_ports_for_pucch = -1; -static int hi_nfapi_transmission_mode_9_supported = -1; -static int hi_nfapi_simultaneous_pucch_pusch = -1; -static int hi_nfapi_for_layer_tx_with_tm3_and_tm4 = -1; - -static int hf_nfapi_pnf_phy_rel11 = -1; -static int hf_nfapi_epdcch_supported = -1; -static int hi_nfapi_multi_ack_csi_reporting = -1; -static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; -static int hi_nfapi_ul_comp_supported = -1; -static int hi_nfapi_transmission_mode_5_supported = -1; - -static int hf_nfapi_pnf_phy_rel12 = -1; -static int hf_nfapi_csi_subframe_set = -1; -static int hi_nfapi_enhanced_4tx_codebook = -1; -static int hi_nfapi_drs_supported = -1; -static int hi_nfapi_ul_64qam_supported = -1; -static int hi_nfapi_transmission_mode_10_supported = -1; -static int hi_nfapi_alternative_tbs_indices = -1; - -static int hf_nfapi_pnf_phy_rel13 = -1; -static int hf_nfapi_pucch_format_4_supported = -1; -static int hf_nfapi_pucch_format_5_supported = -1; -static int hf_nfapi_more_than_5_ca_supported = -1; -static int hf_nfapi_laa_supported = -1; -static int hf_nfapi_laa_ending_in_dwpts_supported = -1; -static int hf_nfapi_laa_starting_in_second_slot_supported = -1; -static int hf_nfapi_beamforming_supported = -1; -static int hf_nfapi_csi_rs_enhancements_supported = -1; -static int hf_nfapi_drms_enhancements_supported = -1; -static int hf_nfapi_srs_enhancements_supported = -1; - - -// P5 Message Structures -static int hf_nfapi_pnf_param_response_pnf_param_general = -1; -static int hf_nfapi_pnf_param_response_pnf_phy = -1; -static int hf_nfapi_pnf_param_response_pnf_rf = -1; - -static int hf_nfapi_pnf_param_request = -1; -static int hf_nfapi_pnf_param_response = -1; -static int hf_nfapi_pnf_config_request = -1; -static int hf_nfapi_pnf_config_response = -1; -static int hf_nfapi_pnf_start_request = -1; -static int hf_nfapi_pnf_start_response = -1; -static int hf_nfapi_pnf_stop_request = -1; -static int hf_nfapi_pnf_stop_response = -1; -static int hf_nfapi_param_response = -1; -static int hf_nfapi_start_request = -1; -static int hf_nfapi_start_response = -1; -static int hf_nfapi_stop_request = -1; -static int hf_nfapi_stop_response = -1; - -static int hf_nfapi_uint8_tag = -1; -static int hf_nfapi_uint16_tag = -1; - -static int hf_nfapi_error_code = -1; -static int hf_nfapi_p4_error_code = -1; -static int hf_nfapi_rat_type = -1; -static int hf_nfapi_num_tlv = -1; -static int hf_nfapi_phy_state = -1; -// static int hf_nfapi_bandwidth_support = -1; - -static int hf_nfapi_modulation_support = -1; -static int hf_nfapi_phy_antenna_capability = -1; -static int hf_nfapi_release_capability = -1; -static int hf_nfapi_mbsfn_capability = -1; - -static int hf_nfapi_laa_capability = -1; -static int hf_nfapi_pd_sensing_lbt_support = -1; -static int hf_nfapi_multi_carrier_lbt_support = -1; -static int hf_nfapi_partial_sf_support = -1; - -/* nfapi nfapi */ -static int hf_nfapi_pnf_address = -1; -static int hf_nfapi_pnf_address_ipv4 = -1; -static int hf_nfapi_pnf_address_ipv6 = -1; - -static int hf_nfapi_vnf_address = -1; -static int hf_nfapi_vnf_address_ipv4 = -1; -static int hf_nfapi_vnf_address_ipv6 = -1; - -static int hf_nfapi_pnf_port = -1; -static int hf_nfapi_vnf_port = -1; -static int hf_nfapi_dl_ue_per_sf = -1; -static int hf_nfapi_ul_ue_per_sf = -1; - -static int hf_nfapi_rf_bands = -1; -static int hf_nfapi_rf_bands_nfapi_tl = -1; -static int hf_nfapi_rf_bands_count = -1; -static int hf_nfapi_rf_bands_value = -1; - -static int hf_nfapi_timing_window = -1; -static int hf_nfapi_timing_info_mode = -1; -static int hf_nfapi_timing_info_period = -1; -static int hf_nfapi_max_transmit_power = -1; - -/* subframe config */ -static int hf_nfapi_duplex_mode = -1; -static int hf_nfapi_pcfich_power_offset = -1; -static int hf_nfapi_pb = -1; -static int hf_nfapi_dl_cyclic_prefix_type = -1; -static int hf_nfapi_ul_cyclic_prefix_type = -1; - -static int hf_nfapi_tx_antenna_ports = -1; -static int hf_nfapi_rx_antenna_ports = -1; - - - -/* RF Config */ -static int hf_nfapi_downlink_channel_bandwidth = -1; -static int hf_nfapi_uplink_channel_bandwidth = -1; -static int hf_nfapi_reference_signal_power = -1; - -/* PHICH config*/ -static int hf_nfapi_phich_resource = -1; -static int hf_nfapi_phich_duration = -1; -static int hf_nfapi_phich_power_offset = -1; - -static int hf_nfapi_value_float = -1; - -/* SCH Config */ -static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; -static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; -static int hf_nfapi_physical_cell_id = -1; - -/* PRACH config */ -static int hf_nfapi_configuration_index = -1; -static int hf_nfapi_root_sequence_index = -1; -static int hf_nfapi_zero_correlation_zone_configuration = -1; -static int hf_nfapi_high_speed_flag = -1; -static int hf_nfapi_frequency_offset = -1; - -/* PUSCH config */ -static int hf_nfapi_hopping_mode = -1; -static int hf_nfapi_hopping_offset = -1; - -/* PUCCH config */ -static int hf_nfapi_delta_pucch_shift = -1; -static int hf_nfapi_n_cqi_rb = -1; -static int hf_nfapi_n_an_cs = -1; -static int hf_nfapi_n1_pucch_an = -1; - -/* SRS config */ -static int hf_nfapi_bandwidth_configuration = -1; -static int hf_nfapi_max_up_pts = -1; -static int hf_nfapi_srs_subframe_configuration = -1; -static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; - -/* uplink reference signal config */ -static int hf_nfapi_uplink_rs_hopping = -1; -static int hf_nfapi_group_assignment = -1; -static int hf_nfapi_cyclic_shift_1_for_drms = -1; - -/* tdd frame structure */ -static int hf_nfapi_subframe_assignment = -1; -static int hf_nfapi_special_subframe_patterns = -1; - -/* laa config */ -static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; -static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; -static int hf_nfapi_pd_threshold = -1; -static int hf_nfapi_multi_carrier_type = -1; -static int hf_nfapi_multi_carrier_tx = -1; -static int hf_nfapi_multi_carrier_freeze = -1; -static int hf_nfapi_tx_antenna_ports_for_drs = -1; -static int hf_nfapi_transmission_power_for_drs = -1; - -/* eMTC config */ -static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; -static int hf_nfapi_prach_cat_m_root_sequence_index = -1; -static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; -static int hf_nfapi_prach_cat_m_high_speed_flag = -1; - -static int hf_nfapi_prach_ce_level_0_enable = -1; -static int hf_nfapi_prach_ce_level_0_configuration_index = -1; -static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; -static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; -static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; -static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; -static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; - -static int hf_nfapi_prach_ce_level_1_enable = -1; -static int hf_nfapi_prach_ce_level_1_configuration_index = -1; -static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; -static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; -static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; -static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; -static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; - -static int hf_nfapi_prach_ce_level_2_enable = -1; -static int hf_nfapi_prach_ce_level_2_configuration_index = -1; -static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; -static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; -static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; -static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; -static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; - -static int hf_nfapi_prach_ce_level_3_enable = -1; -static int hf_nfapi_prach_ce_level_3_configuration_index = -1; -static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; -static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; -static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; -static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; -static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; -static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; -static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; - -static int hf_nfapi_dl_modulation_support = -1; -static int hf_nfapi_ul_modulation_support = -1; - -/* 123 config */ -static int hf_nfapi_data_report_mode = -1; -static int hf_nfapi_sfnsf = -1; - -// P7 Sub Structures -static int hf_nfapi_dl_config_dci_dl_pdu_rel8 = -1; -static int hf_nfapi_dci_format = -1; -static int hf_nfapi_cce_idx = -1; -static int hf_nfapi_aggregation_level = -1; -static int hf_nfapi_mcs_1 = -1; -static int hf_nfapi_redundancy_version_1 = -1; -static int hf_nfapi_new_data_indicator_1 = -1; -static int hf_nfapi_mcs_2 = -1; -static int hf_nfapi_redundancy_version_2 = -1; -static int hf_nfapi_new_data_indicator_2 = -1; -static int hf_nfapi_harq_process = -1; -static int hf_nfapi_tpmi = -1; -static int hf_nfapi_pmi = -1; -static int hf_nfapi_precoding_information = -1; -static int hf_nfapi_tpc = -1; -static int hf_nfapi_downlink_assignment_index = -1; -static int hf_nfapi_transport_block_size_index = -1; -static int hf_nfapi_downlink_power_offset = -1; -static int hf_nfapi_allocate_prach_flag = -1; -static int hf_nfapi_preamble_index = -1; -static int hf_nfapi_prach_mask_index = -1; -static int hf_nfapi_rnti_type = -1; - -static int hf_nfapi_dl_config_dci_dl_pdu_rel9 = -1; -static int hf_nfapi_mcch_flag = -1; -static int hf_nfapi_mcch_change_notification = -1; -static int hf_nfapi_scrambling_identity = -1; - -static int hf_nfapi_dl_config_dci_dl_pdu_rel10 = -1; -static int hf_nfapi_cross_carrier_scheduling_flag = -1; -static int hf_nfapi_carrier_indicator = -1; -static int hf_nfapi_srs_flag = -1; -static int hf_nfapi_srs_request = -1; -static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; -static int hf_nfapi_total_dci_length_including_padding = -1; -static int hf_nfapi_n_dl_rb = -1; - -static int hf_nfapi_dl_config_dci_dl_pdu_rel11 = -1; -static int hf_nfapi_harq_ack_resource_offset = -1; -static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; -static int hf_nfapi_dl_config_dci_dl_pdu_rel12 = -1; -static int hf_nfapi_primary_cell_type = -1; -static int hf_nfapi_ul_dl_configuration_flag = -1; -static int hf_nfapi_number_of_ul_dl_configurations = -1; -static int hf_nfapi_ul_dl_configuration_index = -1; -static int hf_nfapi_dl_config_dci_dl_pdu_rel13 = -1; -static int hf_nfapi_laa_end_partial_sf_flag = -1; -static int hf_nfapi_laa_end_partial_sf_configuration = -1; -static int hf_nfapi_initial_lbt_sf = -1; -static int hf_nfapi_codebooksize_determination_r13 = -1; -static int hf_nfapi_rel13_drms_table_flag = -1; - - -static int hf_nfapi_dl_config_dci_dl_pdu = -1; -static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel8 = -1; -static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel9 = -1; -static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel10 = -1; - -static int hf_nfapi_bf_vector_antennas = -1; -static int hf_nfapi_subbands = -1; -static int hf_nfapi_bf_vectors = -1; -static int hf_nfapi_csi_rs_resource_config = -1; -static int hf_nfapi_csi_rs_number_if_nzp_configurations = -1; -static int hf_nfapi_csi_rs_resource_configs = -1; -static int hf_nfapi_pdsch_start = -1; -static int hf_nfapi_drms_config_flag = -1; -static int hf_nfapi_drms_scrambling = -1; -static int hf_nfapi_csi_config_flag = -1; -static int hf_nfapi_csi_scrambling = -1; -static int hf_nfapi_pdsch_re_mapping_flag = -1; -static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; -static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; -static int hf_nfapi_alt_cqi_table_r12 = -1; -static int hf_nfapi_max_layers = -1; -static int hf_nfapi_n_dl_harq = -1; -static int hf_nfapi_dwpts_symbols = -1; -static int hf_nfapi_ue_type = -1; -static int hf_nfapi_pdsch_payload_type = -1; -static int hf_nfapi_initial_transmission_sf = -1; -static int hf_nfapi_req13_drms_table_flag = -1; -static int hf_nfapi_prnti = -1; -static int hf_nfapi_mcs = -1; -static int hf_nfapi_number_of_transport_blocks = -1; -static int hf_nfapi_ue_mode = -1; -static int hf_prs_bandwidth = -1; -static int hf_prs_cyclic_prefix_type = -1; -static int hf_prs_muting = -1; -static int hf_nfapi_csi_rs_number_of_nzp_configuration = -1; -static int hf_nfapi_csi_rs_resource_index = -1; -static int hf_nfapi_csi_rs_class = -1; -static int hf_nfapi_cdm_type = -1; -static int hf_nfapi_csi_rs_bf_vector = -1; -static int hf_nfapi_edpcch_prb_index = -1; -static int hf_nfapi_epdcch_resource_assignment_flag = -1; -static int hf_nfapi_epdcch_id = -1; -static int hf_nfapi_epdcch_start_symbol = -1; -static int hf_nfapi_epdcch_num_prb = -1; -static int hf_nfapi_epdcch_prbs = -1; -static int hf_nfapi_precoding_value = -1; -static int hf_nfapi_mpdcch_narrowband = -1; -static int hf_nfapi_number_of_prb_pairs = -1; -static int hf_nfapi_resource_block_assignment = -1; -static int hf_nfapi_start_symbol = -1; -static int hf_nfapi_ecce_index = -1; -static int hf_nfapi_ce_mode = -1; -static int hf_nfapi_drms_scrabmling_init = -1; -static int hf_nfapi_pdsch_reception_levels = -1; -static int hf_nfapi_new_data_indicator = -1; -static int hf_nfapi_tpmi_length = -1; -static int hf_nfapi_pmi_flag = -1; -static int hf_nfapi_harq_resource_offset = -1; -static int hf_nfapi_dci_subframe_repetition_number = -1; -static int hf_nfapi_downlink_assignment_index_length = -1; -static int hf_nfapi_starting_ce_level = -1; -static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; -static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; -static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; -static int hf_nfapi_direct_indication = -1; -static int hf_nfapi_number_of_tx_antenna_ports = -1; -static int hf_nfapi_precoding = -1; - - - -// P7 Message Structures -static int hf_nfapi_dl_node_sync = -1; -static int hf_nfapi_dl_node_sync_nfapi_p7_message_header = -1; -static int hf_nfapi_dl_node_sync_t1 = -1; -static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; - -static int hf_nfapi_ul_node_sync = -1; -static int hf_nfapi_ul_node_sync_nfapi_p7_message_header = -1; -static int hf_nfapi_ul_node_sync_t1 = -1; -static int hf_nfapi_ul_node_sync_t2 = -1; -static int hf_nfapi_ul_node_sync_t3 = -1; - -static int hf_nfapi_timing_info = -1; -static int hf_nfapi_timing_info_nfapi_p7_message_header = -1; -static int hf_nfapi_timing_info_last_sfn_sf = -1; -static int hf_nfapi_timing_info_time_since_last_timing_info = -1; -static int hf_nfapi_timing_info_dl_config_jitter = -1; -static int hf_nfapi_timing_info_tx_request_jitter = -1; -static int hf_nfapi_timing_info_ul_config_jitter = -1; -static int hf_nfapi_timing_info_hi_dci0_jitter = -1; -static int hf_nfapi_timing_info_dl_config_latest_delay = -1; -static int hf_nfapi_timing_info_tx_request_latest_delay = -1; -static int hf_nfapi_timing_info_ul_config_latest_delay = -1; -static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; -static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; -static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; -static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; -static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; - -static int hf_nfapi_dl_config_request = -1; -static int hf_nfapi_sfn_sf = -1; - -static int hf_nfapi_dl_config_request_body = -1; -static int hf_nfapi_number_pdcch_ofdm_symbols = -1; -static int hf_nfapi_number_dci = -1; -static int hf_nfapi_number_pdus = -1; -static int hf_nfapi_number_pdsch_rnti = -1; -static int hf_nfapi_transmission_power_pcfich = -1; - -static int hf_nfapi_number_of_harqs = -1; -static int hf_nfapi_number_of_crcs = -1; -static int hf_nfapi_number_of_srs = -1; -static int hf_nfapi_number_of_cqi = -1; -static int hf_nfapi_number_of_preambles = -1; -static int hf_nfapi_number_of_srss = -1; -static int hf_nfapi_lbt_dl_req_pdu_type = -1; -static int hf_nfapi_lbt_dl_ind_pdu_type = -1; - -static int hf_nfapi_dl_config_request_pdu_list = -1; -static int hf_nfapi_ul_config_request_pdu_list = -1; -static int hf_nfapi_hi_dci0_request_pdu_list = -1; -static int hf_nfapi_tx_request_pdu_list = -1; -static int hf_nfapi_rx_indication_pdu_list = -1; -static int hf_nfapi_harq_indication_pdu_list = -1; -static int hf_nfapi_crc_indication_pdu_list = -1; -static int hf_nfapi_sr_indication_pdu_list = -1; -static int hf_nfapi_cqi_indication_pdu_list = -1; -static int hf_nfapi_preamble_indication_pdu_list = -1; -static int hf_nfapi_srs_indication_pdu_list = -1; -static int hf_nfapi_lbt_dl_config_pdu_list = -1; -static int hf_nfapi_lbt_dl_indication_pdu_list = -1; - - -static int hf_nfapi_dl_config_pdu_type = -1; -static int hf_nfapi_pdu_size = -1; -static int hf_nfapi_instance_length = -1; - -static int hf_nfapi_dl_config_dlsch_pdu_rel8 = -1; -static int hf_nfapi_length; -static int hf_nfapi_pdu_index = -1; -static int hf_nfapi_rnti = -1; -static int hf_nfapi_resource_allocation_type = -1; -static int hf_nfapi_virtual_resource_block_assignment_flag = -1; -static int hf_nfapi_resource_block_coding = -1; -static int hf_nfapi_modulation = -1; -static int hf_nfapi_redundancy_version = -1; -static int hf_nfapi_transport_blocks = -1; -static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; -static int hf_nfapi_transmission_scheme = -1; -static int hf_nfapi_ul_transmission_scheme = -1; -static int hf_nfapi_number_of_layers = -1; -static int hf_nfapi_number_of_subbands = -1; -static int hf_nfapi_codebook_index = -1; -static int hf_nfapi_ue_category_capacity = -1; -static int hf_nfapi_pa = -1; -static int hf_nfapi_delta_power_offset_index = -1; -static int hf_nfapi_ngap = -1; -static int hf_nfapi_nprb = -1; -static int hf_nfapi_transmission_mode = -1; -static int hf_nfapi_num_bf_prb_per_subband = -1; - -static int hf_nfapi_num_bf_vector = -1; -static int hf_nfapi_bf_vector_subband_index = -1; -static int hf_nfapi_bf_vector_num_antennas = -1; -static int hf_nfapi_bf_vector_bf_value = -1; - -static int hf_nfapi_dl_config_dlsch_pdu_rel9 = -1; -static int hf_nfapi_nscid = -1; - -static int hf_nfapi_dl_config_dlsch_pdu_rel10 = -1; -static int hf_nfapi_csi_rs_flag = -1; -static int hf_nfapi_csi_rs_resource_config_r10 = -1; -static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; - -static int hf_nfapi_dl_config_bch_pdu_rel8 = -1; -static int hf_nfapi_transmission_power = -1; - -static int hf_nfapi_dl_config_mch_pdu_rel8 = -1; -static int hf_nfapi_mbsfn_area_id = -1; - -static int hf_nfapi_dl_config_pch_pdu_rel8 = -1; - -static int hf_nfapi_dl_config_prs_pdu_rel9 = -1; -static int hf_nfapi_prs_bandwidth = -1; -static int hf_nfapi_prs_cyclic_prefix_type = -1; - -static int hf_nfapi_dl_config_csi_rs_pdu_rel10 = -1; -static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; - -static int hf_nfapi_ul_config_request = -1; -static int hf_nfapi_ul_config_request_body = -1; -static int hf_nfapi_ul_config_pdu_type = -1; - -static int hf_nfapi_rach_prach_frequency_resources = -1; -static int hf_nfapi_srs_present = -1; -static int hf_nfapi_ul_config_harq_buffer_pdu = -1; - -static int hf_nfapi_ul_config_ue_information_rel8 = -1; -static int hf_nfapi_handle = -1; -static int hf_nfapi_ul_config_sr_information_pdu_rel8 = -1; -static int hf_nfapi_pucch_index = -1; -static int hf_nfapi_size = -1; -static int hf_nfapi_resource_block_start = -1; -static int hf_nfapi_number_of_resource_blocks = -1; -static int hf_nfapi_cyclic_shift_2_for_drms = -1; -static int hf_nfapi_frequency_hopping_enabled_flag = -1; -static int hf_nfapi_frequency_hopping_bits = -1; -static int hf_nfapi_new_data_indication = -1; -static int hf_nfapi_harq_process_number = -1; -static int hf_nfapi_ul_tx_mode = -1; -static int hf_nfapi_current_tx_nb = -1; -static int hf_nfapi_n_srs = -1; -static int hf_nfapi_disable_sequence_hopping_flag = -1; -static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; -static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; -static int hf_nfapi_ri_size = -1; -static int hf_nfapi_delta_offset_cqi = -1; -static int hf_nfapi_delta_offset_ri = -1; -static int hf_nfapi_harq_size = -1; -static int hf_nfapi_delta_offset_harq = -1; -static int hf_nfapi_ack_nack_mode = -1; -static int hf_nfapi_n_srs_initial = -1; -static int hf_nfapi_initial_number_of_resource_blocks = -1; -static int hf_nfapi_dl_cqi_pmi_size = -1; -static int hf_nfapi_report_type = -1; -static int hf_nfapi_dl_cqi_ri_pmi_size = -1; -static int hf_nfapi_control_type = -1; -static int hf_nfapi_number_of_cc = -1; -static int hf_nfapi_virtual_cell_id_enabled_flag = -1; -static int hf_nfapi_npusch_identity = -1; -static int hf_nfapi_ndrms_csh_identity = -1; -static int hf_nfapi_total_number_of_repetitions = -1; -static int hf_nfapi_repetition_number = -1; -static int hf_nfapi_initial_sf_io = -1; -static int hf_nfapi_empty_symbols_due_to_retunning = -1; -static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; -static int hf_nfapi_npucch_identity = -1; -static int hf_nfapi_harq_size_2 = -1; -static int hf_nfapi_delta_offset_harq_2 = -1; -static int hf_nfapi_empty_symbols = -1; -static int hf_nfapi_total_number_of_repetitons = -1; -static int hf_nfapi_csi_mode = -1; -static int hf_nfapi_dl_cqi_pmi_size_2 = -1; -static int hf_nfapi_statring_prb = -1; -static int hf_nfapi_cdm_index = -1; -static int hf_nfapi_nsrs = -1; -static int hf_nfapi_num_ant_ports = -1; -static int hf_nfapi_n_pucch_2_0 = -1; -static int hf_nfapi_n_pucch_2_1 = -1; -static int hf_nfapi_n_pucch_2_2 = -1; -static int hf_nfapi_n_pucch_2_3 = -1; -static int hf_nfapi_starting_prb = -1; -static int hf_nfapi_antenna_port = -1; -static int hf_nfapi_number_of_combs = -1; - - - -static int hf_nfapi_number_of_pucch_resource = -1; -static int hf_nfapi_pucch_index_p1 = -1; -static int hf_nfapi_n_pucch_1_0 = -1; -static int hf_nfapi_n_pucch_1_1 = -1; -static int hf_nfapi_n_pucch_1_2 = -1; -static int hf_nfapi_n_pucch_1_3 = -1; -static int hf_nfapi_srs_bandwidth = -1; -static int hf_nfapi_frequency_domain_position = -1; -static int hf_nfapi_srs_hopping_bandwidth = -1; -static int hf_nfapi_transmission_comb = -1; -static int hf_nfapi_i_srs = -1; -static int hf_nfapi_sounding_reference_cyclic_shift = -1; -static int hf_nfapi_antenna_ports = -1; -static int hf_nfapi_ul_config_srs_pdu_rel10 = -1; -static int hf_nfapi_ul_config_srs_pdu_rel8 = -1; -static int hf_nfapi_ul_config_harq_information_rel9_fdd = -1; -static int hf_nfapi_ul_config_harq_information_rel8_fdd = -1; -static int hf_nfapi_ul_config_harq_information_rel10_tdd = -1; -static int hf_nfapi_ul_config_sr_information_rel10 = -1; -static int hf_nfapi_ul_config_sr_information_rel8 = -1; -static int hf_nfapi_ul_config_cqi_information_rel10 = -1; -static int hf_nfapi_ul_config_cqi_information_rel8 = -1; -static int hf_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; -static int hf_nfapi_ul_config_ulsch_harq_information_rel10 = -1; - -/* Tx request */ -static int hf_nfapi_pdu_length = -1; -static int hf_nfapi_num_segments = -1; -static int hf_nfapi_segment_length = -1; -static int hf_nfapi_segment_data = -1; - -/* CRC Indication */ -static int hf_nfapi_crc_indication_body = -1; -static int hf_nfapi_crc_flag = -1; - -static int hf_nfapi_number_of_hi_pdus = -1; -static int hf_nfapi_number_of_dci_pdus = -1; -static int hf_nfapi_pdu_type = -1; -static int hf_nfapi_hi_value = -1; -static int hf_nfapi_i_phich = -1; -static int hf_nfapi_flag_tb2 = -1; -static int hf_nfapi_hi_value_2 = -1; -static int hf_nfapi_ue_tx_antenna_selection = -1; -static int hf_nfapi_cqi_csi_request = -1; -static int hf_nfapi_ul_index = -1; -static int hf_nfapi_dl_assignment_index = -1; -static int hf_nfapi_tpc_bitmap = -1; -static int hf_nfapi_new_data_indication_two = -1; -static int hf_nfapi_size_of_cqi_csi_feild = -1; -static int hf_nfapi_resource_allocation_flag = -1; -static int hf_nfapi_number_of_antenna_ports =-1 ; - -static int hf_nfapi_n_ul_rb = -1; -static int hf_nfapi_pscch_resource = -1; -static int hf_nfapi_time_resource_pattern = -1; -static int hf_nfapi_mpdcch_transmission_type = -1; -static int hf_nfapi_drms_scrambling_init = -1; -static int hf_nfapi_pusch_repetition_levels = -1; -static int hf_nfapi_frequency_hopping_flag = -1; -static int hf_nfapi_csi_request = -1; -static int hf_nfapi_dai_presence_flag = -1; -static int hf_nfapi_total_dci_length_include_padding = -1; -static int hf_nfapi_data_offset = -1; -static int hf_nfapi_ul_cqi = -1; -static int hf_nfapi_timing_advance_r9 = -1; -static int hf_nfapi_timing_advance = -1; -static int hf_nfapi_harq_data_value_0 = -1; -static int hf_nfapi_harq_data_value_1 = -1; -static int hf_nfapi_harq_data_value_2 = -1; -static int hf_nfapi_harq_data_value_3 = -1; -static int hf_nfapi_harq_mode = -1; -static int hf_nfapi_number_of_ack_nack = -1; -static int hf_nfapi_harq_ack_nack_data = -1; -static int hf_nfapi_harq_tb_1 = -1; -static int hf_nfapi_harq_tb_2 = -1; -static int hf_nfapi_harq_tb_n = -1; -static int hf_nfapi_harq_data = -1; -static int hf_nfapi_channel = -1; -static int hf_nfapi_ri = -1; -static int hf_nfapi_number_of_cc_reported = -1; -static int hf_nfapi_cc = -1; -static int hf_nfapi_preamble = -1; -static int hf_nfapi_rach_resource_type = -1; -static int hf_nfapi_snr = -1; -static int hf_nfapi_doppler_estimation = -1; -static int hf_nfapi_rb_start = -1; -static int hf_nfapi_rbs = -1; -static int hf_nfapi_up_pts_symbol = -1; -static int hf_nfapi_number_prb_per_subband = -1; -static int hf_nfapi_number_antennas = -1; -static int hf_nfapi_subband_index = -1; -static int hf_nfapi_antennas = -1; -static int hf_nfapi_channel_coefficient = -1; -static int hf_nfapi_ul_rtoa = -1; -static int hf_nfapi_mp_cca = -1; -static int hf_nfapi_n_cca = -1; -static int hf_nfapi_offset = -1; -static int hf_nfapi_lte_txop_sf = -1; -static int hf_nfapi_txop_sfn_sf_end = -1; -static int hf_nfapi_lbt_mode = -1; -static int hf_nfapi_sfn_sf_end = -1; -static int hf_nfapi_result = -1; -static int hf_nfapi_txop_symbols = -1; -static int hf_nfapi_initial_partial_sf = -1; - - -static int hf_nfapi_frequency_band_indicator = -1; -static int hf_nfapi_measurement_period = -1; -static int hf_nfapi_bandwidth = -1; -static int hf_nfapi_timeout = -1; -static int hf_nfapi_number_of_earfcns = -1; -static int hf_nfapi_earfcn_list = -1; -static int hf_nfapi_uarfcn = -1; -static int hf_nfapi_number_of_uarfcns = -1; -static int hf_nfapi_uarfcn_list = -1; -static int hf_nfapi_arfcn = -1; -static int hf_nfapi_arfcn_direction = -1; -static int hf_nfapi_number_of_arfcns = -1; -static int hf_nfapi_arfcn_list = -1; -static int hf_nfapi_rssi = -1; -static int hf_nfapi_number_of_rssi = -1; -static int hf_nfapi_rssi_list = -1; -static int hf_nfapi_pci = -1; -static int hf_nfapi_measurement_bandwidth = -1; -static int hf_nfapi_exhaustive_search = -1; -static int hf_nfapi_number_of_pci = -1; -static int hf_nfapi_pci_list = -1; -static int hf_nfapi_psc = -1; -static int hf_nfapi_number_of_psc = -1; -static int hf_nfapi_psc_list = -1; -static int hf_nfapi_rsrp = -1; -static int hf_nfapi_rsrq = -1; -static int hf_nfapi_number_of_lte_cells_found = -1; -static int hf_nfapi_lte_cells_found_list = -1; -static int hf_nfapi_rscp = -1; -static int hf_nfapi_enco = -1; -static int hf_nfapi_number_of_utran_cells_found = -1; -static int hf_nfapi_utran_cells_found_list = -1; -static int hf_nfapi_bsic = -1; -static int hf_nfapi_rxlev = -1; -static int hf_nfapi_rxqual = -1; -static int hf_nfapi_sfn_offset = -1; -static int hf_nfapi_number_of_geran_cells_found = -1; -static int hf_nfapi_geran_cells_found_list = -1; -static int hf_nfapi_number_of_tx_antenna = -1; -static int hf_nfapi_mib_length = -1; -static int hf_nfapi_mib = -1; -static int hf_nfapi_phich_configuration = -1; -static int hf_nfapi_retry_count = -1; -static int hf_nfapi_sib1 = -1; -static int hf_nfapi_si_periodicity = -1; -static int hf_nfapi_si_index = -1; -static int hf_nfapi_number_of_si_periodicity = -1; -static int hf_nfapi_si_periodicity_list = -1; -static int hf_nfapi_si_window_length = -1; -static int hf_nfapi_sib_type = -1; -static int hf_nfapi_sib_len = -1; -static int hf_nfapi_sib = -1; -static int hf_nfapi_si_len = -1; -static int hf_nfapi_si = -1; - -static int hf_nfapi_pnf_search_state = -1; -static int hf_nfapi_pnf_broadcast_state = -1; - -static const value_string message_id_vals[] = { { 0x80, "DL_CONFIG.request"}, - { 0x81, "UL_CONFIG.request"}, - { 0x82, "SUBFRAME_INDICATION"}, - { 0x83, "HI_DCI0.request"}, - { 0x84, "TX.request"}, - { 0x85, "HARQ.indication"}, - { 0x86, "CRC.indication"}, - { 0x87, "RX_ULSCH.indication"}, - { 0x88, "RACH.indication" }, - { 0x89, "SRS.indication" }, - { 0x8A, "RX_SR.indication" }, - { 0x8B, "RX_CQI.indication" }, - { 0x8C, "LBT_DL_CONFIG.request" } , - { 0x8D, "LBT_DL.indication" } , - - { 0x0100, "PNF_PARAM.request" }, - { 0x0101, "PNF_PARAM.response" }, - { 0x0102, "PNF_CONFIG.request" }, - { 0x0103, "PNF_CONFIG.response" }, - { 0x0104, "PNF_START.request" }, - { 0x0105, "PNF_START.response" }, - { 0x0106, "PNF_STOP.request" }, - { 0x0107, "PNF_STOP.response" }, - { 0x0108, "PARAM.request" }, - { 0x0109, "PARAM.response" }, - { 0x010A, "CONFIG.request" }, - { 0x010B, "CONFIG.response" }, - { 0x010C, "START.request" }, - { 0x010D, "START.response" }, - { 0x010E, "STOP.request" }, - { 0x010F, "STOP.response" }, - { 0x0110, "MEASUREMENT.request" }, - { 0x0111, "MEASUREMENT.response" }, - - { 0x0180, "UL_NODE_SYNC" }, - { 0x0181, "DL_NODE_SYNC" }, - { 0x0182, "TIMING_INFO" }, - - { 0x0200, "RSSI.request" }, - { 0x0201, "RSSI.response" }, - { 0x0202, "RSSI.indication" }, - { 0x0203, "CELL_SEARCH.request" }, - { 0x0204, "CELL_SEARCH.response" }, - { 0x0205, "CELL_SEARCH.indication" }, - { 0x0206, "BROADCAST_DETECT.request" }, - { 0x0207, "BROADCAST_DETECT.response" }, - { 0x0208, "BROADCAST_DETECT.indication" }, - { 0x0209, "SYSTEM_INFORMATION_SCHEDULE.request" }, - { 0x020A, "SYSTEM_INFORMATION_SCHEDULE.response" }, - { 0x020B, "SYSTEM_INFORMATION_SCHEDULE.indication" }, - { 0x020C, "SYSTEM_INFORMATION.request" }, - { 0x020D, "SYSTEM_INFORMATION.response" }, - { 0x020E, "SYSTEM_INFORMATION.indication" }, - { 0x020F, "NMM_STOP.request" }, - { 0x0210, "NMM_STOP.response" }, - - { 0 , NULL }, -}; - - -typedef int(*tlv_decode)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); - -typedef struct -{ - uint16_t tag_id; - char* name; - tlv_decode decode; -} tlv_t; - -static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint end); - - - - -static guint8 proto_tree_add_uint8(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) -{ - guint8 value = tvb_get_guint8(tvb, *offset); - proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); - - if (units != NULL) - { - proto_item_append_text(item, " "); - proto_item_append_text(item, units); - } - - *offset += 1; - - return value; -} - -static guint8 proto_tree_add_uint8_with_range(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, packet_info *pinfo, guint8 min, guint8 max, char* units) -{ - guint8 value = tvb_get_guint8(tvb, *offset); - proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); - - if (units != NULL) - { - proto_item_append_text(item, " "); - proto_item_append_text(item, units); - } - - *offset += 1; - - if (value < min || value > max) - { - expert_add_info(pinfo, tree, &ei_invalid_range); - } - - - return value; -} - -static guint16 proto_tree_add_uint16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) -{ - guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); - proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); - - if (units != NULL) - { - proto_item_append_text(item, " "); - proto_item_append_text(item, units); - } - - *offset += 2; - - return value; -} - -static void proto_tree_add_int16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) -{ - proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); - - if (units != NULL) - { - proto_item_append_text(item, " "); - proto_item_append_text(item, units); - } - - *offset += 2; -} - -typedef int(*uint8_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value); - -static guint8 proto_tree_add_uint8_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint8_value_conversion conversion) -{ - guint8 value = tvb_get_guint8(tvb, *offset); - - conversion(tree, hfindex, tvb, offset, value); - - *offset += 1; - - return value; -} - -typedef int(*uint16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value); - -static guint16 proto_tree_add_uint16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint16_value_conversion conversion) -{ - guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); - - conversion(tree, hfindex, tvb, offset, value); - - *offset += 2; - - return value; -} - -typedef int(*int16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value); - -static gint16 proto_tree_add_int16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, int16_value_conversion conversion) -{ - gint16 value = (gint16)(tvb_get_guint16(tvb, *offset, ENC_NA)); - - conversion(tree, hfindex, tvb, offset, value); - - *offset += 2; - - return value; -} - - -static void proto_tree_add_uint32(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) -{ - proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 4, ENC_NA); - - if (units != NULL) - { - proto_item_append_text(item, " "); - proto_item_append_text(item, units); - } - - *offset += 4; -} - -static void proto_tree_add_uint8_array(proto_tree *tree, int hfindex, guint len, tvbuff_t *tvb, guint* offset) -{ - proto_tree_add_item(tree, hfindex, tvb, *offset, len, ENC_NA); - - *offset += len; -} - - - - - -int dissect_array_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end, const char* name, guint32 hf_idx, guint32 ett_idx, guint32 count, tlv_decode decode) -{ - guint16 i = 0; - - if (count > 0) - { - proto_item *list_ti = proto_tree_add_string_format(tree, hf_idx, tvb, *offset, 2, "", name); - proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_idx); - - gint start_of_list = *offset; - - for (i = 0; i < count; ++i) - { - proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_idx, tvb, *offset, 2, "", "[%d]", i); - proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_idx); - - gint start_of_item = *offset; - - decode(tvb, pinfo, item_tree, data, offset, end); - - if (item_ti != NULL) - item_ti->finfo->length = *offset - start_of_item; - } - - if (list_ti != NULL) - list_ti->finfo->length = *offset - start_of_list; - } - - return 0; -} - -int dissect_pnf_param_general_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_sync_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_location_mode, tvb, offset, 0); - guint16 len = proto_tree_add_uint16(tree, hf_nfapi_location_coordinates_length, tvb, offset, 0); - if (len > 0) - proto_tree_add_uint8_array(tree, hf_nfapi_location_coordinates, len, tvb, offset); - proto_tree_add_uint32(tree, hf_nfapi_dl_config_timing, tvb, offset, "milliseconds"); - proto_tree_add_uint32(tree, hf_nfapi_tx_timing, tvb, offset, "milliseconds"); - proto_tree_add_uint32(tree, hf_nfapi_ul_config_timing, tvb, offset, "milliseconds"); - proto_tree_add_uint32(tree, hf_nfapi_hi_dci0_timing, tvb, offset, "milliseconds"); - proto_tree_add_uint16(tree, hf_nfapi_maximum_number_phys, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_maximum_total_bandwidth, tvb, offset, "(100 khz)"); - proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_dl_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_ul_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_shared_bands, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_shared_pa, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_maximum_total_power, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_oui, 3, tvb, offset); - - return 0; -} - -int dissect_pnf_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); - return 0; -} - -int dissect_pnf_phy_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - guint16 num_rf_configs = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Config List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); - guint16 num_rf_exclusions = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_exclusions, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Exclustion List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); - proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_uplink_channel_bandwidth_supported, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_dl_layers_supported, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_layers_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_maximum_3gpp_release_supported, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nmm_modes_supported, tvb, offset, 0); - return 0; -} - -int dissect_pnf_phy_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); - - - return 0; - -} - - -int dissect_pnf_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_minimum_transmit_power, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_antennas_suppported, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_minimum_downlink_frequency, tvb, offset, "(100 khz)"); - proto_tree_add_uint32(tree, hf_nfapi_maximum_downlink_frequency, tvb, offset, "(100 khz)"); - proto_tree_add_uint32(tree, hf_nfapi_minimum_uplink_frequency, tvb, offset, "(100 khz)"); - proto_tree_add_uint32(tree, hf_nfapi_maximum_uplink_frequency, tvb, offset, "(100 khz)"); - - return 0; -} - - -int dissect_pnf_rf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_rf = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF List", hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); - - return 0; - -} - -int dissect_pnf_phy_rel10_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_transmission_mode7_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_transmission_mode8_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_two_antennas_ports_for_pucch, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_9_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_simultaneous_pucch_pusch, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_for_layer_tx_with_tm3_and_tm4, tvb, offset, 0); - - return 0; -} - -int dissect_pnf_phy_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 10 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); - - return 0; -} - -int dissect_pnf_phy_rel11_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_epdcch_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_multi_ack_csi_reporting, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_pucch_tx_diversity_with_channel_selection, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_ul_comp_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_5_supported, tvb, offset, 0); - return 0; -} - -int dissect_pnf_phy_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 11 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); - return 0; -} - -int dissect_pnf_phy_rel12_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_csi_subframe_set, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_enhanced_4tx_codebook, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_drs_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_ul_64qam_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_10_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hi_nfapi_alternative_tbs_indices, tvb, offset, 0); - return 0; -} - -int dissect_pnf_phy_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 12 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); - return 0; -} - -int dissect_pnf_phy_rel13_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pucch_format_4_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pucch_format_5_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_more_than_5_ca_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_laa_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_laa_ending_in_dwpts_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_laa_starting_in_second_slot_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_beamforming_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_csi_rs_enhancements_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_drms_enhancements_supported, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_srs_enhancements_supported, tvb, offset, 0); - return 0; -} - -int dissect_pnf_phy_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 13 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); - return 0; -} - -int dissect_pnf_phy_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_phy_rf_config_info_phy_id, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); - return 0; -} - - -int dissect_pnf_phy_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_configs = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY RF Config List", hf_nfapi_pnf_phy_rf_config, ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); - return 0; -} - -int bandwidth_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - /* - guint8 comma = 0; - - proto_item_append_text(item, "("); - - if (value & 0x1) - { - proto_item_append_text(item, "6 Mhz"); - comma = 1; - } - - if (comma) - proto_item_append_text(item, ", "); - - if (value & 0x2) - { - proto_item_append_text(item, "15 Mhz"); - comma = 1; - } - - if (comma) - proto_item_append_text(item, ", "); - - if (value & 0x4) - { - proto_item_append_text(item, "25 Mhz"); - comma = 1; - } - - if (comma) - proto_item_append_text(item, ", "); - - if (value & 0x8) - { - proto_item_append_text(item, "50 Mhz"); - comma = 1; - } - - if (comma) - proto_item_append_text(item, ", "); - - if (value & 0x10) - { - proto_item_append_text(item, "75 Mhz"); - comma = 1; - } - - if (comma) - proto_item_append_text(item, ", "); - - if (value & 0x20) - { - proto_item_append_text(item, "100 Mhz"); - comma = 1; - } - - proto_item_append_text(item, ")"); - */ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); - return 0; - -} - -int sfn_sf_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%d/%d (%d)", value >> 3, value & 0x0007, value); - return 0; -} - - -int dissect_duplex_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_duplex_mode, tvb, offset, 0); - return 0; -} - -int power_offset_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.001) - 6.0), value); - return 0; -} - -int dissect_pcfich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 value = proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pcfich_power_offset, tvb, offset, power_offset_conversion); - - if (value > 10000) - { - expert_add_info(pinfo, tree, &ei_power_invalid); - } - - return 0; -} - -int dissect_pb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 value = proto_tree_add_uint16(tree, hf_nfapi_pb, tvb, offset, 0); - - if (value > 3) - { - expert_add_info(pinfo, tree, &ei_power_invalid); - } - return 0; -} - -int dissect_dl_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_dl_cyclic_prefix_type, tvb, offset, 0); - return 0; -} -int dissect_ul_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_ul_cyclic_prefix_type, tvb, offset, 0); - return 0; -} -int dissect_dl_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, bandwidth_conversion); - return 0; -} -int dissect_ul_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_uplink_channel_bandwidth, tvb, offset, bandwidth_conversion); - return 0; -} - - -int reference_signal_power_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.25) - 63.75), value); - return 0; -} - -int dissect_reference_signal_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_reference_signal_power, tvb, offset, reference_signal_power_conversion); - return 0; -} -int dissect_tx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports, tvb, offset, 0); - return 0; -} -int dissect_rx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_rx_antenna_ports, tvb, offset, 0); - return 0; -} -int dissect_phich_resource_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_phich_resource, tvb, offset, 0); - return 0; -} -int dissect_phich_duration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_phich_duration, tvb, offset, 0); - return 0; -} -int dissect_phich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_phich_power_offset, tvb, offset, power_offset_conversion); - return 0; -} -int dissect_psch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_primary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); - return 0; -} -int dissect_physical_cell_id_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_physical_cell_id, tvb, offset, 0); - return 0; -} -int dissect_ssch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_secondary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); - return 0; -} -int dissect_prach_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_configuration_index, tvb, offset, 0); - return 0; -} -int dissect_prach_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_root_sequence_index, tvb, offset, 0); - return 0; -} -int dissect_prach_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_zero_correlation_zone_configuration, tvb, offset, 0); - return 0; -} -int dissect_prach_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_high_speed_flag, tvb, offset, 0); - return 0; -} -int dissect_prach_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); - return 0; -} -int dissect_pusch_hopping_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_hopping_mode, tvb, offset, 0); - return 0; -} -int dissect_pusch_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_hopping_offset, tvb, offset, 0); - return 0; -} -int dissect_pusch_number_of_subbands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); - return 0; -} -int dissect_pucch_delta_pucch_shift_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_delta_pucch_shift, tvb, offset, 0); - return 0; -} -int dissect_pucch_n_cqi_rb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_n_cqi_rb, tvb, offset, 0); - return 0; -} -int dissect_pucch_n_an_cs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_n_an_cs, tvb, offset, 0); - return 0; -} -int dissect_pucch_n1_pucch_an_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_n1_pucch_an, tvb, offset, 0); - return 0; -} -int dissect_srs_bandwidth_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_bandwidth_configuration, tvb, offset, 0); - return 0; -} -int dissect_srs_max_uppts_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_max_up_pts, tvb, offset, 0); - return 0; -} -int dissect_srs_subframe_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_srs_subframe_configuration, tvb, offset, 0); - return 0; -} -int dissect_srs_acknack_srs_sim_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_srs_acknack_srs_simultaneous_transmission, tvb, offset, 0); - return 0; -} -int dissect_uplink_rs_hopping_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_uplink_rs_hopping, tvb, offset, 0); - return 0; -} -int dissect_group_assignment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_group_assignment, tvb, offset, 0); - return 0; -} -int dissect_cyclic_shift_1_for_drms_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_cyclic_shift_1_for_drms, tvb, offset, 0); - return 0; -} -int dissect_tdd_subframe_assignement_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_subframe_assignment, tvb, offset, 0); - return 0; -} -int dissect_tdd_subframe_patterns_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_special_subframe_patterns, tvb, offset, 0); - return 0; -} - -int laa_threshold_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (float)(value * -100.00), value); - return 0; -} - -int dissect_laa_ed_threashold_for_lbt_for_pdsch_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_pdsch, tvb, offset, laa_threshold_conversion); - return 0; -} -int dissect_laa_ed_threashold_for_lbt_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_drs, tvb, offset, laa_threshold_conversion); - return 0; -} -int dissect_laa_pd_threshold_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pd_threshold, tvb, offset, laa_threshold_conversion); - return 0; -} -int dissect_laa_multi_carrier_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_type, tvb, offset, 0); - return 0; -} -int dissect_laa_multi_carrier_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_tx, tvb, offset, 0); - return 0; -} -int dissect_laa_multi_carrier_freeze_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_freeze, tvb, offset, 0); - return 0; -} -int dissect_laa_tx_antenna_port_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports_for_drs, tvb, offset, 0); - return 0; -} -int dissect_laa_transmission_power_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_for_drs, tvb, offset, power_offset_conversion); - return 0; -} - -int dissect_emtc_pbch_repeitions_enabled_r13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pbch_repetitions_enabled_r13, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_cat_m_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_root_sequence_index, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_cat_m_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_high_speed_flag, tvb, offset, 0); - return 0; -} - -int dissect_emtc_prach_ce_level_0_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_enable, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_0_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_configuration_index, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_0_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_frequency_offset, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, tvb, offset, 0); - return 0; -} -int dissect_emtc_ce_level_0_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_0_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_enabled, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_0_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_offset, tvb, offset, 0); - return 0; -} - -int dissect_emtc_prach_ce_level_1_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_enable, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_1_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_configuration_index, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_1_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_frequency_offset, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, tvb, offset, 0); - return 0; -} -int dissect_emtc_ce_level_1_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_1_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_enabled, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_1_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_offset, tvb, offset, 0); - return 0; -} - -int dissect_emtc_prach_ce_level_2_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_enable, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_2_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_configuration_index, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_2_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_frequency_offset, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, tvb, offset, 0); - return 0; -} -int dissect_emtc_ce_level_2_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_2_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_enabled, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_2_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_offset, tvb, offset, 0); - return 0; -} - -int dissect_emtc_prach_ce_level_3_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_enable, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_3_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_configuration_index, tvb, offset, 0); - return 0; -} -int dissect_emtc_prach_ce_level_3_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_frequency_offset, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, tvb, offset, 0); - return 0; -} -int dissect_emtc_ce_level_3_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_3_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_enabled, tvb, offset, 0); - return 0; -} -int dissect_emtc_preach_ce_level_3_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_offset, tvb, offset, 0); - return 0; -} - -int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, tvb, offset, 0); - return 0; -} -int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, tvb, offset, 0); - return 0; -} - - -int dissect_dl_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_bandwidth_support, tvb, offset, bandwidth_conversion); - return 0; -} - -int dissect_ul_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_bandwidth_support, tvb, offset, bandwidth_conversion); - return 0; -} - -int dl_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); - return 0; -} - -int dissect_dl_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_modulation_support, tvb, offset, dl_modulation_conversion); - return 0; -} - -int ul_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); - return 0; -} -int dissect_ul_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_modulation_support, tvb, offset, ul_modulation_conversion); - return 0; -} -int dissect_phy_antenna_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_phy_antenna_capability, tvb, offset, 0); - return 0; -} - -int release_capability_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); - return 0; -} -int dissect_release_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_release_capability, tvb, offset, release_capability_conversion); - return 0; -} -int dissect_mbsfn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_mbsfn_capability, tvb, offset, 0); - return 0; -} - -int dissect_laa_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_laa_capability, tvb, offset, 0); - return 0; -} -int dissect_laa_pd_sensing_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pd_sensing_lbt_support, tvb, offset, 0); - return 0; -} -int dissect_laa_multi_carrier_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_lbt_support, tvb, offset, 0); - return 0; -} -int dissect_laa_partial_sf_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_partial_sf_support, tvb, offset, 0); - return 0; -} - -int dissect_data_report_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_data_report_mode, tvb, offset, 0); - return 0; -} -int dissect_sfn_sf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_sfnsf, tvb, offset, 0); - return 0; -} -int dissect_phy_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_phy_state, tvb, offset, 0); - return 0; -} - - - -int dissect_p7_vnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 4, tvb, offset); - return 0; -} -int dissect_p7_vnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 16, tvb, offset); - return 0; -} -int dissect_p7_vnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_vnf_port, tvb, offset, 0); - return 0; -} - -int dissect_p7_pnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 4, tvb, offset); - return 0; -} -int dissect_p7_pnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 16, tvb, offset); - return 0; -} -int dissect_p7_pnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pnf_port, tvb, offset, 0); - return 0; -} - -int dissect_downlink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dl_ue_per_sf, tvb, offset, 0); - return 0; -} - -int dissect_uplink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ul_ue_per_sf, tvb, offset, 0); - return 0; -} - -int dissect_rf_band_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); - return 0; -} - -int dissect_rf_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); - return 0; -} - -int dissect_timing_window_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_timing_window, tvb, offset, 0); - return 0; -} -int dissect_timing_info_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_timing_info_mode, tvb, offset, 0); - return 0; -} -int dissect_timing_info_period_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_timing_info_period, tvb, offset, 0); - return 0; -} - -int dissect_maximum_transmit_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); - return 0; -} -int dissect_earfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); - return 0; -} - -int dissect_nmm_gsm_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); - return 0; -} -int dissect_nmm_umts_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); - return 0; -} -int dissect_nmm_lte_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); - return 0; -} -int dissect_nmm_uplink_rssi_supported_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_nmm_uplink_rssi_supported, tvb, offset, 0); - return 0; -} - -int dissect_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dl_config_pdu_type, tvb, offset, 0); - guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); - - guint pdu_end = (*offset + size - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - - return 0; -} - - -static int dissect_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_pdcch_ofdm_symbols, tvb, offset, 0); - guint16 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_dci, tvb, offset, 0); - num_pdu += proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_pdsch_rnti, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_pcfich, tvb, offset, power_offset_conversion); - - dissect_array_value(tvb, pinfo, tree, data, offset, end, "DL Config PDU List", hf_nfapi_dl_config_request_pdu_list, ett_nfapi_dl_config_request_pdu_list, num_pdu, dissect_dl_config_pdu); - - - return 0; -} - -static int dissect_dl_config_request_bch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - return 0; -} - -static int dissect_dl_config_request_dl_dci_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_2, tvb, offset, 0); - proto_tree_add_uint8_with_range(tree, hf_nfapi_harq_process, tvb, offset, pinfo, 0, 15, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_precoding_information, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_block_size_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_downlink_power_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - return 0; -} -static int dissect_dl_config_request_dl_dci_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_mcch_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcch_change_notification, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_scrambling_identity, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_dl_dci_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_scrambling_and_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_n_dl_rb, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_dl_dci_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_ack_resource_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, tvb, offset, 0); - return 0; -} - -int dissect_ul_dl_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_index, tvb, offset, 0); - return 0; -} - - -static int dissect_dl_config_request_dl_dci_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_primary_cell_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_flag, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_dl_configurations, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL/DL Configurations", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); - - return 0; -} -static int dissect_dl_config_request_dl_dci_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_configuration, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_codebooksize_determination_r13, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rel13_drms_table_flag, tvb, offset, 0); - return 0; -} - -static int dissect_dl_config_request_mch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - proto_tree_add_uint16(tree, hf_nfapi_mbsfn_area_id, tvb, offset, 0); - - return 0; -} - -int dissect_codebook_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); - return 0; -} - -int dissect_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_bf_vector_bf_value, tvb, offset, 0); - return 0; -} - -int dissect_bf_vector_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_bf_vector_subband_index, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_bf_vector_num_antennas, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Antennas", hf_nfapi_bf_vector_antennas, ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); - return 0; -} - -static int dissect_dl_config_request_dlsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); - guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Subbands", hf_nfapi_subbands, ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); - proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_power_offset_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transmission_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_num_bf_prb_per_subband, tvb, offset, 0); - guint8 num_vectors = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vectors", hf_nfapi_bf_vectors, ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); - - - return 0; -} - -int dissect_csi_rs_resource_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); - return 0; -} - -static int dissect_dl_config_request_dlsch_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_nscid, tvb, offset, 0); - - return 0; -} -static int dissect_dl_config_request_dlsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_start, tvb, offset, 0); - - return 0; -} -static int dissect_dl_config_request_dlsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_csi_config_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_csi_scrambling, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_antenna_ports, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_freq_shift, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_dlsch_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_alt_cqi_table_r12, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_max_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_n_dl_harq, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_dlsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_payload_type, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_req13_drms_table_flag, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_pch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_prnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_transport_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_pch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ue_mode, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_prs_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - proto_tree_add_uint8(tree, hf_prs_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_prs_cyclic_prefix_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_prs_muting, tvb, offset, 0); - return 0; -} -static int dissect_dl_config_request_csi_rs_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_antenna_port_count_r10, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); - return 0; -} - - -int dissect_csi_rs_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_index, tvb, offset, 0); - //proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); - return 0; -} - -static int dissect_dl_config_request_csi_rs_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_rs_class, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cdm_type, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vector", hf_nfapi_csi_rs_bf_vector, ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); - return 0; -} - -int dissect_epdcch_prb_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_edpcch_prb_index, tvb, offset, 0); - return 0; -} - -static int dissect_dl_config_request_edpcch_params_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); - dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); - - return 0; -} -static int dissect_dl_config_request_edpcch_params_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); - return 0; -} - -int dissect_precoding_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_precoding_value, tvb, offset, 0); - return 0; -} - -static int dissect_dl_config_request_mpdpcch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_drms_scrabmling_init, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_transmission_power, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_resource_block_coding , tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pdsch_reception_levels , tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpmi_length, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pmi_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_resource_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index_length, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_starting_ce_level, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag , tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_paging_direct_indication_differentiation_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_direct_indication, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Precoding", hf_nfapi_precoding, ett_nfapi_precoding, count, dissect_precoding_value); - - return 0; -} - -int dissect_ul_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ul_config_pdu_type, tvb, offset, 0); - guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); - - guint pdu_end = (*offset + size - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - - return 0; -} - -static int dissect_ul_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rach_prach_frequency_resources, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_present, tvb, offset, 0); - - dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL Config PDU List", hf_nfapi_ul_config_request_pdu_list, ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); - - return 0; -} - - -int dissect_ul_config_ulsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_process_number, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_tx_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_current_tx_nb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_n_srs, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ulsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_transmission_scheme, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_disable_sequence_hopping_flag, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ulsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_npusch_identity, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_ndrms_csh_identity, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ulsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_initial_sf_io, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_empty_symbols_due_to_retunning, tvb, offset, 0); - return 0; -} -int dissect_ul_config_init_tx_params_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_n_srs_initial, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_initial_number_of_resource_blocks, tvb, offset, 0); - return 0; -} -int dissect_ul_config_cqi_ri_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ri_size, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); - return 0; -} -int dissect_ul_config_cqi_ri_info_rel9_later_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 type = proto_tree_add_uint8(tree, hf_nfapi_report_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); - - switch (type) - { - case 0: - { - proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_ri_pmi_size, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_control_type, tvb, offset, 0); - break; - } - case 1: - { - /*guint8 num_cc = */proto_tree_add_uint8(tree, hf_nfapi_number_of_cc, tvb, offset, 0); - - // todo ... - - break; - } - } - return 0; -} -int dissect_ul_config_cqi_ri_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_ri_pmi_size_2, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_ulsch_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); - - return 0; -} -int dissect_ul_config_harq_info_ulsch_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq_2, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ue_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ue_info_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_npucch_identity, tvb, offset, 0); - return 0; -} -int dissect_ul_config_ue_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_empty_symbols, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); - return 0; -} -int dissect_ul_config_cqi_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pucch_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size, tvb, offset, 0); - return 0; -} -int dissect_ul_config_cqi_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); - return 0; -} -int dissect_ul_config_cqi_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_csi_mode, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_pmi_size_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_statring_prb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); - return 0; -} -int dissect_ul_config_sr_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_pucch_index, tvb, offset, 0); - return 0; -} -int dissect_ul_config_sr_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_uci_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_uci_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_uci_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_num_ant_ports, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_0, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_1, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_2, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_3, tvb, offset, 0); - return 0; -} -int dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_starting_prb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); - return 0; -} -int dissect_ul_config_srs_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_domain_position, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_hopping_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_transmission_comb, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_i_srs, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_sounding_reference_cyclic_shift, tvb, offset, 0); - return 0; -} -int dissect_ul_config_srs_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_antenna_port, tvb, offset, 0); - return 0; -} -int dissect_ul_config_srs_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_of_combs, tvb, offset, 0); - return 0; -} - -int dissect_hi_dci0_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_pdu_type, tvb, offset, 0); - guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); - - guint pdu_end = (*offset + size - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - - return 0; -} - -static int dissect_hi_dci0_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_sfn_sf, tvb, offset, 0); - guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_dci_pdus, tvb, offset, 0); - num_pdu += proto_tree_add_uint8(tree, hf_nfapi_number_of_hi_pdus, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "HI DCI0 PDU List", hf_nfapi_hi_dci0_request_pdu_list, ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); - return 0; -} - -static int dissect_hi_dci0_hi_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_hi_value, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_i_phich, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - return 0; -} -static int dissect_hi_dci0_hi_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_flag_tb2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_hi_value_2, tvb, offset, 0); - return 0; -} -static int dissect_hi_dci0_dci_ul_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ue_tx_antenna_selection, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_cqi_csi_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - return 0; -} -static int dissect_hi_dci0_dci_ul_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indication_two, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_antenna_ports, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_n_ul_rb, tvb, offset, 0); - return 0; -} -static int dissect_hi_dci0_dci_ul_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_pscch_resource, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_time_resource_pattern, tvb, offset, 0); - return 0; -} -static int dissect_hi_dci0_edpcch_dci_ul_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); - dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); - return 0; -} - -static int dissect_hi_dci0_mdpcch_dci_ul_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mpdcch_transmission_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling_init, tvb, offset, 0); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); - proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_pusch_repetition_levels, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_csi_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dai_presence_flag, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_include_padding, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX Antenna Ports", hf_nfapi_tx_antenna_ports, ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); - - - return 0; -} -static int dissect_rx_ue_info_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - return 0; -} -static int dissect_rx_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - int data_offset = proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); - return data_offset; -} -static int dissect_rx_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_multplexing_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_2, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_3, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_special_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_channel_selection_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_format_3_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - return 0; -} - -static int dissect_harq_indication_data_format_4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - return 0; -} - - -static int dissect_harq_indication_data_format_5_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); - return 0; -} - - - -static int dissect_harq_indication_rel8_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); - - switch (mode) - { - case 0: - { - dissect_harq_indication_data_bundling_value(tvb, pinfo, tree, data, offset, end); - break; - } - case 1: - { - dissect_harq_indication_data_multplexing_value(tvb, pinfo, tree, data, offset, end); - break; - } - case 2: - { - dissect_harq_indication_data_special_bundling_value(tvb, pinfo, tree, data, offset, end); - break; - } - }; - - return 0; -} -static int dissect_harq_indication_rel9_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); - - // Have to do this as the mode value is need to decode the value - guint16 i = 0; - - proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); - proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); - - for (i = 0; i < count; ++i) - { - - proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); - proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); - - switch (mode) - { - case 0: - { - dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 1: - { - dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 2: - { - dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 3: - { - dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 4: - { - dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - }; - } - - return 0; -} -static int dissect_harq_indication_rel13_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); - - // Have to do this as the mode value is need to decode the value - guint16 i = 0; - - proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); - proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); - - for (i = 0; i < count; ++i) - { - proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); - proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); - - switch (mode) - { - case 0: - { - dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 1: - { - dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 2: - { - dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 3: - { - dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 4: - { - dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 5: - { - dissect_harq_indication_data_format_4_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - case 6: - { - dissect_harq_indication_data_format_5_value(tvb, pinfo, item_tree, data, offset, end); - break; - } - }; - } - - return 0; -} -static int dissect_harq_indication_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_tb_1, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_harq_tb_2, tvb, offset, 0); - return 0; -} - -int dissect_harq_tb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_harq_tb_n, tvb, offset, 0); - return 0; -} - - -static int dissect_harq_indication_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); - return 0; -} -static int dissect_harq_indication_rel13_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); - return 0; -} -static int dissect_ul_cqi_information_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_channel, tvb, offset, 0); - return 0; -} -static int dissect_crc_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_crc_flag, tvb, offset, 0); - return 0; -} -static int dissect_rx_cqi_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); - return 0; -} - -int dissect_ri_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); - return 0; -} -static int dissect_rx_cqi_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_cc_reported, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "CC List", hf_nfapi_cc, ett_nfapi_cc, count, dissect_ri_value); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); - - return 0; -} -static int dissect_rach_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_preamble, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); - return 0; -} -static int dissect_rach_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); - return 0; -} -static int dissect_rach_indication_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_rach_resource_type, tvb, offset, 0); - return 0; -} - -int dissect_snr_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_snr, tvb, offset, 0); - return 0; -} - -static int dissect_srs_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_doppler_estimation, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); - guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rb_start, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "RB List", hf_nfapi_rbs, ett_nfapi_rbs, count, dissect_snr_value); - - - return 0; -} -static int dissect_srs_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); - return 0; -} -static int dissect_srs_indication_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_up_pts_symbol, tvb, offset, 0); - return 0; -} -static int dissect_tdd_channel_measuerment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_prb_per_subband, tvb, offset, 0); - guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); - guint8 num_phy_ant = proto_tree_add_uint8(tree, hf_nfapi_number_antennas, tvb, offset, 0); - - guint16 i = 0; - guint16 j = 0; - - proto_item *sb_list_ti = proto_tree_add_string_format(tree, hf_nfapi_subbands, tvb, *offset, 2, "", "Subbands"); - proto_tree *sb_list_tree = proto_item_add_subtree(sb_list_ti, ett_nfapi_subbands); - - for (i = 0; i < num_subbands; ++i) - { - proto_item *sb_item_ti = proto_tree_add_string_format(sb_list_tree, hf_nfapi_subbands, tvb, *offset, 2, "", "[%d]", i); - proto_tree *sb_item_tree = proto_item_add_subtree(sb_item_ti, ett_nfapi_subbands); - - proto_tree_add_uint8(sb_item_ti, hf_nfapi_subband_index, tvb, offset, 0); - - - proto_item *ant_list_ti = proto_tree_add_string_format(sb_item_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "Physical Antennas"); - proto_tree *ant_list_tree = proto_item_add_subtree(ant_list_ti, ett_nfapi_antennas); - - for (j = 0; j < num_phy_ant; ++j) - { - proto_item *ant_item_ti = proto_tree_add_string_format(ant_list_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "[%d]", j); - proto_tree *ant_item_tree = proto_item_add_subtree(ant_item_ti, ett_nfapi_antennas); - - proto_tree_add_uint16(ant_item_tree, hf_nfapi_channel_coefficient, tvb, offset, 0); - } - } - - return 0; -} - -static int dissect_srs_indication_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_ul_rtoa, tvb, offset, 0); - return 0; -} - -static int dissect_lbt_dl_config_request_pdsch_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_mp_cca, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_n_cca, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_lte_txop_sf, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_txop_sfn_sf_end, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); - return 0; -} -static int dissect_lbt_dl_config_request_drs_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_sfn_sf_end, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); - return 0; -} -static int dissect_lbt_dl_config_request_pdsch_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_txop_symbols, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_initial_partial_sf, tvb, offset, 0); - return 0; -} -static int dissect_lbt_dl_config_request_drs_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); - return 0; -} - -int dissect_tx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 len = proto_tree_add_uint16(tree, hf_nfapi_pdu_length, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); - - proto_tree_add_uint8_array(tree, hf_nfapi_pdu, len, tvb, offset); - - return 0; -} - -static int dissect_tx_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX PDU List", hf_nfapi_tx_request_pdu_list, ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); - return 0; - -} - -int dissect_rx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - //guint end = (*offset + size - 2); - //dissect_tlv_list(tvb, pinfo, tree, data, offset, end); - return 0; -} - - - -int dissect_harq_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} - -static int dissect_harq_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_harqs, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ PDU List", hf_nfapi_harq_indication_pdu_list, ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); - return 0; -} - -int dissect_crc_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} - - -static int dissect_crc_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_crcs, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "CRC PDU List", hf_nfapi_crc_indication_pdu_list, ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); - return 0; -} -int dissect_sr_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} - -static int dissect_rx_sr_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_srs, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "SR PDU List", hf_nfapi_sr_indication_pdu_list, ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); - return 0; -} -int dissect_cqi_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} -static int dissect_rx_cqi_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_cqi, tvb, offset, 0); - - guint16* lengths = malloc(num_pdu * 2); - memset(lengths, 0, num_pdu * 2); - - guint8 tmp_offset = *offset; - - int i = 0; - for (i = 0; i < num_pdu; ++i) - { - guint16 instance_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); - tmp_offset += 2; - guint8 pdu_end = tmp_offset + instance_len; - - while (tmp_offset < pdu_end) - { - guint16 tlv_id = tvb_get_guint16(tvb, tmp_offset, ENC_NA); - tmp_offset += 2; - guint16 tlv_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); - tmp_offset += 2; - - if (tlv_id == 0x202F) - { - lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); - } - else if (tlv_id == 0x2030) - { - lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); - } - - tmp_offset += tlv_len; - } - - } - - - dissect_array_value(tvb, pinfo, tree, data, offset, end, "CQI PDU List", hf_nfapi_cqi_indication_pdu_list, ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); - - - for (i = 0; i < num_pdu; ++i) - { - proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); - } - - free(lengths); - - return 0; -} -int dissect_preamble_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} -static int dissect_rach_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_preambles, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Preamble PDU List", hf_nfapi_preamble_indication_pdu_list, ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); - return 0; -} -int dissect_srs_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); - guint pdu_end = (*offset + pdu_len - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} -static int dissect_srs_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - - guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_srss, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "SRS PDU List", hf_nfapi_srs_indication_pdu_list, ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); - return 0; -} -int dissect_lbt_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_req_pdu_type, tvb, offset, 0); - guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); - guint pdu_end = (*offset + size - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} -static int dissect_lbt_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_config_pdu_list, ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); - - return 0; -} -int dissect_lbt_dl_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_ind_pdu_type, tvb, offset, 0); - guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); - guint pdu_end = (*offset + size - 2); - dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); - return 0; -} -static int dissect_lbt_indication_message_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_indication_pdu_list, ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); - return 0; -} - -static int dissect_lte_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); - proto_tree_add_uint8(tree, hf_nfapi_bandwidth, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_earfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_earfcns, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "EARFCNs", hf_nfapi_earfcn_list, ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); - return 0; -} - -int dissect_uarfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); - return 0; -} -static int dissect_utran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_uarfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_uarfcns, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "UARFCNs", hf_nfapi_uarfcn_list, ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); - return 0; -} - -int dissect_arfcn_dir_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_arfcn_direction, tvb, offset, 0); - return 0; -} -static int dissect_geran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_arfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); - return 0; -} - - -int rssi_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value) -{ - proto_tree_add_int_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", ((float)value * 0.1), value); - return 0; -} -int dissect_rssi_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_int16_with_conversion(tree, hf_nfapi_rssi, tvb, offset, rssi_conversion); - return 0; -} -static int dissect_rssi_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_rssi = proto_tree_add_uint16(tree, hf_nfapi_number_of_rssi, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_rssi_list, ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); - return 0; -} - -int dissect_pci_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); - return 0; -} -static int dissect_lte_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_measurement_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_pci = proto_tree_add_uint8(tree, hf_nfapi_number_of_pci, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PCIs", hf_nfapi_pci_list, ett_nfapi_pci_list, num_pci, dissect_pci_value); - return 0; -} - -int dissect_psc_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); - return 0; -} -static int dissect_utran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_psc = proto_tree_add_uint8(tree, hf_nfapi_number_of_psc, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "PSCs", hf_nfapi_psc_list, ett_nfapi_psc_list, num_psc, dissect_psc_value); - return 0; -} - -int dissect_arfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); - return 0; -} - -static int dissect_geran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - guint8 num_arfcn = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); - return 0; -} - -int neg_pow_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value) -{ - proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 1, value, "%d dB (%d)", ((gint16)value * (-1)), value); - return 0; -} - -int dissect_lte_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); - proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrp, tvb, offset, neg_pow_conversion); - proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrq, tvb, offset, neg_pow_conversion); - proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); - return 0; -} -static int dissect_lte_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_lte_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_lte_cells_found, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "LTE Cells Found", hf_nfapi_lte_cells_found_list, ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); - return 0; -} -int dissect_utran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); - proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rscp, tvb, offset, neg_pow_conversion); - proto_tree_add_uint8_with_conversion(tree, hf_nfapi_enco, tvb, offset, neg_pow_conversion); - proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); - return 0; -} -static int dissect_utran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_utran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_utran_cells_found, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "UTRAN Cells Found", hf_nfapi_utran_cells_found_list, ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); - return 0; -} - -int dissect_geran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rxlev, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_rxqual, tvb, offset, 0); - proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); - return 0; -} -static int dissect_geran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 num_geran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_geran_cells_found, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "GERAN Cells Found", hf_nfapi_geran_cells_found_list, ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); - - return 0; -} -static int dissect_pnf_cell_search_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_pnf_search_state, *end - *offset, tvb, offset); - return 0; -} - -static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8_array(tree, hf_nfapi_pnf_broadcast_state, *end - *offset, tvb, offset); - return 0; -} -static int dissect_lte_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - return 0; -} -static int dissect_utran_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); - return 0; -} - -static int dissect_lte_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); - guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); - proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); - return 0; -} -static int dissect_utran_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); - proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); - return 0; -} - -static int dissect_lte_system_information_schedule_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_retry_count, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); - return 0; -} -//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -//{ -// return 0; -//} -static int dissect_lte_system_information_schedule_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - // this needs to be SIB 1 - proto_tree_add_uint8_array(tree, hf_nfapi_sib1, (*end - *offset), tvb, offset); - return 0; -} - -int dissect_si_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_si_periodicity, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_si_index, tvb, offset, 0); - return 0; -} - -static int dissect_lte_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); - guint8 si_priodicity = proto_tree_add_uint8(tree, hf_nfapi_number_of_si_periodicity, tvb, offset, 0); - dissect_array_value(tvb, pinfo, tree, data, offset, end, "Number SI Periodicity", hf_nfapi_si_periodicity_list, ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); - proto_tree_add_uint8(tree, hf_nfapi_si_window_length, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); - - return 0; -} -static int dissect_utran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); - proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); - return 0; -} -static int dissect_geran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); - proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); - proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); - return 0; -} -//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -//{ -// return 0; -//} -static int dissect_lte_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - proto_tree_add_uint8(tree, hf_nfapi_sib_type, tvb, offset, 0); - guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); - return 0; -} -static int dissect_utran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); - return 0; -} -static int dissect_geran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint16 si_len = proto_tree_add_uint16(tree, hf_nfapi_si_len, tvb, offset, 0); - proto_tree_add_uint8_array(tree, hf_nfapi_si, si_len, tvb, offset); - return 0; -} - -static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); - -const tlv_t tags[] = -{ - { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, - { 0x1001, "PNF PHY", dissect_pnf_phy_value }, - { 0x1002, "PNF RF", dissect_pnf_rf_value }, - { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, - { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, - { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, - { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, - { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, - - { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, - { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, - { 0x0003, "Subframe config - P-B", dissect_pb_value }, - { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, - { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, - { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, - { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, - { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, - { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, - { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, - { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, - { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, - { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, - { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, - { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, - { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, - { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, - { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, - { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, - { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, - { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, - { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, - { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, - { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, - { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, - { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, - { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, - { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, - { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, - { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, - { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, - { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, - { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, - { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, - { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, - { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, - { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, - { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, - { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, - { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, - { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, - { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, - { 0x0069, "LAA config - Multi carrier freeze ", dissect_laa_multi_carrier_freeze_value }, - { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, - { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, - - { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, - { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, - { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, - { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, - { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, - { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, - { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, - { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, - { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, - { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, - { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, - { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, - { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, - { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, - { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, - { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, - { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, - { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, - { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, - { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, - { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, - { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, - { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, - { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, - { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, - { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, - { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, - { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, - { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, - { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, - { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, - { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, - { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, - { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, - - { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, - { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, - { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, - { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, - { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, - { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, - { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, - - { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, - { 0x00D1, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, - { 0x00D1, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, - { 0x00D1, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, - - { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, - { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, - { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, - - { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, - { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, - { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, - { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, - { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, - { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, - { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, - { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, - - { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, - - { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, - { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, - { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, - { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, - { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, - { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, - { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, - { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, - { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, - - { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, - - { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, - { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, - { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, - { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, - { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, - { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, - - - { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, - - { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, - - { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, - { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, - { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, - { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, - { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, - { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, - - { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, - { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, - - { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, - - { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, - { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, - - //{ 0x2001, "EDPCCH PDU Release 8", ?? }, - //{ 0x2002, "EDPCCH PDU Release 8", ?? }, - //{ 0x2003, "EDPCCH PDU Release 8", ?? }, - //{ 0x2039, "EDPCCH PDU Release 11", ?? }, - //{ 0x203A, "EDPCCH PDU Release 12", ?? }, - //{ 0x203B, "EDPCCH PDU Release 13", ?? }, - { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, - { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, - - { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, - - - { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, - { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, - { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, - { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, - { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, - { 0x200F, "Initial Transmission Paramters Release 8", dissect_ul_config_init_tx_params_rel8_value }, - { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, - { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, - { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, - { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, - { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, - { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, - { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, - { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, - { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, - { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, - { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, - { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, - { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, - { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, - { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, - { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, - { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, - { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, - { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, - { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, - { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, - - { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, - { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, - { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, - { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, - { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, - { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, - //{ 0x2041, "EDPCCH DCI UL PDU Release 11", dissect_hi_dci0_edpcch_dci_ul_rel11_value }, - { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, - - { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, - - { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, - - { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, - { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, - { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, - - { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, - { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, - { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, - { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, - { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, - { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, - { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, - { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, - - { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, - { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, - - { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, - - { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, - { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, - { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, - - { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, - { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, - { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, - { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, - - { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, - { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, - { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, - { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, - { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measuerment_value }, - { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, - - - { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, - { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, - { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, - - { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, - { 0x2056, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, - { 0x2057, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, - - { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, - { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, - { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, - { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, - { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, - { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, - { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, - { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, - { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, - { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, - { 0x300a, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, - { 0x300b, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, - { 0x300c, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, - { 0x300d, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, - { 0x300e, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, - { 0x300f, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, - { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, - { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, - { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, - { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, - { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, - { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, - { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, - { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, - { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, - { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, - { 0x301a, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, - - - - -}; - -int look_up_tlv(int tag_id) -{ - int i; - int num_tags = sizeof(tags) / sizeof(tlv_t); - - for (i = 0; i < num_tags; i++) - { - if (tag_id == tags[i].tag_id) - return i; - } - return -1; -} - -static int dissect_tl_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) -{ - proto_item *tl_ti = proto_tree_add_string_format(tree, hf_nfapi_tl, tvb, *offset, 4, "", "TL"); - proto_tree *tl_tree = proto_item_add_subtree(tl_ti, ett_nfapi_tl); - - proto_tree_add_uint16(tl_tree, hf_nfapi_tl_tag, tvb, offset, 0); - proto_tree_add_uint16(tl_tree, hf_nfapi_tl_length, tvb, offset, "bytes"); - - return 0; - -} - -static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint len) -{ - while (*offset < len) - { - guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); - guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); - - int tlv_index = look_up_tlv(tlv_id); - - char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; - - proto_item *tlv_ti = proto_tree_add_string_format(tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); - proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); - - dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); - - if (tags[tlv_index].decode != NULL) - { - guint tmp = *offset; - guint end = *offset + tlv_len; - tags[tlv_index].decode(tvb, pinfo, tlv_tree, data, &tmp, &end); - *offset += tlv_len; - } - else - { - *offset += tlv_len; - } - } - - return 0; -} - -static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) -{ - guint number_of_pdu_addr = *offset; - guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); - //dissect_array_value(tvb, pinfo, tree, data, offset, "RX PDU List", hf_nfapi_rx_indication_pdu_list, ett_nfapi_rx_indication_pdu_list, num_pdu, dissect_rx_pdu); - - guint16* lengths = malloc(count * 2); - memset(lengths, 0, count * 2); - - guint16 i = 0; - - if (count > 0) - { - proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "RX PDU List"); - proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_rx_indication_pdu_list); - - //for (i = 0; i < count; ++i) - proto_tree *item_tree = 0; - - guint pdu_end = *end; - while (*offset < *end && *offset < pdu_end) - { - - guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); - guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); - - if (tlv_id == 0x2038) - { - proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "[%d]", i); - item_tree = proto_item_add_subtree(item_ti, ett_nfapi_rx_indication_pdu_list); - - i++; - } - - int tlv_index = look_up_tlv(tlv_id); - - char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; - - proto_item *tlv_ti = proto_tree_add_string_format(item_tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); - proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); - - - - - dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); - - guint tmp_offset = *offset; - - if (tlv_id == 0x2038) - { - dissect_rx_ue_info_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); - } - - else if (tlv_id == 0x2024) - { - //int data_offset = dissect_rx_indication_rel8_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); - - lengths[i-1] = proto_tree_add_uint16(tlv_tree, hf_nfapi_length, tvb, &tmp_offset, 0); - int data_offset = proto_tree_add_uint16(tlv_tree, hf_nfapi_data_offset, tvb, &tmp_offset, 0); - proto_tree_add_uint8(tlv_tree, hf_nfapi_ul_cqi, tvb, &tmp_offset, 0); - proto_tree_add_uint16(tlv_tree, hf_nfapi_timing_advance, tvb, &tmp_offset, 0); - - if ((data_offset > 0) && (pdu_end == *end)) - { - pdu_end = number_of_pdu_addr + data_offset; - } - - } - else if (tlv_id == 0x2025) - { - dissect_rx_indication_rel9_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); - } - - - *offset += tlv_len; - } - - } - - for (i = 0; i < count; ++i) - { - proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); - } - - free(lengths); - - // more to follow here ?? - return 0; - -} - - -// ----------------------------------------------------------------------------| - - -static int dissect_p45_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) -{ - proto_item *p4_p5_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p4_p5_message_header, tvb, *offset, NFAPI_HEADER_LENGTH, "", "P4 P5 Header"); - proto_tree *p4_p5_header_tree = proto_item_add_subtree(p4_p5_header_ti, ett_nfapi_p4_p5_message_header); - - proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_phy_id, tvb, offset, 0); - proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_id, tvb, offset, 0); - proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_length, tvb, offset, 0); - proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_spare, tvb, offset, 0); - - return 0; -} - -static int dissect_p7_header_new(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint8* m, guint8* seg, guint8* seq) -{ - proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); - proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); - - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); - - // decoding bits for p7 header - - guint8 m_seg = tvb_get_guint8(tvb, *offset); - *m = (m_seg & 0x80) >> 7; - *seg = m_seg & 0x7F; - - - proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); - proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); - *offset += 1; - - *seq = tvb_get_guint8(tvb, *offset); - proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); - - - proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); - proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); - - return 0; - -} - - - - -static int dissect_p7_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) -{ - proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); - proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); - - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); - proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); - - - proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); - proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); - *offset += 1; - - proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); - - - proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); - proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); - - return 0; - -} - -static reassembly_table ul_p7_reassemble_table; -static reassembly_table dl_p7_reassemble_table; - - - -static int hf_msg_fragments = -1; -static int hf_msg_fragment = -1; -static int hf_msg_fragment_overlap = -1; -static int hf_msg_fragment_overlap_conflicts = -1; -static int hf_msg_fragment_multiple_tails = -1; -static int hf_msg_fragment_too_long_fragment = -1; -static int hf_msg_fragment_error = -1; -static int hf_msg_fragment_count = -1; -static int hf_msg_reassembled_in = -1; -static int hf_msg_reassembled_length = -1; -static int hf_msg_reassembled_data = -1; -static gint ett_msg_fragment = -1; -static gint ett_msg_fragments = -1; - -static const fragment_items msg_frag_items = { - /* Fragment subtrees */ - &ett_msg_fragment, - &ett_msg_fragments, - /* Fragment fields */ - &hf_msg_fragments, - &hf_msg_fragment, - &hf_msg_fragment_overlap, - &hf_msg_fragment_overlap_conflicts, - &hf_msg_fragment_multiple_tails, - &hf_msg_fragment_too_long_fragment, - &hf_msg_fragment_error, - &hf_msg_fragment_count, - /* Reassembled in field */ - &hf_msg_reassembled_in, - /* Reassembled length field */ - &hf_msg_reassembled_length, - NULL, - /* Tag */ - "Message fragments" -}; - -static int dissect_nfapi_ul_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) -{ - guint8 m; - guint8 seg; - guint8 seq; - guint offset = 0; - - guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); - guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); - - dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); - - guint8 save_fragmented = pinfo->fragmented; - - // not sure why I need to do this, but if I don't it does not reasses the protocol - pinfo->fd->flags.visited = 0; - - if (m == 1 || (m == 0 && seg > 0)) - { - pinfo->fragmented = TRUE; - - fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); - - guint8 reassembled = 0; - if (fd_head) - { - tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); - - if (new_tvb) - { - // set the tvb to the new reassembled buffer. - tvb = new_tvb; - reassembled = 1; - col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); - - // reset the offset for the new tvb - offset = 0; - } - else - { - // Is this a failure to reassemble the data - return 0; - } - } - else - { - // this is a segement skip the body - col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); - return 0; - } - } - - pinfo->fragmented = save_fragmented; - - { - switch (msg_id) - { - //HARQ.indication - case 0x85: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //CRC.indication - case 0x86: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //RX_ULSCH.indication - case 0x87: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //RACH.indication - case 0x88: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //SRS.indication - case 0x89: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //RX_SR.indication - case 0x8A: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - //RX_CQI.indication - case 0x8B: - { - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - } - break; - }; - } - - return 0; -} - -static int dissect_nfapi_dl_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) -{ - guint8 m; - guint8 seg; - guint8 seq; - guint offset = 0; - - guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); - guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); - - dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); - - guint8 save_fragmented = pinfo->fragmented; - - // not sure why I need to do this, but if I don't it does not reasses the protocol - pinfo->fd->flags.visited = 0; - - if (m == 1 || (m == 0 && seg > 0)) - { - pinfo->fragmented = TRUE; - - fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); - - guint8 reassembled = 0; - if (fd_head) - { - tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); - - if (new_tvb) - { - // set the tvb to the new reassembled buffer. - tvb = new_tvb; - reassembled = 1; - col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); - - // reset the offset for the new tvb - offset = 0; - } - else - { - // Is this a failure to reassemble the data - return 0; - } - } - else - { - // this is a segement skip the body - col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); - return 0; - } - } - - pinfo->fragmented = save_fragmented; - - { - switch (msg_id) - { - // DL_CONFIG.request - case 0x80: - { - //dissect_p7_header(tvb, pinfo, tree, data, &offset); - proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); - break; - } - - }; - } - - return 0; -} - - -static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) -{ - col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); - - guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); - guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); - - const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); - - col_clear(pinfo->cinfo,COL_INFO); - col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); - - proto_item *msg_tree_ti = proto_tree_add_string_format(tree, hf_nfapi_message_tree, - tvb, 0, msg_len, - "", message_str); - - proto_tree *msg_tree = proto_item_add_subtree(msg_tree_ti, ett_nfapi_message_tree); - - guint offset = 0; - - - switch (msg_id) - { - // HARQ.indication - case 0x85: - // CRC.indication - case 0x86: - // RX_ULSCH.indicatoin - case 0x87: - // RACH.indication - case 0x88: - // SRS.indication - case 0x89: - // RX_SR.indication - case 0x8A: - // RX_CQI.indication - case 0x8B: - { - dissect_nfapi_ul_p7(tvb, pinfo, msg_tree, data); - } - break; - - // DL_CONFIG.request - case 0x80: - { - dissect_nfapi_dl_p7(tvb, pinfo, msg_tree, data); - //dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - //proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - //dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - - // UL_CONFIG.request - case 0x81: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - } - break; - // HI_DCI0.request - case 0x83: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - } - break; - // TX.request - case 0x84: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - } - break; - - // LBT_DL_CONFIG.request - case 0x8C: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - } +#define NFAPI_P7_HEADER_LENGTH 16 + +static const unit_name_string khz_100_units_db = { " (100)khz", NULL }; + +typedef enum{ + NFAPI_DL_CONFIG_REQUEST_MSG_ID = 0x0080, + NFAPI_UL_CONFIG_REQUEST_MSG_ID, + NFAPI_SUBFRAME_INDICATION_MSG_ID, + NFAPI_HI_DCI0_REQUEST_MSG_ID, + NFAPI_TX_REQUEST_MSG_ID, + NFAPI_HARQ_INDICATION_MSG_ID, + NFAPI_CRC_INDICATION_MSG_ID, + NFAPI_RX_ULSCH_INDICATION_MSG_ID, + NFAPI_RACH_INDICATION_MSG_ID, + NFAPI_SRS_INDICATION_MSG_ID, + NFAPI_RX_SR_INDICATION_MSG_ID, + NFAPI_RX_CQI_INDICATION_MSG_ID, + NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, + NFAPI_LBT_DL_INDICATION_MSG_ID, + + NFAPI_PNF_PARAM_REQUEST_MSG_ID = 0x0100, + NFAPI_PNF_PARAM_RESPONSE_MSG_ID, + NFAPI_PNF_CONFIG_REQUEST_MSG_ID, + NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, + NFAPI_PNF_START_REQUEST_MSG_ID, + NFAPI_PNF_START_RESPONSE_MSG_ID, + NFAPI_PNF_STOP_REQUEST_MSG_ID, + NFAPI_PNF_STOP_RESPONSE_MSG_ID, + NFAPI_PARAM_REQUEST_MSG_ID, + NFAPI_PARAM_RESPONSE_MSG_ID, + NFAPI_CONFIG_REQUEST_MSG_ID, + NFAPI_CONFIG_RESPONSE_MSG_ID, + NFAPI_START_REQUEST_MSG_ID, + NFAPI_START_RESPONSE_MSG_ID, + NFAPI_STOP_REQUEST_MSG_ID, + NFAPI_STOP_RESPONSE_MSG_ID, + NFAPI_MEASUREMENT_REQUEST_MSG_ID, + NFAPI_MEASUREMENT_RESPONSE_MSG_ID, + + NFAPI_DL_NODE_SYNC_MSG_ID = 0x0180, + NFAPI_UL_NODE_SYNC_MSG_ID, + NFAPI_TIMING_INFO_MSG_ID, + + NFAPI_RSSI_REQUEST_MSG_ID = 0x0200, + NFAPI_RSSI_RESPONSE_MSG_ID, + NFAPI_RSSI_INDICATION_MSG_ID, + NFAPI_CELL_SEARCH_REQUEST_MSG_ID, + NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, + NFAPI_CELL_SEARCH_INDICATION_MSG_ID, + NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, + NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, + NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, + NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, + NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, + NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, + NFAPI_NMM_STOP_REQUEST_MSG_ID, + NFAPI_NMM_STOP_RESPONSE_MSG_ID, +} nfapi_message_id_e; + +static const value_string nfapi_error_vals[] = { + { 0x0, "MSG_OK" }, + { 0x1, "MSG_INVALID_STATE" }, + { 0x2, "MSG_INVALID_CONFIG" }, + { 0x3, "SFN_OUT_OF_SYNC" }, + { 0x4, "MSG_SUBFRAME_ERR" }, + { 0x5, "MSG_BCH_MISSING" }, + { 0x6, "MSG_BCH_MISSING" }, + { 0x7, "MSG_HI_ERR" }, + { 0x8, "MSG_TX_ERR" }, + { 0, NULL }, +}; + +static const value_string nfapi_p4_error_vals[] = { + { 100, "MSG_OK" }, + { 101, "MSG_INVALID_STATE" }, + { 102, "MSG_INVALID_CONFIG" }, + { 103, "MSG_RAT_NOT_SUPPORTED" }, + { 200, "MSG_NMM_STOP_OK" }, + { 201, "MSG_NMM_STOP_IGNORED" }, + { 202, "MSG_NMM_STOP_INVALID_STATE" }, + { 300, "MSG_PROCEDURE_COMPLETE" }, + { 301, "MSG_PROCEDURE_STOPPED" }, + { 302, "MSG_PARTIAL_RESULTS" }, + { 303, "MSG_TIMEOUT" }, + { 0, NULL }, +}; + +static const value_string nfapi_rat_type_vals[] = { + { 0, "LTE" }, + { 1, "UTRAN" }, + { 2, "GERAN" }, + { 0, NULL }, +}; + +typedef enum{ + UN_ALIGNED_SYNCHRONIZATION = 0, + INTERNAL_PNF_FRAME_ALIGNMENT, + ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION +} nfapi_sync_mode_e; + +static const value_string nfapi_sync_mode_vals[] = { + { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, + { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, + { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" }, + { 0, NULL }, +}; + +typedef enum { + NONE = 0, + GPS, + GLONASS, + BEIDOU +} location_mode_e; + +static const value_string location_mode_vals[] = { + { NONE, "NONE" }, + { GPS, "GPS" }, + { GLONASS, "GLONASS" }, + { BEIDOU, "BeiDou" }, + { 0, NULL } +}; + +static const value_string nfapi_uplink_rs_hopping_vals[] = { + { 0, "RS_NO_HOPPING" }, + { 1, "RS_GROUP_HOPPING" }, + { 2, "RS_SEQUENCE_HOPPING" }, + { 0, NULL } +}; + +static const value_string nfapi_laa_carrier_type_vals[] = { + { 0, "No multi carrier support" }, + { 1, "Mode A1" }, + { 2, "Mode A12" }, + { 3, "Mode B1" }, + { 4, "Mode B2" }, + { 0, NULL } +}; + +static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { + { 0, "Multi carrier Mode A1" }, + { 1, "Multi carrier Mode A2" }, + { 2, "Multi carrier Mode B1" }, + { 3, "Multi carrier Mode B2" }, + { 0, NULL } +}; + +static const value_string nfapi_lbt_dl_req_pdu_type[] = { + { 0, "LBT_PDSCH_REQ PDU" }, + { 1, "LBT_DRS_REQ PDU" }, + { 0, NULL } +}; + + +static const value_string nfapi_lbt_dl_ind_pdu_type[] = { + { 0, "LBT_PDSCH_RSP PDU" }, + { 1, "LBT_DRS_RSP PDU" }, + { 0, NULL } +}; + +static const value_string nfapi_phy_state_vals[] = { + { 0, "IDLE" }, + { 1, "CONFIGURED" }, + { 2, "RUNNING" }, + { 0, NULL }, +}; + + +/* These are definitions where data 0 & 1 represent/provide a string name*/ +static const true_false_string nfapi_csi_report_type_strname = { + "Periodic", + "Aperiodic", +}; + +static const true_false_string nfapi_control_type_string_name = { + "CQI/PMI", + "RI", +}; + +static const true_false_string cyclic_prefix_type_strname = { + "CP_NORMAL", + "CP_EXTENDED" +}; + +static const true_false_string support_strname = { + "No Support", + "Support" +}; + +static const true_false_string partial_sf_support_strname = +{ + "Start partial SF support", + "End partial SF support" +}; + +static const true_false_string phich_duration_strname = { + "PHICH_D_NORMAL", + "PHICH_D_EXTENDED" +}; + +static const true_false_string high_speed_flag_strname = { + "HS_UNRESTRICTED_SET", + "HS_RESTRICTED_SET" +}; + +static const true_false_string hopping_mode_strname = { + "HM_INTER_SF", + "HM_INTRA_INTER_SF" +}; + +static const true_false_string srs_simult_tx_strname = { + "No Simultaneous Transmission", + "Simultaneous Transmission" +}; + +static const true_false_string crc_flag_strname = { + "CRC_ERROR", + "CRC_CORRECT" +}; + +static const true_false_string hi_value_strname = { + "HI_ACK", + "HI_NACK" +}; + +static const true_false_string flag_tb2_strname = { + "HI_NOT_PRESENT", + "HI_PRESENT" +}; + +static const true_false_string nfapi_multi_carrier_tx_strname = { + "Mutual transmission (self-deferral support for current carrier)", + "Transmit on channel access win (no self-deferral)" +}; + +static const true_false_string nfapi_multi_carrier_freeze_strname = { + "Absence of other technology is not guaranteed", + "Absence of other technology is guaranteed" +}; + +static const true_false_string initial_partial_sf_strname = { + "Full SF", + "Partial SF" +}; + +static const true_false_string lbt_mode_strname = { + "Full LBT", + "Partial LBT" +}; + +static const true_false_string data_report_mode_vals = { + "Crc reported in CRC.indication", + "Crc reported in RX.indication" +}; + +static const true_false_string mcch_flag_string_name = { + "MCCH or SC-MCCH change notification field is not valid", + "MCCH or SC-MCCH change notification field is valid" +}; + +static const true_false_string cross_carrier_scheduling_flag_strname = { + "Carrier indicator field is not valid", + "Carrier indicator field is valid" +}; + +static const true_false_string srs_flag_strname = { + "SRS request field is not valid", + "SRS request field is valid" +}; +static const true_false_string srs_request_strname = { + "SRS not requested", + "SRS requested" +}; + +static const true_false_string ul_dl_configuration_flag_strname = { + "UL/DL configuration field is not valid", + "UL/DL configuration field is valid" +}; + +static const true_false_string prs_cyclic_prefix_type_strname = { + "normal cyclic prefix", + "extended cyclic prefix" +}; + +static const true_false_string prs_muting_strname = { + "no muting", + "muting" +}; + + +static const value_string nfapi_dl_config_pdu_type_vals[] = { + { 0, "DL_CONFIG_DCI_DL_PDU" }, + { 1, "DL_CONFIG_BCH_PDU" }, + { 2, "DL_CONFIG_MCH_PDU" }, + { 3, "DL_CONFIG_DLSCH_PDU" }, + { 4, "DL_CONFIG_PCH_PDU" }, + { 5, "DL_CONFIG_PRS_PDU" }, + { 6, "DL_CONFIG_CSI_RS_PDU" }, + { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, + { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, + { 0, NULL } +}; + +static const value_string nfapi_duplex_mode_vals[] = { + { 0, "TDD" }, + { 1, "FDD" }, + { 2, "HD-FDD" }, + { 0, NULL } +}; + +static const value_string modulation_vals[] = { + { 2, "QPSK" }, + { 4, "16QAM" }, + { 6, "64QAM" }, + { 8, "256QAM" }, + { 0, NULL } +}; + +static const value_string pch_modulation_vals[] = { + { 0, "QPSK" }, + { 0, NULL } +}; + +static const value_string ue_mode_vals[] = { + { 0, "non LC/CE UE" }, + { 1, "LC/CE UE" }, + { 0, NULL } +}; + +static const value_string csi_rs_class_vals[] = { + { 0, "not used" }, + { 1, "Class A" }, + { 1, "Class B" }, + { 0, NULL } +}; + +static const value_string csi_rs_cdm_type_vals[] = { + { 0, "cdm 2" }, + { 1, "cdm 4" }, + { 0, NULL } +}; + +static const value_string antenna_ports_vals[] = { + { 0, "1 antenna ports" }, + { 1, "2 antenna ports" }, + { 2, "4 antenna ports" }, + { 0, NULL } +}; + +static const value_string combs_vals[] = { + { 0, "2 TC" }, + { 1, "4 TC" }, + { 0, NULL } +}; + +static const value_string resource_allocation_type_vals[] = { + { 0, "type 0" }, + { 1, "type 1" }, + { 2, "type 2 1A/1B/1D" }, + { 3, "type 2 1C" }, + { 4, "type 2 6-1A" }, + { 5, "type UEModeB" }, + { 6, "NB index" }, + { 0, NULL } +}; + +static const value_string transmission_scheme_vals[] = { + { 0, "SINGLE_ANTENNA_PORT_0" }, + { 1, "TX_DIVERSITY" }, + { 2, "LARGE_DELAY_CDD" }, + { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, + { 4, "MULTI_USER_MIMO" }, + { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, + { 6, "SINGLE_ANTENNA_PORT_5" }, + { 7, "SINGLE_ANTENNA_PORT_7" }, + { 8, "SINGLE_ANTENNA_PORT_8" }, + { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, + { 10, "UP_TO_8_LAYER_TX" }, + { 11, "SINGLE_ANTENNA_PORT_11" }, + { 12, "SINGLE_ANTENNA_PORT_13" }, + { 13, "DUAL_LAYER_TX_PORT_11_13" }, + { 0, NULL } +}; + +static const value_string ul_transmission_scheme_vals[] = { + { 0, "SINGLE_ANTENNA_PORT_10" }, + { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, + { 0, NULL }, +}; + +static const value_string dl_dci_format_vals[] = { + { 0, "1" }, + { 1, "1A" }, + { 2, "1B" }, + { 3, "1C" }, + { 4, "1D" }, + { 5, "2" }, + { 6, "2A" }, + { 7, "2B" }, + { 8, "2C" }, + { 9, "2D" }, + { 10, "6-1A" }, + { 11, "6-1B" }, + { 12, "6-2" }, + { 0, NULL } +}; + +static const value_string ul_dci_format_vals[] = { + { 0, "0" }, + { 1, "3" }, + { 2, "3A" }, + { 3, "4" }, + { 4, "5" }, + { 0, NULL } +}; + +static const value_string mpdcch_ul_dci_format_vals[] = { + { 1, "3" }, + { 2, "3A" }, + { 4, "6-0A" }, + { 5, "6-0B" }, + { 0, NULL } +}; + + +static const value_string pa_vals[] = { + { 0, "-6dB" }, + { 1, "-4.77dB" }, + { 2, "-3dB" }, + { 3, "-1.77dB" }, + { 4, "0dB" }, + { 5, "1dB" }, + { 6, "2dB" }, + { 7, "3dB" }, + { 0, NULL } +}; + +static const value_string transmission_mode_vals[] = { + { 1, "Mode 1" }, + { 2, "Mode 2" }, + { 3, "Mode 3" }, + { 4, "Mode 4" }, + { 5, "Mode 5" }, + { 6, "Mode 6" }, + { 7, "Mode 7" }, + { 8, "Mode 8" }, + { 9, "Mode 9" }, + { 10, "Mode 10" }, + { 0, NULL } +}; + +static const value_string nfapi_ul_config_pdu_type_vals[] = { + { 0, "ULSCH" }, + { 1, "ULSCH_CQI_RI" }, + { 2, "ULSCH_HARQ" }, + { 3, "ULSCH_CQI_HARQ_RI" }, + { 4, "UCI_CQI" }, + { 5, "UCI_SR" }, + { 6, "UCI_HARQ" }, + { 7, "UCI_SR_HARQ" }, + { 8, "UCI_CQI_HARQ" }, + { 9, "UCI_CQI_SR" }, + { 10, "UCI_CQI_SR_HARQ" }, + { 11, "SRS" }, + { 12, "HARQ_BUFFER" }, + { 13, "ULSCH_UCI_CSI" }, + { 14, "ULSCH_UCI_HARQ" }, + { 15, "ULSCH_CSI_UCI_HARQ" }, + { 0, NULL } +}; + +static const value_string nfapi_tdd_ack_nack_mode_vals[] = { + { 0, "Bundling" }, + { 1, "Multiplexing" }, + { 2, "Format 1b with channel selection" }, + { 3, "Format 3" }, + { 4, "Format 4" }, + { 5, "Format 5" }, + { 0, NULL } +}; +static const value_string nfapi_fdd_ack_nack_mode_vals[] = { + { 0, "Format 1a/1b" }, + { 1, "Channel selection" }, + { 2, "Format 3" }, + { 3, "Format 4" }, + { 4, "Format 5" }, + { 0, NULL } +}; + +static const value_string nfapi_phich_resource_vals[] = { + { 0, "PHICH_R_ONE_SIXTH " }, + { 1, "PHICH_R_HALF" }, + { 2, "PHICH_R_ONE" }, + { 3, "PHICH_R_TWO" }, + { 0, NULL } +}; + +static const value_string local_distributed_vals[] = { + { 0, "localized" }, + { 1, "distributed" }, + { 0, NULL } +}; + +static const value_string transport_block_to_codeword_swap_flag_vals[] = { + { 0, "no swapping" }, + { 1, "swapped" }, + { 0, NULL } +}; + +static const value_string ngap_vals[] = { + { 0, "Ngap1" }, + { 1, "Ngap2" }, + { 0, NULL } +}; + +static const value_string pmi_vals[] = { + { 0, "Use precoding indicated in TPMI field" }, + { 1, "Use precoding indicated in last PMI report on PUSCH" }, + { 2, "use precoding indicated in TPM field" }, + { 0, NULL } +}; + +static const value_string true_false_vals[] = { + { 0, "false" }, + { 1, "true" }, + { 0, NULL } +}; + +static const value_string exhustive_search_vals[] = { + { 0, "non-exhaustive search" }, + { 1, "exhaustive search" }, + { 0, NULL } +}; + +static const value_string not_used_enabled_vals[] = { + { 0, "not used" }, + { 1, "enabled" }, + { 0, NULL } +}; + +static const value_string hopping_vals[] = { + { 0, "no hopping" }, + { 1, "hopping enabled" }, + { 0, NULL } +}; + + +static const value_string mpdcch_rnti_type_vals[] = { + { 1, "Temporary C-RNTI" }, + { 2, "RA-RNTI" }, + { 3, "P-RNTI" }, + { 4, "other" }, + { 0, NULL } +}; + +static const value_string rnti_type_vals[] = { + { 1, "C-RNTI" }, + { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, + { 3, "SPS-CRNTI" }, + { 0, NULL } +}; + +static const value_string primary_cells_type_vals[] = { + { 1, "TDD" }, + { 2, "FDD" }, + { 3, "HD_FDD" }, + { 0, NULL } +}; + +static const value_string ul_rssi_supported_vals[] = { + { 0, "Uplink RSSI not supported" }, + { 1, "Uplink RSSI supported" }, + { 0, NULL } +}; + +static const value_string nprb_vals[] = { + { 0, "2" }, + { 1, "3" }, + { 0, NULL } +}; + +static const value_string nmm_modes_supported_vals[] = +{ + { 0, "NONE" }, + { 1, "NMM_ONLY" }, + { 2, "NMM_IN_CONFIGURED_STATE" }, + { 3, "NMM_IN_RUNNING_STATE" }, + { 4, "NMM_IN_CONFIGURED_AND_RUNNING_STATE" }, + { 0, NULL } +}; + +static const value_string dlsch_re13_ue_type_vals[] = { + { 0, "non LC/CE UE" }, + { 1, "LC/CE CEModeA UE" }, + { 2, "LC/CE CEModeB UE" }, + { 0, NULL } +}; + +static const value_string dlsch_re13_pdsch_payload_type_vals[] = { + { 0, "PDSCH carrying SIB1-BR " }, + { 1, "PDSCH carrying SI message (except for SIB1-BR or PCH)" }, + { 2, "PDSCH carrying other" }, + { 0, NULL } +}; + +static const value_string csi_rs_flags_strname[] = { + { 0, "CSI - RS parameters are not valid" }, + { 1, "CSI - RS parameters are valid" }, + { 0, NULL} +}; + + +static const value_string paging_direct_indication_differtiation_flag_vals[] = { + { 0, "Direct Information" }, + { 1, "Paging" }, + { 0, NULL } +}; + +static const value_string ul_tx_mode_vals[] = { + { 0, "SISO/MIMO" }, + { 1, "MIMO" }, + { 0, NULL } +}; + +static const value_string n_srs_vals[] = { + { 0, "No overlap" }, + { 1, "Overlap" }, + { 0, NULL } +}; + +static const value_string n_srs_initial_vals[] = { + { 0, "Last OFDM symbol is not punctured" }, + { 1, "Last OFDM symbol is punctured." }, + { 0, NULL } +}; + + +static const value_string csi_mode_vals[] = { + { 0, "PUCCH format 2/2a/2b/3" }, + { 1, "PUCCH format 4" }, + { 2, "PUCCH format 5" }, + { 0, NULL } +}; + +static const value_string hi_dci0_pdu_type_vals[] = { + { 0, "HI" }, + { 1, "DCI UL" }, + { 2, "EDPCCH DCI UL" }, + { 3, "MDPCCH DCI UL" }, + { 0, NULL } +}; + +static const value_string ue_tx_antenna_selection_vals[] = { + { 0, "Not Configured" }, + { 1, "Configured and using UE port 0" }, + { 2, "Configured and using UE port 1" }, + { 0, NULL } +}; + +static const value_string size_of_cqi_csi_feild_vals[] = { + { 0, "1 bit" }, + { 1, "2 bits" }, + { 2, "3 bits" }, + { 0, NULL } +}; + +static const value_string number_of_antenna_port_vals[] = { + { 0, "1 antenna port" }, + { 1, "2 antenna ports" }, + { 2, "4 antenna ports" }, + { 0, NULL } +}; + +static const value_string ce_mode_vals[] = { + { 1, "CEModeA" }, + { 2, "CEModeB" }, + { 0, NULL } +}; + + +static const value_string csi_request_vals[] = { + { 0, "Aperiodic CSI not requested" }, + { 1, "Aperiodic CSI requested" }, + { 0, NULL } +}; + +static const value_string tdd_harq_mode_vals[] = { + { 0, "Format 1a/1b BUNDLING" }, + { 1, "Format 1a/1b MULTIPLEXING" }, + { 2, "Format 1a/1b SPECIAL BUNDLING" }, + { 3, "Channel Selection" }, + { 4, "Format 3" }, + { 5, "Format 4" }, + { 6, "Format 5" }, + { 0, NULL } +}; + +static const value_string fdd_harq_mode_vals[] = { + { 0, "Format 1a/1b" }, + { 1, "Channel Selection" }, + { 2, "Format 3" }, + { 3, "Format 4" }, + { 4, "Format 5" }, + { 0, NULL } +}; + +static const value_string harq_value_vals[] = { + { 1, "ACK" }, + { 2, "NACK" }, + { 3, "ACK or NACK" }, + { 4, "DTX" }, + { 5, "ACK or DTX" }, + { 6, "NACK or DTX" }, + { 7, "ACK or NACK or DTX" }, + { 0, NULL } +}; + + +static const value_string harq_special_value_vals[] = { + { 0, "0 or None" }, + { 1, "1 or 4 or 7 ACKs reported" }, + { 2, "2 or 5 or 8 ACKs reported" }, + { 3, "3 or 6 or 9 ACKs reported" }, + { 4, "DTX (UE did not transmit anything)" }, + { 0, NULL } +}; + +static const value_string channel_vals[] = { + { 0, "PUCCH" }, + { 1, "PUSCH" }, + { 0, NULL } +}; + +static const value_string rach_resource_type_vals[] = { + { 0, "Non LC / CE RACH" }, + { 1, "LC / CE RACH CE level 0" }, + { 2, "LC / CE RACH CE level 1" }, + { 3, "LC / CE RACH CE level 2" }, + { 4, "LC / CE RACH CE level 3" }, + { 0, NULL } +}; + +static const value_string up_pts_symbol_vals[] = { + { 0, "Symbol 0" }, + { 1, "Symbol 1" }, + { 0, NULL } +}; + +static const value_string arfcn_direction_vals[] = { + { 0, "DL" }, + { 1, "UL" }, + { 0, NULL } +}; + +static int proto_nfapi = -1; + +/* These are for the subtrees */ +static gint ett_nfapi_message_tree = -1; +static gint ett_nfapi_p4_p5_message_header = -1; +static gint ett_nfapi_p7_message_header = -1; +static gint ett_nfapi_tlv_tree = -1; +static gint ett_nfapi_tl = -1; +static gint ett_nfapi_pnf_phy = -1; +static gint ett_nfapi_pnf_phy_rel10 = -1; +static gint ett_nfapi_pnf_phy_rel11 = -1; +static gint ett_nfapi_pnf_phy_rel12 = -1; +static gint ett_nfapi_pnf_phy_rel13 = -1; +static gint ett_nfapi_pnf_phy_rf_config = -1; +static gint ett_nfapi_rf_bands = -1; +static gint ett_nfapi_tx_antenna_ports = -1; +static gint ett_nfapi_harq_ack_nack_data = -1; +static gint ett_nfapi_harq_data = -1; +static gint ett_nfapi_cqi_pmi_size = -1; +static gint ett_nfapi_cc = -1; +static gint ett_nfapi_rbs = -1; +static gint ett_nfapi_antennas = -1; +static gint ett_nfapi_dl_config_request_pdu_list = -1; +static gint ett_nfapi_ul_config_request_pdu_list = -1; +static gint ett_nfapi_hi_dci0_request_pdu_list = -1; +static gint ett_nfapi_tx_request_pdu_list = -1; +static gint ett_nfapi_rx_indication_pdu_list = -1; +static gint ett_nfapi_harq_indication_pdu_list = -1; +static gint ett_nfapi_crc_indication_pdu_list = -1; +static gint ett_nfapi_sr_indication_pdu_list = -1; +static gint ett_nfapi_cqi_indication_pdu_list = -1; +static gint ett_nfapi_preamble_indication_pdu_list = -1; +static gint ett_nfapi_srs_indication_pdu_list = -1; +static gint ett_nfapi_lbt_dl_config_pdu_list = -1; +static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; +static gint ett_nfapi_subbands = -1; +static gint ett_nfapi_bf_vector_antennas = -1; +static gint ett_nfapi_bf_vectors = -1; +static gint ett_nfapi_csi_rs_resource_configs = -1; +static gint ett_nfapi_csi_rs_bf_vector = -1; +static gint ett_nfapi_epdcch_prbs = -1; +static gint ett_nfapi_precoding = -1; +static gint ett_nfapi_earfcn_list = -1; +static gint ett_nfapi_uarfcn_list = -1; +static gint ett_nfapi_arfcn_list = -1; +static gint ett_nfapi_rssi_list = -1; +static gint ett_nfapi_pci_list = -1; +static gint ett_nfapi_psc_list = -1; +static gint ett_nfapi_lte_cells_found_list = -1; +static gint ett_nfapi_utran_cells_found_list = -1; +static gint ett_nfapi_geran_cells_found_list = -1; +static gint ett_nfapi_si_periodicity_list = -1; +static gint ett_nfapi_downlink_bandwidth_support = -1; +static gint ett_nfapi_uplink_bandwidth_support = -1; +static gint ett_nfapi_downlink_modulation_support = -1; +static gint ett_nfapi_uplink_modulation_support = -1; +static gint ett_nfapi_received_interference_power_mesurement_results = -1; +static gint ett_nfapi_release_support = -1; +static expert_field ei_invalid_range = EI_INIT; +static expert_field ei_invalid_tlv_length = EI_INIT; + +static int hf_nfapi_p4_p5_message_header_phy_id = -1; +static int hf_nfapi_p4_p5_message_header_message_id = -1; +static int hf_nfapi_p4_p5_message_header_message_length = -1; +static int hf_nfapi_p4_p5_message_header_spare = -1; +static int hf_nfapi_p7_message_header_phy_id = -1; +static int hf_nfapi_p7_message_header_message_id = -1; +static int hf_nfapi_p7_message_header_message_length = -1; +static int hf_nfapi_p7_message_header_m = -1; +static int hf_nfapi_p7_message_header_segment = -1; +static int hf_nfapi_p7_message_header_sequence_number = -1; +static int hf_nfapi_p7_message_header_checksum = -1; +static int hf_nfapi_p7_message_header_transmit_timestamp = -1; +static int hf_nfapi_tl_tag = -1; +static int hf_nfapi_tl_length = -1; +static int hf_nfapi_sync_mode = -1; +static int hf_nfapi_location_mode = -1; +static int hf_nfapi_location_coordinates = -1; +static int hf_nfapi_location_coordinates_length = -1; +static int hf_nfapi_dl_config_timing = -1; +static int hf_nfapi_tx_timing = -1; +static int hf_nfapi_ul_config_timing = -1; +static int hf_nfapi_hi_dci0_timing = -1; +static int hf_nfapi_maximum_number_phys = -1; +static int hf_nfapi_maximum_total_bandwidth = -1; +static int hf_nfapi_maximum_total_number_dl_layers = -1; +static int hf_nfapi_maximum_total_number_ul_layers = -1; +static int hf_nfapi_shared_bands = -1; +static int hf_nfapi_shared_pa = -1; +static int hf_nfapi_maximum_total_power = -1; +static int hf_nfapi_oui = -1; +static int hf_nfapi_pdu = -1; +static int hf_nfapi_pnf_phy_number_phy = -1; +static int hf_nfapi_pnf_phy_config_index = -1; +static int hf_nfapi_number_of_rf_exclusions = -1; +static int hf_nfapi_dl_bandwidth_support = -1; +static int hf_nfapi_dl_bandwidth_support_6 = -1; +static int hf_nfapi_dl_bandwidth_support_15 = -1; +static int hf_nfapi_dl_bandwidth_support_25 = -1; +static int hf_nfapi_dl_bandwidth_support_50 = -1; +static int hf_nfapi_dl_bandwidth_support_75 = -1; +static int hf_nfapi_dl_bandwidth_support_100 = -1; +static int hf_nfapi_ul_bandwidth_support = -1; +static int hf_nfapi_ul_bandwidth_support_6 = -1; +static int hf_nfapi_ul_bandwidth_support_15= -1; +static int hf_nfapi_ul_bandwidth_support_25 = -1; +static int hf_nfapi_ul_bandwidth_support_50 = -1; +static int hf_nfapi_ul_bandwidth_support_75 = -1; +static int hf_nfapi_ul_bandwidth_support_100 = -1; +static int hf_nfapi_downlink_channel_bandwidth_supported = -1; +static int hf_nfapi_uplink_channel_bandwidth_supported = -1; +static int hf_nfapi_number_of_dl_layers_supported = -1; +static int hf_nfapi_number_of_ul_layers_supported = -1; +static int hf_nfapi_maximum_3gpp_release_supported = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel8 = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel9 = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel10 = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel11 = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel12 = -1; +static int hf_nfapi_maximum_3gpp_release_supported_rel13 = -1; +static int hf_nfapi_nmm_modes_supported = -1; +static int hf_nfapi_number_of_rfs = -1; +static int hf_nfapi_rf_config_index = -1; +static int hf_nfapi_band = -1; +static int hf_nfapi_maximum_transmit_power = -1; +static int hf_nfapi_maximum_transmit_power_2 = -1; +static int hf_nfapi_earfcn = -1; +static int hf_nfapi_minimum_transmit_power = -1; +static int hf_nfapi_number_of_antennas_suppported = -1; +static int hf_nfapi_minimum_downlink_frequency = -1; +static int hf_nfapi_maximum_downlink_frequency = -1; +static int hf_nfapi_minimum_uplink_frequency = -1; +static int hf_nfapi_maximum_uplink_frequency = -1; +static int hf_nfapi_number_of_rf_bands = -1; +static int hf_nfapi_nmm_uplink_rssi_supported = -1; +static int hf_nfapi_phy_rf_config_info_phy_id = -1; +static int hf_nfapi_transmission_mode7_supported = -1; +static int hi_nfapi_transmission_mode8_supported = -1; +static int hi_nfapi_two_antennas_ports_for_pucch = -1; +static int hi_nfapi_transmission_mode_9_supported = -1; +static int hi_nfapi_simultaneous_pucch_pusch = -1; +static int hi_nfapi_four_layer_tx_with_tm3_and_tm4 = -1; +static int hf_nfapi_epdcch_supported = -1; +static int hi_nfapi_multi_ack_csi_reporting = -1; +static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; +static int hi_nfapi_ul_comp_supported = -1; +static int hi_nfapi_transmission_mode_5_supported = -1; +static int hf_nfapi_csi_subframe_set = -1; +static int hi_nfapi_enhanced_4tx_codebook = -1; +static int hi_nfapi_drs_supported = -1; +static int hi_nfapi_ul_64qam_supported = -1; +static int hi_nfapi_transmission_mode_10_supported = -1; +static int hi_nfapi_alternative_tbs_indices = -1; +static int hf_nfapi_pucch_format_4_supported = -1; +static int hf_nfapi_pucch_format_5_supported = -1; +static int hf_nfapi_more_than_5_ca_supported = -1; +static int hf_nfapi_laa_supported = -1; +static int hf_nfapi_laa_ending_in_dwpts_supported = -1; +static int hf_nfapi_laa_starting_in_second_slot_supported = -1; +static int hf_nfapi_beamforming_supported = -1; +static int hf_nfapi_csi_rs_enhancements_supported = -1; +static int hf_nfapi_drms_enhancements_supported = -1; +static int hf_nfapi_srs_enhancements_supported = -1; +static int hf_nfapi_dl_rs_tx_power = -1; +static int hf_nfapi_received_interference_power = -1; +static int hf_nfapi_thermal_noise_power = -1; +static int hf_nfapi_dl_rs_tx_power_measurement = -1; +static int hf_nfapi_received_interference_power_measurement = -1; +static int hf_nfapi_thermal_noise_power_measurement = -1; + +// P5 Message Structures +static int hf_nfapi_error_code = -1; +static int hf_nfapi_p4_error_code = -1; +static int hf_nfapi_rat_type = -1; +static int hf_nfapi_num_tlv = -1; +static int hf_nfapi_phy_state = -1; +static int hf_nfapi_phy_antenna_capability = -1; +static int hf_nfapi_release_capability = -1; +static int hf_nfapi_mbsfn_capability = -1; +static int hf_nfapi_laa_capability = -1; +static int hf_nfapi_pd_sensing_lbt_support = -1; +static int hf_nfapi_multi_carrier_lbt_support = -1; +static int hf_nfapi_partial_sf_support = -1; + +static int hf_nfapi_pnf_address_ipv4 = -1; +static int hf_nfapi_pnf_address_ipv6 = -1; +static int hf_nfapi_vnf_address_ipv4 = -1; +static int hf_nfapi_vnf_address_ipv6 = -1; +static int hf_nfapi_pnf_port = -1; +static int hf_nfapi_vnf_port = -1; +static int hf_nfapi_dl_ue_per_sf = -1; +static int hf_nfapi_ul_ue_per_sf = -1; +static int hf_nfapi_timing_window = -1; +static int hf_nfapi_timing_info_mode = -1; +static int hf_nfapi_timing_info_period = -1; +static int hf_nfapi_duplex_mode = -1; +static int hf_nfapi_pcfich_power_offset = -1; +static int hf_nfapi_pb = -1; +static int hf_nfapi_dl_cyclic_prefix_type = -1; +static int hf_nfapi_ul_cyclic_prefix_type = -1; +static int hf_nfapi_tx_antenna_ports = -1; +static int hf_nfapi_rx_antenna_ports = -1; +static int hf_nfapi_downlink_channel_bandwidth = -1; +static int hf_nfapi_uplink_channel_bandwidth = -1; +static int hf_nfapi_reference_signal_power = -1; +static int hf_nfapi_phich_resource = -1; +static int hf_nfapi_phich_duration = -1; +static int hf_nfapi_phich_power_offset = -1; +static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; +static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; +static int hf_nfapi_physical_cell_id = -1; +static int hf_nfapi_configuration_index = -1; +static int hf_nfapi_root_sequence_index = -1; +static int hf_nfapi_zero_correlation_zone_configuration = -1; +static int hf_nfapi_high_speed_flag = -1; +static int hf_nfapi_frequency_offset = -1; +static int hf_nfapi_hopping_mode = -1; +static int hf_nfapi_hopping_offset = -1; +static int hf_nfapi_delta_pucch_shift = -1; +static int hf_nfapi_n_cqi_rb = -1; +static int hf_nfapi_n_an_cs = -1; +static int hf_nfapi_n1_pucch_an = -1; +static int hf_nfapi_bandwidth_configuration = -1; +static int hf_nfapi_max_up_pts = -1; +static int hf_nfapi_srs_subframe_configuration = -1; +static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; +static int hf_nfapi_uplink_rs_hopping = -1; +static int hf_nfapi_group_assignment = -1; +static int hf_nfapi_cyclic_shift_1_for_drms = -1; +static int hf_nfapi_subframe_assignment = -1; +static int hf_nfapi_special_subframe_patterns = -1; +static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; +static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; +static int hf_nfapi_pd_threshold = -1; +static int hf_nfapi_multi_carrier_type = -1; +static int hf_nfapi_multi_carrier_tx = -1; +static int hf_nfapi_multi_carrier_freeze = -1; +static int hf_nfapi_tx_antenna_ports_for_drs = -1; +static int hf_nfapi_transmission_power_for_drs = -1; +static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; +static int hf_nfapi_prach_cat_m_root_sequence_index = -1; +static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; +static int hf_nfapi_prach_cat_m_high_speed_flag = -1; +static int hf_nfapi_prach_ce_level_0_enable = -1; +static int hf_nfapi_prach_ce_level_0_configuration_index = -1; +static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; +static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; +static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; +static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; +static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; +static int hf_nfapi_prach_ce_level_1_enable = -1; +static int hf_nfapi_prach_ce_level_1_configuration_index = -1; +static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; +static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; +static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; +static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; +static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; +static int hf_nfapi_prach_ce_level_2_enable = -1; +static int hf_nfapi_prach_ce_level_2_configuration_index = -1; +static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; +static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; +static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; +static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; +static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; +static int hf_nfapi_prach_ce_level_3_enable = -1; +static int hf_nfapi_prach_ce_level_3_configuration_index = -1; +static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; +static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; +static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; +static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; +static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; +static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; +static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; +static int hf_nfapi_dl_modulation_support = -1; +static int hf_nfapi_dl_modulation_support_qpsk = -1; +static int hf_nfapi_dl_modulation_support_16qam = -1; +static int hf_nfapi_dl_modulation_support_64qam = -1; +static int hf_nfapi_dl_modulation_support_256qam = -1; +static int hf_nfapi_ul_modulation_support = -1; +static int hf_nfapi_ul_modulation_support_qpsk = -1; +static int hf_nfapi_ul_modulation_support_16qam = -1; +static int hf_nfapi_ul_modulation_support_64qam = -1; +static int hf_nfapi_data_report_mode = -1; +static int hf_nfapi_sfnsf = -1; + +// P7 Sub Structures +static int hf_nfapi_dl_dci_format = -1; +static int hf_nfapi_ul_dci_format = -1; +static int hf_nfapi_mpdcch_ul_dci_format = -1; +static int hf_nfapi_cce_idx = -1; +static int hf_nfapi_aggregation_level = -1; +static int hf_nfapi_mcs_1 = -1; +static int hf_nfapi_redundancy_version_1 = -1; +static int hf_nfapi_new_data_indicator_1 = -1; +static int hf_nfapi_mcs_2 = -1; +static int hf_nfapi_redundancy_version_2 = -1; +static int hf_nfapi_new_data_indicator_2 = -1; +static int hf_nfapi_harq_process = -1; +static int hf_nfapi_tpmi = -1; +static int hf_nfapi_pmi = -1; +static int hf_nfapi_precoding_information = -1; +static int hf_nfapi_tpc = -1; +static int hf_nfapi_downlink_assignment_index = -1; +static int hf_nfapi_transport_block_size_index = -1; +static int hf_nfapi_downlink_power_offset = -1; +static int hf_nfapi_allocate_prach_flag = -1; +static int hf_nfapi_preamble_index = -1; +static int hf_nfapi_prach_mask_index = -1; +static int hf_nfapi_rnti_type = -1; +static int hf_nfapi_mpdcch_rnti_type = -1; +static int hf_nfapi_mcch_flag = -1; +static int hf_nfapi_mcch_change_notification = -1; +static int hf_nfapi_scrambling_identity = -1; +static int hf_nfapi_cross_carrier_scheduling_flag = -1; +static int hf_nfapi_carrier_indicator = -1; +static int hf_nfapi_srs_flag = -1; +static int hf_nfapi_srs_request = -1; +static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; +static int hf_nfapi_total_dci_length_including_padding = -1; +static int hf_nfapi_harq_ack_resource_offset = -1; +static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; +static int hf_nfapi_primary_cell_type = -1; +static int hf_nfapi_ul_dl_configuration_flag = -1; +static int hf_nfapi_number_of_ul_dl_configurations = -1; +static int hf_nfapi_ul_dl_configuration_index = -1; +static int hf_nfapi_laa_end_partial_sf_flag = -1; +static int hf_nfapi_laa_end_partial_sf_configuration = -1; +static int hf_nfapi_initial_lbt_sf = -1; +static int hf_nfapi_codebooksize_determination_r13 = -1; +static int hf_nfapi_rel13_drms_table_flag = -1; +static int hf_nfapi_csi_rs_resource_config = -1; +static int hf_nfapi_csi_rs_number_of_nzp_configurations = -1; +static int hf_nfapi_pdsch_start = -1; +static int hf_nfapi_drms_config_flag = -1; +static int hf_nfapi_drms_scrambling = -1; +static int hf_nfapi_csi_config_flag = -1; +static int hf_nfapi_csi_scrambling = -1; +static int hf_nfapi_pdsch_re_mapping_flag = -1; +static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; +static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; +static int hf_nfapi_alt_cqi_table_r12 = -1; +static int hf_nfapi_max_layers = -1; +static int hf_nfapi_n_dl_harq = -1; +static int hf_nfapi_dwpts_symbols = -1; +static int hf_nfapi_ue_type = -1; +static int hf_nfapi_pdsch_payload_type = -1; +static int hf_nfapi_initial_transmission_sf = -1; +static int hf_nfapi_req13_drms_table_flag = -1; +static int hf_nfapi_prnti = -1; +static int hf_nfapi_mcs = -1; +static int hf_nfapi_number_of_transport_blocks = -1; +static int hf_nfapi_ue_mode = -1; +static int hf_prs_bandwidth = -1; +static int hf_prs_cyclic_prefix_type = -1; +static int hf_prs_muting = -1; +static int hf_nfapi_csi_rs_resource_index = -1; +static int hf_nfapi_csi_rs_class = -1; +static int hf_nfapi_cdm_type = -1; +static int hf_nfapi_edpcch_prb_index = -1; +static int hf_nfapi_epdcch_resource_assignment_flag = -1; +static int hf_nfapi_epdcch_id = -1; +static int hf_nfapi_epdcch_start_symbol = -1; +static int hf_nfapi_epdcch_num_prb = -1; +static int hf_nfapi_precoding_value = -1; +static int hf_nfapi_mpdcch_narrowband = -1; +static int hf_nfapi_number_of_prb_pairs = -1; +static int hf_nfapi_resource_block_assignment = -1; +static int hf_nfapi_start_symbol = -1; +static int hf_nfapi_ecce_index = -1; +static int hf_nfapi_ce_mode = -1; +static int hf_nfapi_drms_scrabmling_init = -1; +static int hf_nfapi_pdsch_reception_levels = -1; +static int hf_nfapi_new_data_indicator = -1; +static int hf_nfapi_tpmi_length = -1; +static int hf_nfapi_pmi_flag = -1; +static int hf_nfapi_harq_resource_offset = -1; +static int hf_nfapi_dci_subframe_repetition_number = -1; +static int hf_nfapi_downlink_assignment_index_length = -1; +static int hf_nfapi_starting_ce_level = -1; +static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; +static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; +static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; +static int hf_nfapi_direct_indication = -1; +static int hf_nfapi_number_of_tx_antenna_ports = -1; + +// P7 Message Structures +static int hf_nfapi_dl_node_sync_t1 = -1; +static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; +static int hf_nfapi_ul_node_sync_t1 = -1; +static int hf_nfapi_ul_node_sync_t2 = -1; +static int hf_nfapi_ul_node_sync_t3 = -1; +static int hf_nfapi_timing_info_last_sfn_sf = -1; +static int hf_nfapi_timing_info_time_since_last_timing_info = -1; +static int hf_nfapi_timing_info_dl_config_jitter = -1; +static int hf_nfapi_timing_info_tx_request_jitter = -1; +static int hf_nfapi_timing_info_ul_config_jitter = -1; +static int hf_nfapi_timing_info_hi_dci0_jitter = -1; +static int hf_nfapi_timing_info_dl_config_latest_delay = -1; +static int hf_nfapi_timing_info_tx_request_latest_delay = -1; +static int hf_nfapi_timing_info_ul_config_latest_delay = -1; +static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; +static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; +static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; +static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; +static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; +static int hf_nfapi_sfn_sf = -1; +static int hf_nfapi_number_pdcch_ofdm_symbols = -1; +static int hf_nfapi_number_dci = -1; +static int hf_nfapi_number_pdus = -1; +static int hf_nfapi_number_pdsch_rnti = -1; +static int hf_nfapi_transmission_power_pcfich = -1; +static int hf_nfapi_number_of_harqs = -1; +static int hf_nfapi_number_of_crcs = -1; +static int hf_nfapi_number_of_srs = -1; +static int hf_nfapi_number_of_cqi = -1; +static int hf_nfapi_number_of_preambles = -1; +static int hf_nfapi_number_of_srss = -1; +static int hf_nfapi_lbt_dl_req_pdu_type = -1; +static int hf_nfapi_lbt_dl_ind_pdu_type = -1; +static int hf_nfapi_dl_config_pdu_type = -1; +static int hf_nfapi_pdu_size = -1; +static int hf_nfapi_instance_length = -1; +static int hf_nfapi_length; +static int hf_nfapi_pdu_index = -1; +static int hf_nfapi_rnti = -1; +static int hf_nfapi_resource_allocation_type = -1; +static int hf_nfapi_virtual_resource_block_assignment_flag = -1; +static int hf_nfapi_resource_block_coding = -1; +static int hf_nfapi_modulation = -1; +static int hf_nfapi_redundancy_version = -1; +static int hf_nfapi_transport_blocks = -1; +static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; +static int hf_nfapi_transmission_scheme = -1; +static int hf_nfapi_ul_transmission_scheme = -1; +static int hf_nfapi_number_of_layers = -1; +static int hf_nfapi_number_of_subbands = -1; +static int hf_nfapi_codebook_index = -1; +static int hf_nfapi_ue_category_capacity = -1; +static int hf_nfapi_pa = -1; +static int hf_nfapi_delta_power_offset_index = -1; +static int hf_nfapi_ngap = -1; +static int hf_nfapi_nprb = -1; +static int hf_nfapi_transmission_mode = -1; +static int hf_nfapi_num_bf_prb_per_subband = -1; +static int hf_nfapi_num_bf_vector = -1; +static int hf_nfapi_bf_vector_subband_index = -1; +static int hf_nfapi_bf_vector_num_antennas = -1; +static int hf_nfapi_bf_vector_bf_value = -1; +static int hf_nfapi_nscid = -1; +static int hf_nfapi_csi_rs_flag = -1; +static int hf_nfapi_csi_rs_resource_config_r10 = -1; +static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; +static int hf_nfapi_transmission_power = -1; +static int hf_nfapi_mbsfn_area_id = -1; +static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; +static int hf_nfapi_ul_config_pdu_type = -1; +static int hf_nfapi_rach_prach_frequency_resources = -1; +static int hf_nfapi_srs_present = -1; +static int hf_nfapi_handle = -1; +static int hf_nfapi_pucch_index = -1; +static int hf_nfapi_size = -1; +static int hf_nfapi_resource_block_start = -1; +static int hf_nfapi_number_of_resource_blocks = -1; +static int hf_nfapi_cyclic_shift_2_for_drms = -1; +static int hf_nfapi_frequency_hopping_enabled_flag = -1; +static int hf_nfapi_frequency_hopping_bits = -1; +static int hf_nfapi_new_data_indication = -1; +static int hf_nfapi_harq_process_number = -1; +static int hf_nfapi_ul_tx_mode = -1; +static int hf_nfapi_current_tx_nb = -1; +static int hf_nfapi_n_srs = -1; +static int hf_nfapi_disable_sequence_hopping_flag = -1; +static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; +static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; +static int hf_nfapi_ri_size = -1; +static int hf_nfapi_delta_offset_cqi = -1; +static int hf_nfapi_delta_offset_ri = -1; +static int hf_nfapi_harq_size = -1; +static int hf_nfapi_delta_offset_harq = -1; +static int hf_nfapi_tdd_ack_nack_mode = -1; +static int hf_nfapi_fdd_ack_nack_mode = -1; +static int hf_nfapi_n_srs_initial = -1; +static int hf_nfapi_initial_number_of_resource_blocks = -1; +static int hf_nfapi_dl_cqi_pmi_size = -1; +static int hf_nfapi_report_type = -1; +static int hf_nfapi_dl_cqi_ri_pmi_size = -1; +static int hf_nfapi_control_type = -1; +static int hf_nfapi_number_of_cc = -1; +static int hf_nfapi_virtual_cell_id_enabled_flag = -1; +static int hf_nfapi_npusch_identity = -1; +static int hf_nfapi_ndrms_csh_identity = -1; +static int hf_nfapi_total_number_of_repetitions = -1; +static int hf_nfapi_repetition_number = -1; +static int hf_nfapi_initial_sf_io = -1; +static int hf_nfapi_empty_symbols_due_to_retunning = -1; +static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; +static int hf_nfapi_npucch_identity = -1; +static int hf_nfapi_harq_size_2 = -1; +static int hf_nfapi_delta_offset_harq_2 = -1; +static int hf_nfapi_empty_symbols = -1; +static int hf_nfapi_csi_mode = -1; +static int hf_nfapi_dl_cqi_pmi_size_2 = -1; +static int hf_nfapi_statring_prb = -1; +static int hf_nfapi_cdm_index = -1; +static int hf_nfapi_nsrs = -1; +static int hf_nfapi_num_ant_ports = -1; +static int hf_nfapi_n_pucch_2_0 = -1; +static int hf_nfapi_n_pucch_2_1 = -1; +static int hf_nfapi_n_pucch_2_2 = -1; +static int hf_nfapi_n_pucch_2_3 = -1; +static int hf_nfapi_starting_prb = -1; +static int hf_nfapi_antenna_port = -1; +static int hf_nfapi_number_of_combs = -1; +static int hf_nfapi_number_of_pucch_resource = -1; +static int hf_nfapi_pucch_index_p1 = -1; +static int hf_nfapi_n_pucch_1_0 = -1; +static int hf_nfapi_n_pucch_1_1 = -1; +static int hf_nfapi_n_pucch_1_2 = -1; +static int hf_nfapi_n_pucch_1_3 = -1; +static int hf_nfapi_srs_bandwidth = -1; +static int hf_nfapi_frequency_domain_position = -1; +static int hf_nfapi_srs_hopping_bandwidth = -1; +static int hf_nfapi_transmission_comb = -1; +static int hf_nfapi_i_srs = -1; +static int hf_nfapi_sounding_reference_cyclic_shift = -1; +static int hf_nfapi_pdu_length = -1; +static int hf_nfapi_crc_flag = -1; +static int hf_nfapi_number_of_hi_pdus = -1; +static int hf_nfapi_number_of_dci_pdus = -1; +static int hf_nfapi_hi_dci0_pdu_type = -1; +static int hf_nfapi_hi_value = -1; +static int hf_nfapi_i_phich = -1; +static int hf_nfapi_flag_tb2 = -1; +static int hf_nfapi_hi_value_2 = -1; +static int hf_nfapi_ue_tx_antenna_selection = -1; +static int hf_nfapi_cqi_csi_request = -1; +static int hf_nfapi_ul_index = -1; +static int hf_nfapi_dl_assignment_index = -1; +static int hf_nfapi_tpc_bitmap = -1; +static int hf_nfapi_new_data_indication_two = -1; +static int hf_nfapi_size_of_cqi_csi_feild = -1; +static int hf_nfapi_resource_allocation_flag = -1; +static int hf_nfapi_number_of_antenna_ports = -1; +static int hf_nfapi_n_ul_rb = -1; +static int hf_nfapi_pscch_resource = -1; +static int hf_nfapi_time_resource_pattern = -1; +static int hf_nfapi_mpdcch_transmission_type = -1; +static int hf_nfapi_drms_scrambling_init = -1; +static int hf_nfapi_pusch_repetition_levels = -1; +static int hf_nfapi_frequency_hopping_flag = -1; +static int hf_nfapi_csi_request = -1; +static int hf_nfapi_dai_presence_flag = -1; +static int hf_nfapi_total_dci_length_include_padding = -1; +static int hf_nfapi_data_offset = -1; +static int hf_nfapi_ul_cqi = -1; +static int hf_nfapi_timing_advance_r9 = -1; +static int hf_nfapi_timing_advance = -1; +static int hf_nfapi_harq_data_value_0 = -1; +static int hf_nfapi_harq_data_value_0_special = -1; +static int hf_nfapi_harq_data_value_1 = -1; +static int hf_nfapi_harq_data_value_2 = -1; +static int hf_nfapi_harq_data_value_3 = -1; +static int hf_nfapi_tdd_harq_mode = -1; +static int hf_nfapi_fdd_harq_mode = -1; +static int hf_nfapi_number_of_ack_nack = -1; +static int hf_nfapi_harq_tb_1 = -1; +static int hf_nfapi_harq_tb_2 = -1; +static int hf_nfapi_harq_tb_n = -1; +static int hf_nfapi_channel = -1; +static int hf_nfapi_ri = -1; +static int hf_nfapi_number_of_cc_reported = -1; +static int hf_nfapi_preamble = -1; +static int hf_nfapi_rach_resource_type = -1; +static int hf_nfapi_snr = -1; +static int hf_nfapi_doppler_estimation = -1; +static int hf_nfapi_rb_start = -1; +static int hf_nfapi_up_pts_symbol = -1; +static int hf_nfapi_number_prb_per_subband = -1; +static int hf_nfapi_number_antennas = -1; +static int hf_nfapi_subband_index = -1; +static int hf_nfapi_channel_coefficient = -1; +static int hf_nfapi_ul_rtoa = -1; +static int hf_nfapi_mp_cca = -1; +static int hf_nfapi_n_cca = -1; +static int hf_nfapi_offset = -1; +static int hf_nfapi_lte_txop_sf = -1; +static int hf_nfapi_txop_sfn_sf_end = -1; +static int hf_nfapi_lbt_mode = -1; +static int hf_nfapi_sfn_sf_end = -1; +static int hf_nfapi_result = -1; +static int hf_nfapi_txop_symbols = -1; +static int hf_nfapi_initial_partial_sf = -1; +static int hf_nfapi_frequency_band_indicator = -1; +static int hf_nfapi_measurement_period = -1; +static int hf_nfapi_bandwidth = -1; +static int hf_nfapi_timeout = -1; +static int hf_nfapi_number_of_earfcns = -1; +static int hf_nfapi_uarfcn = -1; +static int hf_nfapi_number_of_uarfcns = -1; +static int hf_nfapi_arfcn = -1; +static int hf_nfapi_arfcn_direction = -1; +static int hf_nfapi_number_of_arfcns = -1; +static int hf_nfapi_rssi = -1; +static int hf_nfapi_number_of_rssi = -1; +static int hf_nfapi_pci = -1; +static int hf_nfapi_measurement_bandwidth = -1; +static int hf_nfapi_exhaustive_search = -1; +static int hf_nfapi_number_of_pci = -1; +static int hf_nfapi_psc = -1; +static int hf_nfapi_number_of_psc = -1; +static int hf_nfapi_rsrp = -1; +static int hf_nfapi_rsrq = -1; +static int hf_nfapi_number_of_lte_cells_found = -1; +static int hf_nfapi_rscp = -1; +static int hf_nfapi_enco = -1; +static int hf_nfapi_number_of_utran_cells_found = -1; +static int hf_nfapi_bsic = -1; +static int hf_nfapi_rxlev = -1; +static int hf_nfapi_rxqual = -1; +static int hf_nfapi_sfn_offset = -1; +static int hf_nfapi_number_of_geran_cells_found = -1; +static int hf_nfapi_number_of_tx_antenna = -1; +static int hf_nfapi_mib_length = -1; +static int hf_nfapi_mib = -1; +static int hf_nfapi_phich_configuration = -1; +static int hf_nfapi_retry_count = -1; +static int hf_nfapi_sib1 = -1; +static int hf_nfapi_si_periodicity = -1; +static int hf_nfapi_si_index = -1; +static int hf_nfapi_number_of_si_periodicity = -1; +static int hf_nfapi_si_window_length = -1; +static int hf_nfapi_sib_type = -1; +static int hf_nfapi_sib_len = -1; +static int hf_nfapi_sib = -1; +static int hf_nfapi_si_len = -1; +static int hf_nfapi_si = -1; +static int hf_nfapi_pnf_search_state = -1; +static int hf_nfapi_pnf_broadcast_state = -1; + +static const value_string message_id_vals[] = +{ + { NFAPI_DL_CONFIG_REQUEST_MSG_ID, "DL_CONFIG.request" }, + { NFAPI_UL_CONFIG_REQUEST_MSG_ID, "UL_CONFIG.request" }, + { NFAPI_SUBFRAME_INDICATION_MSG_ID, "SUBFRAME_INDICATION" }, + { NFAPI_HI_DCI0_REQUEST_MSG_ID, "HI_DCI0.request" }, + { NFAPI_TX_REQUEST_MSG_ID, "TX.request" }, + { NFAPI_HARQ_INDICATION_MSG_ID, "HARQ.indication" }, + { NFAPI_CRC_INDICATION_MSG_ID, "CRC.indication" }, + { NFAPI_RX_ULSCH_INDICATION_MSG_ID, "RX_ULSCH.indication" }, + { NFAPI_RACH_INDICATION_MSG_ID, "RACH.indication" }, + { NFAPI_SRS_INDICATION_MSG_ID, "SRS.indication" }, + { NFAPI_RX_SR_INDICATION_MSG_ID, "RX_SR.indication" }, + { NFAPI_RX_CQI_INDICATION_MSG_ID, "RX_CQI.indication" }, + { NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, "LBT_DL_CONFIG.request" }, + { NFAPI_LBT_DL_INDICATION_MSG_ID, "LBT_DL.indication" }, + + { NFAPI_PNF_PARAM_REQUEST_MSG_ID, "PNF_PARAM.request" }, + { NFAPI_PNF_PARAM_RESPONSE_MSG_ID, "PNF_PARAM.response" }, + { NFAPI_PNF_CONFIG_REQUEST_MSG_ID, "PNF_CONFIG.request" }, + { NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, "PNF_CONFIG.response" }, + { NFAPI_PNF_START_REQUEST_MSG_ID, "PNF_START.request" }, + { NFAPI_PNF_START_RESPONSE_MSG_ID, "PNF_START.response" }, + { NFAPI_PNF_STOP_REQUEST_MSG_ID, "PNF_STOP.request" }, + { NFAPI_PNF_STOP_RESPONSE_MSG_ID, "PNF_STOP.response" }, + { NFAPI_PARAM_REQUEST_MSG_ID, "PARAM.request" }, + { NFAPI_PARAM_RESPONSE_MSG_ID, "PARAM.response" }, + { NFAPI_CONFIG_REQUEST_MSG_ID, "CONFIG.request" }, + { NFAPI_CONFIG_RESPONSE_MSG_ID, "CONFIG.response" }, + { NFAPI_START_REQUEST_MSG_ID, "START.request" }, + { NFAPI_START_RESPONSE_MSG_ID, "START.response" }, + { NFAPI_STOP_REQUEST_MSG_ID, "STOP.request" }, + { NFAPI_STOP_RESPONSE_MSG_ID, "STOP.response" }, + { NFAPI_MEASUREMENT_REQUEST_MSG_ID, "MEASUREMENT.request" }, + { NFAPI_MEASUREMENT_RESPONSE_MSG_ID, "MEASUREMENT.response" }, + + { NFAPI_DL_NODE_SYNC_MSG_ID, "UL_NODE_SYNC" }, + { NFAPI_UL_NODE_SYNC_MSG_ID, "DL_NODE_SYNC" }, + { NFAPI_TIMING_INFO_MSG_ID, "TIMING_INFO" }, + + { NFAPI_RSSI_REQUEST_MSG_ID, "RSSI.request" }, + { NFAPI_RSSI_RESPONSE_MSG_ID, "RSSI.response" }, + { NFAPI_RSSI_INDICATION_MSG_ID, "RSSI.indication" }, + { NFAPI_CELL_SEARCH_REQUEST_MSG_ID, "CELL_SEARCH.request" }, + { NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, "CELL_SEARCH.response" }, + { NFAPI_CELL_SEARCH_INDICATION_MSG_ID, "CELL_SEARCH.indication" }, + { NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, "BROADCAST_DETECT.request" }, + { NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, "BROADCAST_DETECT.response" }, + { NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, "BROADCAST_DETECT.indication" }, + { NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.request" }, + { NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.response" }, + { NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.indication" }, + { NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, "SYSTEM_INFORMATION.request" }, + { NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, "SYSTEM_INFORMATION.response" }, + { NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, "SYSTEM_INFORMATION.indication" }, + { NFAPI_NMM_STOP_REQUEST_MSG_ID, "NMM_STOP.request" }, + { NFAPI_NMM_STOP_RESPONSE_MSG_ID, "NMM_STOP.response" }, + + { 0, NULL }, +}; + +typedef void(*tlv_decode)(ptvcursor_t * ptvc, packet_info* pinfo); + +typedef struct +{ + guint16 tag_id; + char* name; + tlv_decode decode; +} tlv_t; + +static void dissect_tlv_list(ptvcursor_t * ptvc, packet_info* pinfo, gint len); + +static void dissect_array_value(ptvcursor_t * ptvc, packet_info* pinfo, const char* name, guint32 ett_idx, guint32 count, tlv_decode decode) +{ + guint16 i = 0; + + if (count > 0) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "%s", name); + + for (i = 0; i < count; ++i) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "[%d]", i); + decode(ptvc, pinfo); + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); + } +} + +static void dissect_pnf_param_general_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // nFAPI Sync Mode + guint8 nfapi_sync_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_sync_mode, 1, ENC_BIG_ENDIAN); + if (nfapi_sync_mode_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nfapi sync mode value [0..2]"); + } + + // Location Mode + guint8 location_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_location_mode, 1, ENC_BIG_ENDIAN); + if (location_mode_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid location mode value [0..3]"); + } + + guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_location_coordinates_length, 2, ENC_BIG_ENDIAN); + if (len > 0) + ptvcursor_add(ptvc, hf_nfapi_location_coordinates, len, ENC_NA); + ptvcursor_add(ptvc, hf_nfapi_dl_config_timing, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_tx_timing, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_ul_config_timing, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_hi_dci0_timing, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_number_phys, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_total_bandwidth, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_dl_layers, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_ul_layers, 1, ENC_BIG_ENDIAN); + + // Shared Bands + guint8 shared_bands_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_shared_bands, 1, ENC_BIG_ENDIAN); + if (shared_bands_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared bands value [0..1]"); + } + + // Shared PA + guint8 shared_pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_shared_pa, 1, ENC_BIG_ENDIAN); + if (shared_pa_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared pa value [0..1]"); + } + + ptvcursor_add(ptvc, hf_nfapi_maximum_total_power, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_oui, 3, ENC_HOST_ENDIAN); +} +static void dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); +} +static void dissect_pnf_phy_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + + guint16 num_rf_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Config List", ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); + + guint16 num_rf_exclusions = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rf_exclusions, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Exclustion List", ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); + + // Downlink Channel Bandwidth Supported + guint16 downlink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add_no_advance(ptvc, hf_nfapi_downlink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); + if (downlink_channel_bandwidth_supported_value > 0x3F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink channel bandwidht supported bits [0..0x3F]"); + } + + proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); + + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); + + + + // Uplink Channel Bandwidth Supported + guint16 uplink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add_no_advance(ptvc, hf_nfapi_uplink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); + if (uplink_channel_bandwidth_supported_value > 0x3F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink channel bandwidht supported bits [0..0x3F]"); + } + + proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); + + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); + + // Number of DL layers supported + guint8 number_of_dl_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_dl_layers_supported, 1, ENC_BIG_ENDIAN); + if (!(number_of_dl_layer_supported_value == 1 || number_of_dl_layer_supported_value == 2 || + number_of_dl_layer_supported_value == 4 || number_of_dl_layer_supported_value == 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of dl layers supported value [1, 2, 4, 8]"); + } + + // Number of DL layers supported + guint8 number_of_ul_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_layers_supported, 1, ENC_BIG_ENDIAN); + if (!(number_of_ul_layer_supported_value == 1 || number_of_ul_layer_supported_value == 2 || + number_of_ul_layer_supported_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ul layers supported value [1, 2, 4]"); + } + + // Maximum 3GPP Release Supported + guint16 maximum_3gpp_release_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add_no_advance(ptvc, hf_nfapi_maximum_3gpp_release_supported, 2, ENC_BIG_ENDIAN); + if (maximum_3gpp_release_supported_value > 0x3F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum 3GPP release supported value [0..0x3F]"); + } + + proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); + + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); + + + // NMM Modes Supported + guint8 nmm_modes_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nmm_modes_supported, 1, ENC_BIG_ENDIAN); + if (nmm_modes_supported_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm modes supported value [0..3]"); + } +} + +static void dissect_pnf_phy_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY List", ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); +} + +static void dissect_pnf_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_minimum_transmit_power, 2, ENC_BIG_ENDIAN); + + guint8 number_of_antennas_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_antennas_suppported, 1, ENC_BIG_ENDIAN); + if (!(number_of_antennas_supported_value == 1 || number_of_antennas_supported_value == 2 || + number_of_antennas_supported_value == 4 || number_of_antennas_supported_value == 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of supported antennas [1, 2, 4, 8]"); + } + + ptvcursor_add(ptvc, hf_nfapi_minimum_downlink_frequency, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_downlink_frequency, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_minimum_uplink_frequency, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_maximum_uplink_frequency, 4, ENC_BIG_ENDIAN); +} + + +static void dissect_pnf_rf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_rf = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF List", ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); +} + +static void dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PHY Config Index + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + + // Transmission mode 7 supported + guint16 transmission_mode7_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode7_supported, 2, ENC_BIG_ENDIAN); + if (transmission_mode7_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 7 supported value [0..1]"); + } + + // Two antennas ports for PUCCH + guint16 transmission_mode8_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode8_supported, 2, ENC_BIG_ENDIAN); + if (transmission_mode8_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 8 supported value [0..1]"); + } + + // Transmission mode 8 supported + guint16 two_antennas_port_for_pucch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_two_antennas_ports_for_pucch, 2, ENC_BIG_ENDIAN); + if (two_antennas_port_for_pucch_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid two antennas ports for pucch value [0..1]"); + } + + // Transmission mode 9 supported + guint16 transmission_mode9_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_9_supported, 2, ENC_BIG_ENDIAN); + if (transmission_mode9_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 9 supported value [0..1]"); + } + + // Simultaneous PUCCH PUSCH + guint16 simultaenous_pucch_pusch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_simultaneous_pucch_pusch, 2, ENC_BIG_ENDIAN); + if (simultaenous_pucch_pusch_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid simultaneous pucch pusch supported value [0..1]"); + } + + // Four layer Tx with TM3 and TM4 + guint16 four_layer_tx_with_tm3_and_tm4_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_four_layer_tx_with_tm3_and_tm4, 2, ENC_BIG_ENDIAN); + if (four_layer_tx_with_tm3_and_tm4_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid four layer tx with tm3 and tm4 value [0..1]"); + } +} + +static void dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY Rel 10 List", ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); +} + +static void dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PHY Config Index + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + + // ePDCCH supported + guint16 epdcch_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_epdcch_supported, 2, ENC_BIG_ENDIAN); + if (epdcch_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid edpcch supported value [0..1]"); + } + + // Multi ACK CSI reporting + guint16 multi_ack_csi_reporting_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_multi_ack_csi_reporting, 2, ENC_BIG_ENDIAN); + if (multi_ack_csi_reporting_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi ack csi reporting value [0..1]"); + } + + // PUCCH Tx diversity with channel selection + guint16 pucch_tx_diversity_with_channel_selection_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_pucch_tx_diversity_with_channel_selection, 2, ENC_BIG_ENDIAN); + if (pucch_tx_diversity_with_channel_selection_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch tx diversity with channel selection value [0..1]"); + } + + // UL CoMP supported + guint16 ul_comp_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_ul_comp_supported, 2, ENC_BIG_ENDIAN); + if (ul_comp_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul comp supported value [0..1]"); + } + + // Transmission mode 5 supported + guint16 transmission_mode_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_5_supported, 2, ENC_BIG_ENDIAN); + if (transmission_mode_5_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 5 supported value [0..1]"); + } +} + +static void dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY Rel 11 List", ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); +} + +static void dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PHY Config Index + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + + // CSI subframe set + guint16 csi_subframe_set_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_subframe_set, 2, ENC_BIG_ENDIAN); + if (csi_subframe_set_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi subframe set value [0..1]"); + } + + // Enhanced 4TX codebook + guint16 enhanced_4tx_codebook_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_enhanced_4tx_codebook, 2, ENC_BIG_ENDIAN); + if (enhanced_4tx_codebook_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid enhanced 4TX codebook value [0..1]"); + } + + // DRS supported + guint16 drs_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_drs_supported, 2, ENC_BIG_ENDIAN); + if (drs_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drs supported value [0..1]"); + } + + // UL 64QAM supported + guint16 ul_64qam_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_ul_64qam_supported, 2, ENC_BIG_ENDIAN); + if (ul_64qam_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul 64 QAM supported value [0..1]"); + } + + // Transmission mode 10 supported + guint16 transmission_mode_10_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_10_supported, 2, ENC_BIG_ENDIAN); + if (transmission_mode_10_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 10 supported value [0..1]"); + } + + // Alternative TBS indices + guint16 alternative_tbs_indices_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hi_nfapi_alternative_tbs_indices, 2, ENC_BIG_ENDIAN); + if (alternative_tbs_indices_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alternative tbs indicies supported value [0..1]"); + } +} + +static void dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY Rel 12 List", ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); +} + +static void dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PHY Config Index + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + + // PUCCH format 4 supported + guint16 pucch_format_4_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_4_supported, 2, ENC_BIG_ENDIAN); + if (pucch_format_4_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 4 supported value [0..1]"); + } + + // PUCCH format 5 supported + guint16 pucch_format_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_5_supported, 2, ENC_BIG_ENDIAN); + if (pucch_format_5_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 5 supported value [0..1]"); + } + + // More than 5 CA support + guint16 more_than_5_ca_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_more_than_5_ca_supported, 2, ENC_BIG_ENDIAN); + if (more_than_5_ca_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid more than 5 ca supported value [0..1]"); + } + + // LAA supported + guint16 laa_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_laa_supported, 2, ENC_BIG_ENDIAN); + if (laa_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa supported value [0..1]"); + } + + // LAA ending in DwPTS supported + guint16 laa_ending_in_dwpts_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_laa_ending_in_dwpts_supported, 2, ENC_BIG_ENDIAN); + if (laa_ending_in_dwpts_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa ending in dwpts supported value [0..1]"); + } + + // LAA starting in second slot Supported + guint16 laa_starting_in_second_slot_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_laa_starting_in_second_slot_supported, 2, ENC_BIG_ENDIAN); + if (laa_starting_in_second_slot_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa starting in second slot supported value [0..1]"); + } + + // Beamforming Supported + guint16 beamingforming_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_beamforming_supported, 2, ENC_BIG_ENDIAN); + if (beamingforming_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid beamforming supported value [0..1]"); + } + + // CSI-RS enhancements supported + guint16 csi_rs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_enhancements_supported, 2, ENC_BIG_ENDIAN); + if (csi_rs_enhancements_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs enhancements supported value [0..1]"); + } + + // DMRS enhancements supported + guint16 drms_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_enhancements_supported, 2, ENC_BIG_ENDIAN); + if (drms_enhancements_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms enhancements supported value [0..1]"); + } + + // SRS enhancements supported + guint16 srs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_enhancements_supported, 2, ENC_BIG_ENDIAN); + if (srs_enhancements_supported_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs enhancements supported value [0..1]"); + } + +} + +static void dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY Rel 13 List", ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); +} + +static void dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_phy_rf_config_info_phy_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); +} +static void dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "PHY RF Config List", ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); +} + +static void dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power, 2, ENC_BIG_ENDIAN); + + if (!(value >= 1 && value <= 255)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); + } +} +static void dissect_received_interference_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_received_interference_power, 2, ENC_BIG_ENDIAN); + + if (!(value >= 1 && value <= 255)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); + } +} +static void dissect_thermal_noise_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power, 2, ENC_BIG_ENDIAN); +} +static void dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power_measurement, 2, ENC_BIG_ENDIAN); +} + +static void dissect_received_interference_power_result_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_received_interference_power_measurement, 2, ENC_BIG_ENDIAN); +} +static void dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 num_resource_block = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "Results", ett_nfapi_received_interference_power_mesurement_results, num_resource_block, dissect_received_interference_power_result_value); +} +static void dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power_measurement, 2, ENC_BIG_ENDIAN); +} +static void dissect_duplex_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_duplex_mode, 2, ENC_BIG_ENDIAN); + + if (value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid duplex mode [0..2]"); + } +} +static void dissect_pcfich_power_offset_value(ptvcursor_t* ptvc, packet_info *pinfo) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pcfich_power_offset, 2, ENC_BIG_ENDIAN); + + if (value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid power level [0..10000]"); + } +} +static void dissect_pb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pb, 2, ENC_BIG_ENDIAN); + + if (value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power allocation index [0..3]"); + } +} + +static void dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cyclic prefix type [0..1]"); + } +} +static void dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul cyclic prefix type [0..1]"); + } +} +static void dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); + + if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth value [6, 15, 25, 50, 75, 100]"); + } +} +static void dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_channel_bandwidth, 2, ENC_BIG_ENDIAN); + + if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth value [6, 15, 25, 50, 75, 100]"); + } +} +static void dissect_reference_signal_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_reference_signal_power, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid reference signal power [0..255]"); + } + +} +static void dissect_tx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports value [1, 2, 4, 8, 16]"); + } +} +static void dissect_rx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rx_antenna_ports, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rx antenna ports value [1, 2, 4, 8, 16]"); + } +} +static void dissect_phich_resource_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_resource, 2, ENC_BIG_ENDIAN); + + if (value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich resource value [0..3]"); + } +} +static void dissect_phich_duration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_duration, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich duration value [0..1]"); + } +} +static void dissect_phich_power_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_power_offset, 2, ENC_BIG_ENDIAN); + + if (value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich power offset value [0..10000]"); + } +} +static void dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_primary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); + + if (value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary synchronization signal epre/eprers value [0..10000]"); + } +} +static void dissect_physical_cell_id_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_physical_cell_id, 2, ENC_BIG_ENDIAN); + + if (value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid physical cell id [0..503]"); + } +} +static void dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_secondary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); + + if (value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid secondary synchronization signal epre/eprers value [0..10000]"); + } +} +static void dissect_prach_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_configuration_index, 2, ENC_BIG_ENDIAN); + + if (value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach configuration index [0..63]"); + } +} +static void dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_root_sequence_index, 2, ENC_BIG_ENDIAN); + + if (value > 837) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach root sequency index [0..837]"); + } +} +static void dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); + + // How do differentiate between fdd 0..6 and tdd 0..15 ranges? + if (value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid zero correlation zone configuration [0..15]"); + } +} +static void dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_high_speed_flag, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid high speed flag value [0..1]"); + } +} +static void dissect_prach_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); + + // How to determine the ul channel bandiwdth? + if (value > (100 -6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach frequency offset value [0..94]"); + } +} +static void dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_mode, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping mode value [0..1]"); + } +} +static void dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_offset, 2, ENC_BIG_ENDIAN); + + if (value > 98) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping offset value [0..98]"); + } +} +static void dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 2, ENC_BIG_ENDIAN); + + if (!(value >= 1 && value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of sub-bands [1..4]"); + } +} +static void dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_pucch_shift, 2, ENC_BIG_ENDIAN); + + if (!(value >= 1 && value <= 3)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta pucch shift [1..3]"); + } +} +static void dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_cqi_rb, 2, ENC_BIG_ENDIAN); + + if (value > 98) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n cqi rb value [0..98]"); + } +} +static void dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_an_cs, 2, ENC_BIG_ENDIAN); + + if (value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n an cs value [0..7]"); + } +} +static void dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n1_pucch_an, 2, ENC_BIG_ENDIAN); + + if (value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n1pucch an value [0..2047]"); + } +} +static void dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth_configuration, 2, ENC_BIG_ENDIAN); + + if (value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth configuration value [0..7]"); + } +} +static void dissect_srs_max_uppts_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_max_up_pts, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max up pts value [0..1]"); + } +} +static void dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_subframe_configuration, 2, ENC_BIG_ENDIAN); + + if (value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs subframe configuration value [0..15]"); + } +} +static void dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_acknack_srs_simultaneous_transmission, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs ack nack srs simultaneous transmission value [0..1]"); + } +} +static void dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_rs_hopping, 2, ENC_BIG_ENDIAN); + + if (value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink rs hopping value [0..2]"); + } +} +static void dissect_group_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_group_assignment, 2, ENC_BIG_ENDIAN); + + if (value > 29) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid group assignment value [0..29]"); + } +} +static void dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_1_for_drms, 2, ENC_BIG_ENDIAN); + + if (value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 1 for drms value [0..7]"); + } +} +static void dissect_tdd_subframe_assignement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_subframe_assignment, 2, ENC_BIG_ENDIAN); + + if (value > 6) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tdd subframe assignment value [0..6]"); + } +} +static void dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_special_subframe_patterns, 2, ENC_BIG_ENDIAN); + + if (value > 9) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid special subframe pattern value [0..9]"); + } +} +static void dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_pdsch, 2, ENC_BIG_ENDIAN); + + if (value > 70) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for pdsch value [0..70]"); + } +} +static void dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_drs, 2, ENC_BIG_ENDIAN); + + if (value > 70) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for drs value [0..70]"); + } +} +static void dissect_laa_pd_threshold_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_threshold, 2, ENC_BIG_ENDIAN); + + if (value > 70 && value != 65535) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd threshold value [0..70, 65536]"); + } +} +static void dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_type, 2, ENC_BIG_ENDIAN); + + if (value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier type [0..4]"); + } +} +static void dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_tx, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier tx value [0..1]"); + } +} +static void dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_freeze, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier freeze value [0..1]"); + } +} +static void dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports_for_drs, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports for drs value [1, 2, 4]"); + } +} +static void dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_for_drs, 2, ENC_BIG_ENDIAN); + + if (value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for drs [0..10000]"); + } +} +static void dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pbch_repetitions_enabled_r13, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pbch repetitions enabled r13 value [0..1]"); + } +} +static void dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_root_sequence_index, 2, ENC_BIG_ENDIAN); + + if (value > 837) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m root sequence index value [0..837]"); + } +} +static void dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); + + if (value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m zero correlation zone configuration value [0..15]"); + } +} +static void dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_high_speed_flag, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m high speed flag value [0..1]"); + } +} +static void dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_enable, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 enable value [0..1]"); + } +} +static void dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_configuration_index, 2, ENC_BIG_ENDIAN); + + if (value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 configuration index value [0..63]"); + } +} +static void dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_frequency_offset, 2, ENC_BIG_ENDIAN); + + if (value > (100 - 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 frequency offset value [0..94]"); + } +} +static void dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); + + if (!( value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); + } +} +static void dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); + + if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128 || value == 256)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); + } +} +static void dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_enabled, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping enabled value [0..1]"); + } +} +static void dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_offset, 2, ENC_BIG_ENDIAN); + + if (value > 94) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping offset value [0..94]"); + } +} +static void dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_enable, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 enable value [0..1]"); + } +} +static void dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_configuration_index, 2, ENC_BIG_ENDIAN); + + if (value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 configuration index value [0..63]"); + } +} +static void dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_frequency_offset, 2, ENC_BIG_ENDIAN); + + if (value > (100 - 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 frequency offset value [0..94]"); + } +} +static void dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); + } +} +static void dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); + + if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128 || value == 256)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); + } +} +static void dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_enabled, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping enabled value [0..1]"); + } +} +static void dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_offset, 2, ENC_BIG_ENDIAN); + + if (value > 94) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping offset value [0..94]"); + } +} +static void dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_enable, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 enable value [0..1]"); + } +} +static void dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_configuration_index, 2, ENC_BIG_ENDIAN); + + if (value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); + } +} +static void dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_frequency_offset, 2, ENC_BIG_ENDIAN); + + if (value > (100 - 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 frequency offset value [0..94]"); + } +} +static void dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); + } +} +static void dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); + + if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128 || value == 256)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); + } +} +static void dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_enabled, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping enabled value [0..1]"); + } +} +static void dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_offset, 2, ENC_BIG_ENDIAN); + + if (value > 94) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping offset value [0..94]"); + } +} +static void dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_enable, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 enable value [0..1]"); + } +} +static void dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_configuration_index, 2, ENC_BIG_ENDIAN); + + if (value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); + } +} +static void dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_frequency_offset, 2, ENC_BIG_ENDIAN); + + if (value > (100 - 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 frequency offset value [0..94]"); + } +} +static void dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); + } +} +static void dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); + + if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || + value == 64 || value == 128 || value == 256)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); + } +} +static void dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_enabled, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping enabled value [0..1]"); + } +} +static void dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_offset, 2, ENC_BIG_ENDIAN); + + if (value > 94) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping offset value [0..94]"); + } +} +static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 5 || value == 10 || value == 20)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [1, 2, 4, 8] or [1, 5, 10, 20]"); + } +} +static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, 2, ENC_BIG_ENDIAN); + + if (!(value == 2 || value == 4 || value == 8 || value == 16 || value == 5 || value == 10 || value == 20 || value == 40)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [2, 4, 8, 16] or [5, 10, 20, 40]"); + } +} +static void dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_bandwidth_support, 2, ENC_BIG_ENDIAN); + + if (value > 0x1F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth support bit [0..0x1F]"); + } + + proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); + + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); +} +static void dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_bandwidth_support, 2, ENC_BIG_ENDIAN); + + if (value > 0x1F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth support bit [0..0x1F]"); + } + + proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); + + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); + +} +static void dissect_dl_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_modulation_support, 2, ENC_BIG_ENDIAN); + + if (value > 0x7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink modulation support bit [0..0x7]"); + } + + proto_tree* dl_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_modulation_support); + + proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_256qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); +} +static void dissect_ul_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_modulation_support, 2, ENC_BIG_ENDIAN); + + if (value > 0x7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink modulation support bit [0..0x7]"); + } + + proto_tree* ul_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_modulation_support); + + proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); +} +static void dissect_phy_antenna_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_antenna_capability, 2, ENC_BIG_ENDIAN); + + if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy antenna capability [1, 2, 4, 8, 16]"); + } +} +static void dissect_release_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_release_capability, 2, ENC_BIG_ENDIAN); + + if (value > 0x3F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid release capability value [0..0x3F]"); + } + + proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); + + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); + proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); + + ptvcursor_advance(ptvc, 2); +} +static void dissect_mbsfn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_mbsfn_capability, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mbsfn capability bit [0..0x1]"); + } +} +static void dissect_laa_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_laa_capability, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa support bit [0..0x1]"); + } +} +static void dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_sensing_lbt_support, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd sensing lbt support bit [0..0x1]"); + } +} +static void dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_lbt_support, 2, ENC_BIG_ENDIAN); + + if (value > 0xF) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier LBT support bit [0..0xF]"); + } +} +static void dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_partial_sf_support, 2, ENC_BIG_ENDIAN); + + if (value > 0x1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid partial SF support bit [0..0x1]"); + } +} +static void dissect_data_report_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_data_report_mode, 2, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid data report mode value [0..1]"); + } +} +static void dissect_sfn_sf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_sfnsf, 2, ENC_BIG_ENDIAN); + + guint16 sfn = value >> 0x4; + guint16 sf = value & 0x000F; + if (sfn > 1023 || sf > 9) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sfn/sf value sfn:%d [0..1023] sf:%d [0..9]", sfn, sf); + } +} +static void dissect_phy_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_state, 2, ENC_BIG_ENDIAN); + + if (value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy state [0..2]"); + } +} +static void dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv4, 4, ENC_NA); +} +static void dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv6, 16, ENC_NA); +} +static void dissect_p7_vnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_vnf_port, 2, ENC_BIG_ENDIAN); +} +static void dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv4, 4, ENC_NA); +} +static void dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv6, 16, ENC_NA); +} +static void dissect_p7_pnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_pnf_port, 2, ENC_BIG_ENDIAN); +} +static void dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_dl_ue_per_sf, 1, ENC_BIG_ENDIAN); +} +static void dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_ul_ue_per_sf, 1, ENC_BIG_ENDIAN); +} +static void dissect_rf_band_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); +} +static void dissect_rf_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); +} +static void dissect_timing_window_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_window, 1, ENC_BIG_ENDIAN); + + if (value > 30) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing window value [0..30]"); + } +} +static void dissect_timing_info_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_mode, 1, ENC_BIG_ENDIAN); + + if (value > 0x3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info mode [0..0x3]"); + } +} +static void dissect_timing_info_period_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_period, 1, ENC_BIG_ENDIAN); + + // Compiler throws an hissy fit that value <= 255 is always true... Yes, but I am trying to + // follow the specification... + if (!(value >= 1 /* && value <= 255*/)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info period [1..255]"); + } +} +static void dissect_maximum_transmit_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power_2, 2, ENC_BIG_ENDIAN); + + if (value > 700) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maxiumum transmit power [0..700]"); + } +} +static void dissect_earfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); +} +static void dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); +} +static void dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); +} +static void dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); +} +static void dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nmm_uplink_rssi_supported, 1, ENC_BIG_ENDIAN); + + if (value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm uplink rssi supported value [0..1]"); + } +} +static void dissect_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_dl_config_pdu_type, 1, ENC_BIG_ENDIAN); + guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); + + guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); + dissect_tlv_list(ptvc, pinfo, pdu_end); +} +static void dissect_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Number of PDCCH OFDM symbols + guint8 number_of_pdcch_ofdm_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_pdcch_ofdm_symbols, 1, ENC_BIG_ENDIAN); + if (number_of_pdcch_ofdm_symbols_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdcch ofdm symbols value [0..4]"); + } + + // Number of DCIs + guint8 number_of_dcis_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_dci, 1, ENC_BIG_ENDIAN); + + // Number of PDUs + guint16 number_of_pdus_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); + if (number_of_pdus_value > 514) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [0..514]"); + } + + // Number of PDSCH RNTIs + ptvcursor_add(ptvc, hf_nfapi_number_pdsch_rnti, 1, ENC_BIG_ENDIAN); + + // Transmission power for PCFICH + guint16 transmission_power_for_pdsch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_pcfich, 2, ENC_BIG_ENDIAN); + if (transmission_power_for_pdsch_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for pcfich value [0..10000]"); + } + + dissect_array_value(ptvc, pinfo, "DL Config PDU List", ett_nfapi_dl_config_request_pdu_list, number_of_dcis_value + number_of_pdus_value, dissect_dl_config_pdu); +} +static void dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // PDU index + ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + +} +static void dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DCI format + guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); + if (dci_format_value > 9) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..9]"); + } + + // CCE index + guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); + if (cce_index_value > 88) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); + } + + // Aggregation level + guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); + if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || + aggregation_level_value == 8 || aggregation_level_value == 16 || aggregation_level_value == 32)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8, 16, 32]"); + } + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // Resource allocation type + guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + if (resource_allocation_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); + } + + // Virtual resource block assignment flag + guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); + if (virtual_resource_block_assignment_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + + // MCS_1 + guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); + if (mcs_1_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); + } + + // Redundancy version_1 + guint8 redundancy_version_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_1, 1, ENC_BIG_ENDIAN); + if (redundancy_version_1_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 1 value [0..3]"); + } + + // New data indicator_1 + guint8 new_data_indicator_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_1, 1, ENC_BIG_ENDIAN); + if (new_data_indicator_1_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 1 value [0..1]"); + } + + // Transport block to codeword swap flag + guint8 transport_block_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); + if (transport_block_to_codeword_swap_flag_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); + } + + // MCS_2 + guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); + if (mcs_2_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); + } + + // Redundancy version_2 + guint8 redundancy_version_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_2, 1, ENC_BIG_ENDIAN); + if (redundancy_version_2_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 2 value [0..3]"); + } + + // New Data indicator_2 + guint8 new_data_indicator_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_2, 1, ENC_BIG_ENDIAN); + if (new_data_indicator_2_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 2 value [0..1]"); + } + + // HARQ process + guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); + if (harq_process_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); + } + + // TPMI + guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); + if (tpmi_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..3]"); + } + + // PMI + guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); + if (pmi_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..2]"); + } + + // Precoding information + guint8 precoding_information_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_precoding_information, 1, ENC_BIG_ENDIAN); + if (precoding_information_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid precoding information value [0..15]"); + } + + // TPC + guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); + if (tpc_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); + } + + // Downlink assignment index + guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); + if (downlink_assignment_index_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment value [0..15]"); + } + + // NGAP + guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); + if (ngap_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); + } + + // Transport block size index + guint8 transport_block_size_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transport_block_size_index, 1, ENC_BIG_ENDIAN); + if (transport_block_size_index_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block size index value [0..31]"); + } + + // Downlink power offset + guint8 downlink_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_downlink_power_offset, 1, ENC_BIG_ENDIAN); + if (downlink_power_offset_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power offset value [0..1]"); + } + + // Allocate PRACH flag + guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); + if (allocate_prach_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); + } + + // Preamble index + guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); + if (preamble_index_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); + } + + // PRACH mask index + guint8 prach_mask_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); + if (prach_mask_index_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); + } + + // RNTI type + guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti_type, 1, ENC_BIG_ENDIAN); + if (!(rnti_type_value >= 1 && rnti_type_value <= 3)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [1..3]"); + } + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value value [0..10000]"); + } + +} +static void dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // MCCH flag + guint8 mcch_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcch_flag, 1, ENC_BIG_ENDIAN); + if (mcch_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcch flag value [0..1]"); + } + + // MCCH change notification + ptvcursor_add(ptvc, hf_nfapi_mcch_change_notification, 1, ENC_BIG_ENDIAN); + + // Scrambling identity + guint8 scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_scrambling_identity, 1, ENC_BIG_ENDIAN); + if (scrambling_identity_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid scrambling identity value [0..1]"); + } + +} +static void dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Cross carrier scheduling flag + guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); + if (cross_carrier_scheduling_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); + } + + // Carrier indicator + guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); + if (carrier_indicator_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); + } + + // SRS flag + guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); + if (srs_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs flag value [0..1]"); + } + + // SRS request + guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); + if (srs_request_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); + } + + // Antenna ports, scrambling and layers + guint8 antenna_ports_scrambling_and_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_scrambling_and_layers, 1, ENC_BIG_ENDIAN); + if (antenna_ports_scrambling_and_layers_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports scrambling and layers value [0..15]"); + } + + // Total DCI length including padding + ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); + + // N_DL_RB + // TODO : This is missing from the encoder.... + //ptvcursor_add(ptvc, hf_nfapi_n_dl_rb, 1, ENC_BIG_ENDIAN); +} +static void dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // HARQ-ACK resource offset + guint8 harq_ack_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_ack_resource_offset, 1, ENC_BIG_ENDIAN); + if (harq_ack_resource_offset_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hack ack resource offset value [0..3]"); + } + + // PDSCH RE Mapping and Quasi-Co-Location Indicator + guint8 pdsch_re_mapping_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, 1, ENC_BIG_ENDIAN); + if (pdsch_re_mapping_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping value [0..3]"); + } + +} +static void dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UL/DL configuration indication + guint8 ul_dl_configuration_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_index, 1, ENC_BIG_ENDIAN); + if (!(ul_dl_configuration_indication_value >= 1 && ul_dl_configuration_indication_value <= 5)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration indication value [1..5]"); + } +} +static void dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Primary cell type + guint8 primary_cell_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_primary_cell_type, 1, ENC_BIG_ENDIAN); + if (primary_cell_type_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary cell type value [0..2]"); + } + + // UL/DL configuration flag + guint8 ul_dl_configuration_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_flag, 1, ENC_BIG_ENDIAN); + if (ul_dl_configuration_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration flag value [0..1]"); + } + + // Number of UL / DL configurations + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_dl_configurations, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "UL/DL Configurations", ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); +} +static void dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_flag, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_configuration, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_codebooksize_determination_r13, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_rel13_drms_table_flag, 1, ENC_BIG_ENDIAN); +} +static void dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_mbsfn_area_id, 2, ENC_BIG_ENDIAN); +} +static void dissect_codebook_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); + if (codebook_index_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..15]"); + } +} +static void dissect_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_bf_vector_bf_value, 2, ENC_BIG_ENDIAN); +} +static void dissect_bf_vector_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_bf_vector_subband_index, 1, ENC_BIG_ENDIAN); + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_bf_vector_num_antennas, 1, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "Antennas", ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); +} +static void dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // PDU index + ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (!(rnti_value >= 1 /* && rnti_value <= 65535)*/)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [1..65535]"); + } + + // Resource allocation type + guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + if (resource_allocation_type_value > 5) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..5]"); + } + + // Virtual resource block assignment flag + guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); + if (virtual_resource_block_assignment_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block allocation assignment value [0..1]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + + // Modulation + guint8 modulation_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); + if (!(modulation_value == 2 || modulation_value == 4 || modulation_value == 6 || modulation_value == 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation value [2, 4, 6, 8]"); + } + + // Redundancy version + guint8 redundancy_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); + if (redundancy_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0..3]"); + } + + // Transport blocks + guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); + if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); + } + + // Transport block to codeword swap flag + guint8 transport_blocks_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); + if (transport_blocks_to_codeword_swap_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); + } + + // Transmission scheme + guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); + if (transmission_scheme_value > 13) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..13]"); + } + + // Number of layers + guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); + if (!(number_of_layers_value >= 1 && number_of_layers_value <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..8]"); + } + + // Number of subbands + guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); + if (num_subbands > 13) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of subbands value [0..13]"); + } + + dissect_array_value(ptvc, pinfo, "Subbands", ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); + + // UE category capacity + guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); + if (ue_category_capacity_value > 14) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); + } + + // P-A + guint8 pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); + if (pa_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value [0..7]"); + } + + // Delta power offset index + guint8 delta_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_power_offset_index, 1, ENC_BIG_ENDIAN); + if (delta_power_offset_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta power offset value [0..1]"); + } + + // NGAP + guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); + if (ngap_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); + } + + // NPRB + guint8 nrpb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); + if (nrpb_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); + } + + // Transmission mode + guint8 transmission_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode, 1, ENC_BIG_ENDIAN); + if (!(transmission_mode_value >= 1 && transmission_mode_value <= 10)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode value [1..10]"); + } + + // numBfPRBperSubband + ptvcursor_add(ptvc, hf_nfapi_num_bf_prb_per_subband, 1, ENC_BIG_ENDIAN); + + // numBfVector + guint8 num_vectors = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "Beamforming Vectors", ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); +} +static void dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 csi_rs_resource_config_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config, 1, ENC_BIG_ENDIAN); + if (csi_rs_resource_config_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource config value [0..31]"); + } +} +static void dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 nscid_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nscid, 1, ENC_BIG_ENDIAN); + if (nscid_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nscid value [0..1]"); + } +} +static void dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // CSI-RS flag + guint8 csi_rs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_flag, 1, ENC_BIG_ENDIAN); + if (csi_rs_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs flag value [0..1]"); + } + + // CSI-RS resource config R10 + ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); + + // CSI-RS zero Tx power resource config bitmap R10 + ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); + + // CSI-RS Number of NZP configuration + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); + if (count > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..3]"); + } + + // CSI-RS configuration + dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); + + // PDSCH start + guint8 pdsch_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdsch_start, 1, ENC_BIG_ENDIAN); + if (pdsch_start_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch start value [0..4]"); + } + +} +static void dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DMRS Config flag + guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); + if (drms_config_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); + } + + // DMRS-Scrambling + guint16 drms_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling, 2, ENC_BIG_ENDIAN); + if (drms_scrambling_value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling value [0..503]"); + } + + // CSI Config flag + guint8 csi_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_config_flag, 1, ENC_BIG_ENDIAN); + if (csi_config_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi config flag value [0..1]"); + } + + // CSI- Scrambling + guint16 csi_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_scrambling, 2, ENC_BIG_ENDIAN); + if (csi_scrambling_value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi scrambling value [0..503]"); + } + + // PDSCH RE mapping flag + guint8 pdsch_re_mapping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_flag, 1, ENC_BIG_ENDIAN); + if (pdsch_re_mapping_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping flag value [0..1]"); + } + + // PDSCH RE mapping antenna ports + guint8 pdsch_re_mapping_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_antenna_ports, 1, ENC_BIG_ENDIAN); + if (!(pdsch_re_mapping_antenna_ports_value == 1 || pdsch_re_mapping_antenna_ports_value == 2 || + pdsch_re_mapping_antenna_ports_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping antenna ports value [1, 2, 4]"); + } + + // PDSCH RE mapping freq shift + guint8 pdsch_re_mapping_freq_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_freq_shift, 1, ENC_BIG_ENDIAN); + if (pdsch_re_mapping_freq_shift_value > 5) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping freq shift value [0..5]"); + } +} +static void dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // altCQI-Table-r12 + guint8 alt_cqi_table_r12_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_alt_cqi_table_r12, 1, ENC_BIG_ENDIAN); + if (alt_cqi_table_r12_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alt cqi table r12 value [0..1]"); + } + + // MaxLayers + guint8 max_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_max_layers, 1, ENC_BIG_ENDIAN); + if (!(max_layers_value >= 1 && max_layers_value <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max layers value [1..8]"); + } + + ptvcursor_add(ptvc, hf_nfapi_n_dl_harq, 1, ENC_BIG_ENDIAN); +} +static void dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DwPTS Symbols + guint8 dwpts_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); + if (!(dwpts_symbols_value == 3 || dwpts_symbols_value == 6 || dwpts_symbols_value == 9 || + dwpts_symbols_value == 10 || dwpts_symbols_value == 11 || dwpts_symbols_value == 12 || + dwpts_symbols_value == 14)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); + } + + // Initial LBT SF + guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); + if (initial_lbt_sf_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); + } + + // UE Type + guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); + if (ue_type_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); + } + + // PDSCH Payload Type + guint8 pdsch_payload_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_payload_type, 1, ENC_BIG_ENDIAN); + if (pdsch_payload_type_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch payload type value [0..2]"); + } + + // Initial transmission SF (io) + guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); + if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); + } + + // Rel-13-DMRS-tabe flag + guint8 rel13_drms_table_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_req13_drms_table_flag, 1, ENC_BIG_ENDIAN); + if (rel13_drms_table_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rel13 drms table flag value [0..1]"); + } +} +static void dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // PDU index + ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); + + // P-RNTI + guint16 prnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_prnti, 2, ENC_BIG_ENDIAN); + if (prnti_value != 0xFFFE) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prnti value [0xFFFE]"); + } + + // Resource allocation type + guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + if (!(resource_allocation_type_value == 2 || resource_allocation_type_value == 3 || resource_allocation_type_value == 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocate type value [2, 3, 6]"); + } + + // Virtual resource block assignment flag + guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); + if (virtual_resource_block_assignment_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + + // MCS + guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); + if (mcs_value != 0) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0]"); + } + + // Redundancy version + guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); + if (redundancy_version_value != 0) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0]"); + } + + // Number of transport blocks + guint8 number_of_transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_transport_blocks, 1, ENC_BIG_ENDIAN); + if (number_of_transport_blocks_value != 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1]"); + } + + // Transport block to codeword swap flag + ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); + + // Transmission scheme + guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); + if (!(transmission_scheme_value == 0 || transmission_scheme_value == 1 || transmission_scheme_value == 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission schemes value [0, 1, 6]"); + } + + // Number of layers + guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); + if (!(number_of_layers_value >= 1 && number_of_layers_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); + } + + // Codebook index + ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); + + // UE category capacity + guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); + if (ue_category_capacity_value > 14) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); + } + + // P-A + guint8 p_a_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); + if (p_a_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value value [0..7]"); + } + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + + // NPRB + guint8 nprb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); + if (nprb_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); + } + + // NGAP + guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); + if (ngap_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); + } + +} +static void dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // UE mode + guint8 ue_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_mode, 1, ENC_BIG_ENDIAN); + if (ue_mode_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue mode value [0..1]"); + } + + // Initial transmission SF (io) + guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); + if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); + } +} +static void dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + + // PRS bandwidth + guint8 prs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_prs_bandwidth, 1, ENC_BIG_ENDIAN); + if (!(prs_bandwidth_value == 6 || prs_bandwidth_value == 15 || prs_bandwidth_value == 25 || + prs_bandwidth_value == 50 || prs_bandwidth_value == 75 || prs_bandwidth_value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs bandwidth value [6, 15, 25, 50, 75, 100]"); + } + + // PRS cyclic prefix type + guint8 prs_cyclic_prefix_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_prs_cyclic_prefix_type, 1, ENC_BIG_ENDIAN); + if (prs_cyclic_prefix_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs cyclic prefix value [0..1]"); + } + + // PRS muting + guint8 prs_muting_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_prs_muting, 1, ENC_BIG_ENDIAN); + if (prs_muting_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs muting value [0..1]"); + } +} +static void dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // CSI-RS antenna port count R10 + guint8 csi_rs_antenna_port_count_r10_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_antenna_port_count_r10, 1, ENC_BIG_ENDIAN); + if (!(csi_rs_antenna_port_count_r10_value == 1 || csi_rs_antenna_port_count_r10_value == 2 || + csi_rs_antenna_port_count_r10_value == 4 || csi_rs_antenna_port_count_r10_value == 8 || + csi_rs_antenna_port_count_r10_value == 12 || csi_rs_antenna_port_count_r10_value == 16)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs antenna port count r10 value [1, 2, 4, 6, 8, 10]"); + } + + // CSI-RS resource config R10 + ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + + // CSI-RS zero Tx power resource config bitmap R10 + ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); + + // CSI-RS Number of NZP configuration + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); + if (count > 8) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..8]"); + } + + // CSI-RS configuration + dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); +} +static void dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_index, 1, ENC_BIG_ENDIAN); + if (count > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource index value [0..7]"); + } + + // todo : how to work out the antenna port count for the bfValue +} +static void dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Class + guint8 class_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_class, 1, ENC_BIG_ENDIAN); + if (class_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid class value [0..2]"); + } + + // cdmType + guint8 cdm_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cdm_type, 1, ENC_BIG_ENDIAN); + if (cdm_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm type value [0..1]"); + } + + // numBfVector + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); + if (!((class_value == 1 && count == 0) || (class_value == 2 && count <= 8))) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num bf vector value [0] or [0..8]"); + } + + dissect_array_value(ptvc, pinfo, "Beamforming Vector", ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); +} +static void dissect_epdcch_prb_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // EPDCCH PRB index + guint8 epdcch_prb_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_edpcch_prb_index, 1, ENC_BIG_ENDIAN); + if (epdcch_prb_index_value > 99) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch prb_index value [0..99]"); + } +} +static void dissect_dl_config_request_edpcch_params_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // EPDCCH Resource assignment flag + guint8 epdcch_resource_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_epdcch_resource_assignment_flag, 1, ENC_BIG_ENDIAN); + if (epdcch_resource_assignment_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch resource assignment flag value [0..1]"); + } + + // EPDCCH ID + guint16 epdcch_id_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_epdcch_id, 2, ENC_BIG_ENDIAN); + if (epdcch_id_value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch id value [0..503]"); + } + + // EPDCCH Start Symbol + guint8 epdcch_start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_epdcch_start_symbol, 1, ENC_BIG_ENDIAN); + if (!(epdcch_start_symbol_value >= 1 && epdcch_start_symbol_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch start symbol value [1..4]"); + } + + // EPDCCH NumPRB + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_epdcch_num_prb, 1, ENC_BIG_ENDIAN); + if (!(count == 2 || count == 4 || count == 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch num prb value [2, 4, 8]"); + } + + dissect_array_value(ptvc, pinfo, "PRBs", ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); + + dissect_bf_vector_type_value(ptvc, pinfo); +} +static void dissect_dl_config_request_edpcch_params_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DwPTS Symbols + guint8 dwtps_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); + if (!(dwtps_symbols_value == 3 || dwtps_symbols_value == 6 || dwtps_symbols_value == 9 || + dwtps_symbols_value == 10 || dwtps_symbols_value == 11 || dwtps_symbols_value == 12 || + dwtps_symbols_value == 14)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); + } + + // Initial LBT SF + guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); + if (initial_lbt_sf_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); + } + +} +static void dissect_precoding_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add(ptvc, hf_nfapi_precoding_value, 2, ENC_BIG_ENDIAN); +} +static void dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // MPDCCH Narrowband + guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); + if (mpdcch_narrowband_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); + } + + // Number of PRB pairs + guint8 number_of_prb_pair_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); + if (!(number_of_prb_pair_value == 2 || number_of_prb_pair_value == 4 || number_of_prb_pair_value == 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pair value [2, 4, 6]"); + } + + // Resource Block Assignment + guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); + if (resource_block_assignment_value > 14) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); + } + + // MPDCCH transmission type + guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); + if (mpdcch_transmission_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); + } + + // Start symbol + guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); + if (!(start_symbol_value >= 1 && start_symbol_value <=4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [1..4]"); + } + + // ECCE index + guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); + if (ecce_index_value > 22) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); + } + + // Aggregation level + guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); + if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || + aggregation_level_value == 16 || aggregation_level_value == 24)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); + } + + // RNTI type + guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); + if (rnti_type_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0..4]"); + } + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (!(rnti_value >= 1)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // CEMode + guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); + if (!(cemode_value >= 1 && cemode_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1..2]"); + } + + // DMRS scrambling init + guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_scrabmling_init, 2, ENC_BIG_ENDIAN); + if (drms_scrambling_init_value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); + } + + // Initial transmission SF (io) + guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); + if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); + } + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + + // DCI format + guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); + if (!(dci_format_value == 10 || dci_format_value == 11 || dci_format_value == 12)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [10, 11, 12]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 2, ENC_BIG_ENDIAN); + + // MCS + guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); + if (mcs_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..15]"); + } + + // PDSCH repetition levels + guint8 pdsch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pdsch_reception_levels, 1, ENC_BIG_ENDIAN); + if (!(pdsch_repetition_levels_value >= 1 && pdsch_repetition_levels_value <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch repetition levels value [1..8]"); + } + + // Redundancy version + guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); + if (redundancy_version_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); + } + + // New data indicator + guint8 new_data_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator, 1, ENC_BIG_ENDIAN); + if (new_data_indicator_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); + } + + // HARQ process + guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); + if (harq_process_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); + } + + // TPMI length + guint8 tpmi_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpmi_length, 1, ENC_BIG_ENDIAN); + if (!(tpmi_length_value == 0 || tpmi_length_value == 2 || tpmi_length_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi length value [0, 2, 4]"); + } + + // TPMI + guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); + if (tpmi_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..15]"); + } + + // PMI flag + guint8 pmi_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pmi_flag, 1, ENC_BIG_ENDIAN); + if (pmi_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi flag value [0..1]"); + } + + // PMI + guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); + if (pmi_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi value [0..1]"); + } + + // HARQ resource offset + guint8 harq_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_resource_offset, 1, ENC_BIG_ENDIAN); + if (harq_resource_offset_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq resource offset value [0..3]"); + } + + // DCI subframe repetition number + guint8 dci_subframe_reptition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); + if (!(dci_subframe_reptition_number_value >= 1 && dci_subframe_reptition_number_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); + } + + // TPC + guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); + if (tpc_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); + } + + // Downlink assignment index Length + guint8 downlink_assignment_index_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index_length, 1, ENC_BIG_ENDIAN); + if (!(downlink_assignment_index_length_value == 0 || downlink_assignment_index_length_value == 2 || + downlink_assignment_index_length_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignmnet index value [0, 2, 4]"); + } + + // Downlink assignment index + guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); + if (downlink_assignment_index_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment index value [0..15]"); + } + + // Allocate PRACH flag + guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); + if (allocate_prach_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); + } + + // Preamble index + guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); + if (preamble_index_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); + } + + // PRACH mask index + guint8 prach_mask_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); + if (prach_mask_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); + } + + // Starting CE Level + guint8 starting_ce_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_starting_ce_level, 1, ENC_BIG_ENDIAN); + if (starting_ce_level_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting ce level value [0..3]"); + } + + // SRS request + guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); + if (srs_request_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); + } + + // Antenna ports and scrambling identity flag + guint8 antenna_ports_and_scrambling_identity_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity_flag, 1, ENC_BIG_ENDIAN); + if (antenna_ports_and_scrambling_identity_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity flag value [0..1]"); + } + + // Antenna ports and scrambling identity + guint8 antenna_ports_and_scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity, 1, ENC_BIG_ENDIAN); + if (antenna_ports_and_scrambling_identity_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity value [0..3]"); + } + + // Frequency hopping enabled flag + guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_enabled_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); + } + + // Paging/Direct indication differentiation flag + guint8 paging_direct_indicaton_differentiation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_paging_direct_indication_differentiation_flag, 1, ENC_BIG_ENDIAN); + if (paging_direct_indicaton_differentiation_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid paging/direct indication differentiation flag value [0..1]"); + } + + // Direct indication + ptvcursor_add(ptvc, hf_nfapi_direct_indication, 1, ENC_BIG_ENDIAN); + + // Total DCI length including padding + item = ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); + + // Number of TX Antenna ports + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "Precoding", ett_nfapi_precoding, count, dissect_precoding_value); +} +static void dissect_ul_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PDU Type + guint8 ul_pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_config_pdu_type, 1, ENC_BIG_ENDIAN); + if (ul_pdu_type_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul pdu type value [0..15]"); + } + + guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); + + guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); + dissect_tlv_list(ptvc, pinfo, pdu_end); +} +static void dissect_ul_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Number of PDUs + guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_pdus, 1, ENC_BIG_ENDIAN); + + // RACH/PRACH frequency resources + guint8 rach_prach_frequency_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rach_prach_frequency_resources, 1, ENC_BIG_ENDIAN); + if (rach_prach_frequency_resources_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach prach frequency resources value [0..1]"); + } + + // SRS present + guint8 srs_present_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_present, 1, ENC_BIG_ENDIAN); + if (srs_present_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs present value [0..1]"); + } + + dissect_array_value(ptvc, pinfo, "UL Config PDU List", ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); +} +static void dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // Size + ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (!(rnti_value >= 1)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // Resource block start + guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); + if (resource_block_start_value > 99) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); + } + + // Number of resource blocks + guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); + if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..100]"); + } + + // Modulation type + guint8 modulation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); + if (!(modulation_type_value == 2 || modulation_type_value == 4 || modulation_type_value == 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation type value [2, 4, 6]"); + } + + // Cyclic Shift 2 for DMRS + guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); + if (cyclic_shift_2_for_drms_value > 99) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); + } + + // Frequency hopping enabled flag + guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_enabled_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); + } + + // Frequency hopping bits + guint8 frequency_hopping_bits_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_bits_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); + } + + // New data indication + guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); + if (new_data_indication_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); + } + + // Redundancy version + guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); + if (redundancy_version_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); + } + + // HARQ process number + guint8 harq_process_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_process_number, 1, ENC_BIG_ENDIAN); + if (harq_process_number_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process number value [0..15]"); + } + + // UL Tx mode + guint8 ul_tx_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_tx_mode, 1, ENC_BIG_ENDIAN); + if (ul_tx_mode_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul tx mode value [0..1]"); + } + + // Current TX NB + ptvcursor_add(ptvc, hf_nfapi_current_tx_nb, 1, ENC_BIG_ENDIAN); + + // N srs + guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_srs, 1, ENC_BIG_ENDIAN); + if (n_srs_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n_srs value [0..1]"); + } +} +static void dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Resource allocation type + guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + if (resource_allocation_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + + // Transport blocks + guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); + if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); + } + + // Transmission scheme + guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_transmission_scheme, 1, ENC_BIG_ENDIAN); + if (transmission_scheme_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..1]"); + } + + // Number Of layers + guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); + if (!(number_of_layers_value >= 1 && number_of_layers_value <=4 )) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); + } + + // Codebook Index + guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); + if (codebook_index_value > 23) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..23]"); + } + + // Disable sequence hopping flag + guint8 disable_sequence_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_disable_sequence_hopping_flag, 1, ENC_BIG_ENDIAN); + if (disable_sequence_hopping_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid disable sequence hopping flag value [0..1]"); + } +} +static void dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Virtual cell ID enabled flag + guint8 virtual_cell_id_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); + if (virtual_cell_id_enabled_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); + } + + // nPUSCH Identity + guint16 npusch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_npusch_identity, 2, ENC_BIG_ENDIAN); + if (npusch_identity_value > 509) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npusch identity value [0..509]"); + } + + // DMRS Config flag + guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); + if (drms_config_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); + } + + // nDMRS-CSH Identity + guint16 ndrms_csh_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ndrms_csh_identity, 2, ENC_BIG_ENDIAN); + if (ndrms_csh_identity_value > 509) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ndrms-csh identity value [0..509]"); + } + +} +static void dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // UE Type + guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); + if (ue_type_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); + } + + // Total Number of repetitions + guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); + if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 2048)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..2048]"); + } + + // Repetition Number + guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); + if (!(repetition_number_value >= 1 && repetition_number_value <= 2048)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..2048]"); + } + + // Initial transmission SF (io) + guint16 intial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_sf_io, 2, ENC_BIG_ENDIAN); + if (!(intial_transmission_sf_io_value <= 10239 || intial_transmission_sf_io_value == 0xFFFF)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [0..10239, 0xFFFF]"); + } + + // Empy symbols due to re-tunning + // todo : decode as a bitmap + ptvcursor_add(ptvc, hf_nfapi_empty_symbols_due_to_retunning, 1, ENC_BIG_ENDIAN); +} +static void dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // N srs initial + guint8 n_srs_initial_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_srs_initial, 1, ENC_BIG_ENDIAN); + if (n_srs_initial_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs initial value [0..1]"); + } + + // Initial number of resource blocks + guint8 initial_number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); + if (!(initial_number_of_resource_blocks_value >= 1 && initial_number_of_resource_blocks_value <= 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial number of reosurce blocks value [1..100]"); + } + +} +static void dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DL CQI/PMI Size Rank = 1 + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_1, 1, ENC_BIG_ENDIAN); + + // DL CQI/PMI Size Rank>1 + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, 1, ENC_BIG_ENDIAN); + + // RI Size + guint8 ri_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); + if (ri_size_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri size value [0..3]"); + } + + // Delta Offset CQI + guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); + if (delta_offset_cqi_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); + } + + // Delta Offset RI + guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); + if (delta_offset_ri_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); + } +} +static void dissect_ul_cqi_pmi_size(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Delta Offset RI + guint8 dl_cqi_pmi_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); + if (dl_cqi_pmi_size_value > 255) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..255]"); + } +} + +static void dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + // Report type + guint8 type = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_report_type, 1, ENC_BIG_ENDIAN); + if (type > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid report type value [0..1]"); + } + + // Delta offset CQI + guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); + if (delta_offset_cqi_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); + } + + // Delta offset RI + guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); + if (delta_offset_ri_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); + } + + switch (type) + { + case 0: + { + // DL CQI/PMI/RI size + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size, 1, ENC_BIG_ENDIAN); + + // Control Type + guint8 control_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_control_type, 1, ENC_BIG_ENDIAN); + if (control_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid control type value [0..1]"); + } + break; + } + case 1: + { + // todo : encoder not right for this case. + gint8 num_cc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_cc, 1, ENC_BIG_ENDIAN); + + if (!(num_cc_value >= 1 && num_cc_value <= 32)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of cc value [1..32]"); + } + + // UL CONFIG CQI PMI SIZE + dissect_array_value(ptvc, pinfo, "CQI PMI SIZE", ett_nfapi_cqi_pmi_size, 8, dissect_ul_cqi_pmi_size); + + /* + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "CCs"); + + for (int i = 0; i < num_cc; ++i) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", i); + + guint8 ri_size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Rank"); + + for (int j = 0; j < ri_size; ++j) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", j); + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); + + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); + */ + + break; + } + } +} +static void dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // DL CQI/PMI/RI size 2 + guint16 dl_cqi_ri_pmi_size_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size_2, 2, ENC_BIG_ENDIAN); + if (dl_cqi_ri_pmi_size_2_value < 255) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cqi ri pmi size 2 value [>= 255]"); + } +} +static void dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // HARQ Size + guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); + if (harq_size_value > 21) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); + } + + // Delta Offset HARQ + guint8 delta_offset_harq_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq, 1, ENC_BIG_ENDIAN); + if (delta_offset_harq_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq value [0..15]"); + } + + // ACK_NACK mode + guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); + if (ack_nack_mode_value > 5) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); + } +} +static void dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // HARQ Size 2 + ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); + + // Delta Offset HARQ 2 + guint8 delta_offset_harq_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq_2, 1, ENC_BIG_ENDIAN); + if (delta_offset_harq_2_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq 2 value [0..15]"); + } +} +static void dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } +} +static void dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Virtual cell ID enabled flag + guint8 virtual_cell_id_enabled_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); + if (virtual_cell_id_enabled_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); + } + + // nPUCCH Identity + guint16 npucch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_npucch_identity, 2, ENC_BIG_ENDIAN); + if (npucch_identity_value > 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch identity value [0..503]"); + } + +} +static void dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // UE Type + guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); + if (ue_type_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); + } + + // Empty symbols + // todo : use bit map decoding + ptvcursor_add(ptvc, hf_nfapi_empty_symbols, 1, ENC_BIG_ENDIAN); + + // Total Number of repetitions + guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); + if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 32)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..32]"); + } + + // Repetition Number + guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); + if (!(repetition_number_value >= 1 && repetition_number_value <= 32)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..32]"); + } + +} +static void dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PUCCH index + guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); + if (pucch_index_value > 1184) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..1184]"); + } + + // DL CQI/PMI Size + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); +} +static void dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Number of PUCCH Resources + guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); + if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]"); + } + + //PUCCH Index P1 + guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); + if (pucch_index_p1_value > 1184) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..1184]"); + } +} +static void dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // CSI_mode + guint8 csi_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_mode, 1, ENC_BIG_ENDIAN); + if (csi_mode_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi mode value [0..2]"); + } + + // DL CQI/PMI Size 2 + ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_2, 2, ENC_BIG_ENDIAN); + + // Starting PRB + guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_statring_prb, 1, ENC_BIG_ENDIAN); + if (starting_prb_value > 109) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); + } + + // n_PRB + guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); + if (n_prb_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); + } + + // cdm_Index + guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); + if (cdm_index_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); + } + + // N srs + guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); + if (n_srs_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); + } + +} +static void dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); + if (pucch_index_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..2047]"); + } +} +static void dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Number of PUCCH Resources + guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); + if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..2047]"); + } + + // PUCCH Index P1 + guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); + if (pucch_index_p1_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..2047]"); + } +} +static void dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // HARQ size + guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); + if (harq_size_value > 21) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); + } + + // ACK_NACK mode + guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); + if (ack_nack_mode_value > 5) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); + } + + // Number of PUCCH resources + guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); + if (number_of_pucch_resources_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..4]"); + } + + // n_PUCCH_1_0 + guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) + { + if (npucch_1_0_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047] (All Format 1a/1b)"); + } + } + else if (ack_nack_mode_value == 3) + { + if (npucch_1_0_value > 549) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..549] (Format 3)"); + } + } + + // n_PUCCH_1_1 + guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) + { + if (npucch_1_1_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 1 value [0..2047] (All Format 1a/1b)"); + } + } + + // n_PUCCH_1_2 + guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 2) + { + if (npucch_1_2_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 2 value [0..2047] (All Format 1a/1b)"); + } + } + + // n_PUCCH_1_3 + guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 2) + { + if (npucch_1_3_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 3 value [0..2047] (All Format 1a/1b)"); + } + } +} +static void dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // n_PUCCH_1_0 + // todo : how to work out the ack_nack mode? + guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); + if (npucch_1_0_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047]"); + } + + // HARQ Size + guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); + if (!(harq_size_value >= 1 && harq_size_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..2]"); + } +} +static void dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // HARQ Size + guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* harq_size_item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); + + // ACK_NAK mode + guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_fdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); + if (ack_nack_mode_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..4]"); + } + + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 2) + { + if (!(harq_size_value >= 1 && harq_size_value <= 10)) + { + expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [1..10] (Format 1a/1b/3)"); + } + } + else if (ack_nack_mode_value == 3 || ack_nack_mode_value == 4) + { + if (harq_size_value != 0) + { + expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); + } + } + + // Number of PUCCH Resources + guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); + if (number_of_pucch_resources_value == 0 || number_of_pucch_resources_value == 2) + { + if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..4] (Format 1a/1b/3)"); + } + } + else if (number_of_pucch_resources_value == 3 || number_of_pucch_resources_value == 4) + { + if (number_of_pucch_resources_value != 0) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); + } + } + + // n_PUCCH_1_0 + guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) + { + if (npucch_1_0_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..2047] (Format 1a/1b/channel selection)"); + } + } + else if (ack_nack_mode_value == 2) + { + if (npucch_1_0_value > 549) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..549] (Format 3)"); + } + } + + // n_PUCCH_1_1 + guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) + { + if (npucch_1_1_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 1 value [0..2047] (Format 1a/1b/channel selection)"); + } + } + + // n_PUCCH_1_2 + guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) + { + if (npucch_1_2_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 2 value [0..2047] (Format 1a/1b/channel selection)"); + } + } + + // n_PUCCH_1_3 + guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); + if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) + { + if (npucch_1_3_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 3 value [0..2047] (Format 1a/1b/channel selection)"); + } + } +} +static void dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Num_ant_ports + guint8 num_ant_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_num_ant_ports, 1, ENC_BIG_ENDIAN); + if (!(num_ant_ports_value >= 1 && num_ant_ports_value <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num ant ports value [1..2]"); + } + + // n_PUCCH_2_0 + // todo : how to work out the ack nack mode + guint16 npucch_2_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_0, 2, ENC_BIG_ENDIAN); + if (npucch_2_0_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 0 value [0..2047]"); + } + + // n_PUCCH_2_1 + guint16 npucch_2_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_1, 2, ENC_BIG_ENDIAN); + if (npucch_2_1_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 1 value [0..2047]"); + } + + // n_PUCCH_2_2 + guint16 npucch_2_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_2, 2, ENC_BIG_ENDIAN); + if (npucch_2_2_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 2 value [0..2047]"); + } + + // n_PUCCH_2_3 + guint16 npucch_2_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_3, 2, ENC_BIG_ENDIAN); + if (npucch_2_3_value > 2047) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 3 value [0..2047]"); + } + +} +static void dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // HARQ Size 2 + ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); + + // Starting PRB + guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_starting_prb, 1, ENC_BIG_ENDIAN); + if (starting_prb_value > 109) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); + } + + // n_PRB + guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); + if (n_prb_value > 109) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); + } + + // cdm_Index + guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); + if (cdm_index_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); + } + + // N srs + guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); + if (n_srs_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); + } +} +static void dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // Size + ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // SRS Bandwidth + guint8 srs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_bandwidth, 1, ENC_BIG_ENDIAN); + if (srs_bandwidth_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth value [0..3]"); + } + + // Frequency Domain Position + guint8 frequency_domain_position_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_domain_position, 1, ENC_BIG_ENDIAN); + if (frequency_domain_position_value > 23) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency domain bandwidth value [0..23]"); + } + + // SRS Hopping Bandwidth + guint8 srs_hopping_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_hopping_bandwidth, 1, ENC_BIG_ENDIAN); + if (srs_hopping_bandwidth_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs hopping bandwidth value [0..3]"); + } + + // Transmission Comb + guint8 transmission_comb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_comb, 1, ENC_BIG_ENDIAN); + if (transmission_comb_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission comb value [0..3]"); + } + + // ISRS / SRS-ConfigIndex + guint16 srs_config_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_i_srs, 2, ENC_BIG_ENDIAN); + if (srs_config_index_value > 1023) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid isrs/srs-configindex value [0..1023]"); + } + + // Sounding Reference Cyclic Shift + guint8 sounding_reference_cyclic_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_sounding_reference_cyclic_shift, 1, ENC_BIG_ENDIAN); + if (sounding_reference_cyclic_shift_value > 11) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sounding reference cyclic shift value [0..11]"); + } +} +static void dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 antenna_port_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_antenna_port, 1, ENC_BIG_ENDIAN); + if (antenna_port_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna port value [0..2]"); + } +} +static void dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 number_of_combs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_combs, 1, ENC_BIG_ENDIAN); + if (number_of_combs_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of combs value [0..1]"); + } +} +static void dissect_hi_dci0_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + + // PDU Type + guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hi_dci0_pdu_type, 1, ENC_BIG_ENDIAN); + if (pdu_type_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..3]"); + } + + // PDU Size + guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); + + guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); + dissect_tlv_list(ptvc, pinfo, pdu_end); +} +static void dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // SFN/SF + ptvcursor_add(ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + + // Number of DCI + guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_dci_pdus, 1, ENC_BIG_ENDIAN); + + // Number of HI + num_pdu += tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_hi_pdus, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "HI DCI0 PDU List", ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); +} +static void dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Resource block start + guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); + if (resource_block_start_value > 100) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); + } + + // Cyclic Shift 2 for DMRS + guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); + if (cyclic_shift_2_for_drms_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); + } + + // HI value + guint8 hi_value_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_hi_value, 1, ENC_BIG_ENDIAN); + if (hi_value_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi value [0..1]"); + } + + // I_PHICH + guint8 i_pich_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_i_phich, 1, ENC_BIG_ENDIAN); + if (i_pich_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid i phich value [0..1]"); + } + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + +} +static void dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Flag TB2 + guint8 flag_tb2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_flag_tb2, 1, ENC_BIG_ENDIAN); + if (flag_tb2_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid flag tb2 value [0..1]"); + } + + // HI Value 2 + guint8 hi2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_hi_value_2, 1, ENC_BIG_ENDIAN); + if (hi2_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi2 value [0..1]"); + } + +} +static void dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // DCI format + guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_dci_format, 1, ENC_BIG_ENDIAN); + if (dci_format_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..4]"); + } + + // CCE index + guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); + if (cce_index_value > 88) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); + } + + // Aggregation level + guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); + if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || + aggregation_level_value == 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8]"); + } + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // Resource block start + guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); + if (resource_block_start_value > 100) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); + } + + // Number of resource blocks + guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); + if (number_of_resource_blocks_value > 100) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [0..100]"); + } + + // MCS_1 + guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); + if (mcs_1_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); + } + + // Cyclic Shift 2 for DMRS + guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); + if (cyclic_shift_2_for_drms_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); + } + + // Frequency hopping enabled flag + guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_enabled_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); + } + + // Frequency hopping bits + guint8 frequency_hopping_bit_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_bit_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); + } + + // New Data indication_1 + guint8 new_data_indication_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); + if (new_data_indication_1_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); + } + + // UE TX antenna selection + guint8 ue_tx_antenna_selection_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ue_tx_antenna_selection, 1, ENC_BIG_ENDIAN); + if (ue_tx_antenna_selection_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue tx antenna selection value [0..2]"); + } + + // TPC + guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); + if (tpc_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value value [0..3]"); + } + + // CQI/CSI request + guint8 cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cqi_csi_request, 1, ENC_BIG_ENDIAN); + if (cqi_csi_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cqi csi value [0..7]"); + } + + // UL index + guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); + if (ul_index_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); + } + + // DL assignment index + guint8 dl_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); + if (!(dl_assignment_index_value >= 1 && dl_assignment_index_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment index value [1..4]"); + } + + // TPC bitmap + ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } +} +static void dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Cross carrier scheduling flag + guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); + if (cross_carrier_scheduling_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); + } + + // Carrier indicator + guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); + if (carrier_indicator_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); + } + + // Size of CQI/CSI field + guint8 size_of_cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_size_of_cqi_csi_feild, 1, ENC_BIG_ENDIAN); + if (size_of_cqi_csi_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid size of cqi/csi field value [0..2]"); + } + + // SRS flag + guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); + if (srs_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs field value [0..1]"); + } + + // SRS request + //guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + //item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); + + // Resource allocation flag + guint8 resource_allocation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_flag, 1, ENC_BIG_ENDIAN); + if (resource_allocation_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation flag value [0..1]"); + } + + // Resource allocation type + guint8 resource_alloction_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); + if (resource_alloction_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); + } + + // Resource block coding + ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); + + // MCS_2 + guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); + if (mcs_2_value > 31) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); + } + + // New data indication_2 + guint8 new_data_indication_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication_two, 1, ENC_BIG_ENDIAN); + if (new_data_indication_2_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication 2 value [0..1]"); + } + + // Number of antenna ports + guint8 number_of_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_antenna_ports, 1, ENC_BIG_ENDIAN); + if (number_of_antenna_ports_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of antenna ports value [0..2]"); + } + + // TPMI + guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); + if (number_of_antenna_ports_value == 2) + { + if (tpmi_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..7]"); + } + } + else if (number_of_antenna_ports_value == 4) + { + if (tpmi_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..63]"); + } + } + + // Total DCI length including padding + ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); + + // N_UL_RB + guint8 n_ul_rb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_n_ul_rb, 1, ENC_BIG_ENDIAN); + if (!(n_ul_rb_value == 6 || n_ul_rb_value == 15 || n_ul_rb_value == 25 || n_ul_rb_value == 50 || + n_ul_rb_value == 75 || n_ul_rb_value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n ul rb value [6, 15, 25, 50, 75, 100]"); + } +} +static void dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // PSCCH Resource + guint8 pscch_resource_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pscch_resource, 1, ENC_BIG_ENDIAN); + if (pscch_resource_value > 0x3F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pscch resource value [0..0x3F]"); + } + + // Time resource pattern + guint8 time_resource_pattern_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_time_resource_pattern, 1, ENC_BIG_ENDIAN); + if (time_resource_pattern_value > 0x7F) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid time resource pattern value [0..0x7F]"); + } + +} +static void dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // MPDCCH Narrowband + guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); + if (mpdcch_narrowband_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); + } + + // Number of PRB pairs + guint8 number_of_prb_pairs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); + if (!(number_of_prb_pairs_value == 2 || number_of_prb_pairs_value == 4 || number_of_prb_pairs_value == 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pairs value [2, 4, 6]"); + } + + // Resource Block Assignment + guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); + if (resource_block_assignment_value > 14) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); + } + + // MPDCCH transmission type + guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); + if (mpdcch_transmission_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); + } + + // Start symbol + guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); + if (!(start_symbol_value >= 1 && start_symbol_value <=4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [0..1]"); + } + + // ECCE index + guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); + if (ecce_index_value > 22) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); + } + + // Aggregation level + guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); + if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || + aggregation_level_value == 16 || aggregation_level_value == 24)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); + } + + // RNTI type + guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); + if (!(rnti_type_value == 0 || rnti_type_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0, 4]"); + } + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // CEMode + guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); + if (!(cemode_value == 1 || cemode_value == 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1,2]"); + } + + // DMRS scrambling init + guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling_init, 2, ENC_BIG_ENDIAN); + if (drms_scrambling_init_value < 503) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); + } + + // Initial transmission SF (io) + guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); + if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); + } + + // Transmission power + guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); + if (transmission_power_value > 10000) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); + } + + // DCI format + guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_ul_dci_format, 1, ENC_BIG_ENDIAN); + if (!(dci_format_value == 1 || dci_format_value == 2 || dci_format_value == 4 || dci_format_value == 5)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [1, 2, 4, 5]"); + } + + // Resource block start + guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); + if (resource_block_start_value > 99) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); + } + + // Number of resource blocks + guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); + if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 6)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..6]"); + } + + // MCS + guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); + if (mcs_value > 15) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0..15]"); + } + + // PUSCH repetition levels + guint8 pusch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_pusch_repetition_levels, 1, ENC_BIG_ENDIAN); + if (dci_format_value == 4) + { + if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..4]"); + } + } + else if (dci_format_value == 5) + { + if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..8]"); + } + } + + // Frequency hopping flag + guint8 frequency_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_flag, 1, ENC_BIG_ENDIAN); + if (frequency_hopping_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping flag value [0..1]"); + } + + // New Data indication + guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); + if (new_data_indication_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); + } + + // HARQ process + guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); + if (harq_process_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..7]"); + } + + // Redundancy version + guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); + if (redundancy_version_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); + } + + // TPC + guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); + if (tpc_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); + } + + // CSI request + guint8 csi_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_csi_request, 1, ENC_BIG_ENDIAN); + if (csi_request_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi request value [0..1]"); + } + + // UL index + guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); + if (ul_index_value > 3) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); + } + + // DAI presence flag + guint8 dai_presence_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dai_presence_flag, 1, ENC_BIG_ENDIAN); + if (dai_presence_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dai presence value [0..1]"); + } + + // DL assignment index + guint8 dl_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); + if (!(dl_assignment_value >=1 && dl_assignment_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment value [1, 2, 3, 4]"); + } + + // SRS request + guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); + if (srs_request_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); + } + + // DCI subframe repetition number + guint8 dci_subframe_repetition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); + if (!(dci_subframe_repetition_number_value >= 1 && dci_subframe_repetition_number_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); + } + + //TPC bitmap + ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); + + // Total DCI length including padding + ptvcursor_add(ptvc, hf_nfapi_total_dci_length_include_padding, 1, ENC_BIG_ENDIAN); + + // Number of TX Antenna ports + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "TX Antenna Ports", ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); +} +static void dissect_rx_ue_info_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } +} +static void dissect_rx_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // Data offset + ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); + + // UL_CQI + ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); + + // Timing advance + guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + if (timing_advance_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); + } +} +static void dissect_rx_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Timing advance R9 + guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); + if (timing_advance_r9_value > 7690) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance r9 value [0..7690]"); + } + +} +static void dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } + + guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); + if (!(value_1 >= 1 && value_1 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); + } +} +static void dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } + + guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); + if (!(value_1 >= 1 && value_1 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); + } + + guint8 value_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_2, 1, ENC_BIG_ENDIAN); + if (!(value_2 >= 1 && value_2 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 2 [1..7]"); + } + + guint8 value_3 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_3, 1, ENC_BIG_ENDIAN); + if (!(value_3 >= 1 && value_3 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 3 [1..7]"); + } + +} +static void dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); + if (value_0 > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); + } +} +static void dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); + if (value_0 > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); + } +} +static void dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); + if (!(value_0 >= 1 && value_0 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); + } +} +static void dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); + if (mode > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); + } + + guint8 number_of_ack_nack_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); + if (!(number_of_ack_nack_value >= 1 && number_of_ack_nack_value <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); + } + + switch (mode) + { + case 0: + { + dissect_harq_indication_data_bundling_value(ptvc, pinfo); + break; + } + case 1: + { + dissect_harq_indication_data_multplexing_value(ptvc, pinfo); + break; + } + case 2: + { + dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); + break; + } + }; +} +static void dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 i; + proto_item* item; + + guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); + if (mode > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); + } + + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); + if (mode == 0 || mode == 1) + { + if (!(count >= 1 && count <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); + } + } + else if (mode == 3) + { + if (!(count >= 1 && count <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); + } + } + else if (mode == 4) + { + if (!(count >= 1 && count <= 21)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); + } + } + + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); + + for (i = 0; i < count; ++i) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); + + switch (mode) + { + case 0: + { + dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); + break; + } + case 1: + { + dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); + break; + } + case 2: + { + dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvc, pinfo); + break; + } + case 3: + { + dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); + break; + } + case 4: + { + dissect_harq_indication_data_format_3_value(ptvc, pinfo); + break; + } + }; + + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); +} +static void dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 i = 0; + proto_item* item; + + guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); + if (mode > 6) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..6]"); + } + + + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); + if (mode == 0 || mode == 1) + { + if (!(count >= 1 && count <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); + } + } + else if (mode == 3) + { + if (!(count >= 1 && count <= 8)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); + } + } + else if (mode == 4) + { + if (!(count >= 1 && count <= 21)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); + } + } + else if (mode == 5 || mode == 6) + { + if (count < 22) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [>= 22]"); + } + + } + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); + + for (i = 0; i < count; ++i) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); + + switch (mode) + { + case 0: + { + dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); + break; + } + case 1: + { + dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); + break; + } + case 2: + { + dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); + break; + } + case 3: + { + dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); + break; + } + case 4: + { + dissect_harq_indication_data_format_3_value(ptvc, pinfo); + break; + } + case 5: + { + dissect_harq_indication_data_format_4_value(ptvc, pinfo); + break; + } + case 6: + { + dissect_harq_indication_data_format_5_value(ptvc, pinfo); + break; + } + }; + + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); +} +static void dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_1, 1, ENC_BIG_ENDIAN); + if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 1 [1..7]"); + } + + guint8 harq_tb_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_2, 1, ENC_BIG_ENDIAN); + if (!(harq_tb_2 >= 1 && harq_tb_2 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 2 [1..7]"); + } + +} +static void dissect_harq_tb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_n, 1, ENC_BIG_ENDIAN); + if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb n [1..7]"); + } +} +static void dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Mode + guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); + if (harq_mode_value > 2) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..2]"); + } + + // Number of ACK/NACK + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); + + if (harq_mode_value == 0) + { + if (!(count >=1 && count <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); + } + } + else if (harq_mode_value == 1) + { + if (!(count >= 1 && count <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); + } + + } + else if (harq_mode_value == 2) + { + if (!(count >= 1 && count <= 10)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); + } + + } + + dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); +} +static void dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Mode + guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); + if (harq_mode_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..4]"); + } + + // Number of ACK/NACK + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); + + if (harq_mode_value == 0) + { + if (!(count >= 1 && count <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); + } + } + else if (harq_mode_value == 1) + { + if (!(count >= 1 && count <= 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); + } + + } + else if (harq_mode_value == 2) + { + if (!(count >= 1 && count <= 10)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); + } + } + else if (harq_mode_value == 3 || harq_mode_value == 4) + { + if (count < 22) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [>= 22]"); + } + } + + dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); +} +static void dissect_ul_cqi_information_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // UL_CQI + ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); + + // Channel + guint8 channel_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_channel, 1, ENC_BIG_ENDIAN); + if (channel_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid channel value [0..1]"); + } +} +static void dissect_crc_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // CRC Flag + guint8 crc_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_crc_flag, 1, ENC_BIG_ENDIAN); + if (crc_flag_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid crc flag value [0..1]"); + } +} +static void dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + //Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // Data Offset + ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); + + // UL_CQI + ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); + + // RI + guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); + if (ri_value > 8) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); + } + + // Timing Advance + guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + if (timing_advance_value > 8) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); + } +} +static void dissect_ri_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // RI + guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); + if (ri_value > 8) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); + } +} +static void dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Length + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + + // Data Offset + ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); + + // UL_CQI + ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); + + // Number of CC reported + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_cc_reported, 1, ENC_BIG_ENDIAN); + if (!(count >= 1 && count <= 5)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of CC reported value [1..5]"); + } + + dissect_array_value(ptvc, pinfo, "CC List", ett_nfapi_cc, count, dissect_ri_value); + + // Timing Advance + guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + if (timing_advance_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); + } + + // Timing Advance R9 + guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); + if (timing_advance_r9_value > 7690) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); + } +} +static void dissect_rach_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // RNTI + guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); + if (rnti_value < 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); + } + + // Preamble + guint8 preamble_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_preamble, 1, ENC_BIG_ENDIAN); + if (preamble_value > 63) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble value [0..63]"); + } + + // Timing Advance + guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + if (timing_advance_value > 1282) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); + } + +} +static void dissect_rach_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Timing Advance R9 + guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); + if (timing_advance_r9_value > 7690) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); + } +} +static void dissect_rach_indication_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // RACH resource type + guint8 rach_resource_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rach_resource_type, 1, ENC_BIG_ENDIAN); + if (rach_resource_type_value > 4) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach resource type value [0..4]"); + } +} +static void dissect_snr_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // SNR + ptvcursor_add(ptvc, hf_nfapi_snr, 1, ENC_BIG_ENDIAN); +} +static void dissect_srs_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Doppler estimation + ptvcursor_add(ptvc, hf_nfapi_doppler_estimation, 2, ENC_BIG_ENDIAN); + + // Timing Advance + guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + if (timing_advance_value > 1282) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); + } + + // Number of resource blocks + guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); + + // RB start + ptvcursor_add(ptvc, hf_nfapi_rb_start, 1, ENC_BIG_ENDIAN); + + + dissect_array_value(ptvc, pinfo, "RB List", ett_nfapi_rbs, count, dissect_snr_value); +} +static void dissect_srs_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Timing Advance R9 + guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); + if (timing_advance_r9_value > 7690) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); + } +} +static void dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UpPTS Symbol + guint8 uppts_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_up_pts_symbol, 1, ENC_BIG_ENDIAN); + if (uppts_symbol_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid up pts symbol value [0..1]"); + } + +} +static void dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint16 i = 0; + guint16 j = 0; + + // numPRBperSubband + ptvcursor_add(ptvc, hf_nfapi_number_prb_per_subband, 1, ENC_BIG_ENDIAN); + + // Number of subbands + guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); + + // numAntennas + guint8 num_phy_ant = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_antennas, 1, ENC_BIG_ENDIAN); + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "Subbands"); + + for (i = 0; i < num_subbands; ++i) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "[%d]", i); + + // subbandIndex + ptvcursor_add(ptvc, hf_nfapi_subband_index, 1, ENC_BIG_ENDIAN); + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "Physical Antennas"); + + for (j = 0; j < num_phy_ant; ++j) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "[%d]", j); + + // Channel + ptvcursor_add(ptvc, hf_nfapi_channel_coefficient, 2, ENC_BIG_ENDIAN); + + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); + + ptvcursor_pop_subtree(ptvc); + } + + ptvcursor_pop_subtree(ptvc); +} +static void dissect_srs_indication_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + //UL_RTOA + guint16 ul_rtoa_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_rtoa, 2, ENC_BIG_ENDIAN); + if (ul_rtoa_value > 4800) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul rtoa value [0..4800]"); + } +} +static void dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // nCCA + ptvcursor_add(ptvc, hf_nfapi_mp_cca, 4, ENC_BIG_ENDIAN); + + // NCCA + ptvcursor_add(ptvc, hf_nfapi_n_cca, 4, ENC_BIG_ENDIAN); + + // Offset + guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); + if (ul_rtoa_value > 999) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); + } + + // LTE TXOP SF + ptvcursor_add(ptvc, hf_nfapi_lte_txop_sf, 4, ENC_BIG_ENDIAN); + + // TXOP SFN/SF End + ptvcursor_add(ptvc, hf_nfapi_txop_sfn_sf_end, 2, ENC_BIG_ENDIAN); + + // LBT mode + guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); + if (lbt_mode > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); + } +} +static void dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // Offset + guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); + if (ul_rtoa_value > 999) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); + } + + // SFN/SF End + ptvcursor_add(ptvc, hf_nfapi_sfn_sf_end, 2, ENC_BIG_ENDIAN); + + // LBT mode + guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); + if (lbt_mode > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); + } +} +static void dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // result + guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); + if (result_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); + } + + // LTE TXOP symbols + ptvcursor_add(ptvc, hf_nfapi_txop_symbols, 4, ENC_BIG_ENDIAN); + + // Initial Partial SF + guint32 initial_partial_sf_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_initial_partial_sf, 4, ENC_BIG_ENDIAN); + if (initial_partial_sf_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial partial sf value [0..1]"); + } +} +static void dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // Handle + ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); + + // result + guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); + item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); + if (result_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); + } +} +static void dissect_tx_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PDU length + guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_length, 2, ENC_BIG_ENDIAN); + + // PDU index + ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); + + // PDU#N + ptvcursor_add(ptvc, hf_nfapi_pdu, len, ENC_NA); +} +static void dissect_tx_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of PDUs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "TX PDU List", ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); +} +static void dissect_harq_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_harq_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of HARQs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_harqs, 2, ENC_BIG_ENDIAN); + + + dissect_array_value(ptvc, pinfo, "HARQ PDU List", ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); +} +static void dissect_crc_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_crc_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of CRCs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_crcs, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "CRC PDU List", ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); +} +static void dissect_sr_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of SRs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_srs, 2, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "SR PDU List", ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); +} +static void dissect_cqi_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of PDUs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_cqi, 2, ENC_BIG_ENDIAN); + + guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), num_pdu * 2); + memset(lengths, 0, num_pdu * 2); + + tvbuff_t* tvb = ptvcursor_tvbuff(ptvc); + guint8 tmp_offset = ptvcursor_current_offset(ptvc); + + int i = 0; + for (i = 0; i < num_pdu; ++i) + { + guint16 instance_len = tvb_get_ntohs(tvb, tmp_offset); + tmp_offset += 2; + guint8 pdu_end = tmp_offset + instance_len; + + while (tmp_offset < pdu_end) + { + guint16 tlv_id = tvb_get_ntohs(tvb, tmp_offset); + tmp_offset += 2; + guint16 tlv_len = tvb_get_ntohs(tvb, tmp_offset); + tmp_offset += 2; + + if (tlv_id == 0x202F) + { + lengths[i] = tvb_get_ntohs(tvb, tmp_offset); + } + else if (tlv_id == 0x2030) + { + lengths[i] = tvb_get_ntohs(tvb, tmp_offset); + } + + tmp_offset += tlv_len; + } + } + + dissect_array_value(ptvc, pinfo, "CQI PDU List", ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); + + for (i = 0; i < num_pdu; ++i) + { + ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); + } +} +static void dissect_preamble_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_rach_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of Preambles + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_preambles, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "Preamble PDU List", ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); +} +static void dissect_srs_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Instance Length + guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); + guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); + dissect_tlv_list(ptvc, pinfo, instance_end); +} +static void dissect_srs_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of UEs + guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_srss, 1, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "SRS PDU List", ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); +} +static void dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PDU Type + guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_req_pdu_type, 1, ENC_BIG_ENDIAN); + if (pdu_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); + } + + guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); + guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); + + dissect_tlv_list(ptvc, pinfo, pdu_end); +} +static void dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of PDUs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); + if (!(num_pdu >= 1 && num_pdu <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); + } + + dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); +} +static void dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PDU Type + guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_ind_pdu_type, 1, ENC_BIG_ENDIAN); + if (pdu_type_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); + } + + // PDU Size + guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); + guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); + dissect_tlv_list(ptvc, pinfo, pdu_end); +} +static void dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of PDUs + guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); + if (!(num_pdu >= 1 && num_pdu <= 2)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); + } + + dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); +} +static void dissect_lte_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Frequency Band Indicator + ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); + + // Measurement Period + ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); + + // Bandwidth + guint8 bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 1, ENC_BIG_ENDIAN); + if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || + bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); + } + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of EARFCNs + guint8 num_earfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_earfcns, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "EARFCNs", ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); +} +static void dissect_uarfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UARFCN + ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); +} +static void dissect_utran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Frequency Band Indicator + ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); + + // Measurement Period + ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of UARFCNs + guint8 num_uarfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_uarfcns, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "UARFCNs", ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); +} +static void dissect_arfcn_dir_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // ARFCN + ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); + + // Direction + guint8 direction_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_arfcn_direction, 1, ENC_BIG_ENDIAN); + if (direction_value > 1) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid direction value [0..1]"); + } + +} +static void dissect_geran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Frequency Band Indicator + ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); + + // Measurement Period + ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of ARFCNs + guint8 num_arfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); +} +static void dissect_rssi_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // RSSI + ptvcursor_add(ptvc, hf_nfapi_rssi, 2, ENC_BIG_ENDIAN); +} +static void dissect_rssi_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of RSSI + guint16 num_rssi = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_rssi, 2, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); +} +static void dissect_pci_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PCI + ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); +} +static void dissect_lte_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // EARFCN + ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); + + // Measurement Bandwidth + ptvcursor_add(ptvc, hf_nfapi_measurement_bandwidth, 1, ENC_BIG_ENDIAN); + + // Exhaustive Search + ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of PCI + guint8 num_pci = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_pci, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "PCIs", ett_nfapi_pci_list, num_pci, dissect_pci_value); +} +static void dissect_psc_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PSC + ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); +} +static void dissect_utran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UARFCN + ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); + + // Exhaustive Search + ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of PSC + guint8 num_psc = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_psc, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "PSCs", ett_nfapi_psc_list, num_psc, dissect_psc_value); +} +static void dissect_arfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // ARFCN + ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); +} +static void dissect_geran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); + + // Number of ARFCN + guint8 num_arfcn = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); +} + +static void dissect_lte_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PCI + ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); + + // RSRP + ptvcursor_add(ptvc, hf_nfapi_rsrp, 1, ENC_BIG_ENDIAN); + + // RSRQ + ptvcursor_add(ptvc, hf_nfapi_rsrq, 1, ENC_BIG_ENDIAN); + + // Frequency Offset + ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); +} +static void dissect_lte_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of LTE Cells Found + guint16 num_lte_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_lte_cells_found, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "LTE Cells Found", ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); +} +static void dissect_utran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // PSC + ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); + + // RSCP + ptvcursor_add(ptvc, hf_nfapi_rscp, 1, ENC_BIG_ENDIAN); + + // EcN0 + ptvcursor_add(ptvc, hf_nfapi_enco, 1, ENC_BIG_ENDIAN); + + // Frequency Offset + ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); +} +static void dissect_utran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of UTRAN Cells Found + guint16 num_utran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_utran_cells_found, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "UTRAN Cells Found", ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); +} +static void dissect_geran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // ARFCN + ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); + + // BSIC + ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); + + // RxLev + ptvcursor_add(ptvc, hf_nfapi_rxlev, 1, ENC_BIG_ENDIAN); + + // RxQual + ptvcursor_add(ptvc, hf_nfapi_rxqual, 1, ENC_BIG_ENDIAN); + + // Frequency Offset + ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); + + // SFN Offset + ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); +} +static void dissect_geran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of GSM Cells Found + guint16 num_geran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_geran_cells_found, 2, ENC_BIG_ENDIAN); + dissect_array_value(ptvc, pinfo, "GERAN Cells Found", ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); +} +static void dissect_pnf_cell_search_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_search_state, len, ENC_NA); +} +static void dissect_pnf_cell_broadcast_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_pnf_broadcast_state, len, ENC_NA); +} +static void dissect_lte_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // EARFCN + ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); + + // PCI + ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_utran_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UARFCN + ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); + + // PSC + ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_lte_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // Number of Tx Antenna + guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); + if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); + } + + + // MIB Length + guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); + + // MIB[MIB Length] + ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); + + // SFN Offset + ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); +} +static void dissect_utran_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // MIB Length + guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); + + // MIB[MIB Length] + ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); + + // SFN Offset + ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); +} +static void dissect_lte_system_information_schedule_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // EARFCN + ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); + + // PCI + ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); + + // Bandwidth + guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 2, ENC_BIG_ENDIAN); + if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || + bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); + } + + // PHICH Configuration + // todo : phich bit decode + ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); + + // Number of Tx Antenna + guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); + if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); + } + + // retryCount + ptvcursor_add(ptvc, hf_nfapi_retry_count, 1, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_lte_system_information_schedule_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // this needs to be SIB 1 + guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_sib1, len, ENC_NA); +} +static void dissect_si_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + proto_item* item; + + // SI Periodicity + guint8 si_periodicity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_si_periodicity, 1, ENC_BIG_ENDIAN); + if (si_periodicity_value > 7) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si periodicity value [0..7]"); + } + + // SI Index + guint8 si_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_si_index, 1, ENC_BIG_ENDIAN); + if (si_index_value > 32) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si index value [0..32]"); + } +} + +static void dissect_lte_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // EARFCN + ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); + + // PCI + ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); + + // Downlink channel bandwidth + guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); + if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || + bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); + } + + // PHICH Configuration + ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); + + // Number of Tx Antenna + guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); + if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); + } + + // Number of SI Periodicity + guint8 si_priodicity = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_of_si_periodicity, 1, ENC_BIG_ENDIAN); + + dissect_array_value(ptvc, pinfo, "Number SI Periodicity", ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); + + // SI Window Length + guint8 si_window_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + item = ptvcursor_add(ptvc, hf_nfapi_si_window_length, 1, ENC_BIG_ENDIAN); + if (!(si_window_length_value == 1 || si_window_length_value == 2 || si_window_length_value == 5 || si_window_length_value == 10 || + si_window_length_value == 15 || si_window_length_value == 20 || si_window_length_value == 40)) + { + expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si window length value [1, 2, 5, 10, 15, 20, 40]"); + } + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_utran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // UARFCN + ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); + + // PSC + ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_geran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // ARFCN + ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); + + // BSIC + ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); + + // Timeout + ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); +} +static void dissect_lte_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // SIB Type + ptvcursor_add(ptvc, hf_nfapi_sib_type, 1, ENC_BIG_ENDIAN); + + // SIB Length + guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); + + // SIB[SIB Length] + ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); +} +static void dissect_utran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // SIB Length + guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); + + // SIB[SIB Length] + ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); +} +static void dissect_geran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + // SI Length + guint16 si_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_si_len, 2, ENC_BIG_ENDIAN); + + // SI[SI Length] + ptvcursor_add(ptvc, hf_nfapi_si, si_len, ENC_NA); +} + +static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_); + +// Important the tags must be in numerical order so that they can be indexed correctly +const tlv_t nfapi_tags[] = +{ + { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, + { 0x1001, "PNF PHY", dissect_pnf_phy_value }, + { 0x1002, "PNF RF", dissect_pnf_rf_value }, + { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, + { 0x1004, "DL RS Tx power", dissect_dl_rs_tx_power_value }, + { 0x1005, "Received interference power", dissect_received_interference_power_value }, + { 0x1006, "Thermal noise power", dissect_thermal_noise_power_value }, + { 0x1007, "DL RS TX Power measurement", dissect_dl_rs_tx_power_measurement_value }, + { 0x1008, "Received Interference power measurement", dissect_received_interference_power_measurement_value }, + { 0x1009, "Thermal noise power measurement", dissect_thermal_noise_power_measurement_value }, + { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, + { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, + { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, + { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, +}; + +const tlv_t configuration_tags[] = +{ + { 0x0000, NULL, NULL }, + { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, + { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, + { 0x0003, "Subframe config - P-B", dissect_pb_value }, + { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, + { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, + { 0x0006, NULL, NULL }, + { 0x0007, NULL, NULL }, + { 0x0008, NULL, NULL }, + { 0x0009, NULL, NULL }, + { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, + { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, + { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, + { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, + { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, + { 0x000F, NULL, NULL }, + { 0x0010, NULL, NULL }, + { 0x0011, NULL, NULL }, + { 0x0012, NULL, NULL }, + { 0x0013, NULL, NULL }, + { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, + { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, + { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, + { 0x0017, NULL, NULL }, + { 0x0018, NULL, NULL }, + { 0x0019, NULL, NULL }, + { 0x001A, NULL, NULL }, + { 0x001B, NULL, NULL }, + { 0x001C, NULL, NULL }, + { 0x001D, NULL, NULL }, + { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, + { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, + { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, + { 0x0021, NULL, NULL }, + { 0x0022, NULL, NULL }, + { 0x0023, NULL, NULL }, + { 0x0024, NULL, NULL }, + { 0x0025, NULL, NULL }, + { 0x0026, NULL, NULL }, + { 0x0027, NULL, NULL }, + { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, + { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, + { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, + { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, + { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, + { 0x002D, NULL, NULL }, + { 0x002E, NULL, NULL }, + { 0x002F, NULL, NULL }, + { 0x0030, NULL, NULL }, + { 0x0031, NULL, NULL }, + { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, + { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, + { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, + { 0x0035, NULL, NULL }, + { 0x0036, NULL, NULL }, + { 0x0037, NULL, NULL }, + { 0x0038, NULL, NULL }, + { 0x0039, NULL, NULL }, + { 0x003A, NULL, NULL }, + { 0x003B, NULL, NULL }, + { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, + { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, + { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, + { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, + { 0x0040, NULL, NULL }, + { 0x0041, NULL, NULL }, + { 0x0042, NULL, NULL }, + { 0x0043, NULL, NULL }, + { 0x0044, NULL, NULL }, + { 0x0045, NULL, NULL }, + { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, + { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, + { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, + { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, + { 0x004A, NULL, NULL }, + { 0x004B, NULL, NULL }, + { 0x004C, NULL, NULL }, + { 0x004D, NULL, NULL }, + { 0x004E, NULL, NULL }, + { 0x004F, NULL, NULL }, + { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, + { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, + { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, + { 0x0053, NULL, NULL }, + { 0x0054, NULL, NULL }, + { 0x0055, NULL, NULL }, + { 0x0056, NULL, NULL }, + { 0x0057, NULL, NULL }, + { 0x0058, NULL, NULL }, + { 0x0059, NULL, NULL }, + { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, + { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, + { 0x005C, NULL, NULL }, + { 0x005D, NULL, NULL }, + { 0x005E, NULL, NULL }, + { 0x005F, NULL, NULL }, + { 0x0060, NULL, NULL }, + { 0x0061, NULL, NULL }, + { 0x0062, NULL, NULL }, + { 0x0063, NULL, NULL }, + { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, + { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, + { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, + { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, + { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, + { 0x0069, "LAA config - Multi carrier freeze", dissect_laa_multi_carrier_freeze_value }, + { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, + { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, + { 0x006C, NULL, NULL }, + { 0x006D, NULL, NULL }, + { 0x006E, NULL, NULL }, + { 0x006F, NULL, NULL }, + { 0x0070, NULL, NULL }, + { 0x0071, NULL, NULL }, + { 0x0072, NULL, NULL }, + { 0x0073, NULL, NULL }, + { 0x0074, NULL, NULL }, + { 0x0075, NULL, NULL }, + { 0x0076, NULL, NULL }, + { 0x0077, NULL, NULL }, + { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, + { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, + { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, + { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, + { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, + { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, + { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, + { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, + { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, + { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, + { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, + { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, + { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, + { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, + { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, + { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, + { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, + { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, + { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, + { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, + { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, + { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, + { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, + { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, + { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, + { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, + { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, + { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, + { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, + { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, + { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, + { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, + { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, + { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, + { 0x009A, NULL, NULL }, + { 0x009B, NULL, NULL }, + { 0x009C, NULL, NULL }, + { 0x009D, NULL, NULL }, + { 0x009E, NULL, NULL }, + { 0x009F, NULL, NULL }, + { 0x00A0, NULL, NULL }, + { 0x00A1, NULL, NULL }, + { 0x00A2, NULL, NULL }, + { 0x00A3, NULL, NULL }, + { 0x00A4, NULL, NULL }, + { 0x00A5, NULL, NULL }, + { 0x00A6, NULL, NULL }, + { 0x00A7, NULL, NULL }, + { 0x00A8, NULL, NULL }, + { 0x00A9, NULL, NULL }, + { 0x00AA, NULL, NULL }, + { 0x00AB, NULL, NULL }, + { 0x00AC, NULL, NULL }, + { 0x00AD, NULL, NULL }, + { 0x00AE, NULL, NULL }, + { 0x00AF, NULL, NULL }, + { 0x00B0, NULL, NULL }, + { 0x00B1, NULL, NULL }, + { 0x00B2, NULL, NULL }, + { 0x00B3, NULL, NULL }, + { 0x00B4, NULL, NULL }, + { 0x00B5, NULL, NULL }, + { 0x00B6, NULL, NULL }, + { 0x00B7, NULL, NULL }, + { 0x00B8, NULL, NULL }, + { 0x00B9, NULL, NULL }, + { 0x00BA, NULL, NULL }, + { 0x00BB, NULL, NULL }, + { 0x00BC, NULL, NULL }, + { 0x00BD, NULL, NULL }, + { 0x00BE, NULL, NULL }, + { 0x00BF, NULL, NULL }, + { 0x00C0, NULL, NULL }, + { 0x00C1, NULL, NULL }, + { 0x00C2, NULL, NULL }, + { 0x00C3, NULL, NULL }, + { 0x00C4, NULL, NULL }, + { 0x00C5, NULL, NULL }, + { 0x00C6, NULL, NULL }, + { 0x00C7, NULL, NULL }, + { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, + { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, + { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, + { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, + { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, + { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, + { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, + { 0x00CF, NULL, NULL }, + { 0x00D0, NULL, NULL }, + { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, + { 0x00D2, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, + { 0x00D3, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, + { 0x00D4, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, + { 0x00D5, NULL, NULL }, + { 0x00D6, NULL, NULL }, + { 0x00D7, NULL, NULL }, + { 0x00D8, NULL, NULL }, + { 0x00D9, NULL, NULL }, + { 0x00DA, NULL, NULL }, + { 0x00DB, NULL, NULL }, + { 0x00DC, NULL, NULL }, + { 0x00DD, NULL, NULL }, + { 0x00DE, NULL, NULL }, + { 0x00DF, NULL, NULL }, + { 0x00E0, NULL, NULL }, + { 0x00E1, NULL, NULL }, + { 0x00E2, NULL, NULL }, + { 0x00E3, NULL, NULL }, + { 0x00E4, NULL, NULL }, + { 0x00E5, NULL, NULL }, + { 0x00E6, NULL, NULL }, + { 0x00E7, NULL, NULL }, + { 0x00E8, NULL, NULL }, + { 0x00E9, NULL, NULL }, + { 0x00EA, NULL, NULL }, + { 0x00EB, NULL, NULL }, + { 0x00EC, NULL, NULL }, + { 0x00ED, NULL, NULL }, + { 0x00EE, NULL, NULL }, + { 0x00EF, NULL, NULL }, + { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, + { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, + { 0x00F2, NULL, NULL }, + { 0x00F3, NULL, NULL }, + { 0x00F4, NULL, NULL }, + { 0x00F5, NULL, NULL }, + { 0x00F6, NULL, NULL }, + { 0x00F7, NULL, NULL }, + { 0x00F8, NULL, NULL }, + { 0x00F9, NULL, NULL }, + { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, + { 0x00FB, NULL, NULL }, + { 0x00FC, NULL, NULL }, + { 0x00FD, NULL, NULL }, + { 0x00FE, NULL, NULL }, + { 0x00FF, NULL, NULL }, + { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, + { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, + { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, + { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, + { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, + { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, + { 0x0106, NULL, NULL }, + { 0x0107, NULL, NULL }, + { 0x0108, NULL, NULL }, + { 0x0109, NULL, NULL }, + { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, + { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, + { 0x010C, NULL, NULL }, + { 0x010D, NULL, NULL }, + { 0x010E, NULL, NULL }, + { 0x010F, NULL, NULL }, + { 0x0110, NULL, NULL }, + { 0x0111, NULL, NULL }, + { 0x0112, NULL, NULL }, + { 0x0113, NULL, NULL }, + { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, + { 0x0115, NULL, NULL }, + { 0x0116, NULL, NULL }, + { 0x0117, NULL, NULL }, + { 0x0118, NULL, NULL }, + { 0x0119, NULL, NULL }, + { 0x011A, NULL, NULL }, + { 0x011B, NULL, NULL }, + { 0x011C, NULL, NULL }, + { 0x011D, NULL, NULL }, + { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, + { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, + { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, + { 0x0121, NULL, NULL }, + { 0x0122, NULL, NULL }, + { 0x0123, NULL, NULL }, + { 0x0124, NULL, NULL }, + { 0x0125, NULL, NULL }, + { 0x0126, NULL, NULL }, + { 0x0127, NULL, NULL }, + { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, + { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, + { 0x012A, NULL, NULL }, + { 0x012B, NULL, NULL }, + { 0x012C, NULL, NULL }, + { 0x012D, NULL, NULL }, + { 0x012E, NULL, NULL }, + { 0x012F, NULL, NULL }, + { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, + { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, + { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, + { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, +}; + +const tlv_t p7_tags[] = +{ + { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, + { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, + { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, + { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, + { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, + { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, + { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, + { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, + { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, + { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, + { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, + { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, + { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, + { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, + { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, + { 0x200F, "Initial Transmission Parameters Release 8", dissect_ul_config_init_tx_params_rel8_value }, + { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, + { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, + { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, + { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, + { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, + { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, + { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, + { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, + { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, + { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, + { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, + { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, + { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, + { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, + { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, + { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, + { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, + { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, + { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, + { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, + { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, + { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, + { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, + { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, + { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, + { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, + { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, + { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, + { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, + { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, + { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, + { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, + { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, + { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, + { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, + { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, + { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, + { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, + { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, + { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, + { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, + { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, + { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, + { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, + { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, + { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, + { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, + { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, + { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, + { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, + { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, + { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, + { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, + { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, + { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, + { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, + { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, + { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, + { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, + { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, + { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, + { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, + { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, + { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, + { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, + { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, + { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, + { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, + { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measurement_value }, + { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, + { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, + { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, + { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, + { 0x2059, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, + { 0x205A, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, + { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, +}; + +const tlv_t p4_tags[] = +{ + { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, + { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, + { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, + { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, + { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, + { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, + { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, + { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, + { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, + { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, + { 0x300A, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, + { 0x300B, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, + { 0x300C, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, + { 0x300D, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, + { 0x300E, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, + { 0x300F, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, + { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, + { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, + { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, + { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, + { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, + { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, + { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, + { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, + { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, + { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, + { 0x301A, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, +}; + + +static const tlv_t* look_up_tlv(int tag_id) +{ + const tlv_t* tlv = NULL; + + static const gint num_configuration_tags = sizeof(configuration_tags) / sizeof(tlv_t); + static const gint num_nfapi_tags = sizeof(nfapi_tags) / sizeof(tlv_t); + static const gint num_p7_tags = sizeof(p7_tags) / sizeof(tlv_t); + static const gint num_p4_tags = sizeof(p4_tags) / sizeof(tlv_t); + + if (tag_id >= 0x0000 && tag_id <= (0x0000 + num_configuration_tags - 1)) // 0x0133) + { + tlv = &configuration_tags[tag_id]; + } + else if (tag_id >= 0x1000 && tag_id <= (0x1000 + num_nfapi_tags - 1)) // 0x100D) + { + tlv = &nfapi_tags[tag_id - 0x1000]; + } + else if (tag_id >= 0x2000 && tag_id <= (0x2000 + num_p7_tags - 1)) //0x205B) + { + tlv = &p7_tags[tag_id - 0x2000]; + } + else if (tag_id >= 0x3000 && tag_id <= (0x3000 + num_p4_tags - 1)) // 0x301A) + { + tlv = &p4_tags[tag_id - 0x3000]; + } + return tlv; +} + + +static proto_item* dissect_tl_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tl, "TL"); + ptvcursor_add(ptvc, hf_nfapi_tl_tag, 2, ENC_BIG_ENDIAN); + proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tl_length, 2, ENC_BIG_ENDIAN); + ptvcursor_pop_subtree(ptvc); + + return item; +} + +static void dissect_tlv_list(ptvcursor_t* ptvc, packet_info* pinfo, gint len) +{ + while (ptvcursor_current_offset(ptvc) < len) + { + guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); + + const tlv_t* tlv = look_up_tlv(tlv_id); + + if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "%s", tlv->name); + proto_item* tlv_length_item = dissect_tl_header(ptvc, pinfo); + + // There are rare cases where the len of the tlv is 0. + if (tlv_len > 0) + { + + if (tlv->decode != NULL) + { + // Create a sub buff with the correct length, so we can detect reading off the end + tvbuff_t* sub_tvbuff = tvb_new_subset_length(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), tlv_len); + ptvcursor_t* sub_ptvc = ptvcursor_new(ptvcursor_tree(ptvc), sub_tvbuff, 0); + + tlv->decode(sub_ptvc, pinfo); + + if (ptvcursor_current_offset(sub_ptvc) != tlv_len) + { + // error in the tlv length + expert_add_info_format(pinfo, tlv_length_item, &ei_invalid_tlv_length, "TLV length does not match decoded length"); + } + + ptvcursor_free(sub_ptvc); + } + + ptvcursor_advance(ptvc, tlv_len); + } + + ptvcursor_pop_subtree(ptvc); + } + else + { + if (tlv_id >= 0xF000 /* && tlv_id <= 0xFFFF*/) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown Vendor Extension Tag"); + } + else + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown"); + } + + dissect_tl_header(ptvc, pinfo); + ptvcursor_advance(ptvc, tlv_len); + ptvcursor_pop_subtree(ptvc); + } + } +} + + +static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + guint number_of_pdu_addr = ptvcursor_current_offset(ptvc); // *offset; + guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); + + guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), count * 2); + memset(lengths, 0, count * 2); + + guint16 i = 0; + + if (count > 0) + { + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "RX PDU List"); + gint pdu_end = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc); + + while (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) > 0 && + ptvcursor_current_offset(ptvc) < pdu_end ) + { + guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + //guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); + + if (tlv_id == 0x2038) + { + if (i != 0) + ptvcursor_pop_subtree(ptvc); + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "[%d]", i); + + i++; + } + + char* tlv_name = "Unknown"; + const tlv_t* tlv = look_up_tlv(tlv_id); + + if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) + { + tlv_name = tlv->name; + } + + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "%s", tlv_name); + + dissect_tl_header(ptvc, pinfo); + + + if (tlv_id == 0x2038) + { + dissect_rx_ue_info_value(ptvc, pinfo); + } + else if (tlv_id == 0x2024) + { + lengths[i - 1] = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); + int data_offset = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); + + if ((data_offset > 0) && (pdu_end == (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc)))) + { + pdu_end = number_of_pdu_addr + data_offset; + } + + } + else if (tlv_id == 0x2025) + { + dissect_rx_indication_rel9_value(ptvc, pinfo); + } + + ptvcursor_pop_subtree(ptvc); + + } + + // pop the last pdu index. + ptvcursor_pop_subtree(ptvc); + + ptvcursor_pop_subtree(ptvc); + } + + for (i = 0; i < count; ++i) + { + ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); + } +} + + +// ----------------------------------------------------------------------------| + +static void dissect_p45_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p4_p5_message_header, "P4 P5 Header"); + ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_phy_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_length, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_spare, 2, ENC_BIG_ENDIAN); + ptvcursor_pop_subtree(ptvc); + +} + +static void dissect_p7_header_new(ptvcursor_t* ptvc, guint8* m, guint8* seg, guint8* seq) +{ + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); + + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); + + guint8 m_seg = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + *m = (m_seg & 0x80) >> 7; + *seg = m_seg & 0x7F; + + proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); + proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); + ptvcursor_advance(ptvc, 1); + + + *seq = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); + + ptvcursor_pop_subtree(ptvc); +} + + +static void dissect_p7_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) +{ + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); + + proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); + proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); + ptvcursor_advance(ptvc, 1); + + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); + + ptvcursor_pop_subtree(ptvc); +} + +static reassembly_table ul_p7_reassemble_table; +static reassembly_table dl_p7_reassemble_table; + +static int hf_msg_fragments = -1; +static int hf_msg_fragment = -1; +static int hf_msg_fragment_overlap = -1; +static int hf_msg_fragment_overlap_conflicts = -1; +static int hf_msg_fragment_multiple_tails = -1; +static int hf_msg_fragment_too_long_fragment = -1; +static int hf_msg_fragment_error = -1; +static int hf_msg_fragment_count = -1; +static int hf_msg_reassembled_in = -1; +static int hf_msg_reassembled_length = -1; +static gint ett_msg_fragment = -1; +static gint ett_msg_fragments = -1; + +static const fragment_items msg_frag_items = { + /* Fragment subtrees */ + &ett_msg_fragment, + &ett_msg_fragments, + /* Fragment fields */ + &hf_msg_fragments, + &hf_msg_fragment, + &hf_msg_fragment_overlap, + &hf_msg_fragment_overlap_conflicts, + &hf_msg_fragment_multiple_tails, + &hf_msg_fragment_too_long_fragment, + &hf_msg_fragment_error, + &hf_msg_fragment_count, + /* Reassembled in field */ + &hf_msg_reassembled_in, + /* Reassembled length field */ + &hf_msg_reassembled_length, + NULL, + /* Tag */ + "Message fragments" +}; + +static void dissect_nfapi_ul_p7(ptvcursor_t *ptvc, packet_info *pinfo) +{ + guint8 m; + guint8 seg; + guint8 seq; + + guint8 save_fragmented; + ptvcursor_t* sub_ptvc = 0; + + guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); + guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); + + dissect_p7_header_new(ptvc, &m, &seg, &seq); + save_fragmented = pinfo->fragmented; + + if (m == 1 || (m == 0 && seg > 0)) + { + tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); + guint offset = ptvcursor_current_offset(ptvc); + proto_tree* tree = ptvcursor_tree(ptvc); + + pinfo->fragmented = TRUE; + + fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); + + if (fd_head) + { + tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); + if (new_tvb) + { + sub_ptvc = ptvcursor_new(tree, new_tvb, 0); + + col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); + } + else + { + col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); + return; + } + } + else + { + return; + } + } + + pinfo->fragmented = save_fragmented; + + { + switch (msg_id) + { + case NFAPI_HARQ_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_CRC_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_RX_ULSCH_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_RACH_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_SRS_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_RX_SR_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_RX_CQI_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + + }; + } + + if (sub_ptvc) + ptvcursor_free(sub_ptvc); +} + +static void dissect_nfapi_dl_p7(ptvcursor_t *ptvc, packet_info *pinfo) +{ + guint8 m; + guint8 seg; + guint8 seq; + + guint8 save_fragmented; + ptvcursor_t* sub_ptvc = 0; + + guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); + guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); + + dissect_p7_header_new(ptvc, &m, &seg, &seq); + save_fragmented = pinfo->fragmented; + + if (m == 1 || (m == 0 && seg > 0)) + { + tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); + guint offset = ptvcursor_current_offset(ptvc); + proto_tree* tree = ptvcursor_tree(ptvc); + + pinfo->fragmented = TRUE; + + fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); + + if (fd_head) + { + tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); + if (new_tvb) + { + sub_ptvc = ptvcursor_new(tree, new_tvb, 0); + col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); + } + else + { + col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); + return; + } + } + else + { + return; + } + } + + pinfo->fragmented = save_fragmented; + + switch (msg_id) + { + case NFAPI_DL_CONFIG_REQUEST_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + break; + } + case NFAPI_UL_CONFIG_REQUEST_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_HI_DCI0_REQUEST_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_TX_REQUEST_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + } + break; + case NFAPI_LBT_DL_INDICATION_MSG_ID: + { + ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); + dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); + break; + } + } + + if (sub_ptvc) + ptvcursor_free(sub_ptvc); +} + + +static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); + + ptvcursor_t* ptvc = ptvcursor_new(tree, tvb, 0); + + guint16 msg_id = tvb_get_ntohs(tvb, 2); + + // Get the name of the message + const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); + + // Append to the Info string the nFAPI messages + col_clear(pinfo->cinfo, COL_INFO); + col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); + + // Flag if this is a vendor extention message, could do it for P4, 5, 7 + if (msg_id >= 0x0300 && msg_id <= 0x03FF) + { + col_append_fstr(pinfo->cinfo, COL_INFO, " Vendor Extension"); + } + + // Create the top level tree + ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_message_tree, "%s", message_str); + + switch (msg_id) + { + case NFAPI_HARQ_INDICATION_MSG_ID: + case NFAPI_CRC_INDICATION_MSG_ID: + case NFAPI_RX_ULSCH_INDICATION_MSG_ID: + case NFAPI_RACH_INDICATION_MSG_ID: + case NFAPI_SRS_INDICATION_MSG_ID: + case NFAPI_RX_SR_INDICATION_MSG_ID: + case NFAPI_RX_CQI_INDICATION_MSG_ID: + { + dissect_nfapi_ul_p7(ptvc, pinfo); + } break; - // LBT_DL.indication - case 0x8D: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // PNF_PARAM.request - case 0x100: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // PNF_PARAM.response - case 0x101: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // PNF_CONFIG.request - case 0x102: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // PNF_CONFIG.response - case 0x103: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // PNF_START.request - case 0x104: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; - } - // PNF_START.response - case 0x105: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // PNF_STOP.response - case 0x106: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; - } - // PNF_STOP.request - case 0x107: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // PARAM.request - case 0x108: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; - } - // PARAM.response - case 0x109: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // CONFIG.request - case 0x10A: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_num_tlv, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - // CONFIG.response - case 0x10B: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // START.request - case 0x10C: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; - } - // START.response - case 0x10D: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // STOP.request - case 0x10E: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; - } - // STOP.response - case 0x10F: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - break; - } - // MEASUREMENT.request - case 0x110: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + + case NFAPI_DL_CONFIG_REQUEST_MSG_ID: + case NFAPI_UL_CONFIG_REQUEST_MSG_ID: + case NFAPI_HI_DCI0_REQUEST_MSG_ID: + case NFAPI_TX_REQUEST_MSG_ID: + case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: + case NFAPI_LBT_DL_INDICATION_MSG_ID: + { + dissect_nfapi_dl_p7(ptvc, pinfo); + break; + } + + case NFAPI_PNF_PARAM_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_PNF_PARAM_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + + break; + } + case NFAPI_PNF_CONFIG_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_PNF_CONFIG_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_PNF_START_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; + } + case NFAPI_PNF_START_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_PNF_STOP_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; + } + case NFAPI_PNF_STOP_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_PARAM_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; + } + case NFAPI_PARAM_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_num_tlv, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_CONFIG_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_CONFIG_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_START_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; + } + case NFAPI_START_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_STOP_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; + } + case NFAPI_STOP_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_MEASUREMENT_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_MEASUREMENT_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + + // P4 + case NFAPI_RSSI_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_RSSI_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; + } + case NFAPI_RSSI_INDICATION_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; + } + case NFAPI_CELL_SEARCH_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // MEASUREMENT.response - case 0x111: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; - } - - // P4 - // RSSI.request - case 0x200: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_CELL_SEARCH_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; } - // RSSI.response - case 0x201: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; + case NFAPI_CELL_SEARCH_INDICATION_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // RSSI.indication - case 0x202: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // CELL_SEARCH.request - case 0x203: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; } - // CELL_SEARCH.response - case 0x204: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; + case NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // CELL_SEARCH.indication - case 0x205: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // BROADCAST_DETECT.request - case 0x206: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; } - // BROADCAST_DETECT.response - case 0x207: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // BROADCAST_DETECT.indication - case 0x208: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // SYSTEM_INFORMATION_SCHEDULE.request - case 0x209: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; } - // SYSTEM_INFORMATOIN_SCHEDULE.response - case 0x20A: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; + case NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); + break; } - // SYSTEM_INFORMATION_SCHEDULE.indication - case 0x20B: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_NMM_STOP_REQUEST_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + break; } - // SYSTEM_INFORMATION.request - case 0x20C: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_NMM_STOP_RESPONSE_MSG_ID: + { + dissect_p45_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); + break; } - // SYSTEM_INFORMATION.response - case 0x20D: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; + case NFAPI_DL_NODE_SYNC_MSG_ID: + { + dissect_p7_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t1, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t2, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t3, 4, ENC_BIG_ENDIAN); + break; } - // SYSTEM_INFORMATION.indication - case 0x20E: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); - break; + case NFAPI_UL_NODE_SYNC_MSG_ID: + { + dissect_p7_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_t1, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_delta_sfn_sf, 4, ENC_BIG_ENDIAN); + break; } - // NMM_STOP.request - case 0x20F: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - break; + case NFAPI_TIMING_INFO_MSG_ID: + { + dissect_p7_header(ptvc, pinfo); + ptvcursor_add(ptvc, hf_nfapi_timing_info_last_sfn_sf, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_time_since_last_timing_info, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_jitter, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_jitter, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_jitter, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_jitter, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_latest_delay, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_latest_delay, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_latest_delay, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_latest_delay, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_earliest_arrival, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_earliest_arrival, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_earliest_arrival, 4, ENC_BIG_ENDIAN); + ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_earliest_arrival, 4, ENC_BIG_ENDIAN); + break; } - // NMM_STOP_response - case 0x210: - { - dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); - break; - } - - // DL_NODE.sync - case 0x0180: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t1, tvb, &offset, "microseconds"); - proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t2, tvb, &offset, "microseconds"); - proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t3, tvb, &offset, "microseconds"); - break; - } - // UL_NODE.sync - case 0x0181: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_t1, tvb, &offset, "microseconds"); - proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_delta_sfn_sf, tvb, &offset, 0); - break; - } - // TIMING_INFO - case 0x0182: - { - dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_last_sfn_sf, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_time_since_last_timing_info, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_jitter, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_jitter, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_jitter, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_jitter, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_latest_delay, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_latest_delay, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_latest_delay, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_latest_delay, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_earliest_arrival, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_earliest_arrival, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_earliest_arrival, tvb, &offset, 0); - proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_earliest_arrival, tvb, &offset, 0); - break; - } - default: - { - // todo : is this vendor extention? - break; - } - }; - - return tvb_captured_length(tvb); -} - -static void nfapi_tag_vals_fn(gchar* s, guint32 v) -{ - int index = look_up_tlv(v); - if (v >= 0) - { - g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tags[index].name, v); - } - else - { - g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); - } -} - -// ----------------------------------------------------------------------------| - -void proto_register_nfapi(void) -{ - - static hf_register_info hf[] = - { - { &hf_msg_fragments, { "Message fragments", "afs.fragments", FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment, { "Message fragment", "afs.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_overlap, { "Message fragment overlap", "afs.fragment.overlap", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_overlap_conflicts, { "Message fragment overlapping with conflicting data", "afs.fragment.overlap.conflicts", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_multiple_tails, { "Message has multiple tail fragments", "afs.fragment.multiple_tails", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_too_long_fragment, { "Message fragment too long", "afs.fragment.too_long_fragment", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_error, { "Message defragmentation error", "afs.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_fragment_count, { "Message fragment count", "afs.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_reassembled_in, { "Reassembled in", "afs.reassembled.in", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_reassembled_length, { "Reassembled length", "afs.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, - { &hf_msg_reassembled_data, { "Reassembled data", "afs.reassembled.data", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, - { &hf_nfapi_message_tree, { "Message tree", "nfapi.message_tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_p5_message_header, { "P4 P5 Header", "nfapi.p4_p5_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_p5_message_header_phy_id, { "PHY ID", "nfapi.p4_p5_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_p5_message_header_message_id, { "Message ID", "nfapi.p4_p5_message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_p5_message_header_message_length, { "Message Length", "nfapi.p4_p5_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_p5_message_header_spare, { "Spare", "nfapi.p4_p5_message_header.spare", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header, { "P7 Header", "nfapi.p7_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_phy_id, { "Phy ID", "nfapi.p7_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_message_id, { "Message ID", "nfapi.p7.message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_message_length, { "Message Length", "nfapi.p7_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_m, { "M", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_segment, { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_sequence_number, { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_checksum, { "Checksum", "nfapi.p7_message_header.checksum", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_p7_message_header_transmit_timestamp, { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tlv_tree, { "TAG", "nfapi.tlv.tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tl, { "TL", "nfapi.tl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tl_tag, { "TL Tag", "nfapi.tl_tag", FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, NULL, HFILL } }, - { &hf_nfapi_tl_length, { "TL Length", "nfapi.tl_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tag_uint8_value, { "Value", "nfapi.tag.uint8.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tag_uint16_value, { "Value", "nfapi.tag.uint16.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_param_response, { "Param Request", "nfapi.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_error_code, { "Error Code", "nfapi.error.code", FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_p4_error_code, { "Error Code", "nfapi.p4_error.code", FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_rat_type, { "RAT Type", "nfapi.rat_type", FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_num_tlv, { "Number of TLV", "nfapi.param.response.num_tlv", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phy_state, { "Phy state value", "nfapi.phy.state", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_modulation_support, { "Modulation value", "nfapi.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_ue_per_sf, { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_ue_per_sf, { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_duplex_mode, { "Duplex Mode", "nfapi.duplex.mode", FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_bandwidth_support, { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_bandwidth_support, { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_modulation_support, { "Downlink modulation support", "nfapi.dl.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_modulation_support, { "Uplink modulation support", "nfapi.ul.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phy_antenna_capability, { "Phy Antenna capability", "nfapi.phy.antenna.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_release_capability, { "Release capability", "nfapi.release.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mbsfn_capability, { "MBSFN capability", "nfapi.mbsfn.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_capability, { "LAA Support", "nfapi.laa.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_pd_sensing_lbt_support, { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_multi_carrier_lbt_support, { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_partial_sf_support, { "Partial SF support", "nfapi.partial.sf.support", FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_reference_signal_power, { "Reference signal power", "nfapi.ref_sig_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_primary_synchronization_signal_epre_eprers, { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_secondary_synchronization_signal_epre_eprers, { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_physical_cell_id, { "Physical Cell ID", "nfapi.physical.cell.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phich_resource, { "PHICH Resource", "nfapi.phich.resource", FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_phich_duration, { "PHICH Duration", "nfapi.phich.duration", FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_phich_power_offset, { "PHICH Power Offset", "nfapi.phich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_configuration_index, { "Configuration Index", "nfapi.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_root_sequence_index, { "Root sequence Index", "nfapi.root.sequence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_zero_correlation_zone_configuration, { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_high_speed_flag, { "High Speed Flag", "nfapi.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_offset, { "Frequency offset", "nfapi.frequency.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_hopping_mode, { "Hopping Mode", "nfapi.hopping.mode", FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_hopping_offset, { "Hopping offset", "nfapi.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_pucch_shift, { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_cqi_rb, { "N CQI RB", "nfapi.n.cqi.rb", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_an_cs, { "N AN CS", "nfapi.n.an.cs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n1_pucch_an, { "N1 PUCCH AN", "nfapi.n1.pucch.an", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bandwidth_configuration, { "Bandwidth configuration", "nfapi.bw.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_subframe_configuration, { "SRS subframe configuration", "nfapi.srs.subframe.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uplink_rs_hopping, { "Uplink RS hopping", "nfapi.uplink.rs.hopping", FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_group_assignment, { "Group assigment", "nfapi.group.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cyclic_shift_1_for_drms, { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_subframe_assignment, { "Subframe_assignment", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_special_subframe_patterns, { "Special Subframe patterns", "nfapi.special.subframe.patterns", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, { "ED Threshold for LBT for PDSCH", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ed_threshold_for_lbt_for_drs, { "ED Threshold for LBT for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pd_threshold, { "PD Threshold", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_multi_carrier_type, { "Multi carrier type", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_multi_carrier_tx, { "Multi carrier TX", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_multi_carrier_freeze, { "Multi carrier freeze ", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_tx_antenna_ports_for_drs, { "Tx antenna ports for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_power_for_drs, { "Transmission power for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pbch_repetitions_enabled_r13, { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_cat_m_root_sequence_index, { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_cat_m_high_speed_flag, { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_enable, { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_configuration_index, { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_frequency_offset, { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_hopping_enabled, { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_0_hopping_offset, { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_enable, { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_configuration_index, { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_frequency_offset, { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_hopping_enabled, { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_1_hopping_offset, { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_enable, { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_configuration_index, { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_frequency_offset, { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_hopping_enabled, { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_2_hopping_offset, { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_enable, { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_configuration_index, { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_frequency_offset, { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_hopping_enabled, { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_ce_level_3_hopping_offset, { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_data_report_mode, { "Data Report Mode", "nfapi.data.report.mode", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sfnsf, { "SFN/SF", "nfapi.sfn.sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_max_up_pts, { "Max UpPTS frames", "nfapi.max.uppts.frame", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_address, { "PNF address", "nfapi.p7.pnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_address_ipv4, { "PNF IPV4", "nfapi.pnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_address_ipv6, { "PNF IPV6", "nfapi.pnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_vnf_address, { "VNF address", "nfapi.vnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_vnf_address_ipv4, { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_vnf_address_ipv6, { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_port, { "PNF PORT value", "nfapi.config.pnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_vnf_port, { "VNF PORT value", "nfapi.config.vnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rf_bands, { "RF Bands", "nfapi.rf.bands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rf_bands_count, { "Number of RF Bands", "nfapi.rf.bands.count", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rf_bands_value, { "Band value", "nfapi.rf.bands.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_param_request, { "PNF Param Request", "nfapi.pnf.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_param_response, { "PNF Param Response", "nfapi.pnf.param.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_config_request, { "PNF Config Request", "nfapi.pnf.config.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_config_response, { "PNF Config Response", "nfapi.pnf.config.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_start_request, { "PNF Start Request", "nfapi.pnf.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_start_response, { "PNF Start Response", "nfapi.pnf.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_start_request, { "PNF Start Request", "nfapi.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_start_response, { "PNF Start Response", "nfapi.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_param_general, { "PNF Param General ", "nfapi.pnf.param.general", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sync_mode, { "Sync Mode", "nfapi.sync.mode", FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_location_mode, { "Location Mode", "nfapi.location.mode", FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_location_coordinates_length, { "Location Coordinates Length", "nfapi.location.coordinates.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_location_coordinates, { "Location Coordinates", "nfapi.location.coordinates", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdu, { "PDU", "nfapi.pdu", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_timing, { "DL config Timing", "nfapi.dl.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tx_timing, { "Tx Timing", "nfapi.general.tx.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_timing, { "UL Config Timing", "nfapi.ul.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_hi_dci0_timing, { "HI DCi0 Timing", "nfapi.hi.dci0.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_number_phys, { "Maximum number of Phys", "nfapi.maximum.number.phys", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_total_bandwidth, { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_total_number_dl_layers, { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_total_number_ul_layers, { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_shared_bands, { "Shared bands", "nfapi.shared.bands", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_shared_pa, { "Shared pa", "nfapi.shared.pa", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_total_power, { "Maximum total power", "nfapi.maximum.total.power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_oui, { "OUI", "nfapi.oui", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy, { "PNF Phy", "nfapi.pnf.phy", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy_number_phy, { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy_config_index, { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_rf, { "PNF Phy RF", "nfapi.pnf.rf", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_rfs, { "Number of RFs", "nfapi.pnf.rf.number.rf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phy_rf_config_info, { "Phy RF Config Info", "nfapi.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phy_rf_config_info_phy_id, { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phy_rf_config_info_band, { "RF Band", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy_rf_config, { "PNF Phy RF Config", "nfapi.pnf.phy.rf.config", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info, { "Number of RF Config Info(s)", "nfapi.pnf.phy.rf.config.number.phy.rf.config.info", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, { "PNF Phy RF Config array phy rf config info ", "nfapi.pnf.phy.rf.config.array.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rf_config_index, { "RF Config Index", "nfapi.rf_config_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_rf_exclusions, { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_3gpp_release_supported, { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_downlink_channel_bandwidth_supported, { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uplink_channel_bandwidth_supported, { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_dl_layers_supported, { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_ul_layers_supported, { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_nmm_modes_supported, { "NMM modes supported", "nfapi.nmm_modes_supported", FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_band, { "Band", "nfapi.band", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_transmit_power, { "Maximum transmit power", "nfapi.maximum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_earfcn, { "EARFCN", "nfapi.earfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_rf_bands, { "Number of RF Bands", "nfapi.num.rf_bands", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_nmm_uplink_rssi_supported, { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", FT_UINT16, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_minimum_transmit_power, { "Minimum transmit power", "nfapi.minimum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_antennas_suppported, { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_minimum_downlink_frequency, { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_downlink_frequency, { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_minimum_uplink_frequency, { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_maximum_uplink_frequency, { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_mode7_supported, { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_transmission_mode8_supported, { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_two_antennas_ports_for_pucch, { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_transmission_mode_9_supported, { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_simultaneous_pucch_pusch, { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_for_layer_tx_with_tm3_and_tm4, { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_supported, { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_multi_ack_csi_reporting, { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_pucch_tx_diversity_with_channel_selection, { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_ul_comp_supported, { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_transmission_mode_5_supported, { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_subframe_set, { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_enhanced_4tx_codebook, { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_drs_supported, { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_ul_64qam_supported, { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_transmission_mode_10_supported, { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hi_nfapi_alternative_tbs_indices, { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_format_4_supported, { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_format_5_supported, { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_more_than_5_ca_supported, { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_supported, { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_ending_in_dwpts_supported, { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_starting_in_second_slot_supported, { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_beamforming_supported, { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_enhancements_supported, { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_drms_enhancements_supported, { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_enhancements_supported, { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sfn_sf, { "SFN_SF", "nfapi.sfn_sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_request_body, { "DL Config Request body", "nfapi.dl.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_pdcch_ofdm_symbols, { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_dci, { "Number of DCI", "nfapi.number_dci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_pdus, { "Number of PDUs", "nfapi.number_pdu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_harqs, { "Number of HARQs", "nfapi.number_harqs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_crcs, { "Number of CRCs", "nfapi.number_crcs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_srs, { "Number of SRs", "nfapi.number_srs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_cqi, { "Number of CQIs", "nfapi.number_cqi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_preambles, { "Number of Preambles", "nfapi.number_preambles", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_srss, { "Number of SRSs", "nfapi.number_srss", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_lbt_dl_req_pdu_type, { "LBT DL Request PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, NULL, HFILL } }, - { &hf_nfapi_lbt_dl_ind_pdu_type, { "LBT DL Indication PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_pdsch_rnti, { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_power_pcfich, { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_request_pdu_list, { "DL Config Request body", "nfapi.dl.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_request_pdu_list, { "UL Config Request body", "nfapi.ul.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_hi_dci0_request_pdu_list, { "HI DCI0 Request body", "nfapi.hi.dci0.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tx_request_pdu_list, { "Tx Request body", "nfapi.tx.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rx_indication_pdu_list, { "Rx Indication body", "nfapi.rx.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_indication_pdu_list, { "Harq Indication body", "nfapi.harq.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_crc_indication_pdu_list, { "CRC Indication body", "nfapi.crc.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sr_indication_pdu_list, { "SR Indication body", "nfapi.sr.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cqi_indication_pdu_list, { "CQI Indication body", "nfapi.cqi.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_preamble_indication_pdu_list, { "Preamble Indication body", "nfapi.preamble.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_indication_pdu_list, { "SRS Indication body", "nfapi.srs.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_lbt_dl_config_pdu_list, { "LBT DL Config Request body", "nfapi.lbt.dl.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_lbt_dl_indication_pdu_list, { "LBT DL Indicatoin body", "nfapi.lbt.dl.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_pdu_type, { "PDU Type", "nfapi.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_pdu_size, { "PDU size", "nfapi.pdu.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_instance_length, { "Instance length", "nfapi.instance.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dlsch_pdu_rel8, { "DL CONFIG DLSCH PDU REL8", "nfapi.dl.config.dlsch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdu_index, { "PDU Index", "nfapi.pdu.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rnti, { "RNTI", "nfapi.rnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_resource_allocation_type, { "Resource Allocation Type", "nfapi.resource.allocation.type", FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_virtual_resource_block_assignment_flag, { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_resource_block_coding, { "Resource block coding", "nfapi.resource.block.coding", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_modulation, { "Modulation", "nfapi.modulation", FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_redundancy_version, { "Redundancy version", "nfapi.redundancy.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transport_blocks, { "Transport blocks", "nfapi.transport.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transport_block_to_codeword_swap_flag, { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, - { &hf_nfapi_ul_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, - { &hf_nfapi_number_of_layers, { "Number of layers", "nfapi.number.of.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_subbands, { "Number of subbands", "nfapi.number.of.subbands", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_codebook_index, { "Codebook index", "nfapi.number.of.codebook.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ue_category_capacity, { "UE category capacity", "nfapi.ue.category.capacity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pa, { "P-A", "nfapi.pa", FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_power_offset_index, { "Delta Power offset index", "nfapi.delta.power.offset.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_nprb, { "Nprb", "nfapi.nprb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_mode, { "Transmission Mode", "nfapi.transmission_nprb", FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, "Transmission mode associated with the UE", HFILL } }, - { &hf_nfapi_prnti, { "P-RNTI", "nfapi.prnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mcs, { "MCS", "nfapi.mcs", FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_transport_blocks, { "Number of transport blocks", "nfapi.number_of_transport_blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ue_mode, { "UE Mode", "nfapi.ue.mode", FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, NULL, HFILL } }, - { &hf_prs_bandwidth, { "PRS bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_prs_muting, { "PRS muting", "nfapi.prs.muting", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_num_bf_prb_per_subband, { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_num_bf_vector, { "Num of BF Vector", "nfapi.num.bf.vector", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_resource_config, { "CSI-RS resource config", "nfapi.csi.rs.resource.config", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bf_vector_subband_index, { "BF Subband Index", "nfapi.num.bf.vector.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bf_vector_num_antennas, { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bf_vector_bf_value, { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dlsch_pdu_rel9, { "DL CONFIG DLSCH PDU REL9", "nfapi.dl.config.dlsch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_nscid, { "NSC id", "nfapi.nscid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dlsch_pdu_rel10, { "DL CONFIG DLSCH PDU REL10", "nfapi.dl.config.dlsch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_flag, { "CSI RS Flag", "nfapi.csi.rs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_subbands, { "Subbands", "nfapi.subbands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bf_vectors, { "BF Vectors", "nfapi.bf.vectors", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bf_vector_antennas, { "Antennas", "nfapi.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_resource_config_r10, { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_number_if_nzp_configurations, { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_resource_configs, { "CSR/RS Resource Configs", "nfapi.csi.rs.resource.configs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_start, { "PDSCH_start", "nfapi.pdsch.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_drms_config_flag, { "DMRS Config flag", "nfapi.drms.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_drms_scrambling, { "DMRS Scrambling", "nfapi.drms.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_config_flag, { "CSI Config flag", "nfapi.csi.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_scrambling, { "CSI Scrambling", "nfapi.csi.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_re_mapping_flag, { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_re_mapping_antenna_ports, { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_re_mapping_freq_shift, { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_alt_cqi_table_r12, { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_max_layers, { "MaxLayers", "nfapi.max.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_dl_harq, { "N_DL_HARQ", "nfapi.n.dl.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dwpts_symbols, { "DwPTS Symbols", "nfapi.dwpts.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_initial_lbt_sf, { "Initial LBT SF", "nfapi.initial.lbt.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ue_type, { "UE Type", "nfapi.ue.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_payload_type, { "PDSCH Payload Type", "nfapi.pdsch.payload.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_initial_transmission_sf, { "Initial transmission SF (io) ", "nfapi.init.tx.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_req13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_resource_index, { "CSI-RS resource index", "nfapi.csi.rs.resource.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_class, { "Class", "nfapi.csi.rs.class", FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_cdm_type, { "CDM Type", "nfapi.cdm.type", FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_bf_vector, { "BF Vector", "nfapi.bf.vector", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_edpcch_prb_index, { "EPDCCH PRB index", "nfapi.edpcch.prb.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_resource_assignment_flag, { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_id, { "EPDCCH ID", "nfapi.epdcch.id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_start_symbol, { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_num_prb, { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_epdcch_prbs, { "EPDCCH PRBs", "nfapi.epdcch.prbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_precoding_value, { "Precoding value", "nfapi.precoding.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mpdcch_narrowband, { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_prb_pairs, { "Number of PRB pairs", "nfapi.number.prb.pairs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_resource_block_assignment, { "Resource Block Assignment", "nfapi.resource.block.assignement", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_start_symbol, { "Start symbol", "nfapi.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ecce_index, { "ECCE index", "nfapi.ecce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ce_mode, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_drms_scrabmling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_reception_levels, { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_new_data_indicator, { "New data indicator", "nfapi.new.data.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tpmi_length, { "TPMI length", "nfapi.tpmi.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pmi_flag, { "PMI flag", "nfapi.pmi.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_resource_offset, { "HARQ resource offset", "nfapi.harq.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dci_subframe_repetition_number, { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_downlink_assignment_index_length, { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_starting_ce_level, { "Starting CE Level", "nfapi.starting.ce.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antenna_ports_and_scrambling_identity, { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_paging_direct_indication_differentiation_flag, { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_direct_indication, { "Direct indication", "nfapi.direct.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_tx_antenna_ports, { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_precoding, { "Precoding", "nfapi.precodiing", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_bch_pdu_rel8, { "DL CONFIG BCH PDU Rel8", "nfapi.dl.config.bch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_value_float, { "Value", "nfapi.value.float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_power, { "Transmission Power", "nfapi.transmission_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_mch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mbsfn_area_id, { "MBSFN Area id", "nfapi.mbsfn.area.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_pch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dci_dl_pdu_rel8, { "DL CONFIG DCI DL PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dci_format, { "DCI format", "nfapi.dci.format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_cce_idx, { "CCE index", "nfapi.cce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_aggregation_level, { "Aggregation level", "nfapi.aggregation.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mcs_1, { "MCS_1", "nfapi.mcs_1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mcs_2, { "MCS_2", "nfapi.mcs_2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_redundancy_version_1, { "Redundancy version_1", "nfapi.redundancy.version.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_redundancy_version_2, { "Redundancy version_2", "nfapi.redundancy.version.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_new_data_indicator_1, { "New data indicator_1", "nfapi.new.data.indicator.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_new_data_indicator_2 ,{ "New data indicator_2", "nfapi.new.data.indicator.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_process, { "HARQ process", "nfapi.harq.process", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tpmi, { "TPMI", "nfapi.tpmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pmi, { "PMI", "nfapi.pmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_precoding_information, { "Precoding information", "nfapi.precoding.information", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tpc, { "TPC", "nfapi.tpc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_downlink_assignment_index, { "Downlink assignment index", "nfapi.downlink.assignment.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ngap, { "Ngap", "nfapi.ngap", FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_transport_block_size_index, { "Transport block size index", "nfapi.transport.block.size.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_downlink_power_offset, { "Downlink power offset", "nfapi.downlink.power.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_allocate_prach_flag, { "Allocation PRACH flag", "nfapi.allocation.prach.flag", FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_preamble_index, { "Preamble index", "nfapi.preamable.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prach_mask_index, { "PRACH mask index", "nfapi.prach.mask.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rnti_type, { "RNTI type", "nfapi.rnti.type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dci_dl_pdu_rel9, { "DL CONFIG DCI DL PDU Rel9", "nfapi.dl.config.mch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mcch_flag, { "MCCH flag", "nfapi.mcch.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mcch_change_notification, { "MCCH change notification", "nfapi.mcch.change.notification", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_scrambling_identity, { "Scrambling identity", "nfapi.scrambling.identity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_dci_dl_pdu_rel10, { "DL CONFIG DCI DL PDU Rel10", "nfapi.dl.config.mch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cross_carrier_scheduling_flag, { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_carrier_indicator, { "Carrier Indicator", "nfapi.carrier.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_flag, { "SRS flag", "nfapi.srs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_request, { "SRS request", "nfapi.srs.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antenna_ports_scrambling_and_layers, { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_total_dci_length_including_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_dl_rb, { "N_DL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_ul_rb, { "N_UL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_ack_resource_offset, { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_primary_cell_type, { "Primary cell type", "nfapi.primary.cell.type", FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_dl_configuration_flag, { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_ul_dl_configurations, { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_dl_configuration_index, { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_end_partial_sf_flag, { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_laa_end_partial_sf_configuration, { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_codebooksize_determination_r13, { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rel13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pscch_resource, { "PSCCH Resource", "nfapi.pscch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_time_resource_pattern, { "Time resource pattern", "nfapi.time.resource.pattern", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mpdcch_transmission_type, { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_drms_scrambling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pusch_repetition_levels, { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_hopping_flag, { "Frequency hopping flag", "nfapi.frequency.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_request, { "CSI request", "nfapi.csi.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dai_presence_flag, { "DAI presence flag", "nfapi.dia.presence.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_total_dci_length_include_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_prs_pdu_rel9, { "DL CONFIG PRS PDU Rel9", "nfapi.dl.config.prs.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prs_bandwidth, { "PRS Bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_config_csi_rs_pdu_rel10, { "DL CONFIG CSI RS PDU Rel10", "nfapi.dl.config.csi.rs.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_rs_antenna_port_count_r10, { "Antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_request_body, { "UL Config Request body", "nfapi.ul.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_pdu_type, { "UL Config PDU Type", "nfapi.ul.config.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_rach_prach_frequency_resources, { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_present, { "SRS present", "nfapi.srs.present", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_harq_buffer_pdu, { "HARQ Buffer PDU", "nfapi.ul.config.harq.buffer.pdu", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_ue_information_rel8, { "UE Information Rel 8", "nfapi.ul.config.ue.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_handle, { "Handle", "nfapi.handle", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_sr_information_pdu_rel8, { "SR Information Rel 8", "nfapi.ul.config.sr.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_index, { "PUCCH Index", "nfapi.pucch.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_size, { "Size", "nfapi.size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_resource_block_start, { "Resource block start", "nfapi.resource.block.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_resource_blocks, { "Number of resource blocks", "nfapi.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cyclic_shift_2_for_drms, { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_hopping_enabled_flag, { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_hopping_bits, { "Frequency hopping bits", "nfapi.frequency.hopping.bits", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_new_data_indication, { "New Data inidication", "nfapi.new.data.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_process_number, { "HARQ Process number", "nfapi.harq.process.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_tx_mode, { "UL Tx Mode", "nfapi.ul.tx.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_current_tx_nb, { "Current Tx nb", "nfapi.current.tx.nb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_srs, { "N SRS", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_disable_sequence_hopping_flag, { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_virtual_cell_id_enabled_flag, { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_npusch_identity, { "nPUSCH Identity", "nfapi.npusch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ndrms_csh_identity, { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_total_number_of_repetitions, { "Total Number of repetitions", "nfapi.total.number.of.repetitions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_repetition_number, { "Repetition Number", "nfapi.repetition.number", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_initial_sf_io, { "Initial transmission SF (io) ", "nfapi.initial.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_empty_symbols_due_to_retunning, { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_ri_pmi_size_2, { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_size_2, { "HARQ Size 2", "nfapi.harq.size2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_offset_harq_2, { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_starting_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antenna_port, { "Antenna Port", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_combs, { "Number of Combs", "nfapi.num.of.combs", FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_npucch_identity, { "nPUCCH Identity", "nfapi.npucch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_empty_symbols, { "Empty symbols", "nfapi.empty.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_csi_mode, { "CSI_mode", "nfapi.csi.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_pmi_size_2, { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_statring_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cdm_index, { "cdm_Index", "nfapi.cdm.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_nsrs, { "N srs", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_num_ant_ports, { "Num_ant_ports", "nfapi.num.ant.port", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_2_0, { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_2_1, { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_2_2, { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_2_3, { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_pmi_size_rank_1, { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ri_size, { "RI size", "nfapi.ri.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_offset_cqi, { "Delta offset cqi", "nfapi.delta.offset.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_offset_ri, { "Delta offset ri", "nfapi.delta.offset.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_size, { "HARQ size", "nfapi.harq_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_delta_offset_harq, { "Delta offset HARQ", "nfapi.delta.offset.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ack_nack_mode, { "ACK NACK mode", "nfapi.ack.nack.mode", FT_UINT8, BASE_DEC, VALS(nfapi_ack_nack_mode_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_n_srs_initial, { "N srs initial", "nfapi.n.srs.initial", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_initial_number_of_resource_blocks, { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_pmi_size, { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_report_type, { "Report type", "nfapi.report.type", FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cqi_ri_pmi_size, { "DL CQI RI PMI size", "nfapi.dl.cqi.ri.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_control_type, { "Control type", "nfapi.control.type", FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_cc, { "Number of cc", "nfapi.number.of.cc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_pucch_resource, { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pucch_index_p1, { "PUCCH Index P1", "nfapi.pucch.index.p1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_1_0, { "N PUCCH 1 0", "nfapi.n.pucch.1.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_1_1, { "N PUCCH 1 1", "nfapi.n.pucch.1.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_1_2, { "N PUCCH 1 2", "nfapi.n.pucch.1.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_n_pucch_1_3, { "N PUCCH 1 3", "nfapi.n.pucch.1.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_bandwidth, { "SRS Bandwidth", "nfapi.srs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_domain_position, { "Frequency Domain position", "nfapi.frequency.domain.position", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_srs_hopping_bandwidth, { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_transmission_comb, { "Transmission comb", "nfapi.transmission.comb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_i_srs, { "I SRS", "nfapi.i.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sounding_reference_cyclic_shift, { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antenna_ports, { "Antenna port(s)", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(nfapi_antenna_port_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_srs_pdu_rel10, { "SRS PDU Rel 10", "nfapi.srs.pdu.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_srs_pdu_rel8, { "SRS PDU Rel 8", "nfapi.srs.pdu.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_harq_information_rel9_fdd, { "HARQ information Rel 9 FDD", "nfapi.harq.information.rel.9.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_harq_information_rel8_fdd, { "HARQ information Rel 8 FDD", "nfapi.harq.information.rel.8.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_harq_information_rel10_tdd, { "HARQ information Rel 10 TDD", "nfapi.harq.information.rel.10.tdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_sr_information_rel10, { "SR information Rel 10", "nfapi.sr.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_sr_information_rel8, { "SR information Rel 8", "nfapi.sr.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_cqi_information_rel10, { "CQI information Rel 10", "nfapi.cqi.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_cqi_information_rel8, { "CQI information Rel 8", "nfapi.cqi.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_initial_transmission_parameters_rel8, { "Initial transmission parameters Rel 8", "nfapi.initial.transmission.parameters.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_config_ulsch_harq_information_rel10, { "HARQ Information Rel 10", "nfapi.harq.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdu_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_num_segments, { "Num segments", "nfapi.num.segments", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_segment_length, { "Segment length", "nfapi.segment.length", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_segment_data, { "Segment data", "nfapi.segment.data", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_crc_indication_body, { "CRC Indication Body", "nfapi.crc_indication_body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_crc_flag, { "CRC flag", "nfapi.crc.flag", FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_hi_pdus, { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_dci_pdus, { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pdu_type, { "PDU Type", "nfapi.pdu_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_hi_value, { "HI Value", "nfapi.hi_value", FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_i_phich, { "i phich", "nfapi.i_phich", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_flag_tb2, { "Flag TB2", "nfapi.flag_tb2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_hi_value_2, { "HI Value 2", "nfapi.hi_value_2", FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_ue_tx_antenna_selection, { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cqi_csi_request, { "cqi csi request", "nfapi.cqi_csi_request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_index, { "UL index", "nfapi.ul_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_assignment_index, { "DL Assignment index", "nfapi.dl_assignment_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tpc_bitmap, { "TPC bitmap", "nfapi.tpc_bitmap", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_antenna_ports, { "Number of antenna ports", "nfapi.number.of.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_size_of_cqi_csi_feild, { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_new_data_indication_two, { "New data indicatipon 2", "nfapi.new.data.indication.two", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_resource_allocation_flag, { "Resource allocation flag", "nfapi.resource.allocation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_node_sync, { "DL Node Sync", "nfapi.dl.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_node_sync_t1, { "DL Node Sync t1", "nfapi.dl.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_node_sync_delta_sfn_sf, { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_dl_cyclic_prefix_type, { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_cyclic_prefix_type, { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, - { &hf_nfapi_downlink_channel_bandwidth, { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uplink_channel_bandwidth, { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_tx_antenna_ports, { "Tx Antenna Ports", "nfapi.tx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rx_antenna_ports, { "Tx Antenna Ports", "nfapi.rx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_node_sync, { "UL Node Sync", "nfapi.ul.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_node_sync_t1, { "UL Node Sync t1", "nfapi.ul.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_node_sync_t2, { "UL Node Sync t2", "nfapi.ul.node.sync.t2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_node_sync_t3, { "UL Node Sync t3", "nfapi.ul.node.sync.t3", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pb, { "P-B", "nfapi.pb.allocation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_last_sfn_sf, { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_time_since_last_timing_info, { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_dl_config_jitter, { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_tx_request_jitter, { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_ul_config_jitter, { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_hi_dci0_jitter, { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_dl_config_latest_delay, { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_tx_request_latest_delay, { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_ul_config_latest_delay, { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_hi_dci0_latest_delay, { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_dl_config_earliest_arrival, { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_tx_request_earliest_arrival, { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_ul_config_earliest_arrival, { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pcfich_power_offset, { "PCFICH Power Offset", "nfapi.pcfich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_window, { "NFAPI Timing window", "nfapi.timing.window", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_mode, { "Timing Info mode", "nfapi.timing.info.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_info_period, { "Timing info period", "nfapi.timing.info.period", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_max_transmit_power, { "Max transmit power", "nfapi.max.transmit.power", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uint8_tag, { "uint8 tag", "nfapi.uint8.tag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uint16_tag, { "uint16 tag", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_mode, { "Mode", "nfapi.harq.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_ack_nack, { "Number of ACK/NACK", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_data_value_0, { "Value 0", "nfapi.harq.value.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_data_value_1, { "Value 1", "nfapi.harq.value.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_data_value_2, { "Value 2", "nfapi.harq.value.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_data_value_3, { "Value 3", "nfapi.harq.value.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_tb_1, { "HARQ TB1", "nfapi.harq.tb.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_tb_2, { "HARQ TB2", "nfapi.harq.tb.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_tb_n, { "HARQ TB_N", "nfapi.harq.tb.n", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_cqi, { "UL_CQI", "nfapi.ul.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_channel, { "Channel", "nfapi.channel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_data_offset, { "Data Offset", "nfapi.data.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ri, { "RI", "nfapi.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_ack_nack_data, { "HARQ Ack/Nack Data", "nfapi.harq.ack.nack.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_harq_data, { "HARQ TB Data", "nfapi.harq.tb.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_cc, { "CC", "nfapi.cc", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rbs, { "RBs", "nfapi.rbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_antennas, { "Physical Antennas", "nfapi.physical.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_advance, { "Timing Advance", "nfapi.timing.advance", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timing_advance_r9, { "Timing Advance R9", "nfapi.timing.advance.r9", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_cc_reported, { "Number of CC reported", "nfapi.number.of.cc.reported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_preamble, { "Preamble", "nfapi.preamble", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rach_resource_type, { "RACH resource type", "nfapi.rach.resource.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_doppler_estimation, { "Doppler estimation", "nfapi.doppler.estimation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rb_start, { "RB Start", "nfapi.rb.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_snr, { "SNR", "nfapi.snr", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_up_pts_symbol, { "UpPTS Symbol", "nfapi.uppts.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_prb_per_subband, { "numPRBperSubband", "nfapi.num.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_antennas, { "numAntennas", "nfapi.num.antennas", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_subband_index, { "subbandIndex", "nfapi.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_channel_coefficient, { "Channel", "nfapi.channel.coefficient", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_ul_rtoa, { "UL_RTOA", "nfapi.ul.rtoa", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_frequency_band_indicator, { "Frequency Band Indicator", "nfapi.frequency.band.indicator", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_measurement_period, { "Measurement Period", "nfapi.measurement.period", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bandwidth, { "Bandwidth", "nfapi.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_timeout, { "Timeout", "nfapi.timeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_earfcns, { "Number of EARFCNs", "nfapi.number.of.earfcns", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_earfcn_list, { "EARFCN List", "nfapi.earfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uarfcn, { "UARFCN", "nfapi.uarfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_uarfcns, { "Number of UARFCNs", "nfapi.number.of.uarfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_uarfcn_list, { "UARFCN List", "nfapi.uarfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_arfcn, { "ARFCN", "nfapi.arfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_arfcn_direction, { "Direction", "nfapi.arfcn.direction", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_arfcns, { "Number of ARFCNs", "nfapi.number.of.arfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_arfcn_list, { "ARFCN List", "nfapi.arfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rssi, { "RSSI", "nfapi.rssi", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_rssi, { "Number of RSSI", "nfapi.number.of.rssi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rssi_list, { "RSSI List", "nfapi.rssi.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pci, { "PCI", "nfapi.pci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_measurement_bandwidth, { "Measurement Bandwidth", "nfapi.measurement.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_exhaustive_search, { "Exhaustive Search", "nfapi.exhaustive.search", FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_pci, { "Number of PCI", "nfapi.number.of.pci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pci_list, { "PCI List", "nfapi.pci.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_psc, { "PSC", "nfapi.psc", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_psc, { "Number of PSC", "nfapi.number.of.psc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_psc_list, { "PCS List", "nfapi.psc.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rsrp, { "RSRP", "nfapi.rsrp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rsrq, { "RSRQ", "nfapi.rsrq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_lte_cells_found, { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_lte_cells_found_list, { "LTE Cells Found List", "nfapi.lte.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rscp, { "RSCP", "nfapi.rscp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_enco, { "EcNo", "nfapi.ecno", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_utran_cells_found, { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_utran_cells_found_list, { "UTRAN Cells Found List", "nfapi.utran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_bsic, { "BSIC", "nfapi.bsic", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rxlev, { "RxLev", "nfapi.rxlev", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_rxqual, { "RxQual", "nfapi.rxqual", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sfn_offset, { "SFN Offset", "nfapi.sfn.offset", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_geran_cells_found, { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_geran_cells_found_list, { "GERAN Cells Found List", "nfapi.geran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_tx_antenna, { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mib_length, { "MIB Length", "nfapi.mib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_mib, { "MIB", "nfapi.mib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_phich_configuration, { "PHICH Configuration", "nfapi.phich.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_retry_count, { "retryCount", "nfapi.retry.count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sib1, { "SIB1", "nfapi.sib1", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si_periodicity, { "SI Periodicity", "nfapi.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si_index, { "SI Index", "nfapi.si.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_number_of_si_periodicity, { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si_periodicity_list, { "SI Periodicity List", "nfapi.si.periodicity.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si_window_length, { "SI Window Length", "nfapi.si.window.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sib_type, { "SIB Type", "nfapi.sib.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sib_len, { "SIB Length", "nfapi.sib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_sib, { "SIB", "nfapi.sib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si_len, { "SI Length", "nfapi.si.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_si, { "SI", "nfapi.si", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_search_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - { &hf_nfapi_pnf_broadcast_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, - - }; - - /* Setup protocol subtree array */ - static gint *ett[] = { - &ett_nfapi_message_tree, - &ett_nfapi_p4_p5_message_header, - &ett_nfapi_p7_message_header, - &ett_nfapi_tlv_tree, - &ett_nfapi_tl, - &ett_nfapi_pnf_param_response, - &ett_nfapi_pnf_phy_rf_config, - &ett_nfapi_pnf_phy_rf_config_instance, - &ett_nfapi_pnf_phy, - &ett_nfapi_pnf_phy_rel10, - &ett_nfapi_pnf_phy_rel11, - &ett_nfapi_pnf_phy_rel12, - &ett_nfapi_pnf_phy_rel13, - &ett_nfapi_pnf_rf, - &ett_nfapi_phy_state, - &ett_nfapi_rf_bands, - &ett_nfapi_bf_vectors, - &ett_nfapi_csi_rs_bf_vector, - &ett_nfapi_csi_rs_resource_configs, - &ett_nfapi_tx_antenna_ports, - &ett_nfapi_harq_ack_nack_data, - &ett_nfapi_harq_data, - &ett_nfapi_cc, - &ett_nfapi_rbs, - &ett_nfapi_antennas, - &ett_nfapi_epdcch_prbs, - &ett_nfapi_dl_config_request_body, - &ett_nfapi_dl_config_request_pdu_list, - &ett_nfapi_ul_config_request_pdu_list, - &ett_nfapi_hi_dci0_request_pdu_list, - &ett_nfapi_tx_request_pdu_list, - &ett_nfapi_rx_indication_pdu_list, - &ett_nfapi_harq_indication_pdu_list, - &ett_nfapi_crc_indication_pdu_list, - &ett_nfapi_sr_indication_pdu_list, - &ett_nfapi_cqi_indication_pdu_list, - &ett_nfapi_preamble_indication_pdu_list, - &ett_nfapi_srs_indication_pdu_list, - &ett_nfapi_lbt_dl_config_pdu_list, - &ett_nfapi_lbt_dl_indication_pdu_list, - &ett_nfapi_dl_config_request_dlsch_pdu_rel8, - &ett_nfapi_dl_config_request_dlsch_pdu_rel9, - &ett_nfapi_dl_config_request_dlsch_pdu_rel10, - &ett_nfapi_dl_config_bch_pdu_rel8, - &ett_nfapi_dl_config_mch_pdu_rel8, - &ett_nfapi_dl_config_pch_pdu_rel8, - &ett_nfapi_dl_config_dci_dl_pdu_rel8, - &ett_nfapi_dl_config_dci_dl_pdu_rel9, - &ett_nfapi_dl_config_dci_dl_pdu_rel10, - &ett_nfapi_dl_config_prs_pdu_rel9, - &ett_nfapi_dl_config_csi_rs_pdu_rel10, - &ett_nfapi_subbands, - &ett_nfapi_precoding, - &ett_nfapi_bf_vector_antennas, - &ett_nfapi_ul_config_request_body, - &ett_nfapi_ul_config_harq_buffer_pdu, - &ett_nfapi_ul_config_ue_information_rel8, - &ett_nfapi_ul_config_sr_information_pdu_rel8, - &ett_nfapi_ul_config_ulsch_pdu_rel8, - &ett_nfapi_ul_config_ulsch_pdu_rel10, - &ett_nfapi_ul_config_cqi_ri_information_rel8, - &ett_nfapi_ul_config_cqi_ri_information_rel9, - &ett_nfapi_ul_config_ulsch_harq_information_rel10, - &ett_nfapi_ul_config_initial_transmission_parameters_rel8, - &ett_nfapi_ul_config_cqi_information_rel8, - &ett_nfapi_ul_config_cqi_information_rel10, - &ett_nfapi_ul_config_sr_information_rel8, - &ett_nfapi_ul_config_sr_information_rel10, - &ett_nfapi_ul_config_harq_information_rel10_tdd, - &ett_nfapi_ul_config_harq_information_rel8_fdd, - &ett_nfapi_ul_config_harq_information_rel9_fdd, - &ett_nfapi_ul_config_srs_pdu_rel8, - &ett_nfapi_ul_config_srs_pdu_rel10, - &ett_nfapi_crc_indication_body, - - &ett_nfapi_earfcn_list, - &ett_nfapi_uarfcn_list, - &ett_nfapi_arfcn_list, - &ett_nfapi_rssi_list, - &ett_nfapi_pci_list, - &ett_nfapi_psc_list, - &ett_nfapi_lte_cells_found_list, - &ett_nfapi_utran_cells_found_list, - &ett_nfapi_geran_cells_found_list, - &ett_nfapi_si_periodicity_list, - - /* for fragmentation support*/ - &ett_msg_fragment, - &ett_msg_fragments - }; - - static ei_register_info ei[] = - { - { &ei_power_invalid, { "nfapi.power.invalid", PI_PROTOCOL, PI_ERROR, "Tx Power range invalid [0 - 10000]", EXPFILL } }, - { &ei_ref_sig_power_invalid, { "nfapi.ref_sig_power.invalid", PI_PROTOCOL, PI_ERROR, "Ref Sig Power range invalid [0 - 255]", EXPFILL }}, - { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_ERROR, "Out of valid range. Todo create more specific error", EXPFILL } }, - }; - - - - expert_module_t* expert_nfapi; - - /* Register protocol */ - proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); - - expert_nfapi = expert_register_protocol(proto_nfapi); - - expert_register_field_array(expert_nfapi, ei, array_length(ei)); - - proto_register_field_array(proto_nfapi, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - - reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); - reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); - - register_dissector("nfapi", dissect_nfapi, proto_nfapi); - -} - -// ----------------------------------------------------------------------------| - -void proto_reg_handoff_nfapi(void) -{ - static dissector_handle_t nfapi_handle; - - nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); - - dissector_add_for_decode_as("sctp.port", nfapi_handle); - - dissector_add_uint("udp.port", 41700, nfapi_handle); - -} + + default: + { + if (msg_id >= 0x112 && msg_id <= 0x017f) + { + // reserved P5 message + } + else if (msg_id >= 0x183 && msg_id <= 0x01ff) + { + // reserved P7 message + } + else if (msg_id >= 0x0200 && msg_id <= 0x02ff) + { + // reserved P4 message + } + else if (msg_id >= 0x0300 && msg_id <= 0x03ff) + { + // reserved vendor extentions + } + + break; + } + }; + + ptvcursor_pop_subtree(ptvc); + ptvcursor_free(ptvc); + + return tvb_captured_length(tvb); +} + +static void nfapi_tag_vals_fn(gchar* s, guint32 v) +{ + const tlv_t* tlv = look_up_tlv(v); + if (tlv != 0) + { + g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tlv->name, v); + } + else + { + g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); + } +} +static void neg_pow_conversion_fn(gchar* s, guint8 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB (%d)", ((gint16)v * (-1)), v); +} +static void power_offset_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.001) - 6.0), v); +} +static void reference_signal_power_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.25) - 63.75), v); +} +static void laa_threshold_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (float)(v * -100.00), v); +} +static void max_transmit_power_2_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1) - 10.0, v); +} +static void max_transmit_power_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); +} +static void sfn_sf_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%d/%d (%d)", v >> 0x4, v & 0x000F, v); +} +static void rssi_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); +} +static void dl_rs_tx_pow_measment_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); +} + +static void ul_cqi_conversion_fn(gchar* s, guint16 v) +{ + g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v / 2 ) - 64.0), v); +} + +// ----------------------------------------------------------------------------| + +void proto_register_nfapi(void) +{ + static hf_register_info hf[] = + { + { &hf_msg_fragments, + { "Message fragments", "nfapi.fragments", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment, + { "Message fragment", "nfapi.fragment", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_overlap, + { "Message fragment overlap", "nfapi.fragment.overlap", + FT_BOOLEAN, 0, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_overlap_conflicts, + { "Message fragment overlapping with conflicting data", "nfapi.fragment.overlap.conflicts", + FT_BOOLEAN, 0, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_multiple_tails, + { "Message has multiple tail fragments", "nfapi.fragment.multiple_tails", + FT_BOOLEAN, 0, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_too_long_fragment, + { "Message fragment too long", "nfapi.fragment.too_long_fragment", + FT_BOOLEAN, 0, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_error, + { "Message defragmentation error", "nfapi.fragment.error", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_fragment_count, + { "Message fragment count", "nfapi.fragment.count", + FT_UINT32, BASE_DEC, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_reassembled_in, + { "Reassembled in", "nfapi.reassembled.in", + FT_FRAMENUM, BASE_NONE, NULL, 0x00, + NULL, HFILL } + }, + { &hf_msg_reassembled_length, + { "Reassembled length", "nfapi.reassembled.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + NULL, HFILL } + }, + { &hf_nfapi_p4_p5_message_header_phy_id, + { "PHY ID", "nfapi.p4_p5_message_header.phy_id", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } + }, + { &hf_nfapi_p4_p5_message_header_message_id, + { "Message ID", "nfapi.p4_p5_message_header.message_id", + FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, + "The nFAPI message identity", HFILL } + }, + { &hf_nfapi_p4_p5_message_header_message_length, + { "Message Length", "nfapi.p4_p5_message_header.message_length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The length in bytes of the message including the header", HFILL } + }, + { &hf_nfapi_p4_p5_message_header_spare, + { "Spare", "nfapi.p4_p5_message_header.spare", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Reserved field to be populated with zeros on transmission and ignored on reception", HFILL } + }, + { &hf_nfapi_p7_message_header_phy_id, + { "Phy ID", "nfapi.p7_message_header.phy_id", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } + }, + { &hf_nfapi_p7_message_header_message_id, + { "Message ID", "nfapi.p7.message_header.message_id", + FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, + "The nFAPI message identity", HFILL } + }, + { &hf_nfapi_p7_message_header_message_length, + { "Message Length", "nfapi.p7_message_header.message_length", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, + "The length in bytes of the message segment including the header", HFILL } + }, + { &hf_nfapi_p7_message_header_m, + { "M", "nfapi.p7_message_header.m_segment_sequence", + FT_UINT8, BASE_DEC, NULL, 0x0, + "A More flag indicating there are more segments to follow to complete the entire message", HFILL } + }, + { &hf_nfapi_p7_message_header_segment, + { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The segment number starting at zero and incrementing by one between each segment", HFILL } + }, + { &hf_nfapi_p7_message_header_sequence_number, + { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The incrementing sequence number for all complete messages over the P7 nFAPI interface per PHY instance", HFILL } + }, + { &hf_nfapi_p7_message_header_checksum, + { "Checksum", "nfapi.p7_message_header.checksum", + FT_UINT32, BASE_HEX_DEC, NULL, 0x0, + "The checksum of the whole message segment (including header) as calculated using " + "the CRC32c algorithm following the same method as the SCTP protocol defined in IETF RFC 4960 " + "The Checksum is optional to populate and must be filled with zero's when not used", HFILL } + }, + { &hf_nfapi_p7_message_header_transmit_timestamp, + { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The offset from VNF SFN/SF 0/0 time reference of the message transmission at the transport layer, in microseconds, with a range of 0 to 10239999", HFILL } + }, + { &hf_nfapi_tl_tag, + { "TLV Tag", "nfapi.tl_tag", + FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_tl_length, + { "TLV Length", "nfapi.tl_length", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_error_code, + { "Error Code", "nfapi.error.code", + FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_p4_error_code, + { "Error Code", "nfapi.p4_error.code", + FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_rat_type, + { "RAT Type", "nfapi.rat_type", + FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_num_tlv, + { "Number of TLV", "nfapi.param.response.num_tlv", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_phy_state, + { "Phy state value", "nfapi.phy.state", + FT_UINT16, BASE_DEC, VALS(nfapi_phy_state_vals), 0x0, + "Indicates the current operational state of the PHY", HFILL } + }, + { &hf_nfapi_dl_ue_per_sf, + { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The maximum number of downlink UEs per subframe supported." + "This is the maximum number of downlink UEs that can be scheduled per " + "subframe, non-inclusive of broadcast, paging and common channels.", HFILL } + }, + { &hf_nfapi_ul_ue_per_sf, + { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The maximum number of uplink UEs per subframe supported." + "This is the maximum number of uplink UEs that can be scheduled per " + "subframe, non-inclusive of common channels.", HFILL } + }, + { &hf_nfapi_duplex_mode, + { "Duplex Mode", "nfapi.duplex.mode", + FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support, + { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PHY downlink channel bandwidth capability (in resource blocks)", HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_6, + { "6Mhz", "nfapi.dl.bandwidth.support.6", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_15, + { "15Mhz", "nfapi.dl.bandwidth.support.15", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_25, + { "25Mhz", "nfapi.dl.bandwidth.support.25", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_50, + { "50Mhz", "nfapi.dl.bandwidth.support.50", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_75, + { "75Mhz", "nfapi.dl.bandwidth.support.75", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_bandwidth_support_100, + { "100Mhz", "nfapi.dl.bandwidth.support.100", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support, + { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PHY uplink channel bandwidth capability (in resource blocks)", HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_6, + { "6Mhz", "nfapi.ul.bandwidth.support.6", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_15, + { "15Mhz", "nfapi.ul.bandwidth.support.15", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_25, + { "25Mhz", "nfapi.ul.bandwidth.support.25", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_50, + { "50Mhz", "nfapi.ul.bandwidth.support.50", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_75, + { "75Mhz", "nfapi.ul.bandwidth.support.75", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_bandwidth_support_100, + { "100Mhz", "nfapi.ul.bandwidth.support.100", + FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_modulation_support, + { "Downlink modulation support", "nfapi.dl.modulation.support", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PHY downlink modulation capability", HFILL } + }, + { &hf_nfapi_dl_modulation_support_qpsk, + { "QPSK", "nfapi.dl.modulation.support.qpsk", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_modulation_support_16qam, + { "16QAM", "nfapi.dl.modulation.support.16qam", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_modulation_support_64qam, + { "64QAM", "nfapi.dl.modulation.support.64qam", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_modulation_support_256qam, + { "256QAM", "nfapi.dl.modulation.support.256qam", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_modulation_support, + { "Uplink modulation support", "nfapi.ul.modulation.support", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PHY uplink modulation capability", HFILL } + }, + { &hf_nfapi_ul_modulation_support_qpsk, + { "QPSK", "nfapi.ul.modulation.support.qpsk", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_modulation_support_16qam, + { "16QAM", "nfapi.ul.modulation.support.16qam", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_modulation_support_64qam, + { "64QAM", "nfapi.ul.modulation.support.64qam", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_phy_antenna_capability, + { "Phy Antenna capability", "nfapi.phy.antenna.capability", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of antennas supported", HFILL } + }, + { &hf_nfapi_release_capability, + { "Release capability", "nfapi.release.capability", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates which release the PHY supports", HFILL } + }, + { &hf_nfapi_mbsfn_capability, + { "MBSFN capability", "nfapi.mbsfn.capability", + FT_BOOLEAN, 8, TFS(&support_strname), 0x0, + "Indicates support for MBSFN features", HFILL } + }, + { &hf_nfapi_laa_capability, + { "LAA Support", "nfapi.laa.support", + FT_BOOLEAN, 8, TFS(&support_strname), 0x0, + "Indicates support for LAA features", HFILL } + }, + { &hf_nfapi_pd_sensing_lbt_support, + { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", + FT_BOOLEAN, 8, TFS(&support_strname), 0x0, + "Indicates support for PD sensing in L1", HFILL } + }, + { &hf_nfapi_multi_carrier_lbt_support, + { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", + FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_partial_sf_support, + { "Partial SF support", "nfapi.partial.sf.support", + FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, + "Indicates support for Partial SF in L1", HFILL } + }, + { &hf_nfapi_reference_signal_power, + { "Reference signal power", "nfapi.ref_sig_power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(reference_signal_power_conversion_fn), 0x0, + "Normalized value levels (relative) to accommodate different absolute Tx Power used by eNb", HFILL } + }, + { &hf_nfapi_primary_synchronization_signal_epre_eprers, + { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "The power of synchronization signal with respect to the reference signal, (PSS for LTE cell, NPSS for NB-IOT cell)", HFILL } + }, + { &hf_nfapi_secondary_synchronization_signal_epre_eprers, + { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "The power of synchronization signal with respect to the reference signal, (SSS for LTE cell, NSSS for NB-IOT cell)", HFILL } + }, + { &hf_nfapi_physical_cell_id, + { "Physical Cell ID", "nfapi.physical.cell.id", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The Cell ID sent with the synchronization signal", HFILL } + }, + { &hf_nfapi_phich_resource, + { "PHICH Resource", "nfapi.phich.resource", + FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, + "The number of resource element groups used for PHICH", HFILL } + }, + { &hf_nfapi_phich_duration, + { "PHICH Duration", "nfapi.phich.duration", + FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, + "The PHICH duration for MBSFN and non-MBSFN sub-frames", HFILL } + }, + { &hf_nfapi_phich_power_offset, + { "PHICH Power Offset", "nfapi.phich.power.offset", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "The power per antenna of the PHICH with respect to the reference signal", HFILL } + }, + { &hf_nfapi_configuration_index, + { "Configuration Index", "nfapi.configuration.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Provides information about the location and format of the PRACH.", HFILL } + }, + { &hf_nfapi_root_sequence_index, + { "Root sequence Index", "nfapi.root.sequence.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "PRACH Root sequence index", HFILL } + }, + { &hf_nfapi_zero_correlation_zone_configuration, + { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Equivalent to Ncs", HFILL } + }, + { &hf_nfapi_high_speed_flag, + { "High Speed Flag", "nfapi.high.speed.flag", + FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, + "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } + }, + { &hf_nfapi_frequency_offset, + { "Frequency offset", "nfapi.frequency.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The first physical resource block available for PRACH", HFILL } + }, + { &hf_nfapi_hopping_mode, + { "Hopping Mode", "nfapi.hopping.mode", + FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, + "If hopping is enabled indicates the type of hopping used", HFILL } + }, + { &hf_nfapi_hopping_offset, + { "Hopping offset", "nfapi.hopping.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The offset used if hopping is enabled", HFILL } + }, + { &hf_nfapi_delta_pucch_shift, + { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The cyclic shift difference", HFILL } + }, + { &hf_nfapi_n_cqi_rb, + { "N CQI RB", "nfapi.n.cqi.rb", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The bandwidth, in units of resource blocks, that is available for use by PUCCH formats 2/2a/2b transmission in each slot", HFILL } + }, + { &hf_nfapi_n_an_cs, + { "N AN CS", "nfapi.n.an.cs", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of cyclic shifts used for PUCCH formats 1/1a/1b in a resource block with a mix of formats 1/a/1/ab and 2/2a/2b.", HFILL } + }, + { &hf_nfapi_n1_pucch_an, + { "N1 PUCCH AN", "nfapi.n1.pucch.an", + FT_UINT16, BASE_DEC, NULL, 0x0, + "N1 PUCCH", HFILL } + }, + { &hf_nfapi_bandwidth_configuration, + { "Bandwidth configuration", "nfapi.bw.configuration", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The available SRS bandwidth of the cell", HFILL } + }, + { &hf_nfapi_srs_subframe_configuration, + { "SRS subframe configuration", "nfapi.srs.subframe.configuration", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The subframe configuration. Needed if semi-static configuration is held in PHY", HFILL } + }, + { &hf_nfapi_uplink_rs_hopping, + { "Uplink RS hopping", "nfapi.uplink.rs.hopping", + FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, + "Indicates the type of hopping to use", HFILL } + }, + { &hf_nfapi_group_assignment, + { "Group assignment", "nfapi.group.assignment", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The sequence shift pattern used if group hopping is enabled", HFILL } + }, + { &hf_nfapi_cyclic_shift_1_for_drms, + { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Specifies the cyclic shift for the reference signal used in the cell.", HFILL } + }, + { &hf_nfapi_subframe_assignment, + { "Subframe_assignment", "nfapi.subframe.assignment", + FT_UINT16, BASE_DEC, NULL, 0x0, + "For TDD mode only, indicates the DL/UL subframe structure", HFILL } + }, + { &hf_nfapi_special_subframe_patterns, + { "Special Subframe patterns", "nfapi.special.subframe.patterns", + FT_UINT16, BASE_DEC, NULL, 0x0, + "For TDD mode only. Length of fields DwPTS, GP and UpPTS", HFILL } + }, + { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, + { "ED Threshold for LBT for PDSCH", "nfapi.ed.threshold.for.lbt.pdsch", + FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, + "Indicates the energy detection threshold in dBm for LBT for PDSCH", HFILL } + }, + { &hf_nfapi_ed_threshold_for_lbt_for_drs, + { "ED Threshold for LBT for DRS", "nfapi.ed.threshold.for.lbt.for.drs", + FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, + "Indicates the energy detection threshold in dBm for LBT for DRS", HFILL } + }, + { &hf_nfapi_pd_threshold, + { "PD Threshold", "nfapi.pd.threshold", + FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, + "Indicates the preamble detection threshold in dBm, if the L1 capabilities support PD", HFILL } + }, + { &hf_nfapi_multi_carrier_type, + { "Multi carrier type", "nfapi.multi.carrier.type", + FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, + "Indicates multi carrier type configuration of L1 (according to L1 capabilities and L2 scheduler requirements", HFILL } + }, + { &hf_nfapi_multi_carrier_tx, + { "Multi carrier TX", "nfapi.multi.carrier.tx", + FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, + "Indicates multi carrier transmission configuration of L1 (according to type if supporting multi carrier)", HFILL } + }, + { &hf_nfapi_multi_carrier_freeze, + { "Multi carrier freeze", "nfapi.multi.carrier.freeze", + FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, + "Indicates multi carrier freeze, configuration of L1 (applicable only to type A type if supporting multi carrier)", HFILL } + }, + { &hf_nfapi_tx_antenna_ports_for_drs, + { "Tx antenna ports for DRS", "nfapi.tx.antenna.ports.for.drs", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of cell specific transmit antenna ports within the DRS occasions", HFILL } + }, + { &hf_nfapi_transmission_power_for_drs, + { "Transmission power for DRS", "nfapi.transmission.power.for.drs.", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "Offset of cell specific Reference signals power within DRS occasions to the reference signal power", HFILL } + }, + { &hf_nfapi_pbch_repetitions_enabled_r13, + { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable / Disable PBCH repetitions", HFILL } + }, + { &hf_nfapi_prach_cat_m_root_sequence_index, + { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "PRACH Root sequence index", HFILL } + }, + { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, + { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Equivalent to Ncs", HFILL } + }, + { &hf_nfapi_prach_cat_m_high_speed_flag, + { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", + FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, + "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_enable, + { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable CE level #0.", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_configuration_index, + { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Provides information about the location and format of the PRACH", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_frequency_offset, + { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The first physical resource block available for PRACH for each CE", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, + { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of PRACH repetitions per attempt for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, + { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_hopping_enabled, + { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_0_hopping_offset, + { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Valid in case 'PRACH Hopping Enable' is enabled", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_enable, + { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable CE level #1", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_configuration_index, + { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.1.configuration.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Provides information about the location and format of the PRACH", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_frequency_offset, + { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.1.frequency_offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The first physical resource block available for PRACH for each CE", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, + { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.1.number.of.repetitions.per_attempt", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of PRACH repetitions per attempt for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, + { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.1.starting.subframe_periodicity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Optional.PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities),", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_hopping_enabled, + { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.1.hopping_enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } + }, + { &hf_nfapi_prach_ce_level_1_hopping_offset, + { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.1.hopping.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_enable, + { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.2.enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable CE level #2", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_configuration_index, + { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.2.configuration.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Provides information about the location and format of the PRACH", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_frequency_offset, + { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.2.frequency_offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The first physical resource block available for PRACH for each CE", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, + { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.2.number.of.repetitions.per_attempt", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of PRACH repetitions per attempt for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, + { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.2.starting.subframe_periodicity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_hopping_enabled, + { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.2.hopping_enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_2_hopping_offset, + { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.2.hopping.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_enable, + { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.3.enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable CE level #3.", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_configuration_index, + { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.3.configuration.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Provides information about the location and format of the PRACH.", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_frequency_offset, + { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.3.frequency_offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The first physical resource block available for PRACH for each CE", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, + { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.3.number.of.repetitions.per_attempt", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of PRACH repetitions per attempt for each CE level", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, + { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.3.starting.subframe_periodicity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_hopping_enabled, + { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.3.hopping_enable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } + }, + { &hf_nfapi_prach_ce_level_3_hopping_offset, + { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.3.hopping.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } + }, + { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, + { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", + FT_UINT16, BASE_DEC, NULL, 0x0, + "NthULNB for UEModeA", HFILL } + }, + { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, + { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", + FT_UINT16, BASE_DEC, NULL, 0x0, + "NthULNB for UEModeB", HFILL } + }, + { &hf_nfapi_data_report_mode, + { "Data Report Mode", "nfapi.data.report.mode", + FT_BOOLEAN, 8, TFS(&data_report_mode_vals), 0x0, + "The data report mode for the uplink data", HFILL } + }, + { &hf_nfapi_sfnsf, + { "SFN/SF", "nfapi.sfn.sf", + FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, + "The future SFN/SF subframe where the TLVs included in the message should be applied", HFILL } + }, + { &hf_nfapi_max_up_pts, + { "Max UpPTS frames", "nfapi.max.uppts.frame", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, + "Used for TDD only and indicates how SRS operates in UpPTS subframes", HFILL } + }, + { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, + { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", + FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, + "Indicates if SRS and ACK/NACK can be received in the same subframe. Needed if semi-static configuration is held in PHY.", HFILL } + }, + { &hf_nfapi_pnf_address_ipv4, + { "PNF IPV4", "nfapi.pnf.address.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, + "The IPv4 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } + }, + { &hf_nfapi_pnf_address_ipv6, + { "PNF IPV6", "nfapi.pnf.address.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, + "The IPv6 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } + }, + { &hf_nfapi_vnf_address_ipv4, + { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, + "The IPv4 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } + }, + { &hf_nfapi_vnf_address_ipv6, + { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, + "The IPv6 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } + }, + { &hf_nfapi_pnf_port, + { "PNF PORT value", "nfapi.config.pnf.port.value", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The port of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } + }, + { &hf_nfapi_vnf_port, + { "VNF PORT value", "nfapi.config.vnf.port.value", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The port of the VNF to be used by the PNF for this P7 PHY instance", HFILL } }, + { &hf_nfapi_sync_mode, + { "Sync Mode", "nfapi.sync.mode", + FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, + "The method of nFAPI Synchronization supported by the PNF", HFILL } + }, + { &hf_nfapi_location_mode, + { "Location Mode", "nfapi.location.mode", + FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, + "The method of location derivation supported by the PNF", HFILL } + }, + { &hf_nfapi_location_coordinates_length, + { "Location Coordinates Length", "nfapi.location.coordinates.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Length in bytes of the Location Coordinates Array field", HFILL } + }, + { &hf_nfapi_location_coordinates, + { "Location Coordinates", "nfapi.location.coordinates", + FT_BYTES, BASE_NONE, NULL, 0x0, + "The Location of the PNF. The value is formatted as the LocationCoordinates IE using BASIC-PER encoding as defined in " + "TS36.355 section 6.4.2. The first bit of the LocationCoordinates IE is in the LSB of the first byte of the array." + "The MSBs of the last element of the array may be padded with zeros if the ASN.1 element is not an integer number of bytes", HFILL } + }, + { &hf_nfapi_pdu, + { "PDU", "nfapi.pdu", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_config_timing, + { "DL config Timing", "nfapi.dl.config.timing", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The timing offset before the air interface subframe start that the DL_Config.request must be received at the PNF.", HFILL } + }, + { &hf_nfapi_tx_timing, + { "Tx Timing", "nfapi.general.tx.timing", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The timing offset before the air interface subframe start that the TX.request must be received at the PNF.", HFILL } + }, + { &hf_nfapi_ul_config_timing, + { "UL Config Timing", "nfapi.ul.config.timing", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The timing offset before the air interface subframe start that the UL_CONFIG.request must be received at the PNF.", HFILL } + }, + { &hf_nfapi_hi_dci0_timing, + { "HI DCi0 Timing", "nfapi.hi.dci0.timing", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The timing offset before the air interface subframe start that the HI_DCI0.request must be received at the PNF.", HFILL } + }, + { &hf_nfapi_maximum_number_phys, + { "Maximum number of Phys", "nfapi.maximum.number.phys", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The maximum number of operational PHYs supported by the PNF device.", HFILL } + }, + { &hf_nfapi_maximum_total_bandwidth, + { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, + "The total maximum bandwidth (in units of 100kHz) supported by the PNF device.", HFILL } + }, + { &hf_nfapi_maximum_total_number_dl_layers, + { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The maximum total number of downlink layers supported.", HFILL } + }, + { &hf_nfapi_maximum_total_number_ul_layers, + { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The maximum total number of uplink layers supported across all available PHYs.", HFILL } + }, + { &hf_nfapi_shared_bands, + { "Shared bands", "nfapi.shared.bands", + FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, + "Indication that the PNF device shares the list of RF band options available across all available PHYs, so each may only be used with a single PHY.", HFILL } + }, + { &hf_nfapi_shared_pa, + { "Shared pa", "nfapi.shared.pa", + FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, + "Indication that the PNF device shares a single RF PA across all available PHYs, so that the maximum Total Power is shared across all available PHYs.", HFILL } + }, + { &hf_nfapi_maximum_total_power, + { "Maximum total power", "nfapi.maximum.total.power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, + "The maximum transmit power of the PNF device summed across all PHYs.", HFILL } + }, + { &hf_nfapi_oui, + { "OUI", "nfapi.oui", + FT_STRING, BASE_NONE, NULL, 0x0, + "The PNF OUI in the format as specified by IEEE", HFILL } + }, + { &hf_nfapi_pnf_phy_number_phy, + { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of PHY instances", HFILL } + }, + { &hf_nfapi_pnf_phy_config_index, + { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The unique index number of the PHY to permit the PNF to identify the PHY in the PNF_CONFIG.Request", HFILL } + }, + { &hf_nfapi_number_of_rfs, + { "Number of RFs", "nfapi.pnf.rf.number.rf", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of RF configurations", HFILL } + }, + { &hf_nfapi_phy_rf_config_info_phy_id, + { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_rf_config_index, + { "RF Config Index", "nfapi.rf_config_index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The index number defined in the PNF RF struct that the PHY can support", + HFILL } + }, + { &hf_nfapi_number_of_rf_exclusions, + { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of RF configurations excluded from use by this PHY", HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported, + { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The major 3GPP releases supported", HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel8, + { "Release 8", "nfapi.maximum_3gpp_release_supported.rel8", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel9, + { "Release 9", "nfapi.maximum_3gpp_release_supported.rel9", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel10, + { "Release 10", "nfapi.maximum_3gpp_release_supported.rel10", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel11, + { "Release 11", "nfapi.maximum_3gpp_release_supported.rel11", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel12, + { "Release 12", "nfapi.maximum_3gpp_release_supported.rel12", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_maximum_3gpp_release_supported_rel13, + { "Release 13", "nfapi.maximum_3gpp_release_supported.rel13", + FT_BOOLEAN, 1, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_downlink_channel_bandwidth_supported, + { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The downlink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104", HFILL } + }, + { &hf_nfapi_uplink_channel_bandwidth_supported, + { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The uplink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104.", HFILL } + }, + { &hf_nfapi_number_of_dl_layers_supported, + { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The maximum number of downlink layers supported", HFILL } + }, + { &hf_nfapi_number_of_ul_layers_supported, + { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The maximum number of uplink layers supported", HFILL } + }, + { &hf_nfapi_nmm_modes_supported, + { "NMM modes supported", "nfapi.nmm_modes_supported", + FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, + "Network Monitor Modes Supported.", HFILL } + }, + { &hf_nfapi_band, + { "Band", "nfapi.band", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Band number as specified in 3GPP TS36.101", HFILL } + }, + { &hf_nfapi_maximum_transmit_power_2, + { "Maximum transmit power", "nfapi.maximum_transmit_power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_2_conversion_fn), 0x0, + "The maximum transmit power for the PHY and RF operating at the configured bandwidth as defined in 3GPP TS 36.104.", HFILL } + }, + { &hf_nfapi_maximum_transmit_power, + { "Maximum transmit power", "nfapi.maximum_transmit_power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, + "The maximum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } + }, + { &hf_nfapi_earfcn, + { "EARFCN", "nfapi.earfcn", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The EARFCN to be measured.", HFILL } + }, + { &hf_nfapi_number_of_rf_bands, + { "Number of RF Bands", "nfapi.num.rf_bands", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of RF Band instances", HFILL } + }, + { &hf_nfapi_nmm_uplink_rssi_supported, + { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", + FT_UINT8, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, + "Indicates if the uplink RSSI meausremnts are supported by NMM.", HFILL } + }, + { &hf_nfapi_minimum_transmit_power, + { "Minimum transmit power", "nfapi.minimum_transmit_power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, + "The minimum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } + }, + { &hf_nfapi_number_of_antennas_suppported, + { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The maximum number of antennas supported.", HFILL } + }, + { &hf_nfapi_minimum_downlink_frequency, + { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, + "The minimum supported downlink frequency in 100kHz units", HFILL } + }, + { &hf_nfapi_maximum_downlink_frequency, + { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, + "The maximum supported downlink frequency in 100kHz units", HFILL } + }, + { &hf_nfapi_minimum_uplink_frequency, + { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, + "The minimum supported uplink frequency in 100kHz units", HFILL } + }, + { &hf_nfapi_maximum_uplink_frequency, + { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, + "The maximum supported uplink frequency in 100kHz units", HFILL } + }, + { &hf_nfapi_transmission_mode7_supported, + { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports TM7 for PDSCH", HFILL } + }, + { &hi_nfapi_transmission_mode8_supported, + { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports TM8 for PDSCH", HFILL } + }, + { &hi_nfapi_two_antennas_ports_for_pucch, + { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports PUCCH transmit diversity introduced in Release 10. Equivalent to two-AntennaPortsForPUCCH-r10 in TS36.306", HFILL } + }, + { &hi_nfapi_transmission_mode_9_supported, + { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports TM9 for PDSCH with 8 antennas and 8 CSI. Equivalent to tm9-With-8Tx-FDD-r10 in TS36.306", HFILL } + }, + { &hi_nfapi_simultaneous_pucch_pusch, + { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports UE sending simultaneous PUCCH and PUSCH introduced in Release 10. Equivalent to simultaneousPUCCH-PUSCH-r10 in TS36.306", HFILL } + }, + { &hi_nfapi_four_layer_tx_with_tm3_and_tm4, + { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports four layer transmission for TM3 and TM4. Equivalent to fourLayerTM3-TM4-r10 in TS36.306", HFILL } + }, + { &hf_nfapi_epdcch_supported, + { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports Enhanced PDCCH", HFILL } + }, + { &hi_nfapi_multi_ack_csi_reporting, + { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports the multi ACK and CSI reporting required with CA and mixed FDD/TDD carriers. Equivalent to multiACK-CSI-Reporting-r11 in TS36.306", HFILL } + }, + { &hi_nfapi_pucch_tx_diversity_with_channel_selection, + { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports transmit diversity for PUCCH format 1b with channel selection. Equivalent to txDiv-PUCCH1b-ChSelect in TS36.306", HFILL } + }, + { &hi_nfapi_ul_comp_supported, + { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports UL CoMP", HFILL } + }, + { &hi_nfapi_transmission_mode_5_supported, + { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports TM5 for PDSCH", HFILL } + }, + { &hf_nfapi_csi_subframe_set, + { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Equivalent to csi-SubframeSet-r12 in TS36.306", HFILL } + }, + { &hi_nfapi_enhanced_4tx_codebook, + { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports the enhanced 4TX codebook. Equivalent to enhanced-4TxCodebook-r12 in TS36.306", HFILL } + }, + { &hi_nfapi_drs_supported, + { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports the Discovery Reference Signal", HFILL } + }, + { &hi_nfapi_ul_64qam_supported, + { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY support 64 QAM in the uplink", HFILL } + }, + { &hi_nfapi_transmission_mode_10_supported, + { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports TM10 for PDSCH (DL CoMP)", HFILL } + }, + { &hi_nfapi_alternative_tbs_indices, + { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports the alternate TBS indices (256 QAM). Equivalent to alternativeTBS-Indices-r12 in TS36.306", HFILL } + }, + { &hf_nfapi_pucch_format_4_supported, + { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports PUCCH format 4", HFILL } + }, + { &hf_nfapi_pucch_format_5_supported, + { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports PUCCH format 5", HFILL } + }, + { &hf_nfapi_more_than_5_ca_supported, + { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports features required for more than 5 CA support on PUSCH. Equivalent to uci-PUSCH-Ext-r13 in TS36.306", HFILL } + }, + { &hf_nfapi_laa_supported, + { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports DL LAA (subframe format 3)", HFILL } + }, + { &hf_nfapi_laa_ending_in_dwpts_supported, + { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports DL LAA ending in a DwPTS subframe. Equivalent to endingDwPTS-r13i n TS36.306", HFILL } + }, + { &hf_nfapi_laa_starting_in_second_slot_supported, + { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports DL LAA starting in the second slot in a subframe. Equivalent to secondSlotStartingPosition-r13 in TS36.306", HFILL } + }, + { &hf_nfapi_beamforming_supported, + { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports beamforming (FD-MIMO Class B). Equivalent to beamformed-r13 in TS36.306", HFILL } + }, + { &hf_nfapi_csi_rs_enhancements_supported, + { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports CSI-RS enhancements (FD-MIMO Class A). Equivalent to csi-RS-EnhancementsTDD-r13 in TS36.306", HFILL } + }, + { &hf_nfapi_drms_enhancements_supported, + { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports DMRS enhancements added in Release 13. Equivalent to dmrs-Enhancements-r13 in TS36.306", HFILL } + }, + { &hf_nfapi_srs_enhancements_supported, + { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates if PHY supports SRS enhancements added in Release 13. Equivalent to srs-Enhancements-r13in TS36.306", HFILL } + }, + { &hf_nfapi_sfn_sf, + { "SFN_SF", "nfapi.sfn_sf", + FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_number_pdcch_ofdm_symbols, + { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of OFDM symbols for the PDCCH", HFILL } + }, + { &hf_nfapi_number_dci, + { "Number of DCI", "nfapi.number_dci", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of DCI PDUs included in this message", HFILL } + }, + { &hf_nfapi_number_pdus, + { "Number of PDUs", "nfapi.number_pdu", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of PDUs that are included in this message", HFILL } + }, + { &hf_nfapi_number_of_harqs, + { "Number of HARQs", "nfapi.number_harqs", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of HARQs included in this message", HFILL } + }, + { &hf_nfapi_number_of_crcs, + { "Number of CRCs", "nfapi.number_crcs", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of CRCs included in this message", HFILL } + }, + { &hf_nfapi_number_of_srs, + { "Number of SRs", "nfapi.number_srs", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of SRs included in this message", HFILL } + }, + { &hf_nfapi_number_of_cqi, + { "Number of CQIs", "nfapi.number_cqi", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of CQIs included in this message", HFILL } + }, + { &hf_nfapi_number_of_preambles, + { "Number of Preambles", "nfapi.number_preambles", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of RACH preambles", HFILL } + }, + { &hf_nfapi_number_of_srss, + { "Number of SRSs", "nfapi.number_srss", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Number of UEs contributing to the uplink SRS", HFILL } + }, + { &hf_nfapi_lbt_dl_req_pdu_type, + { "LBT DL Request PDU Type", "nfapi.number_srss", + FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_lbt_dl_ind_pdu_type, + { "LBT DL Indication PDU Type", "nfapi.number_srss", + FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_number_pdsch_rnti, + { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of unique RNTIs sent on the PDSCH", HFILL } + }, + { &hf_nfapi_transmission_power_pcfich, + { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "Offset to the reference signal power.", HFILL } + }, + { &hf_nfapi_dl_config_pdu_type, + { "PDU Type", "nfapi.pdu.type", + FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, + "DL_CONFIG.request PDU Type", HFILL } + }, + { &hf_nfapi_pdu_size, + { "PDU size", "nfapi.pdu.size", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Size of the PDU control information (in bytes). This length value includes the 2 bytes required for the PDU type and PDU size parameters", HFILL } + }, + { &hf_nfapi_instance_length, + { "Instance length", "nfapi.instance.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The Length in bytes of all TLVs within this instance", HFILL } + }, + { &hf_nfapi_length, + { "PDU length", "nfapi.pdu.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Length of PDU in bytes.", HFILL } + }, + { &hf_nfapi_pdu_index, + { "PDU Index", "nfapi.pdu.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PDU index parameter specified for each PDU", HFILL } + }, + { &hf_nfapi_rnti, + { "RNTI", "nfapi.rnti", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The RNTI used for identifying the UE when receiving the PDU", HFILL } + }, + { &hf_nfapi_resource_allocation_type, + { "Resource Allocation Type", "nfapi.resource.allocation.type", + FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, + "Resource allocation type/header Valid for DCI formats : 1, 2, 2A, 2B, 2C, 2D", HFILL } + }, + { &hf_nfapi_virtual_resource_block_assignment_flag, + { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", + FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, + "Type of virtual resource block used Valid for DCI formats : 1A, 1B, 1D", HFILL } + }, + { &hf_nfapi_resource_block_coding, + { "Resource block coding", "nfapi.resource.block.coding", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The encoding for the resource blocks. The coding is dependent on whether resource allocation type 0, 1, 2 is in use", HFILL } + }, + { &hf_nfapi_modulation, + { "Modulation", "nfapi.modulation", + FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_redundancy_version, + { "Redundancy version", "nfapi.redundancy.version", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ redundancy version", HFILL } + }, + { &hf_nfapi_transport_blocks, + { "Transport blocks", "nfapi.transport.blocks", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The transport block transmitted to this RNTI", HFILL } + }, + { &hf_nfapi_transport_block_to_codeword_swap_flag, + { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", + FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, + "Indicates the mapping of transport block to codewords.", HFILL } + }, + { &hf_nfapi_transmission_scheme, + { "Transmission scheme", "nfapi.transmission.scheme", + FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, + "The MIMO mode used in the PDU", HFILL } + }, + { &hf_nfapi_ul_transmission_scheme, + { "Transmission scheme", "nfapi.transmission.scheme", + FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, + "The MIMO mode used in the PDU", HFILL } + }, + { &hf_nfapi_number_of_layers, + { "Number of layers", "nfapi.number.of.layers", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of layers used in transmission", HFILL } + }, + { &hf_nfapi_number_of_subbands, + { "Number of subbands", "nfapi.number.of.subbands", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Only valid when transmission scheme = 3, 4, 5. Defines the number of subbands and " + "codebooks used for PMI.If value = 1 then a single PMI value is supplied which should be used over all RB", HFILL } + }, + { &hf_nfapi_codebook_index, + { "Codebook index", "nfapi.number.of.codebook.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Only valid when transmission scheme = 3, 4, 5. Defines the codebook used.", HFILL } + }, + { &hf_nfapi_ue_category_capacity, + { "UE category capacity", "nfapi.ue.category.capacity", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The UE capabilities category", HFILL } + }, + { &hf_nfapi_pa, + { "P-A", "nfapi.pa", + FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, + "The ratio of PDSCH EPRE to cell-specific RS EPRE among PDSCH REs in all the OFDM symbols not containing cell-specific RS in dB.", HFILL } + }, + { &hf_nfapi_delta_power_offset_index, + { "Delta Power offset index", "nfapi.delta.power.offset.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Delta power offset, value: 0..1", HFILL } + }, + { &hf_nfapi_nprb, + { "Nprb", "nfapi.nprb", + FT_UINT8, BASE_DEC, VALS(nprb_vals), 0x0, + "Used with DCI format 1A and RNTI=SI-RNTI or RA-RNTI. This should match the value sent in the TPC field of the DCI 1A PDU which allocated this grant.", HFILL } + }, + { &hf_nfapi_transmission_mode, + { "Transmission Mode", "nfapi.transmission_nprb", + FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, + "Transmission mode associated with the UE", HFILL } + }, + { &hf_nfapi_prnti, + { "P-RNTI", "nfapi.prnti", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The P-RNTI associated with the paging", HFILL } + }, + { &hf_nfapi_mcs, + { "MCS", "nfapi.mcs", + FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, + "The modulation and coding scheme for the transport block", HFILL } + }, + { &hf_nfapi_number_of_transport_blocks, + { "Number of transport blocks", "nfapi.number_of_transport_blocks", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of transport blocks transmitted to this RNTI", HFILL } + }, + { &hf_nfapi_ue_mode, + { "UE Mode", "nfapi.ue.mode", + FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, + NULL, HFILL } + }, + { &hf_prs_bandwidth, + { "PRS bandwidth", "nfapi.prs.bandwidth", + FT_UINT8, BASE_DEC, NULL, 0x0, + "PRS bandwidth in resource blocks.", HFILL } + }, + { &hf_prs_cyclic_prefix_type, + { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", + FT_BOOLEAN, 8, TFS(&prs_cyclic_prefix_type_strname), 0x0, + "The cyclic prefix used for PRS transmission", HFILL } + }, + { &hf_prs_muting, + { "PRS muting", "nfapi.prs.muting", + FT_BOOLEAN, 8, TFS(&prs_muting_strname), 0x0, + "PRS muting dictates if PRS REs are vacant (prsMutingInfo-r9 indicates the SF occasions)", HFILL } + }, + { &hf_nfapi_num_bf_prb_per_subband, + { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of PRBs that are treated as one subband", HFILL } + }, + { &hf_nfapi_num_bf_vector, + { "Num of BF Vector", "nfapi.num.bf.vector", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of beam forming vectors. One beam forming vector is specified for each subband", HFILL } + }, + { &hf_nfapi_csi_rs_resource_config, + { "CSI-RS resource config", "nfapi.csi.rs.resource.config", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates reference signal configuration for CSI-RS", HFILL } + }, + { &hf_nfapi_bf_vector_subband_index, + { "BF Subband Index", "nfapi.num.bf.vector.subband.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Index of subband for which the following beam forming vector is applied", HFILL } + }, + { &hf_nfapi_bf_vector_num_antennas, + { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of physical antennas", HFILL } + }, + { &hf_nfapi_bf_vector_bf_value, + { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Beam forming vector element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } + }, + { &hf_nfapi_nscid, + { "NSC id", "nfapi.nscid", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Used with DCI format 2B and 2C.", HFILL } + }, + { &hf_nfapi_csi_rs_flag, + { "CSI RS Flag", "nfapi.csi.rs.flag", + FT_BOOLEAN, 8, TFS(&csi_rs_flags_strname), 0x0, + "Indicates if parameters related to CSI-RS are valid or not.", HFILL } + }, + { &hf_nfapi_csi_rs_resource_config_r10, + { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", + FT_UINT8, BASE_DEC, NULL, 0x0, + "This value is deprecated", HFILL } + }, + { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, + { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Bitmap of 16 bits. Encoding format of bitmap follows section 6.10.5.2 of 36.211", HFILL } + }, + { &hf_nfapi_csi_rs_number_of_nzp_configurations, + { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates the number of Non-Zero power CSI-RS configurations.", HFILL } + }, + { &hf_nfapi_pdsch_start, + { "PDSCH_start", "nfapi.pdsch.start", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Per UE starting OFDM symbol for the PDSCH, impacts the mapping of PDSCH to REs", HFILL } + }, + { &hf_nfapi_drms_config_flag, + { "DMRS Config flag", "nfapi.drms.config.flag", + FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, + "Indicates if the DMRS Config parameter is valid", HFILL } + }, + { &hf_nfapi_drms_scrambling, + { "DMRS Scrambling", "nfapi.drms.scrambling", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The scrambling identity for UE specific reference signals.", HFILL } + }, + { &hf_nfapi_csi_config_flag, + { "CSI Config flag", "nfapi.csi.config.flag", + FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, + "Indicates if the CSI Config parameter is valid", HFILL } + }, + { &hf_nfapi_csi_scrambling, + { "CSI Scrambling", "nfapi.csi.scrambling", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The scrambling identity for CSI.", HFILL } + }, + { &hf_nfapi_pdsch_re_mapping_flag, + { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", + FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, + "Indicates if the PDSCH RE parameters are valid.", HFILL } + }, + { &hf_nfapi_pdsch_re_mapping_antenna_ports, + { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates number of antennas used for PDSCH RE mapping", HFILL } + }, + { &hf_nfapi_pdsch_re_mapping_freq_shift, + { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the frequency shift used for PDSCH RE mapping.", HFILL } + }, + { &hf_nfapi_alt_cqi_table_r12, + { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", + FT_UINT8, BASE_DEC, NULL, 0x0, + "altCQI-Table-r12 is indicative of using an alternative MCS table for UEs supporting 256QAM." + "This is taken into account for calculation of soft buffer size for the transport block", HFILL } + }, + { &hf_nfapi_max_layers, + { "MaxLayers", "nfapi.max.layers", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Maximal number of negotiated / configured layers for a UE, used for the calculation of soft buffer size for the transport block", HFILL } + }, + { &hf_nfapi_n_dl_harq, + { "N_DL_HARQ", "nfapi.n.dl.harq", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dwpts_symbols, + { "DwPTS Symbols", "nfapi.dwpts.symbols", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid if DCI format 1C is being used to signal LAA end partial SF. Indicates the number of starting symbols according to 36.213 Table 13-A-1", HFILL } + }, + { &hf_nfapi_initial_lbt_sf, + { "Initial LBT SF", "nfapi.initial.lbt.sf", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if the DCI PDU is prepared for full SF (regular) or for initial partial SF (2nd slot) according to [11] section 6.2.4 (if PDCCH) or 6.2.4A (if ePDCCH)", HFILL } + }, + { &hf_nfapi_ue_type, + { "UE Type", "nfapi.ue.type", + FT_UINT8, BASE_DEC, VALS(dlsch_re13_ue_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_pdsch_payload_type, + { "PDSCH Payload Type", "nfapi.pdsch.payload.type", + FT_UINT8, BASE_DEC, VALS(dlsch_re13_pdsch_payload_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_initial_transmission_sf, + { "Initial transmission SF (io)", "nfapi.init.tx.sf.io", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Absolute Sub-Frame of the initial transmission", HFILL } + }, + { &hf_nfapi_req13_drms_table_flag, + { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if Release 13 DMRS table is used.", HFILL } + }, + { &hf_nfapi_csi_rs_resource_index, + { "CSI-RS resource index", "nfapi.csi.rs.resource.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Index of the CSI-RS resource. This is included to link bfValues to CSI-RS resources included in Release 10 parameters.", HFILL } + }, + { &hf_nfapi_csi_rs_class, + { "Class", "nfapi.csi.rs.class", + FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, + "Indicates CSI-RS class", HFILL } + }, + { &hf_nfapi_cdm_type, + { "CDM Type", "nfapi.cdm.type", + FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, + "Indicates CDM type for CSI-RS. See [36.211] section 6.10.5.2. Valid for Class A", HFILL } + }, + { &hf_nfapi_edpcch_prb_index, + { "EPDCCH PRB index", "nfapi.edpcch.prb.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "PRB index", HFILL } + }, + { &hf_nfapi_epdcch_resource_assignment_flag, + { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", + FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, + "Type of virtual resource block used", HFILL } + }, + { &hf_nfapi_epdcch_id, + { "EPDCCH ID", "nfapi.epdcch.id", + FT_UINT8, BASE_DEC, NULL, 0x0, + "EPDCCH index- used for the scrambler initiation The DMRS scrambling sequence initialization parameter defined in[11] section 6.10.3A.1", HFILL } + }, + { &hf_nfapi_epdcch_start_symbol, + { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the OFDM starting symbol for any EPDCCH and PDSCH", HFILL } + }, + { &hf_nfapi_epdcch_num_prb, + { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of PRBs allocated for EPDCCH", HFILL } + }, + { &hf_nfapi_precoding_value, + { "Precoding value", "nfapi.precoding.value", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Precoding element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } + }, + { &hf_nfapi_mpdcch_narrowband, + { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Narrowband for MPDCCH", HFILL } + }, + { &hf_nfapi_number_of_prb_pairs, + { "Number of PRB pairs", "nfapi.number.prb.pairs", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of PRB-pairs constituting the MPDCCH-PRB-pair set", HFILL } + }, + { &hf_nfapi_resource_block_assignment, + { "Resource Block Assignment", "nfapi.resource.block.assignement", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Combinational index r", HFILL } + }, + { &hf_nfapi_start_symbol, + { "Start symbol", "nfapi.start.symbol", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ecce_index, + { "ECCE index", "nfapi.ecce.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "CCE index used to send the DCI", HFILL } + }, + { &hf_nfapi_ce_mode, + { "CE Mode", "nfapi.ce.mode", + FT_UINT8, BASE_DEC, VALS(ce_mode_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_drms_scrabmling_init, + { "DMRS scrambling init", "nfapi.drms.scrambling.init", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The DMRS scrambling sequence initialization parameter defined in [11] section 6.10.3A.1", HFILL } + }, + { &hf_nfapi_pdsch_reception_levels, + { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid for DCI formats: 6-0A, 6-0B", HFILL } + }, + { &hf_nfapi_new_data_indicator, + { "New data indicator", "nfapi.new.data.indicator", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The new data indicator for the transport block", HFILL } + }, + { &hf_nfapi_tpmi_length, + { "TPMI length", "nfapi.tpmi.length", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Length of 'TPMI' field in units of bits", HFILL } + }, + { &hf_nfapi_pmi_flag, + { "PMI flag", "nfapi.pmi.flag", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, + "Indicates if 'PMI' field is present", HFILL } + }, + { &hf_nfapi_harq_resource_offset, + { "HARQ resource offset", "nfapi.harq.resource.offset", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ-ACK resource offset used", HFILL } + }, + { &hf_nfapi_dci_subframe_repetition_number, + { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the number of MPDCCH repetitions", HFILL } + }, + { &hf_nfapi_downlink_assignment_index_length, + { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Length of Downlink assignment index field in units of bits.", HFILL } + }, + { &hf_nfapi_starting_ce_level, + { "Starting CE Level", "nfapi.starting.ce.level", + FT_UINT8, BASE_DEC, NULL, 0x0, + "2 bits provide the PRACH starting CE level", HFILL } + }, + { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, + { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, + "Indicates if 'Antenna ports and scrambling identity' field is present.", HFILL } + }, + { &hf_nfapi_antenna_ports_and_scrambling_identity, + { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the Antenna port and, scrambling identity value", HFILL } + }, + { &hf_nfapi_paging_direct_indication_differentiation_flag, + { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", + FT_UINT8, BASE_DEC, VALS(paging_direct_indication_differtiation_flag_vals), 0x0, + "Valid for DCI format 6-2", HFILL } + }, + { &hf_nfapi_direct_indication, + { "Direct indication", "nfapi.direct.indication", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid for DCI format 6-2", HFILL } + }, + { &hf_nfapi_number_of_tx_antenna_ports, + { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of TX physical antenna ports", HFILL } + }, + { &hf_nfapi_transmission_power, + { "Transmission Power", "nfapi.transmission_power", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "Offset to the reference signal power.", HFILL } + }, + { &hf_nfapi_mbsfn_area_id, + { "MBSFN Area id", "nfapi.mbsfn.area.id", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates MBSFN area ID", HFILL } + }, + { &hf_nfapi_dl_dci_format, + { "DL DCI format", "nfapi.dl.dci.format", + FT_UINT8, BASE_DEC, VALS(dl_dci_format_vals), 0x0, + "Format of the DL DCI", HFILL } + }, + { &hf_nfapi_ul_dci_format, + { "UL DCI format", "nfapi.ul_dci.format", + FT_UINT8, BASE_DEC, VALS(ul_dci_format_vals), 0x0, + "Format of the UL DCI", HFILL } + }, + { &hf_nfapi_mpdcch_ul_dci_format, + { "UL DCI format", "nfapi.mpdcch.ul_dci.format", + FT_UINT8, BASE_DEC, VALS(mpdcch_ul_dci_format_vals), 0x0, + "Format of the UL DCI", HFILL } + }, + { &hf_nfapi_cce_idx, + { "CCE index", "nfapi.cce.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "CCE index used to send the DCI", HFILL } + }, + { &hf_nfapi_aggregation_level, + { "Aggregation level", "nfapi.aggregation.level", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The aggregation level used", HFILL } + }, + { &hf_nfapi_mcs_1, + { "MCS_1", "nfapi.mcs_1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The modulation and coding scheme for 1st transport block", HFILL } + }, + { &hf_nfapi_mcs_2, + { "MCS_2", "nfapi.mcs_2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The modulation and coding scheme for 2nd transport block", HFILL } + }, + { &hf_nfapi_redundancy_version_1, + { "Redundancy version_1", "nfapi.redundancy.version.1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The redundancy version for 1st transport block.", HFILL } + }, + { &hf_nfapi_redundancy_version_2, + { "Redundancy version_2", "nfapi.redundancy.version.2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The redundancy version for 2nd transport block", HFILL } + }, + { &hf_nfapi_new_data_indicator_1, + { "New data indicator_1", "nfapi.new.data.indicator.1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The new data indicator for 1st transport block.", HFILL } + }, + { &hf_nfapi_new_data_indicator_2, + { "New data indicator_2", "nfapi.new.data.indicator.2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The new data indicator for 2nd transport block.", HFILL } + }, + { &hf_nfapi_harq_process, + { "HARQ process", "nfapi.harq.process", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ process number", HFILL } + }, + { &hf_nfapi_tpmi, + { "TPMI", "nfapi.tpmi", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The codebook index to be used for precoding", HFILL } + }, + { &hf_nfapi_pmi, + { "PMI", "nfapi.pmi", + FT_UINT8, BASE_DEC, VALS(pmi_vals), 0x0, + "Confirmation for precoding", HFILL } + }, + { &hf_nfapi_precoding_information, + { "Precoding information", "nfapi.precoding.information", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_tpc, + { "TPC", "nfapi.tpc", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Tx power control command for PUCCH", HFILL } + }, + { &hf_nfapi_downlink_assignment_index, + { "Downlink assignment index", "nfapi.downlink.assignment.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The downlink assignment index. In release 8-11 this is only used in TDD mode, " + "value ignored for FDD. In release 12 or later a field indicating the structure " + "type of the primary cell is used to determine if this is valid with size 2 bits." + "In release 13 or later a field indicating codebooksizeDetermination - r13 = 0 is " + "used to determine is this field is valid with size 4 bits", HFILL } + }, + { &hf_nfapi_ngap, + { "Ngap", "nfapi.ngap", + FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, + "Used in virtual resource block distribution", HFILL } + }, + { &hf_nfapi_transport_block_size_index, + { "Transport block size index", "nfapi.transport.block.size.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The transport block size", HFILL } + }, + { &hf_nfapi_downlink_power_offset, + { "Downlink power offset", "nfapi.downlink.power.offset", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the DL power offset type for multi-user MIMO transmission", HFILL } + }, + { &hf_nfapi_allocate_prach_flag, + { "Allocation PRACH flag", "nfapi.allocation.prach.flag", + FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, + "Indicates that PRACH procedure is initiated", HFILL } + }, + { &hf_nfapi_preamble_index, + { "Preamble index", "nfapi.preamable.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The preamble index to be used on the PRACH", HFILL } + }, + { &hf_nfapi_prach_mask_index, + { "PRACH mask index", "nfapi.prach.mask.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The mask index to be used on the PRACH", HFILL } + }, + { &hf_nfapi_rnti_type, + { "RNTI type", "nfapi.rnti.type", + FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_mpdcch_rnti_type, + { "RNTI type", "nfapi.mpdcch.rnti.type", + FT_UINT8, BASE_DEC, VALS(mpdcch_rnti_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_mcch_flag, + { "MCCH flag", "nfapi.mcch.flag", + FT_BOOLEAN, BASE_NONE, TFS(&mcch_flag_string_name), 0x0, + "Indicates if format 1C is being used to signal a MCCH or SC-MCCH change notification", HFILL } + }, + { &hf_nfapi_mcch_change_notification, + { "MCCH change notification", "nfapi.mcch.change.notification", + FT_UINT8, BASE_DEC, NULL, 0x0, + "MCCH or SC-MCCH Change Notification", HFILL } + }, + { &hf_nfapi_scrambling_identity, + { "Scrambling identity", "nfapi.scrambling.identity", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the scrambling identity value NSCID", HFILL } + }, + { &hf_nfapi_cross_carrier_scheduling_flag, + { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", + FT_BOOLEAN, 8, TFS(&cross_carrier_scheduling_flag_strname), 0x0, + "Indicates if cross carrier scheduling has been enabled for the UE receiving this DCI", HFILL } + }, + { &hf_nfapi_carrier_indicator, + { "Carrier Indicator", "nfapi.carrier.indicator", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Serving Cell Index", HFILL } + }, + { &hf_nfapi_srs_flag, + { "SRS flag", "nfapi.srs.flag", + FT_BOOLEAN, 8, TFS(&srs_flag_strname), 0x0, + "Indicates if the SRS request parameter is valid", HFILL } + }, + { &hf_nfapi_srs_request, + { "SRS request", "nfapi.srs.request", + FT_BOOLEAN, 8, TFS(&srs_request_strname), 0x0, + "SRS request flag", HFILL } + }, + { &hf_nfapi_antenna_ports_scrambling_and_layers, + { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the Antenna port, scrambling identity value NSCID and number of layers", HFILL } + }, + { &hf_nfapi_total_dci_length_including_padding, + { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The total DCI length including padding bits", HFILL } + }, + { &hf_nfapi_n_ul_rb, + { "N_UL_RB", "nfapi.n.dl.rb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "BW of serving cell for which the DCI was scheduled for. This is valid for " + "the case of cross carrier scheduling, for the case of a self - " + "scheduling(cross carrier scheduling is not valid or Carrier indicator has value '0', " + "the BW is the 'DL BW support' as configured in configuration phase(params) " + "Uplink channel bandwidth in resource blocks", HFILL } + }, + { &hf_nfapi_harq_ack_resource_offset, + { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ-ACK resource offset field is present only when this format is carried by EPDCCH.", HFILL } + }, + { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, + { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the parameter set configured by the higher layers which the UE should use.", HFILL } + }, + { &hf_nfapi_primary_cell_type, + { "Primary cell type", "nfapi.primary.cell.type", + FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, + "Indicates the type of the primary cell.", HFILL } + }, + { &hf_nfapi_ul_dl_configuration_flag, + { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", + FT_BOOLEAN, 8, TFS(&ul_dl_configuration_flag_strname), 0x0, + "Indicates if format 1C is being used to signal UL/DL configuration", HFILL } + }, + { &hf_nfapi_number_of_ul_dl_configurations, + { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_dl_configuration_index, + { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", + FT_UINT8, BASE_DEC, NULL, 0x0, + "UL/DL configuration index", HFILL } + }, + { &hf_nfapi_laa_end_partial_sf_flag, + { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if DCI format 1C is being used to signal LAA end partial SF (valid if end partial SF support configuraton is set)", HFILL } + }, + { &hf_nfapi_laa_end_partial_sf_configuration, + { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", + FT_UINT8, BASE_DEC, NULL, 0x0, + "If DCI format 1C scrambled by CC - RNTI is used to signal end partial SF, this field " + "contains LAA common information (4 bits used in [9] Table 13A-1 for configuration of " + "occupied OFDM symbols for current and next SF)", HFILL } + }, + { &hf_nfapi_codebooksize_determination_r13, + { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if the downlink assignment index parameter (DAI) is 4 bits", HFILL } + }, + { &hf_nfapi_rel13_drms_table_flag, + { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if Release 13 DMRS table for be used", HFILL } + }, + { &hf_nfapi_pscch_resource, + { "PSCCH Resource", "nfapi.pscch.resource", + FT_UINT8, BASE_DEC, NULL, 0x0, + "6-bits describing the resource blocks for transmitting PSCCH", HFILL } + }, + { &hf_nfapi_time_resource_pattern, + { "Time resource pattern", "nfapi.time.resource.pattern", + FT_UINT8, BASE_DEC, NULL, 0x0, + "7-bits describing the time resource pattern index", HFILL } + }, + { &hf_nfapi_mpdcch_transmission_type, + { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", + FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_drms_scrambling_init, + { "DMRS scrambling init", "nfapi.drms.scrambling.init", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The DMRS scrambling sequence initialization", HFILL } + }, + { &hf_nfapi_pusch_repetition_levels, + { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid for DCI formats: 6-0A, 6-0B", HFILL } + }, + { &hf_nfapi_frequency_hopping_flag, + { "Frequency hopping flag", "nfapi.frequency.hopping.flag", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if hopping is being used.", HFILL } + }, + { &hf_nfapi_csi_request, + { "CSI request", "nfapi.csi.request", + FT_UINT8, BASE_DEC, VALS(csi_request_vals), 0x0, + "Aperiodic CSI request flag", HFILL } + }, + { &hf_nfapi_dai_presence_flag, + { "DAI presence flag", "nfapi.dia.presence.flag", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, + "Indicates if DL assignment index field is present in the DCI", HFILL } + }, + { &hf_nfapi_total_dci_length_include_padding, + { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The total DCI length including padding bits", HFILL } + }, + { &hf_nfapi_csi_rs_antenna_port_count_r10, + { "CSI-RS antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates number of antennas used for transmission of CSI reference signal.", HFILL } + }, + { &hf_nfapi_ul_config_pdu_type, + { "UL Config PDU Type", "nfapi.ul.config.pdu.type", + FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_rach_prach_frequency_resources, + { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", + FT_UINT8, BASE_DEC, NULL, 0x0, + "If semi-static information is held in the MAC", HFILL } + }, + { &hf_nfapi_srs_present, + { "SRS present", "nfapi.srs.present", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, + "If semi-static information is held in the MAC", HFILL } + }, + { &hf_nfapi_handle, + { "Handle", "nfapi.handle", + FT_UINT32, BASE_DEC, NULL, 0x0, + "An opaque handle", HFILL } + }, + { &hf_nfapi_pucch_index, + { "PUCCH Index", "nfapi.pucch.index", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PUCCH index value", HFILL } + }, + { &hf_nfapi_size, + { "Size", "nfapi.size", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The size of the ULSCH PDU in bytes as defined by the relevant UL grant", HFILL } + }, + { &hf_nfapi_resource_block_start, + { "Resource block start", "nfapi.resource.block.start", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The starting resource block for this ULSCH allocation", HFILL } + }, + { &hf_nfapi_number_of_resource_blocks, + { "Number of resource blocks", "nfapi.resource.blocks", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of resource blocks allocated to this ULSCH grant", HFILL } + }, + { &hf_nfapi_cyclic_shift_2_for_drms, + { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The 2nd cyclic shift for DMRS assigned to the UE in the ULSCH grant", HFILL } + }, + { &hf_nfapi_frequency_hopping_enabled_flag, + { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", + FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, + "Indicates if hopping is being used", HFILL } + }, + { &hf_nfapi_frequency_hopping_bits, + { "Frequency hopping bits", "nfapi.frequency.hopping.bits", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_new_data_indication, + { "New Data inidication", "nfapi.new.data.indication", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Specify whether this received transport block is a new transmission from UE", HFILL } + }, + { &hf_nfapi_harq_process_number, + { "HARQ Process number", "nfapi.harq.process.number", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_ul_tx_mode, + { "UL Tx Mode", "nfapi.ul.tx.mode", + FT_UINT8, BASE_DEC, VALS(ul_tx_mode_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_current_tx_nb, + { "Current Tx nb", "nfapi.current.tx.nb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The current HARQ transmission count of this transport block. Valid if frequency hopping enabled.", HFILL } + }, + { &hf_nfapi_n_srs, + { "N SRS", "nfapi.n.srs", + FT_UINT8, BASE_DEC, VALS(n_srs_vals), 0x0, + "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } + }, + { &hf_nfapi_disable_sequence_hopping_flag, + { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if any configured group hopping should be disabled for this UE.", HFILL } + }, + { &hf_nfapi_virtual_cell_id_enabled_flag, + { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", + FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, + "Indicates if virtual cell is being used and nPUSCH identity is valid.", HFILL } + }, + { &hf_nfapi_npusch_identity, + { "nPUSCH Identity", "nfapi.npusch.identity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Virtual cell ID for initialization of group hopping, sequence hopping and sequence shift pattern of PUSCH DMRS.", HFILL } + }, + { &hf_nfapi_ndrms_csh_identity, + { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Virtual cell ID for initialization of cyclic shift hopping of PUSCH DMRS.", HFILL } + }, + { &hf_nfapi_total_number_of_repetitions, + { "Total Number of repetitions", "nfapi.total.number.of.repetitions", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_repetition_number, + { "Repetition Number", "nfapi.repetition.number", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Current transmission number", HFILL } + }, + { &hf_nfapi_initial_sf_io, + { "Initial transmission SF (io)", "nfapi.initial.sf.io", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Absolute Sub-Frame of the initial transmission", HFILL } + }, + { &hf_nfapi_empty_symbols_due_to_retunning, + { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } + }, + { &hf_nfapi_dl_cqi_ri_pmi_size_2, + { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI/RI in bits. If the CQI/PMI/RI size exceeds 255 (8-bits) then the Release 9 size value = 0, and this field is used instead.", HFILL } + }, + { &hf_nfapi_harq_size_2, + { "HARQ Size 2", "nfapi.harq.size2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the ACK/NACK in bits.", HFILL } + }, + { &hf_nfapi_delta_offset_harq_2, + { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Delta offset 2 for HARQ. This value is fixed for a UE, allocated in RRC connection setup and used for ACK_NACK mode = 4 or 5", HFILL } + }, + { &hf_nfapi_starting_prb, + { "Starting PRB", "nfapi.starting.prb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The starting PRB for the PUCCH", HFILL } + }, + { &hf_nfapi_antenna_port, + { "Antenna Port", "nfapi.antenna.port", + FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, + "Defines the number of antenna ports used by the UE for the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_number_of_combs, + { "Number of Combs", "nfapi.num.of.combs", + FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, + "Defines the maximum number of transmission combs (TC).", HFILL } + }, + { &hf_nfapi_npucch_identity, + { "nPUCCH Identity", "nfapi.npucch.identity", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Virtual cell ID for initialization of base sequence and cyclic shift hopping of PUCCH.", HFILL } + }, + { &hf_nfapi_empty_symbols, + { "Empty symbols", "nfapi.empty.symbols", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } + }, + { &hf_nfapi_csi_mode, + { "CSI_mode", "nfapi.csi.mode", + FT_UINT8, BASE_DEC, VALS(csi_mode_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_dl_cqi_pmi_size_2, + { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI in bits", HFILL } + }, + { &hf_nfapi_statring_prb, + { "Starting PRB", "nfapi.starting.prb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The starting PRB for the PUCCH", HFILL } + }, + { &hf_nfapi_cdm_index, + { "cdm_Index", "nfapi.cdm.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Selected CDM option", HFILL } + }, + { &hf_nfapi_nsrs, + { "N srs", "nfapi.n.srs", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } + }, + { &hf_nfapi_num_ant_ports, + { "Num_ant_ports", "nfapi.num.ant.port", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of antenna ports used by the UE transmit", HFILL } + }, + { &hf_nfapi_n_pucch_2_0, + { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PUCCH Index value for ACK/NACK HARQ resource 4 on antenna port", HFILL } + }, + { &hf_nfapi_n_pucch_2_1, + { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", + FT_UINT16, BASE_DEC, NULL, 0x0, + "HARQ resource 5", HFILL } + }, + { &hf_nfapi_n_pucch_2_2, + { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", + FT_UINT16, BASE_DEC, NULL, 0x0, + "HARQ resource 6", HFILL } + }, + { &hf_nfapi_n_pucch_2_3, + { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", + FT_UINT16, BASE_DEC, NULL, 0x0, + "HARQ resource 7", HFILL } + }, + { &hf_nfapi_dl_cqi_pmi_size_rank_1, + { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI in bits in case of rank 1 report.", HFILL } + }, + { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, + { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI in bits in case of rank>1 report.", HFILL } + }, + { &hf_nfapi_ri_size, + { "RI size", "nfapi.ri.size", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of RI in bits", HFILL } + }, + { &hf_nfapi_delta_offset_cqi, + { "Delta offset cqi", "nfapi.delta.offset.cqi", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Delta offset for CQI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_delta_offset_ri, + { "Delta offset ri", "nfapi.delta.offset.ri", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Delta offset for RI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_harq_size, + { "HARQ size", "nfapi.harq_size", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the ACK/NACK in bits", HFILL } + }, + { &hf_nfapi_delta_offset_harq, + { "Delta offset HARQ", "nfapi.delta.offset.harq", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Delta offset for HARQ. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_tdd_ack_nack_mode, + { "ACK NACK mode", "nfapi.tdd.ack.nack.mode", + FT_UINT8, BASE_DEC, VALS(nfapi_tdd_ack_nack_mode_vals), 0x0, + "The format of the ACK/NACK response expected. For TDD only.", HFILL } + }, + { &hf_nfapi_fdd_ack_nack_mode, + { "ACK NACK mode", "nfapi.fdd.ack.nack.mode", + FT_UINT8, BASE_DEC, VALS(nfapi_fdd_ack_nack_mode_vals), 0x0, + "The format of the ACK/NACK response expected. For TDD only.", HFILL } + }, + { &hf_nfapi_n_srs_initial, + { "N srs initial", "nfapi.n.srs.initial", + FT_UINT8, BASE_DEC, VALS(n_srs_initial_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_initial_number_of_resource_blocks, + { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of resource blocks used in the initial transmission of this transport block.", HFILL } + }, + { &hf_nfapi_dl_cqi_pmi_size, + { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI in bits in case of this RI value. The size of the DL CQI / PMI / RI in bits in case of this CRI value", HFILL } + }, + { &hf_nfapi_report_type, + { "Report type", "nfapi.report.type", + FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, + "Type of CSI report", HFILL } + }, + { &hf_nfapi_dl_cqi_ri_pmi_size, + { "DL CQI/PMI/RI size", "nfapi.dl.cqi.ri.pmi.size", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The size of the DL CQI/PMI/RI/CRI in bits", HFILL } + }, + { &hf_nfapi_control_type, + { "Control type", "nfapi.control.type", + FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_number_of_cc, + { "Number of cc", "nfapi.number.of.cc", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of CC in the aperiodic report", HFILL } + }, + { &hf_nfapi_number_of_pucch_resource, + { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", + FT_UINT8, BASE_DEC, NULL, 0x0, + "A value of 2 indicates that the UE is configured to transmit on two antenna ports", HFILL } + }, + { &hf_nfapi_pucch_index_p1, + { "PUCCH Index P1", "nfapi.pucch.index.p1", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PUCCH index value for antenna port P1", HFILL } + }, + { &hf_nfapi_n_pucch_1_0, + { "N PUCCH 1 0", "nfapi.n.pucch.1.0", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ resource 0", HFILL } + }, + { &hf_nfapi_n_pucch_1_1, + { "N PUCCH 1 1", "nfapi.n.pucch.1.1", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ resource 1", HFILL } + }, + { &hf_nfapi_n_pucch_1_2, + { "N PUCCH 1 2", "nfapi.n.pucch.1.2", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ resource 2", HFILL } + }, + { &hf_nfapi_n_pucch_1_3, + { "N PUCCH 1 3", "nfapi.n.pucch.1.3", + FT_UINT8, BASE_DEC, NULL, 0x0, + "HARQ resource 3", HFILL } + }, + { &hf_nfapi_srs_bandwidth, + { "SRS Bandwidth", "nfapi.srs.bandwidth", + FT_UINT8, BASE_DEC, NULL, 0x0, + "SRS Bandwidth. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_frequency_domain_position, + { "Frequency Domain position", "nfapi.frequency.domain.position", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Frequency-domain position, NRRC This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_srs_hopping_bandwidth, + { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Configures the frequency hopping on the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_transmission_comb, + { "Transmission comb", "nfapi.transmission.comb", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Configures the frequency location of the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_i_srs, + { "I SRS", "nfapi.i.srs", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Defines the periodicity and subframe location of the SRS. SRS Configuration Index. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_sounding_reference_cyclic_shift, + { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Configures the SRS sequence generation. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } + }, + { &hf_nfapi_pdu_length, + { "PDU length", "nfapi.pdu.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The total length (in bytes) of the PDU description and PDU data, without the padding bytes", HFILL } + }, + { &hf_nfapi_crc_flag, + { "CRC flag", "nfapi.crc.flag", + FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, + "A flag indicating if a CRC error was detected", HFILL } + }, + { &hf_nfapi_number_of_hi_pdus, + { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of HI PDUs included in this message", HFILL } + }, + { &hf_nfapi_number_of_dci_pdus, + { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of DCI PDUs included in this message", HFILL } + }, + { &hf_nfapi_hi_dci0_pdu_type, + { "PDU Type", "nfapi.pdu_type", + FT_UINT8, BASE_DEC, VALS(hi_dci0_pdu_type_vals), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_hi_value, + { "HI Value", "nfapi.hi_value", + FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, + "The PHICH value which is sent on the resource", HFILL } + }, + { &hf_nfapi_i_phich, + { "i phich", "nfapi.i_phich", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Is used in the calculation of the PHICH location. For TDD only", HFILL } + }, + { &hf_nfapi_flag_tb2, + { "Flag TB2", "nfapi.flag_tb2", + FT_BOOLEAN, BASE_NONE, TFS(&flag_tb2_strname), 0x0, + "Indicates is HI is present for a second transport block", HFILL } + }, + { &hf_nfapi_hi_value_2, + { "HI Value 2", "nfapi.hi_value_2", + FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, + "The PHICH value for a second transport block.", HFILL } + }, + { &hf_nfapi_ue_tx_antenna_selection, + { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", + FT_UINT8, BASE_DEC, VALS(ue_tx_antenna_selection_vals), 0x0, + "Indicates how the CRC is calculated on the PDCCH.", HFILL } + }, + { &hf_nfapi_cqi_csi_request, + { "cqi csi request", "nfapi.cqi_csi_request", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Aperiodic CQI request flag", HFILL } + }, + { &hf_nfapi_ul_index, + { "UL index", "nfapi.ul_index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid for TDD mode only", HFILL } + }, + { &hf_nfapi_dl_assignment_index, + { "DL Assignment index", "nfapi.dl_assignment_index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Valid for TDD mode only.", HFILL } + }, + { &hf_nfapi_tpc_bitmap, + { "TPC bitmap", "nfapi.tpc_bitmap", + FT_UINT8, BASE_DEC, NULL, 0x0, + "TPC commands for PUCCH and PUSCH", HFILL } + }, + { &hf_nfapi_number_of_antenna_ports, + { "Number of antenna ports", "nfapi.number.of.antenna.ports", + FT_UINT8, BASE_DEC, VALS(number_of_antenna_port_vals), 0x0, + "Defines number of antenna ports for this ULSCH allocation", HFILL } + }, + { &hf_nfapi_size_of_cqi_csi_feild, + { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", + FT_UINT8, BASE_DEC, VALS(size_of_cqi_csi_feild_vals), 0x0, + "Indicates the size of the CQI/CSI request field", HFILL } + }, + { &hf_nfapi_new_data_indication_two, + { "New data indication 2", "nfapi.new.data.indication.two", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The new data indicator for the second transport block", HFILL } + }, + { &hf_nfapi_resource_allocation_flag, + { "Resource allocation flag", "nfapi.resource.allocation.flag", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Indicates if the Resource Allocation Type parameter is valid.", HFILL } + }, + { &hf_nfapi_dl_node_sync_t1, + { "DL Node Sync t1", "nfapi.dl.node.sync.t1", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "Offset from VNF SFN/SF 0/0 time reference of the DL Node Sync message transmission at the transport layer, in microseconds.", HFILL } + }, + { &hf_nfapi_dl_node_sync_delta_sfn_sf, + { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", + FT_INT32, BASE_DEC, NULL, 0x0, + "The delta shift in subframes that the PNF PHY instance must update to on the next subframe boundary", HFILL } + }, + { &hf_nfapi_dl_cyclic_prefix_type, + { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", + FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, + "Cyclic prefix type, used for DL", HFILL } + }, + { &hf_nfapi_ul_cyclic_prefix_type, + { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", + FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, + "Cyclic prefix type, used for UL", HFILL } + }, + { &hf_nfapi_downlink_channel_bandwidth, + { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Downlink channel bandwidth in resource blocks.", HFILL } + }, + { &hf_nfapi_uplink_channel_bandwidth, + { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Uplink channel bandwidth in resource blocks.", HFILL } + }, + { &hf_nfapi_tx_antenna_ports, + { "Tx Antenna Ports", "nfapi.tx.antenna.ports", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of cell specific or NB transmit antenna ports.", HFILL } + }, + { &hf_nfapi_rx_antenna_ports, + { "Tx Antenna Ports", "nfapi.rx.antenna.ports", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of cell specific or NB receive antenna ports.", HFILL } + }, + { &hf_nfapi_ul_node_sync_t1, + { "UL Node Sync t1", "nfapi.ul.node.sync.t1", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The supplied t1 field in the DL Node Sync", HFILL } + }, + { &hf_nfapi_ul_node_sync_t2, + { "UL Node Sync t2", "nfapi.ul.node.sync.t2", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "Offset from PNF SFN/SF 0/0 time reference of the DL Node Sync message reception at the transport layer, in microseconds.", HFILL } + }, + { &hf_nfapi_ul_node_sync_t3, + { "UL Node Sync t3", "nfapi.ul.node.sync.t3", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "Offset from PNF SFN/SF 0/0 time reference of the UL Node Sync message transmission at the transport layer, in microseconds.", HFILL } + }, + { &hf_nfapi_pb, + { "P-B", "nfapi.pb.allocation", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Refers to downlink power allocation. Value is an index into the referenced table.", HFILL } + }, + { &hf_nfapi_timing_info_last_sfn_sf, + { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The completed SFN/SF at the PNF PHY instance that triggered the Timing Info message", HFILL } + }, + { &hf_nfapi_timing_info_time_since_last_timing_info, + { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The number of ms since the last Timing Info was sent from this PNF PHY instance.", HFILL } + }, + { &hf_nfapi_timing_info_dl_config_jitter, + { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The inter message jitter of the DL Config message reception in microseconds", HFILL } + }, + { &hf_nfapi_timing_info_tx_request_jitter, + { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The inter message jitter of the Tx Request message reception in microseconds", HFILL } + }, + { &hf_nfapi_timing_info_ul_config_jitter, + { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The inter message jitter of the UL Config message reception in microseconds", HFILL } + }, + { &hf_nfapi_timing_info_hi_dci0_jitter, + { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The inter message jitter of the HI_DCI0 message reception in microseconds", HFILL } + }, + { &hf_nfapi_timing_info_dl_config_latest_delay, + { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", + FT_INT32, BASE_DEC, NULL, 0x0, + "The latest delay offset in microseconds from the latest acceptable time for the DL Config as defined in the DL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_tx_request_latest_delay, + { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", + FT_INT32, BASE_DEC, NULL, 0x0, + "The latest delay offset in microseconds from the latest acceptable time for the Tx Request as defined in the Tx Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_ul_config_latest_delay, + { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", + FT_INT32, BASE_DEC, NULL, 0x0, + "The latest delay offset in microseconds from the latest acceptable time for the UL Config as defined in the UL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_hi_dci0_latest_delay, + { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", + FT_INT32, BASE_DEC, NULL, 0x0, + "The latest delay offset in microseconds from the latest acceptable time for the HI_DCI0 as defined in the HI_DCI0 Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_dl_config_earliest_arrival, + { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", + FT_INT32, BASE_DEC, NULL, 0x0, + "The earlierst arrival offset in microseconds from the latest time acceptable for the DL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_tx_request_earliest_arrival, + { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", + FT_INT32, BASE_DEC, NULL, 0x0, + "The earlierst arrival offset in microseconds from the latest time acceptable for the Tx Request as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_ul_config_earliest_arrival, + { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", + FT_INT32, BASE_DEC, NULL, 0x0, + "The earlierst arrival offset in microseconds from the latest time acceptable for the UL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, + { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", + FT_INT32, BASE_DEC, NULL, 0x0, + "The earlierst arrival offset in microseconds from the latest time acceptable for the HI_DCI0 as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } + }, + { &hf_nfapi_pcfich_power_offset, + { "PCFICH Power Offset", "nfapi.pcfich.power.offset", + FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, + "The power per antenna of the PCFICH with respect to the reference signal.", HFILL } + }, + { &hf_nfapi_timing_window, + { "NFAPI Timing window", "nfapi.timing.window", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The window in milliseconds that the PHY must receive and queue the P7 messages.", HFILL } + }, + { &hf_nfapi_timing_info_mode, + { "Timing Info mode", "nfapi.timing.info.mode", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The configured mode of operation for the timing info message to be sent to the VNF from the PHY", HFILL } + }, + { &hf_nfapi_timing_info_period, + { "Timing info period", "nfapi.timing.info.period", + FT_UINT8, BASE_DEC, NULL, 0x0, + "If Periodic timing mode is enabled, this defines the periodicity in subframes. This field is ignored if periodic timing mode is disabled.", HFILL } + }, + { &hf_nfapi_tdd_harq_mode, + { "Mode", "nfapi.tdd.harq.mode", + FT_UINT8, BASE_DEC, VALS(tdd_harq_mode_vals), 0x0, + "The format of the ACK/NACK response expected", HFILL } + }, + { &hf_nfapi_fdd_harq_mode, + { "Mode", "nfapi.fdd.harq.mode", + FT_UINT8, BASE_DEC, VALS(fdd_harq_mode_vals), 0x0, + "The format of the ACK/NACK response expected", HFILL } + }, + { &hf_nfapi_number_of_ack_nack, + { "Number of ACK/NACK", "nfapi.uint16.tag", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of ACK/NACK results reported for this UE", HFILL } + }, + { &hf_nfapi_harq_data_value_0, + { "Value 0", "nfapi.harq.value.0", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "Indicates HARQ results", HFILL } + }, + { &hf_nfapi_harq_data_value_0_special, + { "Value 0", "nfapi.harq.value.0.special", + FT_UINT8, BASE_DEC, VALS(harq_special_value_vals), 0x0, + "Indicates HARQ results", HFILL } + }, + { &hf_nfapi_harq_data_value_1, + { "Value 1", "nfapi.harq.value.1", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "Indicates HARQ results", HFILL } + }, + { &hf_nfapi_harq_data_value_2, + { "Value 2", "nfapi.harq.value.2", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "Indicates HARQ results", HFILL } + }, + { &hf_nfapi_harq_data_value_3, + { "Value 3", "nfapi.harq.value.3", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "Indicates HARQ results", HFILL } + }, + { &hf_nfapi_harq_tb_1, + { "HARQ TB1", "nfapi.harq.tb.", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "HARQ feedback of 1st TB.", HFILL } + }, + { &hf_nfapi_harq_tb_2, + { "HARQ TB2", "nfapi.harq.tb.2", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "HARQ feedback of 2nd TB.", HFILL } + }, + { &hf_nfapi_harq_tb_n, + { "HARQ TB_N", "nfapi.harq.tb.n", + FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, + "HARQ feedback of Nth TB.", HFILL } + }, + { &hf_nfapi_ul_cqi, + { "UL_CQI", "nfapi.ul.cqi", + FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, + "SNR", HFILL } + }, + { &hf_nfapi_channel, + { "Channel", "nfapi.channel", + FT_UINT8, BASE_DEC, VALS(channel_vals), 0x0, + "The channel to which this measurement refers", HFILL } + }, + { &hf_nfapi_data_offset, + { "Data Offset", "nfapi.data.offset", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Gives the PDU#i data address offset from the beginning of the 'Number of PDUs' field. An offset of 0 indicates a CRC or decoding error", HFILL } + }, + { &hf_nfapi_ri, + { "RI", "nfapi.ri", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The rank indication reported by the UE on PUSCH for aperiodic CSI.", HFILL } + }, + { &hf_nfapi_timing_advance, + { "Timing Advance", "nfapi.timing.advance", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The timing advance measured for this PDU and UE.", HFILL } + }, + { &hf_nfapi_timing_advance_r9, + { "Timing Advance R9", "nfapi.timing.advance.r9", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Timing advance used for positioning", HFILL } + }, + { &hf_nfapi_number_of_cc_reported, + { "Number of CC reported", "nfapi.number.of.cc.reported", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_preamble, + { "Preamble", "nfapi.preamble", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The detected preamble", HFILL } + }, + { &hf_nfapi_rach_resource_type, + { "RACH resource type", "nfapi.rach.resource.type", + FT_UINT8, BASE_DEC, VALS(rach_resource_type_vals), 0x0, + "Indicates if this indication is related to Cat-M UE and in which CE level", HFILL } + }, + { &hf_nfapi_doppler_estimation, + { "Doppler estimation", "nfapi.doppler.estimation", + FT_UINT16, BASE_DEC, NULL, 0x0, + "FFS", HFILL } + }, + { &hf_nfapi_rb_start, + { "RB Start", "nfapi.rb.start", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The starting point of the RBs to be reported", HFILL } + }, + { &hf_nfapi_snr, + { "SNR", "nfapi.snr", + FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, + "Field size dependent on configured bandwidth SNR for RBs, each RBs report one SNR.", HFILL } + }, + { &hf_nfapi_up_pts_symbol, + { "UpPTS Symbol", "nfapi.uppts.symbol", + FT_UINT8, BASE_DEC, VALS(up_pts_symbol_vals), 0x0, + "Indicates symbol where SRS was received. Only valid if the SRS was received in subframe 1 or 6.", HFILL } + }, + { &hf_nfapi_number_prb_per_subband, + { "numPRBperSubband", "nfapi.num.prb.per.subband", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of PRBs that are treated as one subband", HFILL } + }, + { &hf_nfapi_number_antennas, + { "numAntennas", "nfapi.num.antennas", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Number of physical antennas", HFILL } + }, + { &hf_nfapi_subband_index, + { "subbandIndex", "nfapi.subband.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Index of subband for which the following channel coefficient is applied", HFILL } + }, + { &hf_nfapi_channel_coefficient, + { "Channel", "nfapi.channel.coefficient", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Averaged channel coefficient in a subband for physical antenna #i, real 8 bits followed by imaginary 8 bits", HFILL } + }, + { &hf_nfapi_ul_rtoa, + { "UL_RTOA", "nfapi.ul.rtoa", + FT_UINT16, BASE_DEC, NULL, 0x0, + "UL relative time of arrival used for network based positioning", HFILL } + }, + { &hf_nfapi_frequency_band_indicator, + { "Frequency Band Indicator", "nfapi.frequency.band.indicator", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The E-UTRA band for which the carrierList applies.", HFILL } + }, + { &hf_nfapi_measurement_period, + { "Measurement Period", "nfapi.measurement.period", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The length of time to measure RSSI over, in units of 1ms.", HFILL } + }, + { &hf_nfapi_bandwidth, + { "Bandwidth", "nfapi.bandwidth", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The bandwidth (in resource blocks) over which the RSSI is measured.", HFILL } + }, + { &hf_nfapi_timeout, + { "Timeout", "nfapi.timeout", + FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The timeout value after which the PNF should abort the procedure in units of 1ms. The value of 0 indicates that the PNF should attempt to complete the procedure without any VNF-imposed timeout.", HFILL } + }, + { &hf_nfapi_number_of_earfcns, + { "Number of EARFCNs", "nfapi.number.of.earfcns", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of EARFCNs which should be measured. In the case that no EARFCN (value 0) is specified, all valid EARFCNs for the specified bandwidth in the band shall be measured, in order of ascending EARCFN.", HFILL } + }, + { &hf_nfapi_uarfcn, + { "UARFCN", "nfapi.uarfcn", + FT_UINT16, BASE_DEC, NULL, 0x0, + "UARFCN to be measured.", HFILL } + }, + { &hf_nfapi_number_of_uarfcns, + { "Number of UARFCNs", "nfapi.number.of.uarfcn", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of UARFCNs which should be measured. In the case that no UARFCN (value 0) is specified, all UARFCNs in the band shall be measured, in order of ascending UARCFN.", HFILL } + }, + { &hf_nfapi_arfcn, + { "ARFCN", "nfapi.arfcn", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The ARFCN to be measured", HFILL } + }, + { &hf_nfapi_arfcn_direction, + { "Direction", "nfapi.arfcn.direction", + FT_UINT8, BASE_DEC, VALS(arfcn_direction_vals), 0x0, + "The link direction to be measured", HFILL } + }, + { &hf_nfapi_number_of_arfcns, + { "Number of ARFCNs", "nfapi.number.of.arfcn", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of ARFCNs which should be measured. In the case that no ARFCN (value 0) is specified, all ARFCNs in the band shall be measured, in order of ascending ARCFN.", HFILL } + }, + { &hf_nfapi_rssi, + { "RSSI", "nfapi.rssi", + FT_INT16, BASE_CUSTOM, CF_FUNC(rssi_conversion_fn), 0x0, + "The list of RSSI values of the carriers measured, in the order of the list of the original request.", HFILL } + }, + { &hf_nfapi_number_of_rssi, + { "Number of RSSI", "nfapi.number.of.rssi", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of RSSI results returned in the following array.", HFILL } + }, + { &hf_nfapi_pci, + { "PCI", "nfapi.pci", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PCI for cell which should be searched", HFILL } + }, + { &hf_nfapi_measurement_bandwidth, + { "Measurement Bandwidth", "nfapi.measurement.bandwidth", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of resource blocks which should be used for measuring RSRP", HFILL } + }, + { &hf_nfapi_exhaustive_search, + { "Exhaustive Search", "nfapi.exhaustive.search", + FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, + "NMM should try to find all cells on the carrier", HFILL } + }, + { &hf_nfapi_number_of_pci, + { "Number of PCI", "nfapi.number.of.pci", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of cells in the PCI list. If 0 all cells on the carrier should be found. Otherwise, depending on exhaustiveSearch flag, only the given pciList is searched or the pciList is used for indicating a priority list. Range: 0 to MAX_PCI_LIST.", HFILL } + }, + { &hf_nfapi_psc, + { "PSC", "nfapi.psc", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The PSC for cells which should be searched.", HFILL } + }, + { &hf_nfapi_number_of_psc, + { "Number of PSC", "nfapi.number.of.psc", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of cells in the PSC list. If 0 all cells on the carrier should be found. Otherwise, depending on Exhaustive Search flag, only the given PSC list is searched or the PSC list is used for indicating a priority list. Range: 0 to MAX_PSC_LIST.", HFILL } + }, + { &hf_nfapi_rsrp, + { "RSRP", "nfapi.rsrp", + FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, + "The measured RSRP value in units of -1dB", HFILL } + }, + { &hf_nfapi_rsrq, + { "RSRQ", "nfapi.rsrq", + FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, + "The measured RSRQ value in units of -1dB", HFILL } + }, + { &hf_nfapi_number_of_lte_cells_found, + { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of LTE cells indicated in this message.", HFILL } + }, + { &hf_nfapi_rscp, + { "RSCP", "nfapi.rscp", + FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, + "The measured RSCP value in units of -1dB", HFILL } + }, + { &hf_nfapi_enco, + { "EcNo", "nfapi.ecno", + FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, + "The measured RSCP value in units of -1dB", HFILL } + }, + { &hf_nfapi_number_of_utran_cells_found, + { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of LTE cells indicated in this message", HFILL } + }, + { &hf_nfapi_bsic, + { "BSIC", "nfapi.bsic", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The BSIC of the cell which the NMM synchronized to", HFILL } + }, + { &hf_nfapi_rxlev, + { "RxLev", "nfapi.rxlev", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The measured RxLev value", HFILL } + }, + { &hf_nfapi_rxqual, + { "RxQual", "nfapi.rxqual", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The measured RxQual value", HFILL } + }, + { &hf_nfapi_sfn_offset, + { "SFN Offset", "nfapi.sfn.offset", + FT_UINT32, BASE_DEC, NULL, 0x0, + "The offset in us of the start of the current GSM Radio HyperFrame (i.e. FN=0) from the start of the preceding LTE Radio Frame of the PNF for SFN=0", HFILL } + }, + { &hf_nfapi_number_of_geran_cells_found, + { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The number of GSM cells indicated in this message", HFILL } + }, + { &hf_nfapi_number_of_tx_antenna, + { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of Tx Antenna detected for the cell", HFILL } + }, + { &hf_nfapi_mib_length, + { "MIB Length", "nfapi.mib.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Length in bytes of the following MIB array", HFILL } + }, + { &hf_nfapi_mib, + { "MIB", "nfapi.mib", + FT_BYTES, BASE_NONE, NULL, 0x0, + "The MIB read from the specified cell.", HFILL } + }, + { &hf_nfapi_phich_configuration, + { "PHICH Configuration", "nfapi.phich.configuration", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The PHICH-Config of the cell", HFILL } + }, + { &hf_nfapi_retry_count, + { "retryCount", "nfapi.retry.count", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of SIB1 repetition periods for which decoding of SIB1 should be retried.", HFILL } + }, + { &hf_nfapi_sib1, + { "SIB1", "nfapi.sib1", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_nfapi_si_periodicity, + { "SI Periodicity", "nfapi.si.periodicity", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The SI Periodicity of the requested SIBs, with the first element being for SIB2, the next for SIB3, etc, encoded as follows", HFILL } + }, + { &hf_nfapi_si_index, + { "SI Index", "nfapi.si.index", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The index of this SIB in the SIB1 SchedulingInfoList:", HFILL } + }, + { &hf_nfapi_number_of_si_periodicity, + { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The number of System Information periodicity values in the following array", HFILL } + }, + { &hf_nfapi_si_window_length, + { "SI Window Length", "nfapi.si.window.length", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The SI window in units of 1ms", HFILL } + }, + { &hf_nfapi_sib_type, + { "SIB Type", "nfapi.sib.type", + FT_UINT8, BASE_DEC, NULL, 0x0, + "The SIB type", HFILL } + }, + { &hf_nfapi_sib_len, + { "SIB Length", "nfapi.sib.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The length in bytes of the following SIB array", HFILL } + }, + { &hf_nfapi_sib, + { "SIB", "nfapi.sib", + FT_BYTES, BASE_NONE, NULL, 0x0, + "The SIB element read from the specified cell.", HFILL } + }, + { &hf_nfapi_si_len, + { "SI Length", "nfapi.si.length", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The length in bytes of the following SI array", HFILL } + }, + { &hf_nfapi_si, + { "SI", "nfapi.si", + FT_BYTES, BASE_NONE, NULL, 0x0, + "The SI element read from the specified cell.", HFILL } + }, + { &hf_nfapi_pnf_search_state, + { "State", "nfapi.state", + FT_BYTES, BASE_NONE, NULL, 0x0, + "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } + }, + { &hf_nfapi_pnf_broadcast_state, + { "State", "nfapi.state", + FT_BYTES, BASE_NONE, NULL, 0x0, + "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } + }, + { &hf_nfapi_dl_rs_tx_power, + { "DL RS Tx power", "nfapi.dl.rs.tx.power", + FT_UINT16, BASE_DEC, NULL, 0x0, + "The DL RS Tx power measurement", HFILL } + }, + { &hf_nfapi_received_interference_power, + { "Received interference power", "nfapi.received.interference.power", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The Received interference power measurement", HFILL } + }, + { &hf_nfapi_thermal_noise_power, + { "Thermal noise power", "nfapi.thermal.noise.power", + FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, + "The Thermal noise power measurement", HFILL } + }, + { &hf_nfapi_dl_rs_tx_power_measurement, + { "DL RS TX Power measurement", "nfapi.dl.rs.tx.power.measurement", + FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, + "The DL RS Tx power measurement defined", HFILL } + }, + { &hf_nfapi_received_interference_power_measurement, + { "Received interference power measurement", "nfapi.received.interference.power.measurement", + FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, + NULL, HFILL } + }, + { &hf_nfapi_thermal_noise_power_measurement, + { "Thermal noise power measurement", "nfapi.thermal.noise.power.measurement", + FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, + "The Thermal noise power measurement", HFILL } + }, + { &hf_nfapi_initial_partial_sf, + { "Initial Partial SF", "nfapi.initial.partial.sf", + FT_BOOLEAN, 32, TFS(&initial_partial_sf_strname), 0x0, + "Indicates whether the initial SF in the LBT process is full or partial", HFILL } + }, + { &hf_nfapi_lbt_mode, + { "LBT Mode", "nfapi.lbt.mode", + FT_BOOLEAN, 32, TFS(&lbt_mode_strname), 0x0, + "Part of multi-carrier support. Indicates whether full LBT process is carried or partial LBT process is carried (multi carrier mode B according to [9] section 15.1.5.2)", HFILL } + }, + { &hf_nfapi_lte_txop_sf, + { "LTE TXOP SF", "nfapi.txop.sf", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the LTE TXOP (TMCOT,P in [9] section 15.1.1) duration in subframes.", HFILL } + }, + { &hf_nfapi_mp_cca, + { "mp cca", "nfapi.mp.cca", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the value of the defer factor", HFILL } + }, + { &hf_nfapi_n_cca, + { "n cca", "nfapi.n.cca", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the value of LBT backoff counter", HFILL } + }, + { &hf_nfapi_offset, + { "offset", "nfapi.offset", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Indicates the LBT start time in microseconds from the beginning of the subframe scheduled by this message.", HFILL } + }, + { &hf_nfapi_result, + { "result", "nfapi.result", + FT_BOOLEAN, 32, TFS(&tfs_fail_success), 0x0, + "Indicates the LBT procedure result of SFN/SF:", HFILL } + }, + { &hf_nfapi_sfn_sf_end, + { "SFN/SF End", "nfapi.sfn.sf.end", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates the SFN/SF by which the DRS window (Discovery signal occasion as described in [9] section 6.11A) must end. In worst case, this would be the last TXOP subframe.", HFILL } + }, + { &hf_nfapi_txop_sfn_sf_end, + { "TXOP SFN/SF End", "nfapi.txop.sfn.sf.end", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Indicates the SFN/SF by which the TXOP must end. In worst case, this would be the last TXOP subframe.", HFILL } + }, + { &hf_nfapi_txop_symbols, + { "LTE TXOP symbols", "nfapi.lte.txop.symbols", + FT_UINT32, BASE_DEC, NULL, 0x0, + "Actual LTE TXOP in symbols", HFILL } + }, + }; + + /* Setup protocol subtree array */ + static gint *ett[] = + { + &ett_nfapi_message_tree, + &ett_nfapi_p4_p5_message_header, + &ett_nfapi_p7_message_header, + &ett_nfapi_tlv_tree, + &ett_nfapi_tl, + &ett_nfapi_pnf_phy_rf_config, + &ett_nfapi_pnf_phy, + &ett_nfapi_pnf_phy_rel10, + &ett_nfapi_pnf_phy_rel11, + &ett_nfapi_pnf_phy_rel12, + &ett_nfapi_pnf_phy_rel13, + &ett_nfapi_rf_bands, + &ett_nfapi_bf_vectors, + &ett_nfapi_csi_rs_bf_vector, + &ett_nfapi_csi_rs_resource_configs, + &ett_nfapi_tx_antenna_ports, + &ett_nfapi_harq_ack_nack_data, + &ett_nfapi_harq_data, + &ett_nfapi_cqi_pmi_size, + &ett_nfapi_cc, + &ett_nfapi_rbs, + &ett_nfapi_antennas, + &ett_nfapi_epdcch_prbs, + &ett_nfapi_dl_config_request_pdu_list, + &ett_nfapi_ul_config_request_pdu_list, + &ett_nfapi_hi_dci0_request_pdu_list, + &ett_nfapi_tx_request_pdu_list, + &ett_nfapi_rx_indication_pdu_list, + &ett_nfapi_harq_indication_pdu_list, + &ett_nfapi_crc_indication_pdu_list, + &ett_nfapi_sr_indication_pdu_list, + &ett_nfapi_cqi_indication_pdu_list, + &ett_nfapi_preamble_indication_pdu_list, + &ett_nfapi_srs_indication_pdu_list, + &ett_nfapi_lbt_dl_config_pdu_list, + &ett_nfapi_lbt_dl_indication_pdu_list, + &ett_nfapi_subbands, + &ett_nfapi_precoding, + &ett_nfapi_bf_vector_antennas, + &ett_nfapi_received_interference_power_mesurement_results, + &ett_nfapi_downlink_bandwidth_support, + &ett_nfapi_uplink_bandwidth_support, + &ett_nfapi_release_support, + &ett_nfapi_downlink_modulation_support, + &ett_nfapi_uplink_modulation_support, + + &ett_nfapi_earfcn_list, + &ett_nfapi_uarfcn_list, + &ett_nfapi_arfcn_list, + &ett_nfapi_rssi_list, + &ett_nfapi_pci_list, + &ett_nfapi_psc_list, + &ett_nfapi_lte_cells_found_list, + &ett_nfapi_utran_cells_found_list, + &ett_nfapi_geran_cells_found_list, + &ett_nfapi_si_periodicity_list, + + /* for fragmentation support*/ + &ett_msg_fragment, + &ett_msg_fragments + }; + + static ei_register_info ei[] = + { + { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_WARN, NULL, EXPFILL } }, + { &ei_invalid_tlv_length, { "nfapi.invalid.tlv.length", PI_PROTOCOL, PI_ERROR, NULL, EXPFILL } }, + }; + + expert_module_t* expert_nfapi; + /* Register protocol */ + proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); + + expert_nfapi = expert_register_protocol(proto_nfapi); + expert_register_field_array(expert_nfapi, ei, array_length(ei)); + + + proto_register_field_array(proto_nfapi, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); + reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); + + register_dissector("nfapi", dissect_nfapi, proto_nfapi); + +} + +// ----------------------------------------------------------------------------| + +void proto_reg_handoff_nfapi(void) +{ + static dissector_handle_t nfapi_handle; + + nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); + + dissector_add_for_decode_as("sctp.port", nfapi_handle); + + dissector_add_uint("udp.port", 41700, nfapi_handle); + +} + + +/* +* Editor modelines - http://www.wireshark.org/tools/modelines.html +* +* Local variables: +* c-basic-offset: 8 +* tab-width: 8 +* indent-tabs-mode: t +* End: +* +* vi: set shiftwidth=8 tabstop=8 noexpandtab: +* :indentSize=8:tabSize=8:noTabs=false: +*/ diff --git a/xml/pnf_phy_1_A.xml b/xml/pnf_phy_1_A.xml index da6cc26..45f8f46 100644 --- a/xml/pnf_phy_1_A.xml +++ b/xml/pnf_phy_1_A.xml @@ -26,7 +26,7 @@ <phy> <index>88</index> <port>2500</port> - <address>127.0.0.1</address> + <address>192.168.1.74</address> <duplex_mode>1</duplex_mode> @@ -54,9 +54,9 @@ <data> <udp> - <rx_port>7722</rx_port> - <tx_addr>127.0.0.1</tx_addr> - <tx_port>7733</tx_port> + <rx_port>5201</rx_port> + <tx_addr>192.168.1.28</tx_addr> + <tx_port>5200</tx_port> </udp> </data> </phy> diff --git a/xml/vnf_A.xml b/xml/vnf_A.xml index e609c93..3791239 100644 --- a/xml/vnf_A.xml +++ b/xml/vnf_A.xml @@ -2,8 +2,8 @@ <vnf> <vnf_p7_list> <vnf_p7> - <port>5200</port> - <address>127.0.0.1</address> + <port>5201</port> + <address>192.168.1.28</address> <timing_window>10</timing_window> <periodic_timing_enabled>0</periodic_timing_enabled> <periodic_timing_window>0</periodic_timing_window> @@ -12,7 +12,7 @@ <data> <udp> <rx_port>8891</rx_port> - <tx_addr>127.0.0.1</tx_addr> + <tx_addr>192.168.1.28</tx_addr> <tx_port>8892</tx_port> </udp> </data>