Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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
Michael Black
OpenXG UE
Commits
43fa1f39
Commit
43fa1f39
authored
Jul 15, 2019
by
laurent
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more code
parent
7ea58d7f
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
136 additions
and
51 deletions
+136
-51
executables/dl_fs6.c
executables/dl_fs6.c
+53
-24
executables/main-ocp.c
executables/main-ocp.c
+2
-2
executables/split_headers.h
executables/split_headers.h
+15
-3
executables/transport_split.c
executables/transport_split.c
+66
-22
No files found.
executables/dl_fs6.c
View file @
43fa1f39
...
...
@@ -4,7 +4,7 @@
#include <executables/split_headers.h>
#define FS6_BUF_SIZE 100*1000
static
in
t
sockFS6
;
static
UDPsock_
t
sockFS6
;
#if 0
void pdsch_procedures(PHY_VARS_eNB *eNB,
...
...
@@ -66,14 +66,26 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
dlsch->active = 0;
dlsch_harq->round++;
}
#endif
phy_procedures_eNB_TX_fs6(int sockFS6, uint64_t TS) {
uint8_t bufferZone[FS6_BUF_SIZE];
receiveSubFrame(sockFS6, TS, bufferZone, sizeof(bufferZone) );
void
phy_procedures_eNB_TX_process
(
uint8_t
*
bufferZone
,
int
bufSize
,
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
int
do_meas
)
{
// We got
// subframe number
//
int
frame
=
proc
->
frame_tx
;
int
subframe
=
proc
->
subframe_tx
;
uint32_t
i
,
aa
;
uint8_t
harq_pid
;
int16_t
UE_id
=
0
;
uint8_t
num_pdcch_symbols
=
0
;
uint8_t
num_dci
=
0
;
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
uint8_t
num_mdci
=
0
;
#endif
uint8_t
ul_subframe
;
uint32_t
ul_frame
;
LTE_DL_FRAME_PARMS
*
fp
=&
eNB
->
frame_parms
;
LTE_UL_eNB_HARQ_t
*
ulsch_harq
;
for
(
int
aa
=
0
;
aa
<
fp
->
nb_antenna_ports_eNB
;
aa
++
)
{
memset
(
&
eNB
->
common_vars
.
txdataF
[
aa
][
subframe
*
fp
->
ofdm_symbol_size
*
fp
->
symbols_per_tti
],
...
...
@@ -165,13 +177,15 @@ phy_procedures_eNB_TX_fs6(int sockFS6, uint64_t TS) {
harq_pid
,
UE_id
,
frame
,
subframe
,
dlsch0
->
rnti
);
}
else
{
// generate pdsch
pdsch_procedures_fs6(eNB,
proc,
harq_pid,
dlsch0,
dlsch1,
&eNB->UE_stats[(uint32_t)UE_id],
0);
/*
pdsch_procedures_fs6(eNB,
proc,
harq_pid,
dlsch0,
dlsch1,
&eNB->UE_stats[(uint32_t)UE_id],
0);
*/
}
}
else
if
((
dlsch0
)
&&
(
dlsch0
->
rnti
>
0
)
&&
(
dlsch0
->
active
==
0
)
...
...
@@ -185,21 +199,32 @@ phy_procedures_eNB_TX_fs6(int sockFS6, uint64_t TS) {
proc
,
AMP
);
}
#endif
void
prach_eNB_extract
(
PHY_VARS_eNB
*
eNB
,
RU_t
*
ru
,
int
frame
,
int
subframe
)
{
void
prach_eNB_extract
(
PHY_VARS_eNB
*
eNB
,
RU_t
*
ru
,
int
frame
,
int
subframe
,
uint8_t
*
buf
,
int
bufSize
)
{
commonUDP_t
*
header
=
(
commonUDP_t
*
)
buf
;
header
->
contentBytes
=
1000
;
header
->
nbBlocks
=
1
;
return
;
}
void
prach_eNB_process
(
PHY_VARS_eNB
*
eNB
,
RU_t
*
ru
,
int
frame
,
int
subframe
)
{
}
void
phy_procedures_eNB_uespec_RX_extract
(
PHY_VARS_eNB
*
phy_vars_eNB
,
L1_rxtx_proc_t
*
proc
)
{
void
phy_procedures_eNB_uespec_RX_extract
(
PHY_VARS_eNB
*
phy_vars_eNB
,
L1_rxtx_proc_t
*
proc
,
uint8_t
*
buf
,
int
bufSize
)
{
commonUDP_t
*
header
=
(
commonUDP_t
*
)
buf
;
header
->
contentBytes
=
1000
;
header
->
nbBlocks
=
1
;
return
;
}
void
phy_procedures_eNB_uespec_RX_process
(
PHY_VARS_eNB
*
phy_vars_eNB
,
L1_rxtx_proc_t
*
proc
)
{
}
void
phy_procedures_eNB_TX_fs6
()
{
void
phy_procedures_eNB_TX_extract
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
,
int
do_meas
,
uint8_t
*
buf
,
int
bufSize
)
{
commonUDP_t
*
header
=
(
commonUDP_t
*
)
buf
;
header
->
contentBytes
=
1000
;
header
->
nbBlocks
=
1
;
return
;
}
void
DL_du_fs6
(
RU_t
*
ru
,
int
frame
,
int
subframe
,
uint64_t
TS
)
{
...
...
@@ -207,10 +232,10 @@ void DL_du_fs6(RU_t *ru, int frame, int subframe, uint64_t TS) {
for
(
int
i
=
0
;
i
<
ru
->
num_eNB
;
i
++
)
{
uint8_t
bufferZone
[
FS6_BUF_SIZE
];
receiveSubFrame
(
sockFS6
,
TS
,
bufferZone
,
sizeof
(
bufferZone
)
);
receiveSubFrame
(
&
sockFS6
,
TS
,
bufferZone
,
sizeof
(
bufferZone
)
);
phy_procedures_eNB_TX_process
(
bufferZone
,
sizeof
(
bufferZone
),
ru
->
eNB_list
[
i
],
&
ru
->
eNB_list
[
i
]
->
proc
.
L1_proc
,
1
);
}
phy_procedures_eNB_TX_fs6
();
/* Fixme: datamodel issue: a ru is supposed to be connected to several eNB
L1_rxtx_proc_t * L1_proc = &proc->L1_proc;
ru_proc->timestamp_tx = L1_proc->timestamp_tx;
...
...
@@ -244,14 +269,14 @@ void UL_du_fs6(RU_t *ru, int frame, int subframe) {
}
uint8_t
bufferZone
[
FS6_BUF_SIZE
];
prach_eNB_extract
(
eNB
,
NULL
,
proc
->
frame_rx
,
proc
->
subframe_rx
);
prach_eNB_extract
(
eNB
,
NULL
,
proc
->
frame_rx
,
proc
->
subframe_rx
,
bufferZone
,
FS6_BUF_SIZE
);
if
(
NFAPI_MODE
==
NFAPI_MONOLITHIC
||
NFAPI_MODE
==
NFAPI_MODE_PNF
)
{
phy_procedures_eNB_uespec_RX_extract
(
eNB
,
&
proc
->
L1_proc
);
phy_procedures_eNB_uespec_RX_extract
(
eNB
,
&
proc
->
L1_proc
,
bufferZone
,
FS6_BUF_SIZE
);
}
for
(
int
i
=
0
;
i
<
ru
->
num_eNB
;
i
++
)
{
sendSubFrame
(
sockFS6
,
bufferZone
,
sizeof
(
bufferZone
)
);
sendSubFrame
(
&
sockFS6
,
bufferZone
);
}
}
...
...
@@ -267,13 +292,13 @@ void DL_cu_fs6(RU_t *ru,int frame, int subframe) {
eNB
->
if_inst
->
UL_indication
(
&
eNB
->
UL_INFO
);
pthread_mutex_unlock
(
&
eNB
->
UL_INFO_mutex
);
uint8_t
bufferZone
[
FS6_BUF_SIZE
];
phy_procedures_eNB_TX
(
eNB
,
&
proc
->
L1_proc
,
1
);
sendSubFrame
(
sockFS6
,
bufferZone
,
sizeof
(
bufferZone
)
);
phy_procedures_eNB_TX
_extract
(
eNB
,
&
proc
->
L1_proc
,
1
,
bufferZone
,
FS6_BUF_SIZE
);
sendSubFrame
(
&
sockFS6
,
bufferZone
);
}
void
UL_cu_fs6
(
RU_t
*
ru
,
int
frame
,
int
subframe
,
uint64_t
TS
)
{
uint8_t
bufferZone
[
FS6_BUF_SIZE
];
receiveSubFrame
(
sockFS6
,
TS
,
bufferZone
,
sizeof
(
bufferZone
)
);
receiveSubFrame
(
&
sockFS6
,
TS
,
bufferZone
,
sizeof
(
bufferZone
)
);
// Fixme: datamodel issue
PHY_VARS_eNB
*
eNB
=
RC
.
eNB
[
0
][
0
];
L1_proc_t
*
proc
=
&
eNB
->
proc
;
...
...
@@ -289,8 +314,11 @@ void *cu_fs6(void *arg) {
RU_t
*
ru
=
(
RU_t
*
)
arg
;
RU_proc_t
*
proc
=
&
ru
->
proc
;
int64_t
AbsoluteSubframe
=-
1
;
fill_rf_config
(
ru
,
ru
->
rf_config_file
);
init_frame_parms
(
&
ru
->
frame_parms
,
1
);
phy_init_RU
(
ru
);
wait_sync
(
"ru_thread"
);
AssertFatal
(
createUDPsock
(
NULL
,
"8888"
,
"127.0.0.1"
,
"7777"
,
&
sockFS6
),
""
);
while
(
1
)
{
AbsoluteSubframe
++
;
...
...
@@ -312,6 +340,7 @@ void *du_fs6(void *arg) {
phy_init_RU
(
ru
);
openair0_device_load
(
&
ru
->
rfdevice
,
&
ru
->
openair0_cfg
);
wait_sync
(
"ru_thread"
);
AssertFatal
(
createUDPsock
(
NULL
,
"7777"
,
"127.0.0.1"
,
"8888"
,
&
sockFS6
),
""
);
while
(
1
)
{
AbsoluteSubframe
++
;
...
...
executables/main-ocp.c
View file @
43fa1f39
...
...
@@ -107,9 +107,9 @@ void init_RU_proc(RU_t *ru) {
char
*
fs6
=
getenv
(
"fs6"
);
if
(
fs6
)
{
if
(
strncasecmp
(
fs6
,
"cu"
,
2
)
)
if
(
strncasecmp
(
fs6
,
"cu"
,
2
)
==
0
)
threadCreate
(
&
t
,
cu_fs6
,
(
void
*
)
ru
,
"MainCu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
else
if
(
strncasecmp
(
fs6
,
"du"
,
2
)
)
else
if
(
strncasecmp
(
fs6
,
"du"
,
2
)
==
0
)
threadCreate
(
&
t
,
du_fs6
,
(
void
*
)
ru
,
"MainDu"
,
-
1
,
OAI_PRIORITY_RT_MAX
);
else
AssertFatal
(
false
,
"environement variable fs6 is not cu or du"
);
...
...
executables/split_headers.h
View file @
43fa1f39
...
...
@@ -2,12 +2,22 @@
#define __SPLIT_HEADERS_H
#include <stdint.h>
#include <stdbool.h>
#include <openair1/PHY/defs_eNB.h>
#define MTU 65536
#define UDP_TIMEOUT 100000L // in nano second
#define MAX_BLOCKS 16
#define blockAlign 32 //bytes
typedef
struct
{
char
*
sourceIP
;
char
*
sourcePort
;
char
*
destIP
;
char
*
destPort
;
struct
addrinfo
*
destAddr
;
int
sockHandler
;
}
UDPsock_t
;
typedef
struct
commonUDP_s
{
uint64_t
timestamp
;
// id of the group (subframe for LTE)
uint16_t
nbBlocks
;
// total number of blocks for this timestamp
...
...
@@ -24,9 +34,9 @@ typedef struct frequency_s {
int
nbSamples
;
}
frequency_t
;
int
createListner
(
int
por
t
);
int
receiveSubFrame
(
int
sock
,
uint64_t
expectedTS
,
void
*
bufferZone
,
int
bufferSize
);
int
sendSubFrame
(
int
sock
,
void
*
bufferZone
,
int
nbBlocks
);
bool
createUDPsock
(
char
*
sourceIP
,
char
*
sourcePort
,
char
*
destIP
,
char
*
destPort
,
UDPsock_t
*
resul
t
);
int
receiveSubFrame
(
UDPsock_t
*
sock
,
uint64_t
expectedTS
,
void
*
bufferZone
,
int
bufferSize
);
int
sendSubFrame
(
UDPsock_t
*
sock
,
void
*
bufferZone
);
inline
size_t
alignedSize
(
void
*
ptr
)
{
commonUDP_t
*
header
=
(
commonUDP_t
*
)
ptr
;
return
((
header
->
contentBytes
+
sizeof
(
commonUDP_t
)
+
blockAlign
-
1
)
/
blockAlign
)
*
blockAlign
;
...
...
@@ -37,6 +47,8 @@ void *du_fs6(void *arg);
void
fill_rf_config
(
RU_t
*
ru
,
char
*
rf_config_file
);
void
rx_rf
(
RU_t
*
ru
,
int
*
frame
,
int
*
subframe
);
void
tx_rf
(
RU_t
*
ru
);
void
common_signal_procedures
(
PHY_VARS_eNB
*
eNB
,
int
frame
,
int
subframe
);
void
pmch_procedures
(
PHY_VARS_eNB
*
eNB
,
L1_rxtx_proc_t
*
proc
);
// mistakes in main OAI
void
phy_init_RU
(
RU_t
*
);
...
...
executables/transport_split.c
View file @
43fa1f39
...
...
@@ -3,40 +3,79 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <netdb.h>
bool
createUDPsock
(
char
*
sourceIP
,
char
*
sourcePort
,
char
*
destIP
,
char
*
destPort
,
UDPsock_t
*
result
)
{
struct
addrinfo
hints
=
{
0
},
*
servinfo
,
*
p
;
hints
.
ai_family
=
AF_UNSPEC
;
hints
.
ai_socktype
=
SOCK_DGRAM
;
hints
.
ai_flags
=
AI_PASSIVE
;
int
status
;
if
((
status
=
getaddrinfo
(
sourceIP
,
sourcePort
,
&
hints
,
&
servinfo
))
!=
0
)
{
LOG_E
(
GTPU
,
"getaddrinfo error: %s
\n
"
,
gai_strerror
(
status
));
return
false
;
}
// loop through all the results and bind to the first we can
for
(
p
=
servinfo
;
p
!=
NULL
;
p
=
p
->
ai_next
)
{
if
((
result
->
sockHandler
=
socket
(
p
->
ai_family
,
p
->
ai_socktype
,
p
->
ai_protocol
))
==
-
1
)
{
LOG_W
(
GTPU
,
"socket: %s
\n
"
,
strerror
(
errno
));
continue
;
}
if
(
bind
(
result
->
sockHandler
,
p
->
ai_addr
,
p
->
ai_addrlen
)
==
-
1
)
{
close
(
result
->
sockHandler
);
LOG_W
(
GTPU
,
"bind: %s
\n
"
,
strerror
(
errno
));
continue
;
}
break
;
// if we get here, we must have connected successfully
}
if
(
p
==
NULL
)
{
// looped off the end of the list with no successful bind
LOG_E
(
GTPU
,
"failed to bind socket: %s %s
\n
"
,
sourceIP
,
sourcePort
);
return
false
;
}
freeaddrinfo
(
servinfo
);
// all done with this structure
if
((
status
=
getaddrinfo
(
destIP
,
destPort
,
&
hints
,
&
servinfo
))
!=
0
)
{
LOG_E
(
GTPU
,
"getaddrinfo error: %s
\n
"
,
gai_strerror
(
status
));
return
false
;
}
if
(
servinfo
)
{
result
->
destAddr
=
servinfo
;
}
else
{
LOG_E
(
PHY
,
"No valid UDP addr: %s:%s
\n
"
,
destIP
,
destPort
);
return
false
;
}
int
createListner
(
int
port
)
{
int
sock
;
AssertFatal
((
sock
=
socket
(
AF_INET
,
SOCK_DGRAM
,
IPPROTO_UDP
))
>=
0
,
""
);
struct
sockaddr_in
addr
=
{
sin_family:
AF_INET
,
sin_port:
htons
(
port
),
sin_addr:
{
s_addr
:
INADDR_ANY
}
};
int
enable
=
1
;
AssertFatal
(
setsockopt
(
sock
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
enable
,
sizeof
(
enable
))
==
0
,
""
);
AssertFatal
(
bind
(
sock
,
(
const
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
))
==
0
,
""
);
AssertFatal
(
setsockopt
(
result
->
sockHandler
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
enable
,
sizeof
(
enable
))
==
0
,
""
);
struct
timeval
tv
=
{
0
,
UDP_TIMEOUT
};
AssertFatal
(
setsockopt
(
sock
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
tv
,
sizeof
(
tv
))
==
0
,
""
);
AssertFatal
(
setsockopt
(
result
->
sockHandler
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
tv
,
sizeof
(
tv
))
==
0
,
""
);
// Make a send/recv buffer larger than a a couple of subframe
// so the kernel will store for us in and out paquets
int
buff
=
1000
*
1000
*
10
;
AssertFatal
(
setsockopt
(
sock
,
SOL_SOCKET
,
SO_SNDBUF
,
&
buff
,
sizeof
(
buff
))
==
0
,
""
);
AssertFatal
(
setsockopt
(
sock
,
SOL_SOCKET
,
SO_RCVBUF
,
&
buff
,
sizeof
(
buff
))
==
0
,
""
);
AssertFatal
(
setsockopt
(
result
->
sockHandler
,
SOL_SOCKET
,
SO_SNDBUF
,
&
buff
,
sizeof
(
buff
))
==
0
,
""
);
AssertFatal
(
setsockopt
(
result
->
sockHandler
,
SOL_SOCKET
,
SO_RCVBUF
,
&
buff
,
sizeof
(
buff
))
==
0
,
""
);
return
true
;
}
// sock: udp socket
// expectedTS: the expected timestamp, 0 if unknown
// bufferZone: a reception area of bufferSize
int
receiveSubFrame
(
int
sock
,
uint64_t
expectedTS
,
void
*
bufferZone
,
int
bufferSize
)
{
int
receiveSubFrame
(
UDPsock_t
*
sock
,
uint64_t
expectedTS
,
void
*
bufferZone
,
int
bufferSize
)
{
int
rcved
=
0
;
commonUDP_t
*
tmp
=
NULL
;
do
{
//read all subframe data from the control unit
int
ret
=
recv
(
sock
,
bufferZone
,
bufferSize
,
0
);
int
ret
=
recv
(
sock
->
sockHandler
,
bufferZone
,
bufferSize
,
0
);
if
(
ret
==-
1
)
{
if
(
errno
==
EWOULDBLOCK
||
errno
==
EINTR
)
{
...
...
@@ -60,14 +99,19 @@ int receiveSubFrame(int sock, uint64_t expectedTS, void *bufferZone, int buffer
return
rcved
;
}
int
sendSubFrame
(
int
sock
,
void
*
bufferZone
,
int
nbBlocks
)
{
int
sendSubFrame
(
UDPsock_t
*
sock
,
void
*
bufferZone
)
{
commonUDP_t
*
header
=
(
commonUDP_t
*
)
bufferZone
;
int
nbBlocks
=
header
->
nbBlocks
;
do
{
int
sz
=
alignedSize
(
bufferZone
);
int
ret
=
send
(
sock
,
bufferZone
,
sz
,
0
);
// Let's use the first address returned by getaddrinfo()
int
ret
=
sendto
(
sock
->
sockHandler
,
bufferZone
,
sz
,
0
,
sock
->
destAddr
->
ai_addr
,
sock
->
destAddr
->
ai_addrlen
);
if
(
ret
!=
sz
)
LOG_W
(
HW
,
"Wrote socket doesn't return size %d (val: %d, errno:%d)
\n
"
,
sz
,
ret
,
errno
);
LOG_W
(
HW
,
"Wrote socket doesn't return size %d (val: %d, errno:%d
, %s
)
\n
"
,
sz
,
ret
,
errno
,
strerror
(
errno
)
);
bufferZone
+=
sz
;
nbBlocks
--
;
...
...
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