small fix, documentation enhancement
This commit is contained in:
@@ -0,0 +1,91 @@
|
|||||||
|
# interthread interface (ITTI)
|
||||||
|
|
||||||
|
A Middleware called “itti” (interthread interface) provides classical send/receive message queues between threads.
|
||||||
|
|
||||||
|
A simpler thread safe message queue is available in the thread-pool, as it is a required lower level feature.
|
||||||
|
|
||||||
|
ITTI is providing more feature, to be used as the thread event main loop.
|
||||||
|
|
||||||
|
It is also made for strong type definition is source code.
|
||||||
|
|
||||||
|
It is able to add in the managed events: external sockets, timers
|
||||||
|
|
||||||
|
All queues are created in .h files, as static permanent queues, nevertheless the possibility to add queues during runtime is available.
|
||||||
|
|
||||||
|
The queues are called tasks because it is often read in a single thread that have the same name.
|
||||||
|
|
||||||
|
# API definition
|
||||||
|
|
||||||
|
## itti_send_msg_to_task, itti_receive_msg, itti_poll_msg
|
||||||
|
|
||||||
|
Standard messages queues, thread safe
|
||||||
|
The reader is responsible of freeing the message
|
||||||
|
|
||||||
|
## itti_subscribe_event_fd, itti_get_events
|
||||||
|
|
||||||
|
Add external sockets to itti based main loop
|
||||||
|
|
||||||
|
## timer_setup timer_remove
|
||||||
|
|
||||||
|
When a timer expire, it adds a message in a itti queue
|
||||||
|
|
||||||
|
## itti_terminate_tasks
|
||||||
|
|
||||||
|
Calling this function push a “terminate” message on each itti queue
|
||||||
|
|
||||||
|
# Example code of a thread using ITTI
|
||||||
|
|
||||||
|
```
|
||||||
|
Thread_aLayer_main(void * context) {
|
||||||
|
// initialize the layer data
|
||||||
|
// and register in itti the external sockets (like S1AP, GTP)
|
||||||
|
aLayer_init();
|
||||||
|
while (1) {
|
||||||
|
MessageDef * msg
|
||||||
|
itti_receive_msg(TASK_aLayer, &msg);
|
||||||
|
// itti receive released, so we have incoming data
|
||||||
|
// Can be a itti message
|
||||||
|
if ( msg != NULL) {
|
||||||
|
switch(ITTI_MSG_ID(msg)) {
|
||||||
|
case …:
|
||||||
|
processThisMsgType1(msg);
|
||||||
|
break;
|
||||||
|
case …:
|
||||||
|
processThisMsgType2(msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Itti_free(msg);
|
||||||
|
}
|
||||||
|
// or data/event on external entries (sockets)
|
||||||
|
Struct eppol_events* events;
|
||||||
|
int nbEvents=itti_get_events(TASK_aLayer, &events);
|
||||||
|
if ( nbEvents > 0)
|
||||||
|
processLayerEvents(events, nbEvents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Current usage in OpenAir
|
||||||
|
|
||||||
|
## UDP, SCTP
|
||||||
|
|
||||||
|
Simple threads that interface itti internal messages to Linux
|
||||||
|
|
||||||
|
## GTPV1-U, S1AP
|
||||||
|
|
||||||
|
Threads to implement S1AP and GTP protocols
|
||||||
|
|
||||||
|
## PDCP
|
||||||
|
|
||||||
|
4G Pdcp is not following itti design pattern, but it uses itti internally , 5G PDCP uses ad hoc design
|
||||||
|
|
||||||
|
## RRC
|
||||||
|
|
||||||
|
Implements 3GPP Rrc features
|
||||||
|
Interfaces the layer 1 and the above itti tasks
|
||||||
|
|
||||||
|
## X2, ENP_APP (configuration), L1L2
|
||||||
|
|
||||||
|
Are declared itti queues with a dedicated thread, but they are almost empty
|
||||||
+1
-1
@@ -24,7 +24,7 @@ https://gitlab.eurecom.fr/oai/openairinterface5g/-/wikis/f1-interface
|
|||||||
|
|
||||||
# 2. Common multi-threading architecture #
|
# 2. Common multi-threading architecture #
|
||||||
|
|
||||||
The CU and DU interfaces are based on ITTI threads (see oai/common/utils/ocp_itti/itti.md when it will be written, draft available: https://docbox.etsi.org/Workshop/2018/201812_ETSI_OAI/TRAINING/OPENCELLS_THOMAS.pdf)
|
The CU and DU interfaces are based on ITTI threads (see oai/common/utils/ocp_itti/itti.md)
|
||||||
|
|
||||||
All OAI upper layers use the ITTI framework to run isolated threads dedicated to one feature.
|
All OAI upper layers use the ITTI framework to run isolated threads dedicated to one feature.
|
||||||
The lower layers adopt case by case specific software architecture.
|
The lower layers adopt case by case specific software architecture.
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ int8_t nr_mac_rrc_data_ind(const module_id_t module_idP,
|
|||||||
msg->rrc_container=(uint8_t*) (msg+1); // Made extra room after the struct with itti_alloc_msg_sized()
|
msg->rrc_container=(uint8_t*) (msg+1); // Made extra room after the struct with itti_alloc_msg_sized()
|
||||||
memcpy(msg->rrc_container, sduP, sdu_lenP);
|
memcpy(msg->rrc_container, sduP, sdu_lenP);
|
||||||
msg->rrc_container_length=sdu_lenP;
|
msg->rrc_container_length=sdu_lenP;
|
||||||
itti_send_msg(TASK_DU_F1, 0, tmp);
|
itti_send_msg_to_task(TASK_DU_F1, 0, tmp);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user