|
|
|
@ -19,20 +19,19 @@
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <strings.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <strings.h>
|
|
|
|
|
|
|
|
|
|
#include "srslte/common/pdu.h"
|
|
|
|
|
#include "srslte/srslte.h"
|
|
|
|
|
|
|
|
|
|
// 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,35 +41,36 @@ 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
|
|
|
|
|
if (nof_subheaders > 0) {
|
|
|
|
|
uint32_t read_len = 0;
|
|
|
|
|
for (int i=0;i<nof_subheaders-1;i++) {
|
|
|
|
|
for (int i = 0; i < nof_subheaders - 1; i++) {
|
|
|
|
|
read_len += subheaders[i].size_plus_header();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int n_sub = pdu_len-read_len-1;
|
|
|
|
|
int n_sub = pdu_len - read_len - 1;
|
|
|
|
|
|
|
|
|
|
if (n_sub >= 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;
|
|
|
|
|
int init_rem_len = rem_len;
|
|
|
|
|
sch_subh padding;
|
|
|
|
|
padding.set_padding();
|
|
|
|
|
|
|
|
|
@ -85,12 +85,12 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
@ -101,19 +101,18 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Determine the header size and CE payload size */
|
|
|
|
|
uint32_t header_sz = 0;
|
|
|
|
|
uint32_t ce_payload_sz = 0;
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
header_sz += subheaders[i].get_header_size(!multibyte_padding && i==last_sdu_idx);
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
header_sz += subheaders[i].get_header_size(!multibyte_padding && i == last_sdu_idx);
|
|
|
|
|
if (!subheaders[i].is_sdu()) {
|
|
|
|
|
ce_payload_sz += subheaders[i].get_payload_size();
|
|
|
|
|
}
|
|
|
|
@ -133,24 +132,24 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Start writing header and CE payload before the start of the SDU payload */
|
|
|
|
|
uint8_t *ptr = &buffer_tx[sdu_offset_start-header_sz-ce_payload_sz];
|
|
|
|
|
uint8_t *pdu_start_ptr = ptr;
|
|
|
|
|
uint8_t* ptr = &buffer_tx[sdu_offset_start - header_sz - ce_payload_sz];
|
|
|
|
|
uint8_t* pdu_start_ptr = ptr;
|
|
|
|
|
|
|
|
|
|
// Add single/two byte padding first
|
|
|
|
|
for (uint32_t i=0;i<onetwo_padding;i++) {
|
|
|
|
|
for (uint32_t i = 0; i < onetwo_padding; i++) {
|
|
|
|
|
padding.write_subheader(&ptr, false);
|
|
|
|
|
}
|
|
|
|
|
// Then write subheaders for MAC CE
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
if (!subheaders[i].is_sdu()) {
|
|
|
|
|
subheaders[i].write_subheader(&ptr, ce_only && !multibyte_padding && i==(nof_subheaders-1));
|
|
|
|
|
subheaders[i].write_subheader(&ptr, ce_only && !multibyte_padding && i == (nof_subheaders - 1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Then for SDUs
|
|
|
|
|
if (!ce_only) {
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
if (subheaders[i].is_sdu()) {
|
|
|
|
|
subheaders[i].write_subheader(&ptr, !multibyte_padding && i==last_sdu_idx);
|
|
|
|
|
subheaders[i].write_subheader(&ptr, !multibyte_padding && i == last_sdu_idx);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -162,25 +161,42 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write CE payloads (SDU payloads already in the buffer)
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
if (!subheaders[i].is_sdu()) {
|
|
|
|
|
subheaders[i].write_payload(&ptr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Set padding to zeros (if any)
|
|
|
|
|
if (rem_len > 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) {
|
|
|
|
@ -221,7 +237,7 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
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));
|
|
|
|
@ -231,7 +247,8 @@ uint8_t* sch_pdu::write_packet(srslte::log *log_h)
|
|
|
|
|
return pdu_start_ptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int sch_pdu::rem_size() {
|
|
|
|
|
int sch_pdu::rem_size()
|
|
|
|
|
{
|
|
|
|
|
return rem_len;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -286,9 +303,9 @@ bool sch_pdu::update_space_sdu(uint32_t nbytes)
|
|
|
|
|
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;
|
|
|
|
@ -303,7 +320,7 @@ int sch_pdu::get_sdu_space()
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
@ -322,17 +339,19 @@ 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) {
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
@ -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:
|
|
|
|
@ -376,7 +395,7 @@ 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;
|
|
|
|
|
return nof_mch_sched_ce * 2;
|
|
|
|
|
case PADDING:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
@ -397,20 +416,21 @@ 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 ((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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -418,9 +438,9 @@ uint64_t sch_subh::get_con_res_id()
|
|
|
|
|
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];
|
|
|
|
|
}
|
|
|
|
@ -452,19 +472,17 @@ int sch_subh::get_bsr(uint32_t buff_size[4])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
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);
|
|
|
|
@ -534,20 +552,20 @@ 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);
|
|
|
|
@ -561,8 +579,8 @@ bool sch_subh::set_bsr(uint32_t buff_size[4], sch_subh::cetype format)
|
|
|
|
|
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));
|
|
|
|
|
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;
|
|
|
|
@ -574,12 +592,12 @@ bool sch_subh::set_c_rnti(uint16_t crnti)
|
|
|
|
|
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));
|
|
|
|
|
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;
|
|
|
|
@ -591,7 +609,7 @@ bool sch_subh::set_con_res_id(uint64_t con_res_id)
|
|
|
|
|
bool sch_subh::set_phr(float phr)
|
|
|
|
|
{
|
|
|
|
|
if (((sch_pdu*)parent)->has_space_ce(1)) {
|
|
|
|
|
w_payload_ce[0] = phr_report_table(phr)&0x3f;
|
|
|
|
|
w_payload_ce[0] = phr_report_table(phr) & 0x3f;
|
|
|
|
|
lcid = PHR_REPORT;
|
|
|
|
|
((sch_pdu*)parent)->update_space_ce(1);
|
|
|
|
|
nof_bytes = 1;
|
|
|
|
@ -604,7 +622,7 @@ bool sch_subh::set_phr(float phr)
|
|
|
|
|
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;
|
|
|
|
|
w_payload_ce[0] = ta_cmd & 0x3f;
|
|
|
|
|
lcid = TA_CMD;
|
|
|
|
|
((sch_pdu*)parent)->update_space_ce(1);
|
|
|
|
|
nof_bytes = 1;
|
|
|
|
@ -617,10 +635,8 @@ bool sch_subh::set_ta_cmd(uint8_t ta_cmd)
|
|
|
|
|
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,7 +647,7 @@ 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_;
|
|
|
|
@ -645,12 +661,11 @@ int sch_subh::set_sdu(uint32_t lcid_, uint32_t requested_bytes, read_pdu_interfa
|
|
|
|
|
}
|
|
|
|
|
if (sdu_sz == 0) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
} else {
|
|
|
|
|
// Save final number of written bytes
|
|
|
|
|
nof_bytes = sdu_sz;
|
|
|
|
|
|
|
|
|
|
if(nof_bytes > (int32_t)requested_bytes) {
|
|
|
|
|
if (nof_bytes > (int32_t)requested_bytes) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -663,7 +678,7 @@ int sch_subh::set_sdu(uint32_t lcid_, uint32_t requested_bytes, read_pdu_interfa
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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_;
|
|
|
|
@ -674,29 +689,28 @@ int sch_subh::set_sdu(uint32_t lcid_, uint32_t nof_bytes_, uint8_t *payload)
|
|
|
|
|
((sch_pdu*)parent)->update_space_sdu(nof_bytes_);
|
|
|
|
|
nof_bytes = nof_bytes_;
|
|
|
|
|
|
|
|
|
|
return (int) nof_bytes;
|
|
|
|
|
return (int)nof_bytes;
|
|
|
|
|
} else {
|
|
|
|
|
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) = (uint8_t)(nof_bytes & 0x7f);
|
|
|
|
|
*ptr += 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -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,16 +731,16 @@ 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 {
|
|
|
|
@ -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,15 +810,16 @@ 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;
|
|
|
|
|
} 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;
|
|
|
|
@ -820,7 +835,7 @@ uint8_t sch_subh::phr_report_table(float phr_value)
|
|
|
|
|
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)
|
|
|
|
@ -856,7 +871,7 @@ bool rar_pdu::write_packet(uint8_t* ptr)
|
|
|
|
|
{
|
|
|
|
|
// 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,15 +879,15 @@ bool rar_pdu::write_packet(uint8_t* ptr)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Write RAR subheaders
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
subheaders[i].write_subheader(&ptr, i==nof_subheaders-1);
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
subheaders[i].write_subheader(&ptr, i == nof_subheaders - 1);
|
|
|
|
|
}
|
|
|
|
|
// Write payload
|
|
|
|
|
for (int i=0;i<nof_subheaders;i++) {
|
|
|
|
|
for (int i = 0; i < nof_subheaders; i++) {
|
|
|
|
|
subheaders[i].write_payload(&ptr);
|
|
|
|
|
}
|
|
|
|
|
// Set padding to zeros (if any)
|
|
|
|
|
bzero(ptr, rem_len*sizeof(uint8_t));
|
|
|
|
|
bzero(ptr, rem_len * sizeof(uint8_t));
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
@ -907,7 +922,7 @@ bool rar_subh::has_rapid()
|
|
|
|
|
|
|
|
|
|
void rar_subh::get_sched_grant(uint8_t grant_[RAR_GRANT_LEN])
|
|
|
|
|
{
|
|
|
|
|
memcpy(grant_, grant, sizeof(uint8_t)*RAR_GRANT_LEN);
|
|
|
|
|
memcpy(grant_, grant, sizeof(uint8_t) * RAR_GRANT_LEN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t rar_subh::get_ta_cmd()
|
|
|
|
@ -927,7 +942,7 @@ void rar_subh::set_rapid(uint32_t rapid)
|
|
|
|
|
|
|
|
|
|
void rar_subh::set_sched_grant(uint8_t grant_[RAR_GRANT_LEN])
|
|
|
|
|
{
|
|
|
|
|
memcpy(grant, grant_, sizeof(uint8_t)*RAR_GRANT_LEN);
|
|
|
|
|
memcpy(grant, grant_, sizeof(uint8_t) * RAR_GRANT_LEN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void rar_subh::set_ta_cmd(uint32_t ta_)
|
|
|
|
@ -943,19 +958,19 @@ void rar_subh::set_temp_crnti(uint16_t temp_rnti_)
|
|
|
|
|
// Section 6.2.2
|
|
|
|
|
void rar_subh::write_subheader(uint8_t** ptr, bool is_last)
|
|
|
|
|
{
|
|
|
|
|
*(*ptr) = (uint8_t) (!is_last<<7 | 1<<6 | (preamble & 0x3f));
|
|
|
|
|
*(*ptr) = (uint8_t)(!is_last << 7 | 1 << 6 | (preamble & 0x3f));
|
|
|
|
|
*ptr += 1;
|
|
|
|
|
}
|
|
|
|
|
// Section 6.2.3
|
|
|
|
|
void rar_subh::write_payload(uint8_t** ptr)
|
|
|
|
|
{
|
|
|
|
|
*(*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 + 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,7 +992,7 @@ 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;
|
|
|
|
@ -988,4 +1003,4 @@ bool rar_subh::read_subheader(uint8_t** ptr)
|
|
|
|
|
return e_bit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} // namespace srslte
|
|
|
|
|