Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
trx-ecpri
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
nexedi
trx-ecpri
Commits
9b28bca2
Commit
9b28bca2
authored
Jan 28, 2025
by
Joanne Hugé
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
struct
parent
bcc89588
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
50 additions
and
67 deletions
+50
-67
trx_ecpri.c
trx_ecpri.c
+50
-67
No files found.
trx_ecpri.c
View file @
9b28bca2
...
@@ -150,23 +150,25 @@ typedef struct {
...
@@ -150,23 +150,25 @@ typedef struct {
typedef
struct
{
typedef
struct
{
uint8_t
mac_dst
[
6
];
uint8_t
mac_dst
[
6
];
uint8_t
mac_src
[
6
];
uint8_t
mac_src
[
6
];
uint16_t
ethertype
;
uint16_t
ether
_
type
;
uint8_t
ecpri_version
;
uint8_t
ecpri_version
;
uint8_t
ecpri_type
;
uint8_t
ecpri_type
;
uint16_t
payload_size
;
uint16_t
payload_size
;
uint16_t
antenna_id
;
uint16_t
antenna_id
;
uint16_t
seq_id
;
uint8_t
seq_id
;
uint8_t
seq_id_fixed
;
}
ecpri_header
;
}
ecpri_header
;
typedef
struct
{
typedef
struct
{
uint8_t
mac_dst
[
6
];
uint8_t
mac_dst
[
6
];
uint8_t
mac_src
[
6
];
uint8_t
mac_src
[
6
];
uint16_t
ethertype
;
uint16_t
ether
_
type
;
uint8_t
ecpri_version
;
uint8_t
ecpri_version
;
uint8_t
ecpri_type
;
uint8_t
ecpri_type
;
uint16_t
payload_size
;
uint16_t
payload_size
;
uint16_t
antenna_id
;
uint16_t
antenna_id
;
uint16_t
seq_id
;
uint8_t
seq_id
;
uint8_t
seq_id_fixed
;
uint8_t
oran_header
[
ORAN_HEADER
];
uint8_t
oran_header
[
ORAN_HEADER
];
uint8_t
iq_samples
[
IQ_PAYLOAD
];
uint8_t
iq_samples
[
IQ_PAYLOAD
];
}
ecpri_iq_packet
;
}
ecpri_iq_packet
;
...
@@ -174,12 +176,13 @@ typedef struct {
...
@@ -174,12 +176,13 @@ typedef struct {
typedef
struct
{
typedef
struct
{
uint8_t
mac_dst
[
6
];
uint8_t
mac_dst
[
6
];
uint8_t
mac_src
[
6
];
uint8_t
mac_src
[
6
];
uint16_t
ethertype
;
uint16_t
ether
_
type
;
uint8_t
ecpri_version
;
uint8_t
ecpri_version
;
uint8_t
ecpri_type
;
uint8_t
ecpri_type
;
uint16_t
payload_size
;
uint16_t
payload_size
;
uint16_t
antenna_id
;
uint16_t
antenna_id
;
uint16_t
seq_id
;
uint8_t
seq_id
;
uint8_t
seq_id_fixed
;
uint8_t
oran_header
[
ORAN_HEADER
];
uint8_t
oran_header
[
ORAN_HEADER
];
uint8_t
gps_time
[
10
];
uint8_t
gps_time
[
10
];
}
ecpri_timing_packet
;
}
ecpri_timing_packet
;
...
@@ -208,8 +211,6 @@ static int send_sockfd;
...
@@ -208,8 +211,6 @@ static int send_sockfd;
static
int
recv_sockfd
;
static
int
recv_sockfd
;
static
struct
sockaddr_ll
connect_sk_addr
;
static
struct
sockaddr_ll
connect_sk_addr
;
static
struct
sockaddr_ll
recv_connect_sk_addr
;
static
struct
sockaddr_ll
recv_connect_sk_addr
;
static
uint8_t
ecpri_iq_header
[
ECPRI_IQ_HEADER
+
ORAN_HEADER
];
static
uint8_t
packet_header
[
PACKET_HEADER
];
// ethernet + ecpri + iq header
static
void
print_debug
(
FILE
*
f
,
int
print_header
)
{
static
void
print_debug
(
FILE
*
f
,
int
print_header
)
{
char
buffer
[
200
];
char
buffer
[
200
];
...
@@ -372,33 +373,24 @@ static void update_counter(counter_stat_t * c, int64_t v) {
...
@@ -372,33 +373,24 @@ static void update_counter(counter_stat_t * c, int64_t v) {
c
->
counter
+=
v
;
c
->
counter
+=
v
;
}
}
void
print_bytes
(
const
char
*
str
,
uint8_t
*
data
,
int
*
offset
,
int
count
)
{
void
print_bytes
(
const
char
*
str
,
uint8_t
*
data
,
int
count
)
{
int
i
;
printf
(
"%s"
,
str
);
printf
(
"%s"
,
str
);
for
(
i
=
*
offset
;
i
<
(
*
offset
+
count
)
;
i
++
)
for
(
i
nt
i
=
0
;
i
<
count
;
i
++
)
printf
(
"%02x"
,
data
[
i
]);
printf
(
"%02x"
,
data
[
i
]);
*
offset
+=
count
;
printf
(
"
\n
"
);
printf
(
"
\n
"
);
}
}
void
print_packet
(
uint8_t
*
data
,
int
length
)
{
void
print_packet
(
ecpri_header
*
header
)
{
int
offset
=
0
;
print_bytes
(
"mac_dst: "
,
(
uint8_t
*
)
&
header
->
mac_dst
,
6
);
int
j
;
print_bytes
(
"mac_src: "
,
(
uint8_t
*
)
&
header
->
mac_src
,
6
);
uint16_t
antenna_id
;
print_bytes
(
"ethertype: "
,
(
uint8_t
*
)
&
header
->
ether_type
,
2
);
int
seq_id
;
print_bytes
(
"ecpri_version: "
,
(
uint8_t
*
)
&
header
->
ecpri_version
,
1
);
print_bytes
(
"MAC DST: "
,
data
,
&
offset
,
6
);
print_bytes
(
"ecpri_type: "
,
(
uint8_t
*
)
&
header
->
ecpri_type
,
1
);
print_bytes
(
"MAC SRC: "
,
data
,
&
offset
,
6
);
print_bytes
(
"payload_size: "
,
(
uint8_t
*
)
&
header
->
payload_size
,
2
);
print_bytes
(
"Ethertype: "
,
data
,
&
offset
,
2
);
print_bytes
(
"antenna_id: "
,
(
uint8_t
*
)
&
header
->
antenna_id
,
2
);
print_bytes
(
"eCPRI Common Header: "
,
data
,
&
offset
,
4
);
print_bytes
(
"seq_id: "
,
(
uint8_t
*
)
&
header
->
seq_id
,
1
);
print_bytes
(
"IQ DATA Header: "
,
data
,
&
offset
,
4
);
print_bytes
(
"seq_id_fixed: "
,
(
uint8_t
*
)
&
header
->
seq_id_fixed
,
1
);
//print_bytes("IQ payload:\n", data, &offset, length - offset);
j
=
ETHERNET_HEADER
+
ECPRI_COMMON_HEADER
;
antenna_id
=
ntohs
(
*
((
uint16_t
*
)
(
data
+
j
+
0
)));
seq_id
=
data
[
j
+
2
];
printf
(
"Antenna ID: %d
\n
"
,
antenna_id
);
printf
(
"Seq ID: %d
\n
"
,
_seq_id
);
}
}
static
void
*
recv_thread
(
void
*
p
)
{
static
void
*
recv_thread
(
void
*
p
)
{
#ifdef DISABLE_RECV
#ifdef DISABLE_RECV
pthread_exit
(
EXIT_SUCCESS
);
pthread_exit
(
EXIT_SUCCESS
);
...
@@ -407,7 +399,6 @@ static void *recv_thread(void *p) {
...
@@ -407,7 +399,6 @@ static void *recv_thread(void *p) {
cpu_set_t
mask
;
cpu_set_t
mask
;
int
stop
=
0
;
int
stop
=
0
;
int
prev_seq_id
=
-
1
;
int
prev_seq_id
=
-
1
;
int
offset
;
struct
mmsghdr
msgh
[
MAX_RX_BURST
];
struct
mmsghdr
msgh
[
MAX_RX_BURST
];
struct
iovec
msgv
[
MAX_RX_BURST
];
struct
iovec
msgv
[
MAX_RX_BURST
];
ecpri_header
*
header
;
ecpri_header
*
header
;
...
@@ -444,7 +435,7 @@ static void *recv_thread(void *p) {
...
@@ -444,7 +435,7 @@ static void *recv_thread(void *p) {
header
=
(
ecpri_header
*
)
(
rx_buf
+
j
*
PACKET_SIZE
);
header
=
(
ecpri_header
*
)
(
rx_buf
+
j
*
PACKET_SIZE
);
// Discard packet if it is not eCPRI
// Discard packet if it is not eCPRI
if
(
header
->
ethertype
!=
0xfeae
)
if
(
header
->
ether
_
type
!=
0xfeae
)
continue
;
continue
;
// Stop if packet has unexpected size
// Stop if packet has unexpected size
if
((
msgh
+
j
)
->
msg_len
!=
PACKET_SIZE
)
{
if
((
msgh
+
j
)
->
msg_len
!=
PACKET_SIZE
)
{
...
@@ -499,8 +490,8 @@ static void *recv_thread(void *p) {
...
@@ -499,8 +490,8 @@ static void *recv_thread(void *p) {
}
}
if
(
stop
)
{
if
(
stop
)
{
for
(
int
j
=
0
;
j
<
ret
;
j
++
)
{
for
(
int
j
=
0
;
j
<
ret
;
j
++
)
{
data
=
rx_buf
+
j
*
PACKET_SIZE
;
header
=
(
ecpri_header
*
)
(
rx_buf
+
j
*
PACKET_SIZE
)
;
print_packet
(
data
,
(
msgh
+
j
)
->
msg_len
);
print_packet
(
header
);
}
}
log_exit
(
"DECODE_THREAD"
,
"Exiting"
);
log_exit
(
"DECODE_THREAD"
,
"Exiting"
);
}
}
...
@@ -518,7 +509,7 @@ static void *send_thread(void *p) {
...
@@ -518,7 +509,7 @@ static void *send_thread(void *p) {
struct
timespec
initial
;
struct
timespec
initial
;
struct
mmsghdr
msgh
[
MAX_TX_BURST
];
struct
mmsghdr
msgh
[
MAX_TX_BURST
];
struct
iovec
msgv
[
MAX_TX_BURST
];
struct
iovec
msgv
[
MAX_TX_BURST
];
uint8_t
*
data
;
ecpri_iq_packet
*
iq_packet
;
TRXEcpriState
*
s
=
(
TRXEcpriState
*
)
p
;
TRXEcpriState
*
s
=
(
TRXEcpriState
*
)
p
;
log_info
(
"SEND_THREAD"
,
"Thread init"
);
log_info
(
"SEND_THREAD"
,
"Thread init"
);
...
@@ -554,25 +545,23 @@ static void *send_thread(void *p) {
...
@@ -554,25 +545,23 @@ static void *send_thread(void *p) {
for
(
int
encoded
=
0
;
encoded
<
to_send
;)
{
for
(
int
encoded
=
0
;
encoded
<
to_send
;)
{
for
(
uint16_t
antenna_id
=
0
;
antenna_id
<
s
->
tx_n_channel
;
antenna_id
++
)
{
for
(
uint16_t
antenna_id
=
0
;
antenna_id
<
s
->
tx_n_channel
;
antenna_id
++
)
{
data
=
tx_buf
+
encoded
*
PACKET_SIZE
;
iq_packet
=
(
ecpri_iq_packet
*
)
(
tx_buf
+
encoded
*
PACKET_SIZE
)
;
int
j
=
ETHERNET_HEADER
+
ECPRI_COMMON_HEADER
;
// PC_ID
// PC_ID
*
((
uint16_t
*
)
(
data
+
j
+
0
))
=
ntohs
(
antenna_id
);
iq_packet
->
antenna_id
=
ntohs
(
antenna_id
);
// SEQ_ID
// SEQ_ID
data
[
j
+
2
]
=
(
uint8_t
)
tx_seq_id
;
iq_packet
->
seq_id
=
(
uint8_t
)
tx_seq_id
;
tx_seq_id
=
(
tx_seq_id
+
1
)
%
256
;
tx_seq_id
=
(
tx_seq_id
+
1
)
%
256
;
data
[
j
+
3
]
=
0x80
;
j
=
ETHERNET_HEADER
+
ECPRI_IQ_HEADER
;
// ORAN counters
// ORAN counters
data
[
j
+
1
]
=
frame_id
;
iq_packet
->
oran_header
[
1
]
=
frame_id
;
uint16_t
*
word
=
(
uint16_t
*
)
(
data
+
j
+
2
);
iq_packet
->
oran_header
[
1
]
=
frame_id
;
uint16_t
*
word
=
(
uint16_t
*
)
(
iq_packet
->
oran_header
+
2
);
*
word
=
sub_frame_id
<<
8
;
*
word
=
sub_frame_id
<<
8
;
*
word
|=
slot_id
<<
4
;
*
word
|=
slot_id
<<
4
;
*
word
|=
symbol_id
;
*
word
|=
symbol_id
;
// Add IQ_PAYLOAD to the current packet
// Add IQ_PAYLOAD to the current packet
memcpy
(
data
+
PACKET_HEADER
,
memcpy
(
iq_packet
->
iq_samples
,
rbuf_read
(
&
trxw_rbuf
[
antenna_id
]),
rbuf_read
(
&
trxw_rbuf
[
antenna_id
]),
IQ_PAYLOAD
);
IQ_PAYLOAD
);
rbuf_increment_read
(
&
trxw_rbuf
[
antenna_id
],
IQ_PAYLOAD
);
rbuf_increment_read
(
&
trxw_rbuf
[
antenna_id
],
IQ_PAYLOAD
);
...
@@ -713,7 +702,7 @@ static int start_threads(TRXEcpriState * s) {
...
@@ -713,7 +702,7 @@ static int start_threads(TRXEcpriState * s) {
int
start
(
TRXEcpriState
*
s
)
{
int
start
(
TRXEcpriState
*
s
)
{
uint8_t
dst_mac
[
6
];
uint8_t
dst_mac
[
6
];
uint8_t
src_mac
[
6
];
uint8_t
src_mac
[
6
];
struct
ether_header
*
eh
=
(
struct
ether_header
*
)
packet_header
;
ecpri_iq_packet
iq_packet
;
int
if_index
;
int
if_index
;
log_debug
(
"TRX_ECPRI"
,
"raw socket setup"
);
log_debug
(
"TRX_ECPRI"
,
"raw socket setup"
);
...
@@ -739,9 +728,6 @@ int start(TRXEcpriState * s) {
...
@@ -739,9 +728,6 @@ int start(TRXEcpriState * s) {
init_rbuf
(
&
trxr_rbuf
[
i
],
name
,
s
->
trx_buf_size
,
IQ_PAYLOAD
);
init_rbuf
(
&
trxr_rbuf
[
i
],
name
,
s
->
trx_buf_size
,
IQ_PAYLOAD
);
}
}
memset
((
uint8_t
*
)
packet_header
,
0
,
PACKET_HEADER
);
memset
((
uint8_t
*
)
ecpri_iq_header
,
0
,
ECPRI_IQ_HEADER
+
ORAN_HEADER
);
if
(
!
(
if_index
=
if_nametoindex
(
s
->
bbu_if
)))
{
if
(
!
(
if_index
=
if_nametoindex
(
s
->
bbu_if
)))
{
perror
(
"if_nametoindex"
);
perror
(
"if_nametoindex"
);
return
1
;
return
1
;
...
@@ -784,7 +770,8 @@ int start(TRXEcpriState * s) {
...
@@ -784,7 +770,8 @@ int start(TRXEcpriState * s) {
for
(
int
i
=
0
;
i
<
6
;
i
++
)
for
(
int
i
=
0
;
i
<
6
;
i
++
)
connect_sk_addr
.
sll_addr
[
i
]
=
src_mac
[
i
];
connect_sk_addr
.
sll_addr
[
i
]
=
src_mac
[
i
];
// Only receive packets on configured BBU Ethernet interface
// Only receive packets on configured BBU Ethernet interface
if
((
bind
(
recv_sockfd
,
(
struct
sockaddr
*
)
&
recv_connect_sk_addr
,
sizeof
(
recv_connect_sk_addr
)))
==-
1
)
if
((
bind
(
recv_sockfd
,
(
struct
sockaddr
*
)
&
recv_connect_sk_addr
,
sizeof
(
recv_connect_sk_addr
)))
==-
1
)
{
{
perror
(
"bind: "
);
perror
(
"bind: "
);
return
1
;
return
1
;
...
@@ -797,33 +784,29 @@ int start(TRXEcpriState * s) {
...
@@ -797,33 +784,29 @@ int start(TRXEcpriState * s) {
for
(
int
i
=
0
;
i
<
6
;
i
++
)
for
(
int
i
=
0
;
i
<
6
;
i
++
)
connect_sk_addr
.
sll_addr
[
i
]
=
dst_mac
[
i
];
connect_sk_addr
.
sll_addr
[
i
]
=
dst_mac
[
i
];
memset
(
&
iq_packet
,
0
,
sizeof
(
ecpri_iq_packet
));
for
(
int
i
=
0
;
i
<
6
;
i
++
)
for
(
int
i
=
0
;
i
<
6
;
i
++
)
eh
->
ether_shost
[
i
]
=
src_mac
[
i
];
iq_packet
.
mac_src
[
i
]
=
src_mac
[
i
];
for
(
int
i
=
0
;
i
<
6
;
i
++
)
for
(
int
i
=
0
;
i
<
6
;
i
++
)
eh
->
ether_dho
st
[
i
]
=
dst_mac
[
i
];
iq_packet
.
mac_d
st
[
i
]
=
dst_mac
[
i
];
/* Ethertype field */
/* Ethertype field */
eh
->
ether_type
=
htons
(
0xaefe
);
iq_packet
.
ether_type
=
htons
(
0xaefe
);
/* Common Header */
/* Common Header */
ecpri_iq_header
[
0
]
=
0x10
;
// Version 0x1, Reserved = 0, C = 0
iq_packet
.
ecpri_version
=
0x10
;
// Version 0x1, Reserved = 0, C = 0
ecpri_iq_header
[
1
]
=
0x00
;
// Message type (IQ data)
iq_packet
.
ecpri_type
=
0x00
;
// Message type (IQ data)
/* IQ message header */
iq_packet
.
seq_id_fixed
=
0x80
;
*
((
uint16_t
*
)
(
ecpri_iq_header
+
ECPRI_COMMON_HEADER
))
=
htons
(
s
->
flow_id
);
/* ORAN HEADER */
/* ORAN HEADER */
ecpri_iq_header
[
ECPRI_IQ_HEADER
]
=
0x90
;
iq_packet
.
oran_header
[
0
]
=
0x90
;
ecpri_iq_header
[
ECPRI_IQ_HEADER
+
3
]
=
0x00
;
iq_packet
.
oran_header
[
3
]
=
0x00
;
ecpri_iq_header
[
ECPRI_IQ_HEADER
+
4
]
=
0x00
;
iq_packet
.
oran_header
[
4
]
=
0x00
;
ecpri_iq_header
[
ECPRI_IQ_HEADER
+
5
]
=
0x00
;
iq_packet
.
oran_header
[
5
]
=
0x00
;
ecpri_iq_header
[
ECPRI_IQ_HEADER
+
6
]
=
0x00
;
iq_packet
.
oran_header
[
6
]
=
0x00
;
memcpy
(
packet_header
+
ETHERNET_HEADER
,
ecpri_iq_header
,
ECPRI_IQ_HEADER
+
ORAN_HEADER
);
for
(
int
i
=
0
;
i
<
MAX_TX_BURST
;
i
++
)
for
(
int
i
=
0
;
i
<
MAX_TX_BURST
;
i
++
)
memcpy
(
tx_buf
+
i
*
PACKET_SIZE
,
packet_header
,
PACKET_HEADER
);
memcpy
(
tx_buf
+
i
*
PACKET_SIZE
,
(
uint8_t
*
)
&
iq_packet
,
PACKET_SIZE
);
start_threads
(
s
);
start_threads
(
s
);
return
0
;
return
0
;
...
...
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