2.6 KiB
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