From 9940b262cb8423e9af0f6a19cc1f3f6fd61eaacd Mon Sep 17 00:00:00 2001 From: "lal.harshita" Date: Thu, 24 Mar 2022 17:38:49 +0530 Subject: [PATCH] [Task-ID: ODUHIGH-432]Fix to send correct RLC header and PDCP SN for RRC messages from PHY stub Signed-off-by: lal.harshita Change-Id: I1f9d950eee94c1b11caf0b2f192bea65eb490607 Signed-off-by: lal.harshita --- src/5gnrmac/mac_msg_hdl.c | 7 +- src/du_app/du_f1ap_msg_hdl.c | 2 + src/phy_stub/phy_stub.h | 2 + src/phy_stub/phy_stub_msg_hdl.c | 247 +++++++++++++++++++++++----------------- 4 files changed, 151 insertions(+), 107 deletions(-) diff --git a/src/5gnrmac/mac_msg_hdl.c b/src/5gnrmac/mac_msg_hdl.c index e59e9bb19..37755d819 100644 --- a/src/5gnrmac/mac_msg_hdl.c +++ b/src/5gnrmac/mac_msg_hdl.c @@ -343,10 +343,11 @@ uint8_t lcId, uint16_t pduLen, uint8_t *pdu) ulData->slotInfo.cellId = cellId; /* Filling pdu info */ - if(lcId == SRB1_LCID || lcId == SRB2_LCID) - { + if(lcId != SRB0_LCID) + ulData->pduInfo[ulData->numPdu].commCh = false; + else ulData->pduInfo[ulData->numPdu].commCh = true; - } + ulData->pduInfo[ulData->numPdu].lcId = lcId; ulData->pduInfo[ulData->numPdu].pduBuf = pdu; ulData->pduInfo[ulData->numPdu].pduLen = pduLen; diff --git a/src/du_app/du_f1ap_msg_hdl.c b/src/du_app/du_f1ap_msg_hdl.c index 1279b6919..b7e82620d 100644 --- a/src/du_app/du_f1ap_msg_hdl.c +++ b/src/du_app/du_f1ap_msg_hdl.c @@ -14296,6 +14296,8 @@ uint8_t BuildAndSendUeContextModRsp(DuUeCb *ueCb) ret = RFAILED; break; } + + ret = ROK; break; } FreeUeContextModResp(f1apMsg); diff --git a/src/phy_stub/phy_stub.h b/src/phy_stub/phy_stub.h index ffa77bca9..f40c56839 100644 --- a/src/phy_stub/phy_stub.h +++ b/src/phy_stub/phy_stub.h @@ -58,6 +58,8 @@ typedef struct ueCb bool msgSecurityModeComp; bool msgRrcReconfiguration; bool msgRegistrationComp; + uint8_t rlcSnForSrb1; /* Sequence number of PDU at RLC for AM mode */ + uint8_t pdcpSn; /* Sequence number of PDU at PDCP */ }UeCb; /* Database to store information for all UE */ diff --git a/src/phy_stub/phy_stub_msg_hdl.c b/src/phy_stub/phy_stub_msg_hdl.c index 89c58fd6f..7098e0a75 100644 --- a/src/phy_stub/phy_stub_msg_hdl.c +++ b/src/phy_stub/phy_stub_msg_hdl.c @@ -423,132 +423,154 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_ switch(type) { case MSG_TYPE_MSG3: - { - DU_LOG("\nDEBUG --> PHY_STUB: Forming MSG3 PDU "); - /* For Initial RRC setup Request, - MAC subheader format is R/R/LCId (1byte) - LCId is CCCH(0) - From 38.321 section 6.1.1 - */ - pdu[byteIdx++] = 0; - /* Hardcoding MAC PDU */ - pdu[byteIdx++] = 16; - pdu[byteIdx++] = 00; - pdu[byteIdx++] = 00; - pdu[byteIdx++] = 00; - pdu[byteIdx++] = 00; - pdu[byteIdx++] = 103; - - break; - } + { + DU_LOG("\nDEBUG --> PHY_STUB: Forming MSG3 PDU "); + /* For Initial RRC setup Request, + MAC subheader format is R/R/LCId (1byte) + LCId is CCCH(0) + From 38.321 section 6.1.1 + */ + pdu[byteIdx++] = 0; + /* Hardcoding MAC PDU */ + pdu[byteIdx++] = 16; + pdu[byteIdx++] = 00; + pdu[byteIdx++] = 00; + pdu[byteIdx++] = 00; + pdu[byteIdx++] = 00; + pdu[byteIdx++] = 103; + + break; + } case MSG_TYPE_SHORT_BSR: - { - DU_LOG("\nDEBUG --> PHY_STUB: Forming SHORT BSR PDU "); - uint8_t lcgId = 0; - uint8_t bufferSizeIdx = 6; - - /* For Short BSR - MAC subheader format is R/R/LcId (1Byte) - LCId is 61 - From 38.321 section 6.1.1 - */ - pdu[byteIdx++] = 61; // LCID - pdu[byteIdx++] = (lcgId << 5) | bufferSizeIdx; - - break; - } + { + DU_LOG("\nDEBUG --> PHY_STUB: Forming SHORT BSR PDU "); + uint8_t lcgId = 0; + uint8_t bufferSizeIdx = 6; + + /* For Short BSR + MAC subheader format is R/R/LcId (1Byte) + LCId is 61 + From 38.321 section 6.1.1 + */ + pdu[byteIdx++] = 61; // LCID + pdu[byteIdx++] = (lcgId << 5) | bufferSizeIdx; + + break; + } case MSG_TYPE_MSG5: { - DU_LOG("\nDEBUG --> PHY_STUB: Forming MSG5 PDU"); - uint8_t msg5PduLen = 33; - /* For RRC setup complete - MAC subheader format is R/F/LCId/L (2/3 bytes) - LCId is 1 for SRB1 - L is length of PDU i.e 6bytes here - From 38.321 section 6.1.1 - */ - uint8_t msg5[] = {1, msg5PduLen, 0, 0, 16, 0, 5, 223, 128, 16, 94, \ - 64, 3, 64, 68, 252, 97, 0, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, \ - 184, 56, 0, 0, 0, 0, 0}; - - msg5PduLen += 2; /* 2bytes of header */ - memcpy(pdu, &msg5, msg5PduLen); - byteIdx += msg5PduLen; /* 2 bytes of header */ - break; + /* For RRC setup complete + * + * MAC subheader format is R/F/LCId/L (2/3 bytes) + * LCId is 1 for SRB1 + * L is length of PDU i.e 6bytes here + * From 38.321 section 6.1.1 + * + * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN) + * From 38.322, section 6.2.2.4 + */ + DU_LOG("\nDEBUG --> PHY_STUB: Forming MSG5 PDU"); + uint8_t msg5PduLen = 33; /* Length of MSG5 */ + msg5PduLen += 2; /* RLC subheader */ + uint8_t msg5[] = {1, msg5PduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 16, 0, \ + 5, 223, 128, 16, 94, 64, 3, 64, 68, 252, 97, 0, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, 184, 56, 0, 0, 0, 0, 0}; + + msg5PduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg5, msg5PduLen); + byteIdx += msg5PduLen; /* 4 bytes of header : MAC+RLC */ + break; } case MSG_TYPE_SECURITY_MODE_COMPLETE: { - DU_LOG("\nDEBUG --> PHY_STUB: Forming SECURITY MODE COMPLETE PDU"); - uint8_t pduLen = 12; - /* For security mode complete where RRC Container is dummy - MAC subheader format is R/F/LCId/L (2/3 bytes) - LCId is 1 for SRB1 - L is length of PDU i.e 6bytes here - From 38.321 section 6.1.1 - */ - uint8_t msg[] = {1, pduLen, 0, 3, 0x2a, 0x40, 0, 0, 0, 0, 0, 0, 0, 0}; - - pduLen += 2; /* 2bytes of header */ - memcpy(pdu, &msg, pduLen); - byteIdx += pduLen; /* 2 bytes of header */ - break; + /* For security mode complete where RRC Container is dummy + * + * MAC subheader format is R/F/LCId/L (2/3 bytes) + * LCId is 1 for SRB1 + * L is length of PDU i.e 6bytes here + * From 38.321 section 6.1.1 + * + * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN) + * From 38.322, section 6.2.2.4 + */ + DU_LOG("\nDEBUG --> PHY_STUB: Forming SECURITY MODE COMPLETE PDU"); + uint8_t pduLen = 12; /* Length of PDU */ + pduLen += 2; /* RLC subheader */ + uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 0x2a, 0x40, \ + 0, 0, 0, 0, 0, 0, 0, 0}; + + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ + break; } + case MSG_TYPE_REGISTRATION_COMPLETE: { - - DU_LOG("\nDEBUG --> PHY_STUB: Forming RRC REGISTRATION COMPLETE PDU"); - uint8_t pduLen = 12; - /* For rrc reconfig complete where RRC Container is dummy - MAC subheader format is R/F/LCId/L (2/3 bytes) - LCId is 1 for SRB1 - L is length of PDU i.e 6bytes here - From 38.321 section 6.1.1 - */ - uint8_t msg[] = {1, pduLen, 0, 0x04, 0x3a, 0x81, 0xbf, 0, 0x21, 0x80, 0, \ - 0, 0, 0}; - - pduLen += 2; /* 2bytes of header */ - memcpy(pdu, &msg, pduLen); - byteIdx += pduLen; /* 2 bytes of header */ - break; + /* For rrc reconfig complete where RRC Container is dummy + * + * MAC subheader format is R/F/LCId/L (2/3 bytes) + * LCId is 1 for SRB1 + * L is length of PDU i.e 6bytes here + * From 38.321 section 6.1.1 + * + * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN) + * From 38.322, section 6.2.2.4 + */ + DU_LOG("\nDEBUG --> PHY_STUB: Forming RRC REGISTRATION COMPLETE PDU"); + uint8_t pduLen = 12; /* Length of PDU */ + pduLen += 2; /* RLC subheader */ + uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 0x3a, 0x81, \ + 0xbf, 0, 0x21, 0x80, 0, 0, 0, 0}; + + pduLen += 2; /* 2 bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC */ + break; } + case MSG_TYPE_RRC_RECONFIG_COMPLETE: { + /* For rrc reconfig complete where RRC Container is dummy + * + * MAC subheader format is R/F/LCId/L (2/3 bytes) + * LCId is 1 for SRB1 + * L is length of PDU i.e 6bytes here + * From 38.321 section 6.1.1 + * + * RLC subheader for AM PDU is D/C/P/SI/SN (2 bytes for 12-bit SN) + * From 38.322, section 6.2.2.4 + */ DU_LOG("\nDEBUG --> PHY_STUB: Forming RRC RECONFIGURATION COMPLETE PDU"); - uint8_t pduLen = 14; - /* For rrc reconfig complete where RRC Container is dummy - MAC subheader format is R/F/LCId/L (2/3 bytes) - LCId is 1 for SRB1 - L is length of PDU i.e 6bytes here - From 38.321 section 6.1.1 - */ - uint8_t msg[] = {1, pduLen, 0, 6, 8, 64, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0}; - - pduLen += 2; /* 2bytes of header */ - memcpy(pdu, &msg, pduLen); - byteIdx += pduLen; /* 2 bytes of header */ - break; + uint8_t pduLen = 13; /* PDU length */ + pduLen += 2; /* RLC sub header */ + uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 8, 64, 0, 0,\ + 0, 0, 0, 0, 0, 0, 0}; + + pduLen += 2; /* 2bytes of MAC header */ + memcpy(pdu, &msg, pduLen); + byteIdx += pduLen; /* 4 bytes of header : MAC+RLC*/ + break; } - + default: - break; + break; } /* End of switch(type) */ + /* Filling MAC SDU for Padding bytes*/ if(byteIdx < pduInfo->pdu_length) { /* For Padding - MAC subheader format is R/R/LCId (1byte) - LCId is 63 for padding - From 38.321 section 6.1.1 - */ + MAC subheader format is R/R/LCId (1byte) + LCId is 63 for padding + From 38.321 section 6.1.1 + */ pdu[byteIdx++] = 63; for(; byteIdx < pduInfo->pdu_length; byteIdx++) - pdu[byteIdx] = 0; + pdu[byteIdx] = 0; } msgLen += pduInfo->pdu_length; @@ -1491,10 +1513,27 @@ uint8_t l1SendStatusPdu() msgLen = 3; /* For RLC Status PDU - MAC subheader format is R/F/LCId/L (2/3 bytes) - LCId is 4 for DRB1 - L is length of Status PDU i.e 3 bytes - From 38.321 section 6.1.1 + * MAC subheader format is R/F/LCId/L (2/3 bytes) + * LCId is 4 for DRB1 + * L is length of Status PDU i.e 3 bytes + * From 38.321 section 6.1.1 + * + * RLC Status PDU format : + * --------------------------------- + * |D/C|CPT| ACK_SN | + * --------------------------------- + * | ACK_SN | + * --------------------------------- + * |E1 | R | R | R | R | R | R | R | + * --------------------------------- + * + * Here, D/C bit = 0 for Control PDU + * CPT bit = 0 since control pdu type is Status PDU + * ACK_SN = 0 as of now, this can be changed based on the + * scenario being tested + * E1 = 0 because no NACK_SN, E1, E2 and E3 follows it + * R = 0 i.e. reserved bits + * From Spec 38.322 section 6.2.2.5 */ uint8_t statusPdu[] = {4, msgLen, 0, 0, 0}; msgLen += 2; /* 2bytes of header */ -- 2.16.6