Commit f1b0cde1 authored by Victor Souza's avatar Victor Souza

new branch

parent b99e8567
This diff is collapsed.
<table style="border-collapse: collapse; border: none;">
<tr style="border-collapse: collapse; border: none;">
<td style="border-collapse: collapse; border: none;">
<a href="http://www.openairinterface.org/">
<img src="../images/oai_final_logo.png" alt="" border=3 height=50 width=150>
</img>
</a>
</td>
<td style="border-collapse: collapse; border: none; vertical-align: center;">
<b><font size = "5">OAI IAB Documentation</font></b>
</td>
</tr>
</table>
**Table of Contents**
[[_TOC_]]
# Glossary
| Acronym | Description |
| ------- | ------------------------------ |
| BAP | Backhaul Adaptation Protocol |
| BH | Backhaul |
| CP | Control Plane |
| IAB | Integrated Access and Backhaul |
| RLC | Radio Link Control |
| RLF | Radio Link Failure |
| RRC | Radio Resource Control |
| TNL | Transport Network Layer |
| UP | User Plane |
# 1. Scenario
This document aims to gather all the needed requirements to implement a 5G SA 3GPP compliant Integrated Access and Backhaul (IAB).
# 2. Protocol Stacks
## 2.1 Protocol stack for the support of F1-U protocol
<img src="./images/Protocol_stack_F1-U.png" width=600>
## 2.2 Protocol stack for the support of F1-C protocol
<img src="./images/Protocol_stack_F1-C.png" width=600>
## 2.3 Protocol stack for the support of IAB-MT's RRC and NAS connections
<img src="./images/Protocol_stack_RRC_NAS.png" width=600>
# 3. Backhaul Adaptation Protocol (BAP) (TS 38.340)
Some info in [BAP_info](./BAP_Info.md)
# 4. F1 Mods (TS 38.470 and 38.473)
Needed functions:
- BAP mapping configuration function;
- gNB-DU resource configuration function;
- IAB TNL address configuration function;
- IAB UP configuration update function;
- Mobile IAB F1 Setup Triggering function; (Can we skip mobile IAB for now?)
- Mobile IAB F1 Setup Outcome Notification function. (Can we skip mobile IAB for now?)
# 5. RRC Mods (TS 38.331)
Some info in [RRC_IAB_info](./RRC_IAB_Info.md)
# 6. IAB-MT mandatory features (TS 38.306)
- Routing using BAP (TS 38.340-i00 (release 18), pages 11-17)
- Bearer mapping using BAP (TS 38.340-i00 (release 18), pages 11-17)
- IAB-node IP address signalling over RRC (TS 38.331-i00 (release 18), page 133)
<img src="./images/IAB-MT-Requirements.png" width=600>
# 7. IAB Resource Configuration (TS 38.300)
Check TS 38.300-i00 (release 18), pages 122 and 123.
# 8. Required signalling procedures (TS 38.300 and TS 38.401)
## 8.1 IAB-node Integration (TS 38.401-i00, page 87 and 88)
<img src="./images/IAB_node_integration.png" width=600>
## _8.2 IAB-node Migration (Mobile IAB???)_
## 8.3 Topological Management (TS 38.300-i00, page 34)
### 8.3.1 IAB Inter-donor-DU Re-routing (TS 38.401-i00, pages 105, 106)
When an IAB-donor-DU is configured to support inter-donor-DU re-routing, the IAB-donor-DU may identify a rerouted UL IP packet based on the source IP address field of the UL packet, and forwards UL IP packets, whose source IP addresses are anchored at a peer IAB-donor-DU, to this peer IAB-donor-DU via a tunnel. The IAB-donor-DU and the peer IAB-donor-DU may be controlled by the same IAB-donor-CU or by two different IAB-donor-CUs. The interdonor-DU tunnel may be a GTP-U tunnel. The configuration of the tunnel is up to implementation. At the IAB-donor-DU forwarding the UL IP packets, inter-donor-DU tunnelling may be restricted to only a subset of the IP addresses anchored at the peer IAB-donor-DU. For this purpose, the IAB-donor-CU configures the IAB-donor-DU for forwarding the UL IP packets with a list of TNL addresses and/or prefixes for which tunnelling should be permitted and TNL
address filtering should be exempted.
### 8.3.2 IAB Inter-CU topological redundancy procedure (TS 38.3401-i00, pages 106, 107 and 108)
<img src="./images/IAB_inter-CU_redundancy.png" width=600>
### 8.3.3 IAB Inter-CU topology adaptation procedure (TS 38.3401-i00, pages 108 to 111)
<img src="./images/IAB_inter-CU_topology_adaptation.png" width=600>
### 8.3.4 IAB inter-CU topology adaptation procedure with descendant IAB-node (TS 38.3401-i00, pages 111 to 113)
<img src="./images/IAB_inter-CU_topology_adaptation_descendant.png" width=600>
### 8.3.5 IAB Inter-CU Backhaul RLF recovery for single connected IAB-node (TS 38.3401-i00, pages 113 to 116)
<img src="./images/IAB_inter-CU_BH_RLF_recovery_for_single_node.png" width=600>
## 8.4 OTA timing synchronization (38.300-i00, page 34)
An IAB-DU is subject to the same downlink timing alignment of a gNB. The IAB-DU may use the received downlink
signal from a parent as a reference to control its downlink timing using TA in conjunction with an additional Tdelta
parameter received by the collocated IAB-MT from the parent via MAC-CE.
## 8.5 Inter node discovery (38.300-i00, page 35)
Inter node discovery is supported via SSB-based and/or CSI-RS-based measurements. An IAB-node can be configured
to transmit and receive off synchronization raster SSB signals to discover neighbouring IAB-nodes. The configuration
is not expected to create a conflict between IAB-DU SSB transmission and IAB-MT SSB measurement windows.
This diff is collapsed.
...@@ -816,16 +816,16 @@ void *UE_thread(void *arg) ...@@ -816,16 +816,16 @@ void *UE_thread(void *arg)
delNotifiedFIFO_elt(res); delNotifiedFIFO_elt(res);
start_rx_stream=0; start_rx_stream=0;
} else { } else {
if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) { if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) {
// For IQ recorder/player we force synchronization to happen in 280 ms // For IQ recorder/player we force synchronization to happen in 280 ms
while (trashed_frames != 28) { while (trashed_frames != 28) {
readFrame(UE, &timestamp, true); readFrame(UE, &timestamp, true);
trashed_frames+=2; trashed_frames+=2;
} }
} else { } else {
readFrame(UE, &timestamp, true); readFrame(UE, &timestamp, true);
trashed_frames+=2; trashed_frames+=2;
} }
continue; continue;
} }
} }
......
add_subdirectory(MESSAGES) add_subdirectory(MESSAGES)
\ No newline at end of file
...@@ -926,6 +926,68 @@ uint8_t do_RRCSetupComplete(uint8_t *buffer, ...@@ -926,6 +926,68 @@ uint8_t do_RRCSetupComplete(uint8_t *buffer,
return((enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8);
} }
uint8_t do_RRCSetupComplete_IAB(uint8_t *buffer,
size_t buffer_size,
const uint8_t Transaction_id,
uint8_t sel_plmn_id,
const int dedicatedInfoNASLength,
const char *dedicatedInfoNAS)
{
NR_UL_DCCH_Message_t ul_dcch_msg = {0};
ul_dcch_msg.message.present = NR_UL_DCCH_MessageType_PR_c1;
ul_dcch_msg.message.choice.c1 = CALLOC(1,sizeof(struct NR_UL_DCCH_MessageType__c1));
ul_dcch_msg.message.choice.c1->present = NR_UL_DCCH_MessageType__c1_PR_rrcSetupComplete;
ul_dcch_msg.message.choice.c1->choice.rrcSetupComplete = CALLOC(1, sizeof(NR_RRCSetupComplete_t));
NR_RRCSetupComplete_t *RrcSetupComplete = ul_dcch_msg.message.choice.c1->choice.rrcSetupComplete;
RrcSetupComplete->rrc_TransactionIdentifier = Transaction_id;
RrcSetupComplete->criticalExtensions.present = NR_RRCSetupComplete__criticalExtensions_PR_rrcSetupComplete;
RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete = CALLOC(1, sizeof(NR_RRCSetupComplete_IEs_t));
NR_RRCSetupComplete_IEs_t *ies = RrcSetupComplete->criticalExtensions.choice.rrcSetupComplete;
ies->selectedPLMN_Identity = sel_plmn_id;
ies->registeredAMF = NULL;
ies->ng_5G_S_TMSI_Value = CALLOC(1, sizeof(struct NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value));
ies->ng_5G_S_TMSI_Value->present = NR_RRCSetupComplete_IEs__ng_5G_S_TMSI_Value_PR_ng_5G_S_TMSI;
NR_NG_5G_S_TMSI_t *stmsi = &ies->ng_5G_S_TMSI_Value->choice.ng_5G_S_TMSI;
stmsi->size = 6;
stmsi->buf = calloc(stmsi->size, sizeof(*stmsi->buf));
AssertFatal(stmsi->buf != NULL, "out of memory\n");
stmsi->buf[0] = 0x12;
stmsi->buf[1] = 0x34;
stmsi->buf[2] = 0x56;
stmsi->buf[3] = 0x78;
stmsi->buf[4] = 0x9A;
stmsi->buf[5] = 0xBC;
memset(&ies->dedicatedNAS_Message,0,sizeof(OCTET_STRING_t));
OCTET_STRING_fromBuf(&ies->dedicatedNAS_Message, dedicatedInfoNAS, dedicatedInfoNASLength);
// ----IAB related params----
ies->nonCriticalExtension = CALLOC(1, sizeof(NR_RRCSetupComplete_v1610_IEs_t));
NR_RRCSetupComplete_v1610_IEs_t *v1610_ies = ies->nonCriticalExtension;
v1610_ies->iab_NodeIndication_r16 = CALLOC(1, sizeof(long));
*v1610_ies->iab_NodeIndication_r16 = NR_RRCSetupComplete_v1610_IEs__iab_NodeIndication_r16_true;
// --------------------------
if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
xer_fprint(stdout, &asn_DEF_NR_UL_DCCH_Message, (void *)&ul_dcch_msg);
}
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_UL_DCCH_Message,
NULL,
(void *)&ul_dcch_msg,
buffer,
buffer_size);
AssertFatal(enc_rval.encoded > 0,"ASN1 message encoding failed (%s, %lu)!\n",
enc_rval.failed_type->name,enc_rval.encoded);
LOG_D(NR_RRC,"RRCSetupComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
return((enc_rval.encoded+7)/8);
}
uint8_t do_NR_DLInformationTransfer(uint8_t *buffer, uint8_t do_NR_DLInformationTransfer(uint8_t *buffer,
size_t buffer_len, size_t buffer_len,
uint8_t transaction_id, uint8_t transaction_id,
......
...@@ -115,6 +115,13 @@ uint8_t do_RRCSetupComplete(uint8_t *buffer, ...@@ -115,6 +115,13 @@ uint8_t do_RRCSetupComplete(uint8_t *buffer,
const int dedicatedInfoNASLength, const int dedicatedInfoNASLength,
const char *dedicatedInfoNAS); const char *dedicatedInfoNAS);
uint8_t do_RRCSetupComplete_IAB(uint8_t *buffer,
size_t buffer_size,
const uint8_t Transaction_id,
uint8_t sel_plmn_id,
const int dedicatedInfoNASLength,
const char *dedicatedInfoNAS);
int do_RRCSetupRequest(uint8_t *buffer, size_t buffer_size, uint8_t *rv); int do_RRCSetupRequest(uint8_t *buffer, size_t buffer_size, uint8_t *rv);
uint8_t do_NR_RRCReconfigurationComplete_for_nsa(uint8_t *buffer, size_t buffer_size, NR_RRC_TransactionIdentifier_t Transaction_id); uint8_t do_NR_RRCReconfigurationComplete_for_nsa(uint8_t *buffer, size_t buffer_size, NR_RRC_TransactionIdentifier_t Transaction_id);
......
...@@ -323,6 +323,9 @@ typedef struct gNB_RRC_UE_s { ...@@ -323,6 +323,9 @@ typedef struct gNB_RRC_UE_s {
/* hack, see rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ() for more info */ /* hack, see rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ() for more info */
int max_delays_pdu_session; int max_delays_pdu_session;
/*[IAB] params*/
bool is_iab_mt;
} gNB_RRC_UE_t; } gNB_RRC_UE_t;
typedef struct rrc_gNB_ue_context_s { typedef struct rrc_gNB_ue_context_s {
......
...@@ -145,6 +145,7 @@ typedef struct deliver_dl_rrc_message_data_s { ...@@ -145,6 +145,7 @@ typedef struct deliver_dl_rrc_message_data_s {
f1ap_dl_rrc_message_t *dl_rrc; f1ap_dl_rrc_message_t *dl_rrc;
sctp_assoc_t assoc_id; sctp_assoc_t assoc_id;
} deliver_dl_rrc_message_data_t; } deliver_dl_rrc_message_data_t;
static void rrc_deliver_dl_rrc_message(void *deliver_pdu_data, ue_id_t ue_id, int srb_id, char *buf, int size, int sdu_id) static void rrc_deliver_dl_rrc_message(void *deliver_pdu_data, ue_id_t ue_id, int srb_id, char *buf, int size, int sdu_id)
{ {
DevAssert(deliver_pdu_data != NULL); DevAssert(deliver_pdu_data != NULL);
...@@ -600,6 +601,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co ...@@ -600,6 +601,7 @@ static void rrc_gNB_generate_defaultRRCReconfiguration(const protocol_ctxt_t *co
measconfig, measconfig,
dedicatedNAS_MessageList, dedicatedNAS_MessageList,
ue_p->masterCellGroup); ue_p->masterCellGroup);
AssertFatal(size > 0, "cannot encode RRCReconfiguration in %s()\n", __func__); AssertFatal(size > 0, "cannot encode RRCReconfiguration in %s()\n", __func__);
free_defaultMeasConfig(measconfig); free_defaultMeasConfig(measconfig);
freeSRBlist(SRBs); freeSRBlist(SRBs);
...@@ -1539,6 +1541,19 @@ static int handle_rrcSetupComplete(const protocol_ctxt_t *const ctxt_pP, ...@@ -1539,6 +1541,19 @@ static int handle_rrcSetupComplete(const protocol_ctxt_t *const ctxt_pP,
} }
} }
// [IAB] related configs
if (setup_complete_ies->nonCriticalExtension != NULL){
if (*setup_complete_ies->nonCriticalExtension->iab_NodeIndication_r16 == NR_RRCSetupComplete_v1610_IEs__iab_NodeIndication_r16_true){
LOG_I(NR_RRC, "IAB Node Indication received and set to true\n");
UE->is_iab_mt = true;
// Call UE Context modification request.
} else{
UE->is_iab_mt = false;
}
}
// -------------------
rrc_gNB_process_RRCSetupComplete(ctxt_pP, ue_context_p, setup_complete->criticalExtensions.choice.rrcSetupComplete); rrc_gNB_process_RRCSetupComplete(ctxt_pP, ue_context_p, setup_complete->criticalExtensions.choice.rrcSetupComplete);
LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT " UE State = NR_RRC_CONNECTED \n", PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP)); LOG_I(NR_RRC, PROTOCOL_NR_RRC_CTXT_UE_FMT " UE State = NR_RRC_CONNECTED \n", PROTOCOL_NR_RRC_CTXT_UE_ARGS(ctxt_pP));
return 0; return 0;
......
...@@ -834,7 +834,8 @@ static void rrc_ue_generate_RRCSetupComplete(const NR_UE_RRC_INST_t *rrc, const ...@@ -834,7 +834,8 @@ static void rrc_ue_generate_RRCSetupComplete(const NR_UE_RRC_INST_t *rrc, const
nas_msg_length = sizeof(nr_nas_attach_req_imsi_dummy_NSA_case); nas_msg_length = sizeof(nr_nas_attach_req_imsi_dummy_NSA_case);
} }
size = do_RRCSetupComplete(buffer, sizeof(buffer), Transaction_id, rrc->selected_plmn_identity, nas_msg_length, nas_msg); //size = do_RRCSetupComplete(buffer, sizeof(buffer), Transaction_id, rrc->selected_plmn_identity, nas_msg_length, nas_msg);
size = do_RRCSetupComplete_IAB(buffer, sizeof(buffer), Transaction_id, rrc->selected_plmn_identity, nas_msg_length, nas_msg);
LOG_I(NR_RRC, "[UE %ld][RAPROC] Logical Channel UL-DCCH (SRB1), Generating RRCSetupComplete (bytes%d)\n", rrc->ue_id, size); LOG_I(NR_RRC, "[UE %ld][RAPROC] Logical Channel UL-DCCH (SRB1), Generating RRCSetupComplete (bytes%d)\n", rrc->ue_id, size);
int srb_id = 1; // RRC setup complete on SRB1 int srb_id = 1; // RRC setup complete on SRB1
LOG_D(NR_RRC, "[RRC_UE %ld] PDCP_DATA_REQ/%d Bytes RRCSetupComplete ---> %d\n", rrc->ue_id, size, srb_id); LOG_D(NR_RRC, "[RRC_UE %ld] PDCP_DATA_REQ/%d Bytes RRCSetupComplete ---> %d\n", rrc->ue_id, size, srb_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment