diff --git a/lib/include/srslte/common/pdu.h b/lib/include/srslte/common/pdu.h index 1dc514c35..b71650936 100644 --- a/lib/include/srslte/common/pdu.h +++ b/lib/include/srslte/common/pdu.h @@ -22,18 +22,18 @@ #ifndef SRSLTE_PDU_H #define SRSLTE_PDU_H -#include -#include "srslte/common/log.h" #include "srslte/common/interfaces_common.h" -#include +#include "srslte/common/log.h" +#include #include +#include -/* MAC PDU Packing/Unpacking functions. Section 6 of 36.321 */ +/* MAC PDU Packing/Unpacking functions. Section 6 of 36.321 */ class subh; -namespace srslte { - -template +namespace srslte { + +template class pdu { public: @@ -51,54 +51,56 @@ public: total_sdu_len(0) { } - - void fprint(FILE *stream) { + + void fprint(FILE* stream) + { fprintf(stream, "Number of Subheaders: %d\n", nof_subheaders); - for (int i=0;i 0) { nof_subheaders++; next(); - return true; + return true; } else { - return false; + return false; } } - bool next() { + bool next() + { if (cur_idx < nof_subheaders - 1) { cur_idx++; - return true; + return true; } else { - return false; + return false; } } - - void del_subh() { + + void del_subh() + { if (nof_subheaders > 0) { nof_subheaders--; } @@ -107,31 +109,27 @@ public: } } - SubH* get() { + SubH* get() + { if (cur_idx >= 0) { return &subheaders[cur_idx]; } else { - return NULL; + return NULL; } } - - bool is_ul() { - return pdu_is_ul; - } - - uint8_t* get_current_sdu_ptr() { - return &buffer_tx[total_sdu_len+sdu_offset_start]; - } - - void add_sdu(uint32_t sdu_sz) { - total_sdu_len += sdu_sz; - } + + bool is_ul() { return pdu_is_ul; } + + uint8_t* get_current_sdu_ptr() { return &buffer_tx[total_sdu_len + sdu_offset_start]; } + + void add_sdu(uint32_t sdu_sz) { total_sdu_len += sdu_sz; } // Section 6.1.2 - void parse_packet(uint8_t *ptr) { - uint8_t *init_ptr = ptr; - nof_subheaders = 0; - bool ret = false; + void parse_packet(uint8_t* ptr) + { + uint8_t* init_ptr = ptr; + nof_subheaders = 0; + bool ret = false; do { if (nof_subheaders < (int)max_subheaders) { ret = subheaders[nof_subheaders].read_subheader(&ptr); @@ -139,75 +137,69 @@ public: } } while (ret && (nof_subheaders + 1) < (int)max_subheaders); - for (int i=0;i subheaders; - uint32_t pdu_len; - uint32_t rem_len; - int cur_idx; - int nof_subheaders; - uint32_t max_subheaders; - bool pdu_is_ul; - uint8_t* buffer_tx; - uint32_t total_sdu_len; - uint32_t sdu_offset_start; - int last_sdu_idx; - - + uint32_t pdu_len; + uint32_t rem_len; + int cur_idx; + int nof_subheaders; + uint32_t max_subheaders; + bool pdu_is_ul; + uint8_t* buffer_tx; + uint32_t total_sdu_len; + uint32_t sdu_offset_start; + int last_sdu_idx; + /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ - virtual void init_(uint8_t *buffer_tx_ptr, uint32_t pdu_len_bytes, bool is_ulsch) { - nof_subheaders = 0; - pdu_len = pdu_len_bytes; - rem_len = pdu_len; - pdu_is_ul = is_ulsch; - buffer_tx = buffer_tx_ptr; - sdu_offset_start = max_subheaders*2 + 13; // Assuming worst-case 2 bytes per sdu subheader + all possible CE - total_sdu_len = 0; - last_sdu_idx = -1; + virtual void init_(uint8_t* buffer_tx_ptr, uint32_t pdu_len_bytes, bool is_ulsch) + { + nof_subheaders = 0; + pdu_len = pdu_len_bytes; + rem_len = pdu_len; + pdu_is_ul = is_ulsch; + buffer_tx = buffer_tx_ptr; + sdu_offset_start = max_subheaders * 2 + 13; // Assuming worst-case 2 bytes per sdu subheader + all possible CE + total_sdu_len = 0; + last_sdu_idx = -1; reset(); - for (uint32_t i=0;i +template class subh { public: - subh(){} - virtual ~subh(){} - - virtual bool read_subheader(uint8_t** ptr) = 0; - virtual void read_payload(uint8_t **ptr) = 0; - virtual void write_subheader(uint8_t** ptr, bool is_last) = 0; - virtual void write_payload(uint8_t **ptr) = 0; - virtual void fprint(FILE *stream) = 0; - - pdu* parent; + subh() {} + virtual ~subh() {} + + virtual bool read_subheader(uint8_t** ptr) = 0; + virtual void read_payload(uint8_t** ptr) = 0; + virtual void write_subheader(uint8_t** ptr, bool is_last) = 0; + virtual void write_payload(uint8_t** ptr) = 0; + virtual void fprint(FILE* stream) = 0; + + pdu* parent; + private: virtual void init() = 0; }; - class sch_subh : public subh { public: - sch_subh(subh_type type_ = SCH_SUBH_TYPE) { + sch_subh(subh_type type_ = SCH_SUBH_TYPE) + { lcid = 0; nof_bytes = 0; payload = NULL; @@ -219,53 +211,53 @@ public: bzero(&w_payload_ce, sizeof(w_payload_ce)); } - virtual ~sch_subh(){} + virtual ~sch_subh() {} /* 3GPP 36.321 (R.10) Combined Tables 6.2.1-1, 6.2.1-2, 6.2.1-4 */ typedef enum { /* Values of LCID for DL-SCH */ SCELL_ACTIVATION = 0b11011, - CON_RES_ID = 0b11100, - TA_CMD = 0b11101, - DRX_CMD = 0b11110, + CON_RES_ID = 0b11100, + TA_CMD = 0b11101, + DRX_CMD = 0b11110, /* Values of LCID for UL-SCH */ PHR_REPORT_EXT = 0b11001, - PHR_REPORT = 0b11010, - CRNTI = 0b11011, - TRUNC_BSR = 0b11100, - SHORT_BSR = 0b11101, - LONG_BSR = 0b11110, + PHR_REPORT = 0b11010, + CRNTI = 0b11011, + TRUNC_BSR = 0b11100, + SHORT_BSR = 0b11101, + LONG_BSR = 0b11110, /* Values of LCID for MCH */ - MTCH_MAX_LCID = 0b11100, + MTCH_MAX_LCID = 0b11100, MCH_SCHED_INFO = 0b11110, /*MTCH STOP Value*/ MTCH_STOP_EMPTY = 0b11111111111, /* Common */ PADDING = 0b11111, - SDU = 0b00000 + SDU = 0b00000 } cetype; // Size of MAC CEs - const static int MAC_CE_CONTRES_LEN = 6; + const static int MAC_CE_CONTRES_LEN = 6; // Reading functions bool is_sdu(); bool is_var_len_ce(); - cetype ce_type(); + cetype ce_type(); uint32_t size_plus_header(); void set_payload_size(uint32_t size); bool read_subheader(uint8_t** ptr); - void read_payload(uint8_t **ptr); + void read_payload(uint8_t** ptr); uint32_t get_sdu_lcid(); uint32_t get_payload_size(); uint32_t get_header_size(bool is_last); uint8_t* get_sdu_ptr(); - + uint16_t get_c_rnti(); uint64_t get_con_res_id(); uint8_t get_ta_cmd(); @@ -273,66 +265,62 @@ public: float get_phr(); int get_bsr(uint32_t buff_size[4]); - bool get_next_mch_sched_info(uint8_t *lcid, uint16_t *mtch_stop); - + bool get_next_mch_sched_info(uint8_t* lcid, uint16_t* mtch_stop); + // Writing functions void write_subheader(uint8_t** ptr, bool is_last); - void write_payload(uint8_t **ptr); + void write_payload(uint8_t** ptr); - int set_sdu(uint32_t lcid, uint32_t nof_bytes, uint8_t *payload); - int set_sdu(uint32_t lcid, uint32_t requested_bytes, read_pdu_interface *sdu_itf); - bool set_c_rnti(uint16_t crnti); - bool set_bsr(uint32_t buff_size[4], sch_subh::cetype format); - bool set_con_res_id(uint64_t con_res_id); - bool set_ta_cmd(uint8_t ta_cmd); - bool set_phr(float phr); - void set_padding(); - void set_padding(uint32_t padding_len); + int set_sdu(uint32_t lcid, uint32_t nof_bytes, uint8_t* payload); + int set_sdu(uint32_t lcid, uint32_t requested_bytes, read_pdu_interface* sdu_itf); + bool set_c_rnti(uint16_t crnti); + bool set_bsr(uint32_t buff_size[4], sch_subh::cetype format); + bool set_con_res_id(uint64_t con_res_id); + bool set_ta_cmd(uint8_t ta_cmd); + bool set_phr(float phr); + void set_padding(); + void set_padding(uint32_t padding_len); void init(); - void fprint(FILE *stream); - - bool set_next_mch_sched_info(uint8_t lcid, uint16_t mtch_stop); - - + void fprint(FILE* stream); + + bool set_next_mch_sched_info(uint8_t lcid, uint16_t mtch_stop); + protected: - static const int MAX_CE_PAYLOAD_LEN = 8; - uint32_t lcid; - int nof_bytes; - uint8_t* payload; - uint8_t w_payload_ce[64]; - uint8_t nof_mch_sched_ce; - uint8_t cur_mch_sched_ce; - bool F_bit; - subh_type type; + uint32_t lcid; + int nof_bytes; + uint8_t* payload; + uint8_t w_payload_ce[64]; + uint8_t nof_mch_sched_ce; + uint8_t cur_mch_sched_ce; + bool F_bit; + subh_type type; -private: - uint32_t sizeof_ce(uint32_t lcid, bool is_ul); +private: + uint32_t sizeof_ce(uint32_t lcid, bool is_ul); static uint8_t buff_size_table(uint32_t buffer_size); static uint8_t phr_report_table(float phr_value); }; - class sch_pdu : public pdu { public: - sch_pdu(uint32_t max_subh): pdu(max_subh) {} - - void parse_packet(uint8_t *ptr); - uint8_t* write_packet(); - uint8_t* write_packet(srslte::log *log_h); - bool has_space_ce(uint32_t nbytes, bool var_len=false); - bool has_space_sdu(uint32_t nbytes); - int get_pdu_len(); - int rem_size(); - int get_sdu_space(); - - static uint32_t size_header_sdu(uint32_t nbytes); - bool update_space_ce(uint32_t nbytes, bool var_len=false); - bool update_space_sdu(uint32_t nbytes); - void fprint(FILE *stream); + sch_pdu(uint32_t max_subh) : pdu(max_subh) {} + void parse_packet(uint8_t* ptr); + uint8_t* write_packet(); + uint8_t* write_packet(srslte::log* log_h); + bool has_space_ce(uint32_t nbytes, bool var_len = false); + bool has_space_sdu(uint32_t nbytes); + int get_pdu_len(); + int rem_size(); + int get_sdu_space(); + + static uint32_t size_header_sdu(uint32_t nbytes); + bool update_space_ce(uint32_t nbytes, bool var_len = false); + bool update_space_sdu(uint32_t nbytes); + void fprint(FILE* stream); }; class rar_subh : public subh @@ -340,7 +328,8 @@ class rar_subh : public subh public: typedef enum { BACKOFF = 0, RAPID } rar_subh_type_t; - rar_subh() { + rar_subh() + { bzero(&grant, sizeof(grant)); ta = 0; temp_rnti = 0; @@ -349,8 +338,8 @@ public: type = BACKOFF; } - static const uint32_t RAR_GRANT_LEN = 20; - + static const uint32_t RAR_GRANT_LEN = 20; + // Reading functions bool read_subheader(uint8_t** ptr); void read_payload(uint8_t** ptr); @@ -359,82 +348,79 @@ public: uint32_t get_ta_cmd(); uint16_t get_temp_crnti(); void get_sched_grant(uint8_t grant[RAR_GRANT_LEN]); - - // Writing functoins - void write_subheader(uint8_t** ptr, bool is_last); - void write_payload(uint8_t** ptr); - void set_rapid(uint32_t rapid); - void set_ta_cmd(uint32_t ta); - void set_temp_crnti(uint16_t temp_rnti); - void set_sched_grant(uint8_t grant[RAR_GRANT_LEN]); - - void init(); - void fprint(FILE *stream); -private: - uint8_t grant[RAR_GRANT_LEN]; - uint32_t ta; - uint16_t temp_rnti; - uint32_t preamble; + // Writing functoins + void write_subheader(uint8_t** ptr, bool is_last); + void write_payload(uint8_t** ptr); + void set_rapid(uint32_t rapid); + void set_ta_cmd(uint32_t ta); + void set_temp_crnti(uint16_t temp_rnti); + void set_sched_grant(uint8_t grant[RAR_GRANT_LEN]); + + void init(); + void fprint(FILE* stream); + +private: + uint8_t grant[RAR_GRANT_LEN]; + uint32_t ta; + uint16_t temp_rnti; + uint32_t preamble; rar_subh_type_t type; }; class rar_pdu : public pdu { public: - rar_pdu(uint32_t max_rars = 16); - - void set_backoff(uint8_t bi); - bool has_backoff(); - uint8_t get_backoff(); - - bool write_packet(uint8_t* ptr); - void fprint(FILE *stream); + + void set_backoff(uint8_t bi); + bool has_backoff(); + uint8_t get_backoff(); + + bool write_packet(uint8_t* ptr); + void fprint(FILE* stream); private: - bool has_backoff_indicator; - uint8_t backoff_indicator; + bool has_backoff_indicator; + uint8_t backoff_indicator; }; class mch_subh : public sch_subh { public: - mch_subh():sch_subh(MCH_SUBH_TYPE){} + mch_subh() : sch_subh(MCH_SUBH_TYPE) {} - // Size of MAC CEs - const static int MAC_CE_CONTRES_LEN = 6; + // Size of MAC CEs + const static int MAC_CE_CONTRES_LEN = 6; }; class mch_pdu : public sch_pdu { public: mch_pdu(uint32_t max_subh) : sch_pdu(max_subh) {} - -private: +private: /* Prepares the PDU for parsing or writing by setting the number of subheaders to 0 and the pdu length */ - virtual void init_(uint8_t *buffer_tx_ptr, uint32_t pdu_len_bytes, bool is_ulsch) { - nof_subheaders = 0; - pdu_len = pdu_len_bytes; - rem_len = pdu_len; - pdu_is_ul = is_ulsch; - buffer_tx = buffer_tx_ptr; - sdu_offset_start = max_subheaders*2 + 13; // Assuming worst-case 2 bytes per sdu subheader + all possible CE - total_sdu_len = 0; - last_sdu_idx = -1; + virtual void init_(uint8_t* buffer_tx_ptr, uint32_t pdu_len_bytes, bool is_ulsch) + { + nof_subheaders = 0; + pdu_len = pdu_len_bytes; + rem_len = pdu_len; + pdu_is_ul = is_ulsch; + buffer_tx = buffer_tx_ptr; + sdu_offset_start = max_subheaders * 2 + 13; // Assuming worst-case 2 bytes per sdu subheader + all possible CE + total_sdu_len = 0; + last_sdu_idx = -1; reset(); - for (uint32_t i=0;i -#include #include +#include +#include #include "srslte/common/pdu.h" #include "srslte/srslte.h" -// Table 6.1.3.1-1 Buffer size levels for BSR +// Table 6.1.3.1-1 Buffer size levels for BSR static uint32_t btable[64] = { - 0, 1, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91, 107, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826, 967, 1132, - 1326, 1552, 1817, 2127, 2490, 2915, 3413, 3995, 4667, 5476, 6411, 7505, 8787, 10287, 12043, 14099, 16507, 19325, 22624, 26487, 31009, 36304, - 42502, 49759, 58255, 68201, 79846, 93479, 109439, 128125, 150000}; - - + 0, 1, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, + 91, 107, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826, 967, + 1132, 1326, 1552, 1817, 2127, 2490, 2915, 3413, 3995, 4667, 5476, 6411, 7505, 8787, 10287, 12043, + 14099, 16507, 19325, 22624, 26487, 31009, 36304, 42502, 49759, 58255, 68201, 79846, 93479, 109439, 128125, 150000}; namespace srslte { @@ -42,36 +41,37 @@ void sch_pdu::fprint(FILE* stream) pdu::fprint(stream); } -void sch_pdu::parse_packet(uint8_t *ptr) +void sch_pdu::parse_packet(uint8_t* ptr) { pdu::parse_packet(ptr); - // Correct size for last SDU + // Correct size for last SDU if (nof_subheaders > 0) { - uint32_t read_len = 0; - for (int i=0;i= 0) { - subheaders[nof_subheaders-1].set_payload_size(n_sub); + subheaders[nof_subheaders - 1].set_payload_size(n_sub); } else { ERROR("Reading MAC PDU: negative payload for last subheader\n"); } } } -uint8_t* sch_pdu::write_packet() { +uint8_t* sch_pdu::write_packet() +{ return write_packet(NULL); } /* Writes the MAC PDU in the packet, including the MAC headers and CE payload. Section 6.1.2 */ -uint8_t* sch_pdu::write_packet(srslte::log *log_h) +uint8_t* sch_pdu::write_packet(srslte::log* log_h) { - int init_rem_len=rem_len; - sch_subh padding; + int init_rem_len = rem_len; + sch_subh padding; padding.set_padding(); if (nof_subheaders <= 0 && nof_subheaders < (int)max_subheaders) { @@ -81,45 +81,44 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h) if (init_rem_len < 0) { log_h->error("init_rem_len=%d\n", init_rem_len); - return NULL; + return NULL; } /* If last SDU has zero payload, remove it. FIXME: Why happens this?? */ - if (subheaders[nof_subheaders-1].get_payload_size() == 0) { + if (subheaders[nof_subheaders - 1].get_payload_size() == 0) { del_subh(); } - + /* Determine if we are transmitting CEs only. */ - bool ce_only = last_sdu_idx<0?true:false; - + bool ce_only = last_sdu_idx < 0 ? true : false; + /* Determine if we will need multi-byte padding or 1/2 bytes padding */ - bool multibyte_padding = false; - uint32_t onetwo_padding = 0; + bool multibyte_padding = false; + uint32_t onetwo_padding = 0; if (rem_len > 2) { - multibyte_padding = true; - // Add 1 header for padding - rem_len--; + multibyte_padding = true; + // Add 1 header for padding + rem_len--; // Add the header for the last SDU if (!ce_only) { - rem_len -= (subheaders[last_sdu_idx].get_header_size(false)-1); // Becuase we were assuming it was the one + rem_len -= (subheaders[last_sdu_idx].get_header_size(false) - 1); // Becuase we were assuming it was the one } } else if (rem_len > 0) { - onetwo_padding = rem_len; - rem_len = 0; + onetwo_padding = rem_len; + rem_len = 0; } - /* Determine the header size and CE payload size */ - uint32_t header_sz = 0; - uint32_t ce_payload_sz = 0; - for (int i=0;i 0) { - bzero(&pdu_start_ptr[pdu_len-rem_len], rem_len*sizeof(uint8_t)); + bzero(&pdu_start_ptr[pdu_len - rem_len], rem_len * sizeof(uint8_t)); } /* Sanity check and print if error */ if (log_h) { - log_h->debug("Wrote PDU: pdu_len=%d, header_and_ce=%d (%d+%d), nof_subh=%d, last_sdu=%d, sdu_len=%d, onepad=%d, multi=%d\n", - pdu_len, header_sz+ce_payload_sz, header_sz, ce_payload_sz, - nof_subheaders, last_sdu_idx, total_sdu_len, onetwo_padding, rem_len); + log_h->debug( + "Wrote PDU: pdu_len=%d, header_and_ce=%d (%d+%d), nof_subh=%d, last_sdu=%d, sdu_len=%d, onepad=%d, multi=%d\n", + pdu_len, + header_sz + ce_payload_sz, + header_sz, + ce_payload_sz, + nof_subheaders, + last_sdu_idx, + total_sdu_len, + onetwo_padding, + rem_len); } else { - printf("Wrote PDU: pdu_len=%d, header_and_ce=%d (%d+%d), nof_subh=%d, last_sdu=%d, sdu_len=%d, onepad=%d, multi=%d, init_rem_len=%d\n", - pdu_len, header_sz+ce_payload_sz, header_sz, ce_payload_sz, - nof_subheaders, last_sdu_idx, total_sdu_len, onetwo_padding, rem_len, init_rem_len); + printf("Wrote PDU: pdu_len=%d, header_and_ce=%d (%d+%d), nof_subh=%d, last_sdu=%d, sdu_len=%d, onepad=%d, " + "multi=%d, init_rem_len=%d\n", + pdu_len, + header_sz + ce_payload_sz, + header_sz, + ce_payload_sz, + nof_subheaders, + last_sdu_idx, + total_sdu_len, + onetwo_padding, + rem_len, + init_rem_len); } if (rem_len + header_sz + ce_payload_sz + total_sdu_len != pdu_len) { @@ -217,35 +233,36 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h) rem_len, init_rem_len); } - - return NULL; + + return NULL; } - if ((int)(header_sz + ce_payload_sz) != (int) (ptr - pdu_start_ptr)) { + if ((int)(header_sz + ce_payload_sz) != (int)(ptr - pdu_start_ptr)) { ERROR("Expected a header and CE payload of %d bytes but wrote %d\n", header_sz + ce_payload_sz, (int)(ptr - pdu_start_ptr)); return NULL; } - - return pdu_start_ptr; + + return pdu_start_ptr; } -int sch_pdu::rem_size() { - return rem_len; +int sch_pdu::rem_size() +{ + return rem_len; } int sch_pdu::get_pdu_len() { - return pdu_len; + return pdu_len; } uint32_t sch_pdu::size_header_sdu(uint32_t nbytes) { if (nbytes < 128) { - return 2; + return 2; } else { - return 3; + return 3; } } @@ -253,9 +270,9 @@ bool sch_pdu::has_space_ce(uint32_t nbytes, bool var_len) { uint32_t head_len = var_len ? size_header_sdu(nbytes) : 1; if (rem_len >= nbytes + head_len) { - return true; + return true; } else { - return false; + return false; } } @@ -263,10 +280,10 @@ bool sch_pdu::update_space_ce(uint32_t nbytes, bool var_len) { uint32_t head_len = var_len ? size_header_sdu(nbytes) : 1; if (has_space_ce(nbytes)) { - rem_len -= nbytes + head_len; - return true; + rem_len -= nbytes + head_len; + return true; } else { - return false; + return false; } } @@ -283,12 +300,12 @@ bool sch_pdu::has_space_sdu(uint32_t nbytes) bool sch_pdu::update_space_sdu(uint32_t nbytes) { - int init_rem = rem_len; + int init_rem = rem_len; if (has_space_sdu(nbytes)) { if (last_sdu_idx < 0) { - rem_len -= (nbytes+1); + rem_len -= (nbytes + 1); } else { - rem_len -= (nbytes+1 + (size_header_sdu(subheaders[last_sdu_idx].get_payload_size())-1)); + rem_len -= (nbytes + 1 + (size_header_sdu(subheaders[last_sdu_idx].get_payload_size()) - 1)); } last_sdu_idx = cur_idx; return true; @@ -299,13 +316,13 @@ bool sch_pdu::update_space_sdu(uint32_t nbytes) int sch_pdu::get_sdu_space() { - int ret; + int ret; if (last_sdu_idx < 0) { ret = rem_len - 1; } else { - ret = rem_len - (size_header_sdu(subheaders[last_sdu_idx].get_payload_size())-1) - 1; + ret = rem_len - (size_header_sdu(subheaders[last_sdu_idx].get_payload_size()) - 1) - 1; } - return ret; + return ret; } void sch_subh::init() @@ -322,19 +339,21 @@ sch_subh::cetype sch_subh::ce_type() if (lcid >= PHR_REPORT && type == SCH_SUBH_TYPE) { return (cetype)lcid; } - if(lcid >= MCH_SCHED_INFO && type == MCH_SUBH_TYPE) { + if (lcid >= MCH_SCHED_INFO && type == MCH_SUBH_TYPE) { return (cetype)lcid; } return (cetype)SDU; } -void sch_subh::set_payload_size(uint32_t size) { - nof_bytes = size; +void sch_subh::set_payload_size(uint32_t size) +{ + nof_bytes = size; } -uint32_t sch_subh::size_plus_header() { +uint32_t sch_subh::size_plus_header() +{ if (is_sdu() || is_var_len_ce()) { - return sch_pdu::size_header_sdu(nof_bytes) + nof_bytes; + return sch_pdu::size_header_sdu(nof_bytes) + nof_bytes; } // All others are 1-byte headers return 1 + nof_bytes; @@ -344,7 +363,7 @@ uint32_t sch_subh::sizeof_ce(uint32_t lcid, bool is_ul) { if (type == SCH_SUBH_TYPE) { if (is_ul) { - switch(lcid) { + switch (lcid) { case PHR_REPORT: return 1; case CRNTI: @@ -359,7 +378,7 @@ uint32_t sch_subh::sizeof_ce(uint32_t lcid, bool is_ul) return 0; } } else { - switch(lcid) { + switch (lcid) { case CON_RES_ID: return 6; case TA_CMD: @@ -375,10 +394,10 @@ uint32_t sch_subh::sizeof_ce(uint32_t lcid, bool is_ul) } if (type == MCH_SUBH_TYPE) { switch (lcid) { - case MCH_SCHED_INFO: - return nof_mch_sched_ce*2; - case PADDING: - return 0; + case MCH_SCHED_INFO: + return nof_mch_sched_ce * 2; + case PADDING: + return 0; } } return 0; @@ -397,30 +416,31 @@ bool sch_subh::is_var_len_ce() uint16_t sch_subh::get_c_rnti() { if (payload) { - return (uint16_t) payload[0]<<8 | payload[1]; + return (uint16_t)payload[0] << 8 | payload[1]; } else { - return (uint16_t) w_payload_ce[0]<<8 | w_payload_ce[1]; + return (uint16_t)w_payload_ce[0] << 8 | w_payload_ce[1]; } } uint64_t sch_subh::get_con_res_id() { if (payload) { - return ((uint64_t) payload[5]) | (((uint64_t) payload[4])<<8) | (((uint64_t) payload[3])<<16) | (((uint64_t) payload[2])<<24) | - (((uint64_t) payload[1])<<32) | (((uint64_t) payload[0])<<40); + return ((uint64_t)payload[5]) | (((uint64_t)payload[4]) << 8) | (((uint64_t)payload[3]) << 16) | + (((uint64_t)payload[2]) << 24) | (((uint64_t)payload[1]) << 32) | (((uint64_t)payload[0]) << 40); } else { - return ((uint64_t) w_payload_ce[5]) | (((uint64_t) w_payload_ce[4])<<8) | (((uint64_t) w_payload_ce[3])<<16) | (((uint64_t) w_payload_ce[2])<<24) | - (((uint64_t) w_payload_ce[1])<<32) | (((uint64_t) w_payload_ce[0])<<40); - return 0; + return ((uint64_t)w_payload_ce[5]) | (((uint64_t)w_payload_ce[4]) << 8) | (((uint64_t)w_payload_ce[3]) << 16) | + (((uint64_t)w_payload_ce[2]) << 24) | (((uint64_t)w_payload_ce[1]) << 32) | + (((uint64_t)w_payload_ce[0]) << 40); + return 0; } } float sch_subh::get_phr() { if (payload) { - return (float) (payload[0]&0x3f) - 23; + return (float)(payload[0] & 0x3f) - 23; } else { - return (float) (w_payload_ce[0]&0x3f) - 23; + return (float)(w_payload_ce[0] & 0x3f) - 23; } } @@ -428,19 +448,19 @@ int sch_subh::get_bsr(uint32_t buff_size[4]) { if (payload) { uint32_t nonzero_lcg = 0; - if (ce_type()==LONG_BSR) { - buff_size[0] = (payload[0]&0xFC) >> 2; - buff_size[1] = (payload[0]&0x03) << 4 | (payload[1]&0xF0) >> 4; - buff_size[2] = (payload[1]&0x0F) << 4 | (payload[1]&0xC0) >> 6; - buff_size[3] = (payload[2]&0x3F); + if (ce_type() == LONG_BSR) { + buff_size[0] = (payload[0] & 0xFC) >> 2; + buff_size[1] = (payload[0] & 0x03) << 4 | (payload[1] & 0xF0) >> 4; + buff_size[2] = (payload[1] & 0x0F) << 4 | (payload[1] & 0xC0) >> 6; + buff_size[3] = (payload[2] & 0x3F); } else { - nonzero_lcg = (payload[0]&0xc0) >> 6; - buff_size[nonzero_lcg%4] = payload[0]&0x3f; + nonzero_lcg = (payload[0] & 0xc0) >> 6; + buff_size[nonzero_lcg % 4] = payload[0] & 0x3f; } - for (int i=0;i<4;i++) { + for (int i = 0; i < 4; i++) { if (buff_size[i]) { - if (buff_size[i]<63) { - buff_size[i] = btable[1+buff_size[i]]; + if (buff_size[i] < 63) { + buff_size[i] = btable[1 + buff_size[i]]; } else { buff_size[i] = btable[63]; } @@ -448,23 +468,21 @@ int sch_subh::get_bsr(uint32_t buff_size[4]) } return nonzero_lcg; } else { - return -1; + return -1; } } -bool sch_subh::get_next_mch_sched_info(uint8_t *lcid_, uint16_t *mtch_stop) +bool sch_subh::get_next_mch_sched_info(uint8_t* lcid_, uint16_t* mtch_stop) { uint16_t mtch_stop_ce; - if(payload) { - nof_mch_sched_ce = nof_bytes/2; + if (payload) { + nof_mch_sched_ce = nof_bytes / 2; if (cur_mch_sched_ce < nof_mch_sched_ce) { - *lcid_ = (payload[cur_mch_sched_ce * 2] & 0xF8) >> 3; + *lcid_ = (payload[cur_mch_sched_ce * 2] & 0xF8) >> 3; mtch_stop_ce = ((uint16_t)(payload[cur_mch_sched_ce * 2] & 0x07)) << 8; mtch_stop_ce += payload[cur_mch_sched_ce * 2 + 1]; cur_mch_sched_ce++; - *mtch_stop = (mtch_stop_ce == srslte::mch_subh::MTCH_STOP_EMPTY) - ? (0) - : (mtch_stop_ce); + *mtch_stop = (mtch_stop_ce == srslte::mch_subh::MTCH_STOP_EMPTY) ? (0) : (mtch_stop_ce); return true; } } @@ -474,7 +492,7 @@ bool sch_subh::get_next_mch_sched_info(uint8_t *lcid_, uint16_t *mtch_stop) uint8_t sch_subh::get_ta_cmd() { if (payload) { - return (uint8_t) payload[0]&0x3f; + return (uint8_t)payload[0] & 0x3f; } else { return 0; } @@ -495,14 +513,14 @@ uint32_t sch_subh::get_sdu_lcid() return lcid; } - uint32_t sch_subh::get_payload_size() { return nof_bytes; } -uint32_t sch_subh::get_header_size(bool is_last) { +uint32_t sch_subh::get_header_size(bool is_last) +{ if (!is_last) { if (is_sdu()) { return sch_pdu::size_header_sdu(nof_bytes); @@ -523,8 +541,8 @@ uint8_t* sch_subh::get_sdu_ptr() void sch_subh::set_padding(uint32_t padding_len) { - lcid = PADDING; - nof_bytes = padding_len; + lcid = PADDING; + nof_bytes = padding_len; } void sch_subh::set_padding() @@ -534,93 +552,91 @@ void sch_subh::set_padding() bool sch_subh::set_bsr(uint32_t buff_size[4], sch_subh::cetype format) { - uint32_t nonzero_lcg=0; - for (int i=0;i<4;i++) { + uint32_t nonzero_lcg = 0; + for (int i = 0; i < 4; i++) { if (buff_size[i]) { - nonzero_lcg=i; + nonzero_lcg = i; } } - uint32_t ce_size = format==LONG_BSR?3:1; + uint32_t ce_size = format == LONG_BSR ? 3 : 1; if (((sch_pdu*)parent)->has_space_ce(ce_size)) { - if (format==LONG_BSR) { - w_payload_ce[0] = (buff_size_table(buff_size[0])&0x3f) << 2 | (buff_size_table(buff_size[1])&0xc0)>>6; - w_payload_ce[1] = (buff_size_table(buff_size[1])&0xf) << 4 | (buff_size_table(buff_size[2])&0xf0)>>4; - w_payload_ce[2] = (buff_size_table(buff_size[2])&0x3) << 6 | (buff_size_table(buff_size[3])&0x3f); + if (format == LONG_BSR) { + w_payload_ce[0] = (buff_size_table(buff_size[0]) & 0x3f) << 2 | (buff_size_table(buff_size[1]) & 0xc0) >> 6; + w_payload_ce[1] = (buff_size_table(buff_size[1]) & 0xf) << 4 | (buff_size_table(buff_size[2]) & 0xf0) >> 4; + w_payload_ce[2] = (buff_size_table(buff_size[2]) & 0x3) << 6 | (buff_size_table(buff_size[3]) & 0x3f); } else { - w_payload_ce[0] = (nonzero_lcg&0x3)<<6 | (buff_size_table(buff_size[nonzero_lcg])&0x3f); + w_payload_ce[0] = (nonzero_lcg & 0x3) << 6 | (buff_size_table(buff_size[nonzero_lcg]) & 0x3f); } lcid = format; ((sch_pdu*)parent)->update_space_ce(ce_size); nof_bytes = ce_size; - return true; + return true; } else { - return false; - } + return false; + } } bool sch_subh::set_c_rnti(uint16_t crnti) { if (((sch_pdu*)parent)->has_space_ce(2)) { - w_payload_ce[0] = (uint8_t) ((crnti&0xff00)>>8); - w_payload_ce[1] = (uint8_t) ((crnti&0x00ff)); - lcid = CRNTI; + w_payload_ce[0] = (uint8_t)((crnti & 0xff00) >> 8); + w_payload_ce[1] = (uint8_t)((crnti & 0x00ff)); + lcid = CRNTI; ((sch_pdu*)parent)->update_space_ce(2); - nof_bytes = 2; - return true; + nof_bytes = 2; + return true; } else { - return false; + return false; } } bool sch_subh::set_con_res_id(uint64_t con_res_id) { if (((sch_pdu*)parent)->has_space_ce(6)) { - w_payload_ce[0] = (uint8_t) ((con_res_id&0xff0000000000)>>40); - w_payload_ce[1] = (uint8_t) ((con_res_id&0x00ff00000000)>>32); - w_payload_ce[2] = (uint8_t) ((con_res_id&0x0000ff000000)>>24); - w_payload_ce[3] = (uint8_t) ((con_res_id&0x000000ff0000)>>16); - w_payload_ce[4] = (uint8_t) ((con_res_id&0x00000000ff00)>>8); - w_payload_ce[5] = (uint8_t) ((con_res_id&0x0000000000ff)); - lcid = CON_RES_ID; + w_payload_ce[0] = (uint8_t)((con_res_id & 0xff0000000000) >> 40); + w_payload_ce[1] = (uint8_t)((con_res_id & 0x00ff00000000) >> 32); + w_payload_ce[2] = (uint8_t)((con_res_id & 0x0000ff000000) >> 24); + w_payload_ce[3] = (uint8_t)((con_res_id & 0x000000ff0000) >> 16); + w_payload_ce[4] = (uint8_t)((con_res_id & 0x00000000ff00) >> 8); + w_payload_ce[5] = (uint8_t)((con_res_id & 0x0000000000ff)); + lcid = CON_RES_ID; ((sch_pdu*)parent)->update_space_ce(6); - nof_bytes = 6; - return true; + nof_bytes = 6; + return true; } else { - return false; + return false; } } bool sch_subh::set_phr(float phr) { if (((sch_pdu*)parent)->has_space_ce(1)) { - w_payload_ce[0] = phr_report_table(phr)&0x3f; - lcid = PHR_REPORT; + w_payload_ce[0] = phr_report_table(phr) & 0x3f; + lcid = PHR_REPORT; ((sch_pdu*)parent)->update_space_ce(1); - nof_bytes = 1; - return true; + nof_bytes = 1; + return true; } else { - return false; + return false; } } bool sch_subh::set_ta_cmd(uint8_t ta_cmd) { if (((sch_pdu*)parent)->has_space_ce(1)) { - w_payload_ce[0] = ta_cmd&0x3f; - lcid = TA_CMD; + w_payload_ce[0] = ta_cmd & 0x3f; + lcid = TA_CMD; ((sch_pdu*)parent)->update_space_ce(1); - nof_bytes = 1; - return true; + nof_bytes = 1; + return true; } else { - return false; + return false; } } bool sch_subh::set_next_mch_sched_info(uint8_t lcid_, uint16_t mtch_stop) { if (((sch_pdu*)parent)->has_space_ce(2, true)) { - uint16_t mtch_stop_ce = - (mtch_stop) ? (mtch_stop) : (srslte::mch_subh::MTCH_STOP_EMPTY); - w_payload_ce[nof_mch_sched_ce * 2] = - (lcid_ & 0x1F) << 3 | (uint8_t)((mtch_stop_ce & 0x0700) >> 8); + uint16_t mtch_stop_ce = (mtch_stop) ? (mtch_stop) : (srslte::mch_subh::MTCH_STOP_EMPTY); + w_payload_ce[nof_mch_sched_ce * 2] = (lcid_ & 0x1F) << 3 | (uint8_t)((mtch_stop_ce & 0x0700) >> 8); w_payload_ce[nof_mch_sched_ce * 2 + 1] = (uint8_t)(mtch_stop_ce & 0xff); nof_mch_sched_ce++; lcid = MCH_SCHED_INFO; @@ -631,76 +647,74 @@ bool sch_subh::set_next_mch_sched_info(uint8_t lcid_, uint16_t mtch_stop) return false; } -int sch_subh::set_sdu(uint32_t lcid_, uint32_t requested_bytes, read_pdu_interface *sdu_itf) +int sch_subh::set_sdu(uint32_t lcid_, uint32_t requested_bytes, read_pdu_interface* sdu_itf) { if (((sch_pdu*)parent)->has_space_sdu(requested_bytes)) { lcid = lcid_; - + payload = ((sch_pdu*)parent)->get_current_sdu_ptr(); - // Copy data and get final number of bytes written to the MAC PDU + // Copy data and get final number of bytes written to the MAC PDU int sdu_sz = sdu_itf->read_pdu(lcid, payload, requested_bytes); - + if (sdu_sz < 0) { return -1; - } - if (sdu_sz == 0) { - return 0; } - else { + if (sdu_sz == 0) { + return 0; + } else { // Save final number of written bytes nof_bytes = sdu_sz; - if(nof_bytes > (int32_t)requested_bytes) { - return -1; + if (nof_bytes > (int32_t)requested_bytes) { + return -1; } } ((sch_pdu*)parent)->add_sdu(nof_bytes); ((sch_pdu*)parent)->update_space_sdu(nof_bytes); - return nof_bytes; + return nof_bytes; } else { - return -1; + return -1; } } -int sch_subh::set_sdu(uint32_t lcid_, uint32_t nof_bytes_, uint8_t *payload) +int sch_subh::set_sdu(uint32_t lcid_, uint32_t nof_bytes_, uint8_t* payload) { if (((sch_pdu*)parent)->has_space_sdu(nof_bytes_)) { lcid = lcid_; - + memcpy(((sch_pdu*)parent)->get_current_sdu_ptr(), payload, nof_bytes_); - + ((sch_pdu*)parent)->add_sdu(nof_bytes_); ((sch_pdu*)parent)->update_space_sdu(nof_bytes_); nof_bytes = nof_bytes_; - return (int) nof_bytes; + return (int)nof_bytes; } else { - return -1; + return -1; } } - // Section 6.2.1 void sch_subh::write_subheader(uint8_t** ptr, bool is_last) { - *(*ptr) = (uint8_t) (is_last?0:(1<<5)) | ((uint8_t) lcid & 0x1f); + *(*ptr) = (uint8_t)(is_last ? 0 : (1 << 5)) | ((uint8_t)lcid & 0x1f); *ptr += 1; if (is_sdu() || is_var_len_ce()) { // MAC SDU: R/R/E/LCID/F/L subheader // 2nd and 3rd octet if (!is_last) { if (nof_bytes >= 128) { - *(*ptr) = (uint8_t) 1<<7 | ((nof_bytes & 0x7f00) >> 8); + *(*ptr) = (uint8_t)1 << 7 | ((nof_bytes & 0x7f00) >> 8); *ptr += 1; - *(*ptr) = (uint8_t) (nof_bytes & 0xff); + *(*ptr) = (uint8_t)(nof_bytes & 0xff); *ptr += 1; } else { - *(*ptr) = (uint8_t) (nof_bytes & 0x7f); - *ptr += 1; - } + *(*ptr) = (uint8_t)(nof_bytes & 0x7f); + *ptr += 1; + } } - } + } } void sch_subh::write_payload(uint8_t** ptr) @@ -709,7 +723,7 @@ void sch_subh::write_payload(uint8_t** ptr) // SDU is written directly during subheader creation } else { nof_bytes = sizeof_ce(lcid, parent->is_ul()); - memcpy(*ptr, w_payload_ce, nof_bytes*sizeof(uint8_t)); + memcpy(*ptr, w_payload_ce, nof_bytes * sizeof(uint8_t)); } *ptr += nof_bytes; } @@ -717,31 +731,31 @@ void sch_subh::write_payload(uint8_t** ptr) bool sch_subh::read_subheader(uint8_t** ptr) { // Skip R - bool e_bit = (bool) (*(*ptr) & 0x20)?true:false; - lcid = (uint8_t) *(*ptr) & 0x1f; + bool e_bit = (bool)(*(*ptr) & 0x20) ? true : false; + lcid = (uint8_t) * (*ptr) & 0x1f; *ptr += 1; if (is_sdu() || is_var_len_ce()) { if (e_bit) { - F_bit = (bool) (*(*ptr) & 0x80)?true:false; - nof_bytes = (uint32_t)*(*ptr) & 0x7f; + F_bit = (bool)(*(*ptr) & 0x80) ? true : false; + nof_bytes = (uint32_t) * (*ptr) & 0x7f; *ptr += 1; if (F_bit) { - nof_bytes = nof_bytes<<8 | ((uint32_t) *(*ptr) & 0xff); + nof_bytes = nof_bytes << 8 | ((uint32_t) * (*ptr) & 0xff); *ptr += 1; } } else { - nof_bytes = 0; - F_bit = 0; + nof_bytes = 0; + F_bit = 0; } } else { - nof_bytes = sizeof_ce(lcid, parent->is_ul()); + nof_bytes = sizeof_ce(lcid, parent->is_ul()); } return e_bit; } void sch_subh::read_payload(uint8_t** ptr) { - payload = *ptr; + payload = *ptr; *ptr += nof_bytes; } @@ -751,7 +765,7 @@ void sch_subh::fprint(FILE* stream) fprintf(stream, "SDU LCHID=%d, SDU nof_bytes=%d\n", lcid, nof_bytes); } else if (type == SCH_SUBH_TYPE) { if (parent->is_ul()) { - switch(lcid) { + switch (lcid) { case CRNTI: fprintf(stream, "C-RNTI CE\n"); break; @@ -771,7 +785,7 @@ void sch_subh::fprint(FILE* stream) fprintf(stream, "PADDING\n"); } } else { - switch(lcid) { + switch (lcid) { case CON_RES_ID: fprintf(stream, "Contention Resolution ID CE: 0x%lx\n", get_con_res_id()); break; @@ -786,7 +800,7 @@ void sch_subh::fprint(FILE* stream) } } } else if (type == MCH_SUBH_TYPE) { - switch(lcid) { + switch (lcid) { case MCH_SCHED_INFO: fprintf(stream, "MCH Scheduling Info CE\n"); break; @@ -796,43 +810,44 @@ void sch_subh::fprint(FILE* stream) } } -uint8_t sch_subh::buff_size_table(uint32_t buffer_size) { +uint8_t sch_subh::buff_size_table(uint32_t buffer_size) +{ if (buffer_size == 0) { - return 0; + return 0; } else if (buffer_size > 150000) { return 63; } else { - for (int i=0;i<61;i++) { - if (buffer_size < btable[i+2]) { - return 1+i; - } + for (int i = 0; i < 61; i++) { + if (buffer_size < btable[i + 2]) { + return 1 + i; + } } - return 62; + return 62; } } - + // Implements Table 9.1.8.4-1 Power headroom report mapping (36.133) uint8_t sch_subh::phr_report_table(float phr_value) { if (phr_value < -23) { - phr_value = -23; + phr_value = -23; } if (phr_value > 40) { phr_value = 40; } - return (uint8_t) floor(phr_value+23); + return (uint8_t)floor(phr_value + 23); } void rar_pdu::fprint(FILE* stream) { fprintf(stream, "MAC PDU for RAR. "); - pdu::fprint(stream); -} + pdu::fprint(stream); +} rar_pdu::rar_pdu(uint32_t max_rars_) : pdu(max_rars_) { backoff_indicator = 0; - has_backoff_indicator = false; + has_backoff_indicator = false; } uint8_t rar_pdu::get_backoff() @@ -847,16 +862,16 @@ bool rar_pdu::has_backoff() void rar_pdu::set_backoff(uint8_t bi) { - has_backoff_indicator = true; - backoff_indicator = bi; + has_backoff_indicator = true; + backoff_indicator = bi; } // Section 6.1.5 bool rar_pdu::write_packet(uint8_t* ptr) { - // Write Backoff Indicator, if any + // Write Backoff Indicator, if any if (has_backoff_indicator) { - *(ptr) = backoff_indicator&0xf; + *(ptr) = backoff_indicator & 0xf; if (nof_subheaders > 0) { *(ptr) |= 1 << 7; } @@ -864,17 +879,17 @@ bool rar_pdu::write_packet(uint8_t* ptr) } // Write RAR subheaders - for (int i=0;i>4); - *(*ptr + 1) = (uint8_t) ((ta&0xf) <<4) | (grant[0]<<3) | (grant[1]<<2) | (grant[2]<<1) | grant[3]; - uint8_t *x = &grant[4]; - *(*ptr + 2) = (uint8_t) srslte_bit_pack(&x, 8); - *(*ptr + 3) = (uint8_t) srslte_bit_pack(&x, 8); - *(*ptr + 4) = (uint8_t) ((temp_rnti&0xff00) >> 8); - *(*ptr + 5) = (uint8_t) (temp_rnti&0x00ff); + *(*ptr + 0) = (uint8_t)((ta & 0x7f0) >> 4); + *(*ptr + 1) = (uint8_t)((ta & 0xf) << 4) | (grant[0] << 3) | (grant[1] << 2) | (grant[2] << 1) | grant[3]; + uint8_t* x = &grant[4]; + *(*ptr + 2) = (uint8_t)srslte_bit_pack(&x, 8); + *(*ptr + 3) = (uint8_t)srslte_bit_pack(&x, 8); + *(*ptr + 4) = (uint8_t)((temp_rnti & 0xff00) >> 8); + *(*ptr + 5) = (uint8_t)(temp_rnti & 0x00ff); *ptr += 6; } @@ -977,15 +992,15 @@ void rar_subh::read_payload(uint8_t** ptr) bool rar_subh::read_subheader(uint8_t** ptr) { - bool e_bit = *(*ptr) & 0x80?true:false; + bool e_bit = *(*ptr) & 0x80 ? true : false; type = *(*ptr) & 0x40 ? RAPID : BACKOFF; if (type == RAPID) { preamble = *(*ptr) & 0x3f; } else { ((rar_pdu*)parent)->set_backoff(*(*ptr) & 0xf); } - *ptr += 1; + *ptr += 1; return e_bit; } - -} + +} // namespace srslte