91 lines
2.6 KiB
Markdown
91 lines
2.6 KiB
Markdown
# 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 |