:::warning # <center><i class="fa fa-edit"></i> gNB initialization</center> ::: [TOC] Before initialization of gNB, we have to prepare RU (radio units) ```c printf("wait RUs\n"); wait_RUs(); printf("ALL RUs READY!\n"); printf("RC.nb_RU:%d\n", RC.nb_RU); ``` | Variable/function | Column 2 | | -------- | -------- | | RC.nb_RU |This varible gives us an infotmation about number of RUs instances in this node | ### Once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) ```c if(IS_SOFTMODEM_DOSCOPE) { scopeParms_t p; p.argc=&argc p.argv=argv; p.gNB=RC.gNB[0]; p.ru=RC.ru[0]; load_softscope("nr",&p); } if (NFAPI_MODE != NFAPI_MODE_PNF && NFAPI_MODE != NFAPI_MODE_VNF) { printf("Not NFAPI mode - call init_eNB_afterRU()\n"); init_eNB_afterRU(); } else { printf("NFAPI mode - DO NOT call init_gNB_afterRU()\n"); } printf("ALL RUs ready - ALL gNBs ready\n"); printf("Sending sync to all threads\n"); pthread_mutex_lock(&sync_mutex); sync_var=0; pthread_cond_broadcast(&sync_cond); pthread_mutex_unlock(&sync_mutex); } printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); ``` #### IS_SOFTMODEM_DOSCOPE ```c #define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) ``` Where: - **get_softmodem_optmask()** - temporary dummy implem of get_softmodem_optmask, till basic simulators implemented as device ```c uint64_t get_softmodem_optmask(void) { return softmodem_params.optmask; } ``` - Link on source code of [softmodem_params.optmask](https://hackmd.io/PQW7okndQVGU3r6hT55siA) And this function will retun us uint64_t ( an unsigned long long integer which is guaranteed to be exactly 8 bytes in size. ) #### scopeParms_t ```c int *argc; char **argv; RU_t *ru; PHY_VARS_gNB *gNB; ``` Where: - **argc** - argument count; - **argv** - argument values; - **RU_t** - Radio unit task wich has [such parameters](https://hackmd.io/qF85AF1SQrCCNlFGIA2Eew) - **PHY_VARS_gNB** - [PHY Data Structure for gNB](https://hackmd.io/OxoUYMn8QTS5dzMkaQm2ug) #### pthread_mutex_lock(&sync_mutex) Locks a mutex object, which identifies a mutex. If the mutex is already locked by another thread, the thread waits for the mutex to become available. The thread that has locked a mutex becomes its current owner and remains the owner until the same thread has unlocked it. ```c #define RLC_UM_MUTEX_LOCK(mUTEX, cTXT, rLC) pthread_mutex_lock(mUTEX) ``` #### pthread_cond_broadcast Restart the nr-softmodem after it has been soft-stopped with stop_L1L2() #### pthread_mutex_unlock Unlock a mutex object, which identifies a mutex ```c #define RLC_UM_MUTEX_UNLOCK(mUTEX) pthread_mutex_unlock(mUTEX) ``` ### At this step we are ending our gNB initialization Firsly we are ending a config module ```c printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); ``` Than we have to press ctrl-c for terminating of our program ```c printf("TYPE <CTRL-C> TO TERMINATE\n"); ``` After that we have to handle signals and wait for all threads to join when the process complete. ```c printf("Entering ITTI signals handler\n"); itti_wait_tasks_end(); printf("Returned from ITTI signal handler\n"); oai_exit=1; printf("oai_exit=%d\n",oai_exit); ``` The last step is stoping of gNB ```c stop_gNB(NB_gNB_INST); ``` #### Code of stop_gNB ```c void stop_gNB(int nb_inst) { for (int inst=0; inst<nb_inst; inst++) { LOG_I(PHY,"Killing gNB %d processing threads\n",inst); kill_gNB_proc(inst); } } ```