Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lizhongxiao
OpenXG-RAN
Commits
c1394b70
Commit
c1394b70
authored
Mar 09, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove old EPC documentation
parent
4d16f1f8
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
781 deletions
+0
-781
openair3/DOCS/Latex/EPC/EPC.tex
openair3/DOCS/Latex/EPC/EPC.tex
+0
-751
openair3/DOCS/Latex/EPC/Makefile
openair3/DOCS/Latex/EPC/Makefile
+0
-30
No files found.
openair3/DOCS/Latex/EPC/EPC.tex
deleted
100644 → 0
View file @
4d16f1f8
\documentclass
[a4paper,oneside]
{
report
}
\usepackage
{
pgfplots
}
\ifx\HCode\UnDef\else\def\pgfsysdriver
{
pgfsys-tex4ht.def
}
\fi
\usepackage
{
verbatim
}
\usepackage
{
listings
}
\usepackage
{
tikz,graphicx
}
\usepackage
{
caption
}
\usepackage
{
float
}
\usepackage
{
hyperref
}
\usepackage
{
subfiles
}
\usepackage
{
nomencl
}
\usepackage
{
chngcntr
}
\makenomenclature
\usepackage
{
makeidx
}
\makeindex
\counterwithout
{
figure
}{
chapter
}
\usetikzlibrary
{
external,calc,trees,positioning,arrows,chains,shapes.geometric,
%
decorations.pathreplacing,decorations.pathmorphing,shapes,
%
matrix,fit,shapes.symbols,backgrounds,fit
}
\captionsetup
[figure]
{
labelformat=simple
}
\renewcommand
{
\figurename
}{
Figure
}
% Returns three nodes: The argument, and the projections of the argument on the left and right borders of the bounding box
\newcommand
{
\extendnode
}
[1]
{
(#1)
(
$
(
current bounding box.north east
)!(
#
1
)!(
current bounding box.south east
)
$
)
(
$
(
current bounding box.north west
)!(
#
1
)!(
current bounding box.south west
)
$
)
}
\usetikzlibrary
{
calc,trees,positioning,arrows,chains,shapes.geometric,
%
decorations.pathreplacing,decorations.pathmorphing,shapes,
%
matrix,shapes.symbols,backgrounds,fit,intersections
}
\title
{
OAI EPC current development
}
\author
{
Sebastien ROUX
\\
Eurecom
\\
sebastien.roux@eurecom.fr
}
\definecolor
{
javared
}{
rgb
}{
0.6,0,0
}
% for strings
\definecolor
{
javagreen
}{
rgb
}{
0.25,0.5,0.35
}
% comments
\definecolor
{
ckeyw
}{
rgb
}{
0,0,0.8
}
% keywords
\definecolor
{
ccomment
}{
rgb
}{
0.6,0.6,0.6
}
% javadoc
\lstset
{
language=C,
basicstyle=
\ttfamily
,
keywordstyle=
\color
{
ckeyw
}
\bfseries
,
stringstyle=
\color
{
javared
}
,
commentstyle=
\color
{
ccomment
}
,
morecomment=[s][
\color
{
ccomment
}
]
{
/**
}{
*/
}
,
numbers=left,
numberstyle=
\tiny\color
{
black
}
,
stepnumber=1,
numbersep=10pt,
tabsize=4,
showspaces=false,
showstringspaces=false,
breaklines
}
\tikzset
{
table nodes/.style=
{
rectangle,
rounded corners=0.6mm,
draw=black,
align=center,
minimum height=7mm,
minimum width=22mm,
text depth=0.5ex,
text height=2ex,
% inner xsep=0pt,
outer sep=0pt,
}
,
table/.style=
{
matrix of nodes,
% row sep=-\pgflinewidth,
% column sep=-\pgflinewidth,
rectangle,
nodes=
{
table nodes
}
,
execute at empty cell=
{
\node
[draw=none]
{}
;
}
}
,
cps/.style=
{
draw=black,
fill=blue!20,
rounded corners=0.6mm,
}
,
ups/.style=
{
draw=black,
fill=yellow!30,
rounded corners=0.6mm,
}
,
stdlinux/.style=
{
draw=black,
fill=green!10,
rounded corners=0.6mm,
}
,
rect/.style=
{
rectangle,
draw,
}
,
schritt/.style=
{
draw,
rounded corners,
fill=blue!20,
inner xsep=2em,
}
,
t0/.style=
{
draw,fill=blue!20
}
,
t1/.style=
{
draw,fill=blue!40
}
,
background/.style=
{
draw,
fill=yellow!30,
align=center,
dashed,
}
,
background2/.style=
{
draw,
fill=green!15,
align=center,
}
,
connector/.style=
{
-latex,
font=
\scriptsize
}
,
rectangle connector/.style=
{
connector,
to path=
{
(
\tikztostart
) -| (
\tikztotarget
)
}
,
pos=0.5
}
,
rectangle connector/.default=-2cm,
straight connector/.style=
{
connector,
to path=--(
\tikztotarget
)
\tikztonodes
}
,
queue/.style=
{
draw,
fill=yellow!30,
cylinder,
aspect=0.7,
minimum height=1cm,
minimum width=0.7cm
}
,
}
\renewcommand
{
\nomname
}{
List of Abbreviations
}
\renewcommand
{
\thefigure
}{
\Alph
{
figure
}}
\begin{document}
\maketitle
\tableofcontents
\printnomenclature
[2cm]
\chapter*
{
MME and S+P-Gateway
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
MME and S+P-Gateway
}
% \nomenclature{MME}{Mobility Management Entity}
% \nomenclature{S-GW}{Serving Gateway}
% \nomenclature{P-GW}{PDN Gateway}
\begin{figure}
[H]
\begin{center}
\begin{tikzpicture}
\tikzstyle
{
every node
}
=[font=
\footnotesize
]
\matrix
(table) [row sep=0.5cm, column sep=
{
3.2cm,between origins
}
, table,text width=3mm,name=table]
{
&
&
&
\\
&
&
&
\\
&
&
&
\\
&
&
&
\\
&
&
&
\\
}
;
\node
(MMEAPP)[cps,draw,fit=(table-1-1)(table-1-2),table nodes]
{
MME Application
}
;
\node
(SPGW)[cps,draw,fit=(table-1-3)(table-1-4),table nodes]
{
S+P-GW Application
}
;
\node
(NAS)[cps,draw,fit=(table-2-2),table nodes]
{
NAS
}
;
\node
(S6A)[dashed,cps,draw,fit=(table-3-1),table nodes]
{
S6a/Diameter
}
;
\node
(S1AP)[cps,draw,fit=(table-3-2),table nodes]
{
S1-MME/S1AP
}
;
\node
(S1U)[ups,draw,fit=(table-3-3),table nodes]
{
S1-U/GTPU
}
;
\node
(SGI)[dashed,ups,draw,fit=(table-3-4),table nodes]
{
SGi
}
;
\node
(SCTP)[stdlinux,draw,fit=(table-4-1)(table-4-2),table nodes]
{
SCTP
}
;
\node
(UDP)[stdlinux,draw,fit=(table-4-3),table nodes]
{
UDP
}
;
\node
(IP)[stdlinux,draw,fit=(table-5-1)(table-5-2)(table-5-3)(table-5-4),table nodes]
{
IP
}
;
\draw
[<->, dashed, draw=red]
(MMEAPP) -- node(arrow1)[above, align=center]
{
S11
}
(SPGW);
\draw
[<-,dashed]
(S1U) -- (SPGW.south-|S1U);
\draw
[<-,dashed]
(SGI) -- (SPGW.south-|SGI);
\draw
[-]
(S6A) -- (MMEAPP.south-|S6A);
\draw
[-]
(NAS) -- (MMEAPP.south-|NAS);
\draw
[-]
(S1AP) -- (NAS);
\draw
[-]
(S1U) -- (SGI);
\draw
[-]
(S1U) -- (UDP);
\draw
[-]
(S1AP) -- (SCTP.north-|S1AP);
\draw
[-]
(S6A) -- (SCTP.north-|S6A);
\draw
[-]
(SCTP) -- (IP.north-|SCTP);
\draw
[-]
(UDP) -- (IP.north-|UDP);
\draw
[-]
(SGI) -- (IP.north-|SGI);
\draw
[-]
(MMEAPP.south) |- (S1AP.west);
\draw
(
$
(
table.north west
)
+
(-
2
mm,
1
mm
)
$
) rectangle (
$
(
table.south east
)
+
(
2
mm,
-
1
mm
)
$
);
\node
[cps, minimum width=5mm,minimum height=5mm,below=of IP.south west,anchor=west]
(l1)
{}
;
\node
[right=2mm of l1]
(ct1)
{
Control Plane
}
;
\node
[ups,minimum width=5mm,minimum height=5mm,below=0.3cm of l1]
(l2)
{}
;
\node
[below=0.3cm of ct1, right=2mm of l2]
(ct2)
{
User Plane
}
;
\node
[stdlinux,minimum width=5mm,minimum height=5mm,below=0.3cm of l2]
(l3)
{}
;
\node
[below=0.3cm of ct2, right=2mm of l3]
(ct3)
{
Linux IP Stack
}
;
\draw
[minimum width=5mm,minimum height=5mm,below=0.3cm of l3,<->,dashed, draw=red]
(
$
(
l
3
.south west
)
-
(
0
,
0
.
55
cm
)
$
) -- node(l4)
{}
(
$
(
l
3
.south east
)
-
(
0
,
0
.
55
cm
)
$
);
\node
[right=2mm of l4.north east]
(ct4)
{
Abstraction link
}
;
\draw
[minimum width=5mm,minimum height=5mm,below=0.3cm of l4,->,dashed]
(
$
(
l
4
.south west
)
-
(
0
,
0
.
25
cm
)
$
) -- node(l5)
{}
(
$
(
l
4
.south east
)
-
(
0
,
0
.
25
cm
)
$
);
\node
[right=2mm of l5.north east]
(ct5)
{
Control
}
;
\node
[draw,fit=(ct1)(l1)(ct2)(l2)(ct3)(l3)(ct4)(l4)(ct5)(l5)]
{}
;
\end{tikzpicture}
\caption
{
MME and S+P-GW architecture
}
\label
{
fig:MMEoverall
}
\end{center}
\end{figure}
Figure
\ref
{
fig:MMEoverall
}
shows the targeted implementation of Eurecom
EPC.
\chapter*
{
S1AP layer
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
S1AP layer
}
\nomenclature
{
S1AP
}{
S1 Application Protocol
}
S1AP layer relies on
\nomenclature
{
ASN.1
}{
Abstract Syntax Notation.1
}
ASN.1 messages
description. Generating C code from the specification
implies three steps:
\begin{enumerate}
\item
Modify .asn files to match tools limitation.
\item
Generate
\nomenclature
{
IE
}{
Informations Elements
}
IEs with the help of the asn1c free tool.
\item
Use the provided script which generates
\nomenclature
{
PDU
}{
Protocol Data Unit
}
PDU codec
\footnote
{
Encode/Decode
}
.
\end{enumerate}
\chapter*
{
Inter-task interface
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
Inter-task interface
}
\section
{
Concurrency
}
Code divided in layers should be able to be executed in parallel to use the full
\nomenclature
{
CPU
}{
Control Processing Unit
}
CPUs power. We can achieve better performance
by using some mechanisms that runs part of code in parallel on UNIX platforms:
\begin{itemize}
\item
Multi-process: no link between processes, usage of sockets or pipes is mandatory.
\item
Forks: code is duplicated and data are stored in different spaces.
\item
Threads: only code is duplicated, data space is shared between processes
\end{itemize}
Data synchronization is the first issue to think about when using such mechanisms.
\section
{
Overall description
}
A single
\nomenclature
{
API
}{
Application Programming Interface
}
API
(called ITTI
\footnote
{
InTer-Task Interface
}
) is used to manage messages
exchanged between the tasks which are running on separate threads.
This will lead in better usage of multi-core environments.
\begin{figure}
[h]
\begin{center}
\begin{tikzpicture}
\node
[]
(t1)
{
Task A
}
;
\node
[below=of t1,yshift=7mm,font=\tiny]
(s1)
{
send msg to task
}
;
\node
[queue,rotate=90,below=of t1.south,anchor=top]
(c1)
{}
;
\node
[right=of t1,xshift=15mm]
(t2)
{
Task B
}
;
\node
[below=of t2,yshift=7mm,font=\tiny]
(r2)
{
recv msg from task
}
;
\node
[queue,rotate=90,below=of t2.south,anchor=top]
(c2)
{}
;
\node
[dashed,fit=(c1)(t1)(s1),draw]
(T1)
{}
;
\node
[dashed,fit=(c2)(t2)(r2),draw]
(T2)
{}
;
\node
[draw]
(ITTI) at (
$
(
T
1
)!
0
.
5
!(
T
2
)
+
(
0
,
-
2
.
3
)
$
)
{
ITTI interface
}
;
\draw
[->]
(T1) |- (ITTI);
\draw
[->]
(ITTI.east) -| (c2.bottom);
\draw
[->]
(c2.east) -- (r2);
\node
[queue,rotate=90,minimum width=5mm,minimum height=7mm,right=of c2,anchor=top,yshift=-15mm]
(c3)
{}
;
\node
[dashed,rectangle,minimum width=5mm,minimum height=5mm,draw,below=7mm of c3,anchor=east]
(c4)
{}
;
\node
[right=4mm of c3.shape center]
(x3)
{
Message queue
}
;
\node
[right=4mm of c4.center]
(x4)
{
Thread
}
;
\node
[draw,fit=(c3)(x3)(x4)(c4)]
(T4)
{}
;
\end{tikzpicture}
\caption
{
Overall process
}
\label
{
fig:Overall process
}
\end{center}
\end{figure}
Figure
\ref
{
fig:Overall process
}
describes the basic fonctionnement of the inter-task interface.
A message sent from
Task A is en-queued to the message queue belonging to the target task. Note that
tasks can send messages to themselves. Another API (See Figure
\ref
{
fig:Broadcasting process
}
) defines broadcast messaging
where any task can send a broadcast message to every other task.
\begin{figure}
[H]
\begin{center}
\begin{tikzpicture}
\node
[]
(t1)
{
Task A
}
;
\node
[below=of t1,yshift=7mm,font=\tiny]
(s1)
{
send broadcast msg
}
;
\node
[queue,rotate=90,below=of t1.south,anchor=top]
(c1)
{}
;
\node
[right=of t1,xshift=35mm]
(t2)
{
Task B
}
;
\node
[below=of t2,yshift=7mm,font=\tiny]
(r2)
{
recv msg from task
}
;
\node
[queue,rotate=90,below=of t2.south,anchor=top]
(c2)
{}
;
\node
[right=of t2,xshift=15mm]
(tn)
{
Task N
}
;
\node
[below=of tn,yshift=7mm,font=\tiny]
(rn)
{
recv msg from task
}
;
\node
[queue,rotate=90,below=of tn.south,anchor=top]
(cn)
{}
;
\node
[dashed,fit=(c1)(t1)(s1),draw]
(T1)
{}
;
\node
[dashed,fit=(c2)(t2)(r2),draw]
(T2)
{}
;
\node
[dashed,fit=(cn)(tn)(rn),draw]
(TN)
{}
;
\node
[]
(ITTI) at (
$
(
T
2
)!
0
.
5
!(
TN
)
$
)
{
...
}
;
\node
[draw]
(ITTI) at (
$
(
T
1
)!
0
.
5
!(
T
2
)
+
(
0
,
-
2
.
3
)
$
)
{
ITTI interface
}
;
\draw
[->]
(T1) |- (ITTI);
\draw
[->]
(ITTI.east) -| (c2.bottom);
\draw
[->]
(ITTI.east) -| (cn.bottom);
\draw
[->]
(c2.east) -- (r2);
\draw
[->]
(cn.east) -- (rn);
\node
[queue,rotate=90,minimum width=5mm,minimum height=7mm,below=23mm of T1]
(c3)
{}
;
\node
[dashed,rectangle,minimum width=5mm,minimum height=5mm,draw,below=7mm of c3,anchor=east]
(c4)
{}
;
\node
[right=4mm of c3.shape center]
(x3)
{
Message queue
}
;
\node
[right=4mm of c4.center]
(x4)
{
Thread
}
;
\node
[draw,fit=(c3)(x3)(x4)(c4)]
(T4)
{}
;
\end{tikzpicture}
\caption
{
Broadcasting process
}
\label
{
fig:Broadcasting process
}
\end{center}
\end{figure}
Once a task received a new message and if the task is in sleep mode (i.e. not handling
any message), the task is waken up and the message is de-queued. We can imagine a limit
in number of parallel tasks, for example N+1 CPU's. Architectures using hyper-threading
mechanism can have this value extended to 2 x CPU's.
Every task is running in a separated pthread, awaiting for new messages to handle.
\section
{
Signals from kernel
}
Handling of signals from kernel is the more critical part as a signal can be raised
at any moment and will interrupt one of the running thread. Used signals should be restricted
to a single task that will handle them (using the POSIX sigmask function) . Moreover, it isn't
thread-safe to use mutexes inside a signal handler, a synchronization flag should be used to
notify the signal handler task. This task will then send the appropriate message
to the right task. For example, handling of signals can be done in the main thread or by a background task
scheduled periodically.
To overcome these issues, sigtimedwait and sigwaitinfo API functions can be used
to wait for a signal to happen. Signals will be received in the thread context, as far as
other threads block these signals.
\section
{
Priority handling
}
Usage of message prioritization enables tasks to send critical messages with a faster
delivery time regarding other messages en-queued for the target task.
For now only seven priority levels can be applied when defining tasks:
\begin{itemize}
\item
TASK
\_
PRIORITY
\_
MAX
\item
TASK
\_
PRIORITY
\_
MAX
\_
LEAST
\item
TASK
\_
PRIORITY
\_
MED
\_
PLUS
\item
TASK
\_
PRIORITY
\_
MED
\item
TASK
\_
PRIORITY
\_
MED
\_
LEAST
\item
TASK
\_
PRIORITY
\_
MIN
\_
PLUS
\item
TASK
\_
PRIORITY
\_
MIN
\end{itemize}
For now message priority does not involve any suitable scheduler: every time a message is de-queued,
message priority of other messages is incremented by one.
\section
{
Message scheduling
}
Currently, there is no software limit on the maximum number of threads executed in parallel.
When a task sends a message, it is en-queued in the right message queue, belonging to
the target task. The queue is a double-linked list. A mutex prevents other tasks
from modifying this queue while a task is en-queueing or removing a message.
\section
{
Message definition
}
Messages are defined using a single macro that adds the message to the ids enumeration
and maps data of the message to the union of messages.
\begin{lstlisting}
MESSAGE
_
DEF(S1AP
_
SCTP
_
NEW
_
MESSAGE
_
IND, TASK
_
PRIORITY
_
MED, S1apSctpNewMessageInd s1apSctpNewMessageInd)
\end{lstlisting}
and the associated data:
\begin{lstlisting}
typedef struct
{
uint8
_
t *buffer; ///< SCTP buffer
uint32
_
t bufLen; ///< SCTP buffer length
int32
_
t assocId; ///< SCTP physical association ID
uint8
_
t stream; ///< Stream number on which data had been received
uint16
_
t instreams; ///< Number of input streams for the SCTP connection between peers
uint16
_
t outstreams; ///< Number of output streams for the SCTP connection between peers
}
S1apSctpNewMessageInd;
\end{lstlisting}
\section
{
Task message handling
}
\begin{lstlisting}
void* s1ap
_
mme
_
thread(void *args)
{
while(1)
{
/* Trying to fetch a message from the message queue.
* If the queue is empty, this function will block till a
* message is sent to the task.
*/
receive
_
msg(TASK
_
S1AP,
&
receivedMessage);
assert(receivedMessage != NULL);
switch(receivedMessage->messageId)
{
case S1AP
_
SCTP
_
NEW
_
MESSAGE
_
IND:
{
//Some processing
}
break;
default:
{
S1AP
_
DEBUG("Unkwnon message ID
%d\n", receivedMessage->messageId);
}
break;
}
free(receivedMessage);
receivedMessage = NULL;
}
return NULL;
}
\end{lstlisting}
\section
{
Messages logging
}
\begin{figure}
[H]
\begin{center}
\begin{tikzpicture}
\node
[]
(p1)
{
Process
}
;
\node
[below=5mm of p1]
(i1)
{
ITTI
}
;
\node
[queue,right=of i1,rotate=90,anchor=base]
(q1)
{}
;
\node
[draw,fit=(i1)(q1)]
(s1)
{
}
;
\node
[fit=(p1)(i1)(q1)(s1),draw]
(T1)
{}
;
\node
[queue,fill=red!30,right=of s1.east,yshift=-5mm]
(c1)
{
TCP socket
}
;
\node
[right=of c1]
(r1)
{
Remote host n
}
;
\node
[fit=(r1),draw]
(R2)
{}
;
\node
[queue,fill=red!30,right=of s1.east,yshift=5mm]
(c2)
{
TCP socket
}
;
\node
[right=of c2]
(r1)
{
Remote host 1
}
;
\node
[fit=(r1),draw]
(R1)
{}
;
\draw
[-]
(q1.base) -- ++ (1,0) -| ++ (0,.6) -- (c2.west);
\draw
[-]
(c2) -- (R1);
\draw
[-]
(q1.base) -- ++ (1,0) -| ++ (0,-.4) -- (c1.west);
\draw
[-]
(c1) -- (R2);
\end{tikzpicture}
\caption
{
Remote debugging
}
\label
{
fig:Remote debugging
}
\end{center}
\end{figure}
Logging of inter-tasks messages can be setup using an external tool that will be
connected to the ITTI. Based on an array of dumped messages, they are serialized
to produce an array of byte sent over a socket. A remote tool can then decode
messages and display fields, message number, time.
\\
Additionaly, logs from standard output can be printed over the debug tool.
Multi-user debugging on only one running process can be achieved using this interface.
Messages to dump should be queued for a pure asynchronous communication between the
dump task and the remote hosts.
Another interesting feature could be to send a message to a task from an host,
allowing run-time re-configuration.
The C pre-processor can be used to generate messages definition (using
\nomenclature
{
XML
}{
Extensible Markup Language
}
XML templates
for example).
\\
\section
{
Limitations
}
Data pointers belonging to one task should never be passed to another task.
The presented mechanism does not prevent a task from being locked. In such a case,
the blocked task will no more handle messages incoming from other tasks.
\section
{
Benefits
}
\begin{itemize}
\item
Only a single entry point between all tasks (easy inter-task communication tracking and debugging).
\item
Usage of message queues enables parallelization of layers.
\item
Message prioritization and scheduling.
\item
Protection of data between threads is done by the API at an higher level.
\end{itemize}
\section
{
To do
}
\begin{itemize}
\item
Implement a priority based scheduler. Currently the queue of messages works as a FIFO.
\item
Limit the number of tasks thread that can be run in parallel
\end{itemize}
\chapter*
{
Signal API
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
Signal API
}
On LINUX platforms, processes will receive signals comming from Kernel.
A single blocking entry point handles all used signals that are requested by the
MME. The main application thread is reserved to signal handling as this thread will
be blocked till a new signal is ready for handling.
\\
Using this method prevents threads from being interrupted by signals handler which
can interrupt the thread at any time and as a consequence create some misbehaving
in threads contexts.
Following is a sample list of signals handled:
\begin{itemize}
\item
SIGABRT This is signal is sent to the process when abort() function is called
within the process and kill the process. Process can for example display the stack
once this signal is received.
\item
SIGRTMIN This signal is used by the timer API and is raised everytime a
timer has expired.
\end{itemize}
Till now there is no way for tasks to request a new signal.
\chapter*
{
Timer API
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
Timer API
}
Timer API doesn't consist of a task (i.e. tasks cannot send messages to it).
Handling of UNIX signal associated to the timers is a Real-time signal with an id (SIGRTMIN)
depending on the platform. Management of this signal is done by the signal interface
and developpers should not care about handling timer signals incoming from Kernel.
Once a timer has expired the task which has requested it will receive the TIMER
\_
HAS
\_
EXPIRED
signal.
Note that timer
\_
id is of type long and thus its size is platform specific.
\section
{
Timer types
}
\begin{itemize}
\item
TIMER
\_
ONE
\_
SHOT After expiry and its associated signal, the timer is removed.
\item
TIMER
\_
PERIODIC The timer is automatically reloaded on each expiry while the task
which has setup this timer doesn't cancel it.
\end{itemize}
\section
{
Requesting a new signal
}
Any task can request a new signal by invoking the following API:
\begin{lstlisting}
int timer
_
setup(
uint32
_
t interval
_
sec,
uint32
_
t interval
_
us,
task
_
id
_
t task
_
id,
timer
_
type
_
t type,
long *timer
_
id);
\end{lstlisting}
Note that timer id is a unique identifier to distinguish timers.
\section
{
Disable and remove a timer
}
Disable and remove the timer referenced by timer
\_
id.
\begin{lstlisting}
int timer
_
remove(long timer
_
id);
\end{lstlisting}
\section
{
Timer signal expiry
}
Once the signal dispatcher receives the SIGRTMIN signal, a new signal is sent
to the task which has requested the timer. Contrary to signal request, timer
expiry notification is achieved using the intertask mechanism.
The signal data associated to this event follows:
\begin{lstlisting}
typedef struct
{
long timer
_
id;
}
timer
_
has
_
expired
_
t;
\end{lstlisting}
\chapter*
{
Compiling core EPC
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
Compiling core EPC
}
The core EPC software has been tested on Ubuntu 12.04LTS x86 and ia64.
Before compiling the core EPC, some packages should be installed on the platform.
\section
{
Dependencies
}
\begin{itemize}
\item
libsctp-dev
\item
libpthread-dev
\item
automake and autoconf
\item
libtoolize
\item
gcc, g++, make
\item
flex and bison
\item
openssl-dev
\item
asn1c (see section
\ref
{
sec:asn1c
}
)
\item
freediameter (see section
\ref
{
sec:freediameter
}
) and gnutls 3.1.0
(see section
\ref
{
sec:gnutls
}
)
\end{itemize}
Command-line to install the required packages:
\begin{lstlisting}
sudo apt-get install cmake make gcc flex bison
\
libsctp1 libsctp-dev libidn2-0-dev libidn11-dev
\
libmysqlclient-dev libxml2-dev swig python-dev
\
cmake-curses-gui valgrind guile-2.0-dev
\
libgmp-dev libgcrypt11-dev gdb unzip
\
libtasn1-3-dev g++ autoconf automake
\
openssl-dev -y
\end{lstlisting}
\subsection
{
ASN1c
}
\label
{
sec:asn1c
}
\subsection
{
gnutls
}
\label
{
sec:gnutls
}
The GNUTls library is only used by freediameter for certificate handling and as a
consequence should be installed before trying to compile the freediameter library.
\begin{lstlisting}
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.0.tar.xz
tar -xvf gnutls-3.1.0.tar.xz
cd gnutls-3.1.0/
./configure LDFLAGS='-L/usr/local/lib'
make
sudo make install
\end{lstlisting}
Note: when dependencies are installed in /usr/local instead of /usr,
LDFLAGS has to be overriden with the path to libraries when configuring the package:
LDFLAGS='-L/usr/local/lib'.
\subsection
{
freediameter
}
\label
{
sec:freediameter
}
Freediameter is the package that provides diameter capabilities to the MME/HSS.
On top of this stack, S6A avp dictionnary is used to enable a compliant S6A interface.
\begin{lstlisting}
wget http://www.freediameter.net/hg/freeDiameter/archive/1.1.5.tar.gz
tar -xvf 1.1.5.tar.gz
cd freeDiameter-1.1.5
patch -p1 < ../../freediameter-1.1.5.patch
mkdir build
cd build
cmake ../
make
make test
sudo make install
\end{lstlisting}
If you want ot install this package in /usr instead of /usr/local,
\\
-DCMAKE
\_
INSTALL
\_
PREFIX:PATH=/usr should be passed to cmake at configuration.
\chapter*
{
System configuration
}
\stepcounter
{
chapter
}
\addcontentsline
{
toc
}{
chapter
}{
System configuration
}
Currently there is two ways to configure the system:
\begin{itemize}
\item
Compilation configuration
\item
Boot-up configuration
\end{itemize}
In the first type of configuration, the single system configuration structure
is filled in with default values that can be found in the mme
\_
default
\_
values.h
header file.
\\
When Boot-up configuration is used, a configuration file is passed to the process
by using the either -c filename.conf or --conf=filename.conf. This file is then parsed
by the bison interpreter and values are replaced in the global system configuration
structure.
\section
{
Global MME parameters
}
\subsection
{
Relative MME capacity
}
Even though this parameter is not used by the MME for controlling the MME load
balancing within a pool (at least for now), the parameter has to be to forwarded
to the eNBs during association procedure.
This parameter is encoded on 8bits, acceptable values going from 0 to 255.
(Default value = 15)
\begin{lstlisting}
RELATIVE
_
CAPACITY = 10;
\end{lstlisting}
\subsection
{
Maximum number of UE
}
\label
{
sec:Maximum number of UE
}
This limit is present here only for debug purposes and is used to restrict
the number of served UE the MME can handle. In real network another mechanism
will trigger an MME overload for certain eNBs and will restrict certain types of
traffic. Such a mechanism would imply the Relative MME capacity.
\begin{lstlisting}
MAXUE = 100;
\end{lstlisting}
\subsection
{
Maximum number of eNB
}
Refer to
\ref
{
sec:Maximum number of UE
}
.
\begin{lstlisting}
MAXENB = 10;
\end{lstlisting}
\subsection
{
Tracking Area Identity
}
\nomenclature
{
TAI
}{
Tracking Area Identity
}
TAI is the concatenation of
\nomenclature
{
MCC
}{
Mobile Country Code
}
MCC,
\nomenclature
{
MNC
}{
Mobile Network Code
}
MNC and
\nomenclature
{
TAC
}{
Tracking Area Code
}
TAC.
The TAC uniquely identifies a PLMN within a Cell Id.
\begin{lstlisting}
PLMN = mcc.mnc:tac;
\end{lstlisting}
Multiple values can be given using a comma separator. Example:
\begin{lstlisting}
PLMN = 208.38:0,209.130:4,208.35:8;
\end{lstlisting}
\subsection
{
MME Code
}
A list of a maximum of 256 values can be provided.
\nomenclature
{
MMEC
}{
MME Code
}
MME Code is encoded on 8 bits,
so acceptable range is: 0 to 255.
Example:
\begin{lstlisting}
MME
_
CODE = 30,56,1,8;
\end{lstlisting}
\subsection
{
MME Group Id
}
A list of a maximum of 65356 values can be provided.
\nomenclature
{
MMEGID
}{
MME Group Id
}
MME Group Id is encoded on 16 bits,
so acceptable range is: 0 to 65535.
Example:
\begin{lstlisting}
MME
_
GID = 3,4,5,30,8,9,50021;
\end{lstlisting}
\section
{
Intertask parameters
}
\subsection
{
Queue size per task
}
To restrict the number of messages in queues or to detect a possible MME overload,
an upper bound for the queue size can be defined like this:
\begin{lstlisting}
ITTI
_
QUEUE
_
SIZE = 2000000;
\end{lstlisting}
This parameter is expressed in bytes. Note that all messages exchanged by tasks
have the same size.
\section
{
SCTP parameters
}
\subsection
{
IN/OUT streams number
}
The number of input/output streams can be configured to limit the number of streams
used for UE-associated signalling. Note that stream with id = 0 is reserved for
non-UE associated signalling. At least two streams should be used by the MME.
(Default value = 64/64 streams)
\begin{lstlisting}
SCTP
_
INSTREAMS = 32;
SCTP
_
OUTSTREAMS = 32;
\end{lstlisting}
\section
{
S1AP parameters
}
\subsection
{
Outcome timer
}
Once an outcome is sent from MME to eNB, the MME locally starts a timer to abort
the procedure and release UE contexts if the expected answer to this outcome is not
received at the expiry of this timer.
\\
This timer is expressed in seconds. (Default value = 5 seconds)
\begin{lstlisting}
S1AP
_
OUTCOME
_
TIMER = 10;
\end{lstlisting}
\section
{
Network interfaces parameters
}
Three paramters can be tuned in the configuration file:
\begin{itemize}
\item
Interface Name: The related interface will be bind to this interface name
\item
IP address: Currently only IPv4 address is allowed
\item
IP netwmask: Netmask for the LAN
\end{itemize}
These three paramters can be setup for five different interfaces used:
\begin{itemize}
\item
SGW interface for S11
\item
SGW interface for S1U/S12/S4 in user plane
\item
SGW interface for S5/S8 in user plane
\item
PGW interface for S5/S8
\item
PGW interface for SGi
\item
MME interface for S1-MME in control plane
\end{itemize}
Example of configuration:
\begin{lstlisting}
# ------- Interfaces definitions
SGW
_
INTERFACE
_
NAME
_
FOR
_
S11 = "s11sgw";
SGW
_
IP
_
ADDRESS
_
FOR
_
S11 = "192.168.10.1";
SGW
_
IP
_
NETMASK
_
FOR
_
S11 = 24;
SGW
_
INTERFACE
_
NAME
_
FOR
_
S1U
_
S12
_
S4
_
UP = "upsgw0";
SGW
_
IP
_
ADDRESS
_
FOR
_
S1U
_
S12
_
S4
_
UP = "192.168.1.1";
SGW
_
IP
_
NETMASK
_
FOR
_
S1U
_
S12
_
S4
_
UP = 24;
SGW
_
INTERFACE
_
NAME
_
FOR
_
S5
_
S8
_
UP = "upsgw1";
SGW
_
IP
_
ADDRESS
_
FOR
_
S5
_
S8
_
UP = "192.168.5.2";
SGW
_
IP
_
NETMASK
_
FOR
_
S5
_
S8
_
UP = 24;
PGW
_
INTERFACE
_
NAME
_
FOR
_
S5
_
S8 = "uppgw0";
PGW
_
IP
_
ADDRESS
_
FOR
_
S5
_
S8 = "192.168.5.1";
PGW
_
IP
_
NETMASK
_
FOR
_
S5
_
S8 = 24;
PGW
_
INTERFACE
_
NAME
_
FOR
_
SGI = "eth1";
PGW
_
IP
_
ADDR
_
FOR
_
SGI = "192.168.12.30";
PGW
_
IP
_
NETMASK
_
FOR
_
SGI = 24;
MME
_
INTERFACE
_
NAME
_
FOR
_
S1
_
MME = "cpmme0";
MME
_
IP
_
ADDRESS
_
FOR
_
S1
_
MME = "192.168.11.1";
MME
_
IP
_
NETMASK
_
FOR
_
S1
_
MME = 24;
\end{lstlisting}
\end{document}
openair3/DOCS/Latex/EPC/Makefile
deleted
100644 → 0
View file @
4d16f1f8
#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements. See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1 (the "License"); you may not use this file
# * except in compliance with the License.
# * You may obtain a copy of the License at
# *
# * http://www.openairinterface.org/?page_id=698
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# * contact@openairinterface.org
# */
MYFILE
=
EPC
all
:
pdflatex
$(MYFILE)
.tex
pdflatex
$(MYFILE)
.tex
makeindex
$(MYFILE)
.nlo
-s
nomencl.ist
-o
$(MYFILE)
.nls
pdflatex
$(MYFILE)
.tex
.PHONY
:
all
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment