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
OpenXG
OpenXG UE
Commits
fde9c64f
Commit
fde9c64f
authored
Jul 17, 2020
by
Aniq
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added slot_indication on VNF side
parent
9fb3c993
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
133 additions
and
11 deletions
+133
-11
executables/nr-uesoftmodem.c
executables/nr-uesoftmodem.c
+1
-0
nfapi/oai_integration/nfapi_pnf.c
nfapi/oai_integration/nfapi_pnf.c
+38
-7
nfapi/oai_integration/nfapi_vnf.c
nfapi/oai_integration/nfapi_vnf.c
+86
-0
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+1
-1
nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
+6
-3
nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
+1
-0
No files found.
executables/nr-uesoftmodem.c
View file @
fde9c64f
...
...
@@ -116,6 +116,7 @@ pthread_cond_t nfapi_sync_cond;
pthread_mutex_t
nfapi_sync_mutex
;
int
nfapi_sync_var
=-
1
;
//!< protected by mutex \ref nfapi_sync_mutex
uint16_t
sf_ahead
=
6
;
//??? value ???
uint16_t
slot_ahead
=
6
;
pthread_cond_t
sync_cond
;
pthread_mutex_t
sync_mutex
;
int
sync_var
=-
1
;
//!< protected by mutex \ref sync_mutex.
...
...
nfapi/oai_integration/nfapi_pnf.c
View file @
fde9c64f
...
...
@@ -58,6 +58,7 @@ extern RAN_CONTEXT_t RC;
#include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
#include "openair1/SCHED_NR/fapi_nr_l1.h"
#include "openair1/PHY/NR_TRANSPORT/nr_dlsch.h"
#include "openair1/PHY/defs_gNB.h"
#define NUM_P5_PHY 2
...
...
@@ -901,7 +902,7 @@ void pnf_phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t *header) {
}
int
pnf_phy_ul_dci_req
(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_ul_dci_request_t
*
req
)
{
int
pnf_phy_ul_dci_req
(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_ul_dci_request_t
*
req
)
{
// if (req-> hi_dci0_request_body.number_of_dci == 0 && req->hi_dci0_request_body.number_of_hi == 0)
// LOG_D(PHY,"[PNF] HI_DCI0_REQUEST SFN/SF:%05d dci:%d hi:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->hi_dci0_request_body.number_of_dci, req->hi_dci0_request_body.number_of_hi);
...
...
@@ -966,7 +967,7 @@ int pnf_phy_hi_dci0_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfa
}
int
pnf_phy_dl_tti_req
(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_dl_tti_request_t
*
req
)
{
int
pnf_phy_dl_tti_req
(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_dl_tti_request_t
*
req
)
{
if
(
RC
.
ru
==
0
)
{
return
-
1
;
}
...
...
@@ -1004,7 +1005,7 @@ int pnf_phy_dl_tti_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfap
if
(
req
->
dl_tti_request_body
.
nPDUs
)
NFAPI_TRACE
(
NFAPI_TRACE_INFO
,
"%s() TX:%d/%d RX:%d/%d; sfn:%d, slot:%d, nGroup:%u, nPDUs: %u, nUE: %u, PduIdx: %u,
\n
"
,
__FUNCTION__
,
proc
->
frame_tx
,
proc
->
s
ubframe_tx
,
proc
->
frame_rx
,
proc
->
subframe
_rx
,
// TODO: change subframes to slot
__FUNCTION__
,
proc
->
frame_tx
,
proc
->
s
lot_tx
,
proc
->
frame_rx
,
proc
->
slot
_rx
,
// TODO: change subframes to slot
req
->
SFN
,
req
->
Slot
,
req
->
dl_tti_request_body
.
nGroup
,
...
...
@@ -1168,6 +1169,35 @@ int pnf_phy_dl_config_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, n
return
0
;
}
int
pnf_phy_tx_data_req
(
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_tx_data_request_t
*
req
)
{
uint16_t
sfn
=
req
->
SFN
;
uint16_t
slot
=
req
->
Slot
;
if
(
req
->
Number_of_PDUs
==
0
)
LOG_D
(
PHY
,
"%s() SFN/SLOT:%d%d PDUs:%d
\n
"
,
__FUNCTION__
,
sfn
,
slot
,
req
->
Number_of_PDUs
);
if
(
req
->
pdu_list
[
0
].
TLVs
->
tag
==
NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST
)
{
for
(
int
i
=
0
;
i
<
req
->
Number_of_PDUs
;
i
++
)
{
// LOG_D(PHY,"%s() SFN/SF:%d%d number_of_pdus:%d [PDU:%d] pdu_length:%d pdu_index:%d num_segments:%d\n",
// __FUNCTION__,
// sfn, sf,
// req->tx_request_body.number_of_pdus,
// i,
// req->tx_request_body.tx_pdu_list[i].pdu_length,
// req->tx_request_body.tx_pdu_list[i].pdu_index,
// req->tx_request_body.tx_pdu_list[i].num_segments
// );
// tx_request_pdu[sfn][sf][i] = &req->tx_request_body.tx_pdu_list[i];
tx_data_request
[
sfn
][
slot
][
i
]
=
&
req
->
pdu_list
[
i
];
}
}
return
0
;
}
int
pnf_phy_tx_req
(
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_tx_request_t
*
req
)
{
uint16_t
sfn
=
NFAPI_SFNSF2SFN
(
req
->
sfn_sf
);
uint16_t
sf
=
NFAPI_SFNSF2SF
(
req
->
sfn_sf
);
...
...
@@ -1195,7 +1225,7 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) {
int
pnf_phy_ul_tti_req
(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_ul_tti_request_t
*
req
)
{
int
pnf_phy_ul_tti_req
(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
pnf_p7
,
nfapi_nr_ul_tti_request_t
*
req
)
{
// if (0)LOG_D(PHY,"[PNF] UL_CONFIG_REQ %s() sfn_sf:%d pdu:%d rach_prach_frequency_resources:%d srs_present:%u\n",
// __FUNCTION__,
// NFAPI_SFNSF2DEC(req->sfn_sf),
...
...
@@ -1448,7 +1478,8 @@ int start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfap
// NR
p7_config
->
dl_tti_req_fn
=
&
pnf_phy_dl_tti_req
;
p7_config
->
ul_tti_req_fn
=
&
pnf_phy_ul_tti_req
;
// p7_config->ul_dci_req_fn = &pnf_phy_ul_dci_req;
p7_config
->
ul_dci_req_fn
=
&
pnf_phy_ul_dci_req
;
p7_config
->
tx_data_req_fn
=
&
pnf_phy_tx_data_req
;
// LTE
p7_config
->
dl_config_req
=
&
pnf_phy_dl_config_req
;
...
...
nfapi/oai_integration/nfapi_vnf.c
View file @
fde9c64f
...
...
@@ -198,6 +198,7 @@ void install_schedule_handlers(IF_Module_t *if_inst);
extern
int
single_thread_flag
;
extern
void
init_eNB_afterRU
(
void
);
extern
uint16_t
sf_ahead
;
extern
uint16_t
slot_ahead
;
void
oai_create_enb
(
void
)
{
int
bodge_counter
=
0
;
...
...
@@ -362,6 +363,66 @@ int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_
return
0
;
}
int
wake_gNB_rxtx
(
PHY_VARS_gNB
*
gNB
,
uint16_t
sfn
,
uint16_t
slot
)
{
gNB_L1_proc_t
*
proc
=&
gNB
->
proc
;
gNB_L1_rxtx_proc_t
*
L1_proc
=
(
slot
&
1
)
?
&
proc
->
L1_proc
:
&
proc
->
L1_proc_tx
;
NR_DL_FRAME_PARMS
*
fp
=
&
gNB
->
frame_parms
;
//printf("%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
//int i;
struct
timespec
wait
;
wait
.
tv_sec
=
0
;
wait
.
tv_nsec
=
5000000L
;
// wake up TX for subframe n+sf_ahead
// lock the TX mutex and make sure the thread is ready
if
(
pthread_mutex_timedlock
(
&
L1_proc
->
mutex
,
&
wait
)
!=
0
)
{
LOG_E
(
PHY
,
"[gNB] ERROR pthread_mutex_lock for gNB RXTX thread %d (IC %d)
\n
"
,
L1_proc
->
slot_rx
&
1
,
L1_proc
->
instance_cnt
);
exit_fun
(
"error locking mutex_rxtx"
);
return
(
-
1
);
}
{
static
uint16_t
old_slot
=
0
;
static
uint16_t
old_sfn
=
0
;
proc
->
slot_rx
=
old_slot
;
proc
->
frame_rx
=
old_sfn
;
// Try to be 1 frame back
old_slot
=
slot
;
old_sfn
=
sfn
;
if
(
old_slot
==
0
&&
old_sfn
%
100
==
0
)
LOG_W
(
PHY
,
"[gNB] sfn/slot:%d%d old_sfn/slot:%d%d proc[rx:%d%d]
\n
"
,
sfn
,
slot
,
old_sfn
,
old_slot
,
proc
->
frame_rx
,
proc
->
slot_rx
);
}
++
L1_proc
->
instance_cnt
;
//LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] L1_proc->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx);
// We have just received and processed the common part of a subframe, say n.
// TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired
// transmitted timestamp of the next TX slot (first).
// The last (TS_rx mod samples_per_frame) was n*samples_per_tti,
// we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti,
// and proc->subframe_tx = proc->subframe_rx+sf_ahead
L1_proc
->
timestamp_tx
=
proc
->
timestamp_rx
+
(
slot_ahead
*
fp
->
samples_per_tti
);
L1_proc
->
frame_rx
=
proc
->
frame_rx
;
L1_proc
->
slot_rx
=
proc
->
slot_rx
;
L1_proc
->
frame_tx
=
(
L1_proc
->
slot_rx
>
(
9
-
slot_ahead
))
?
(
L1_proc
->
frame_rx
+
1
)
&
1023
:
L1_proc
->
frame_rx
;
L1_proc
->
slot_tx
=
(
L1_proc
->
slot_rx
+
slot_ahead
)
%
20
;
//LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] L1_proc[instance_cnt_rxtx:%d rx:%d%d] About to wake rxtx thread\n\n", sfn, sf, proc->frame_rx, proc->subframe_rx, L1_proc->instance_cnt_rxtx, L1_proc->frame_rx, L1_proc->subframe_rx);
// the thread can now be woken up
if
(
pthread_cond_signal
(
&
L1_proc
->
cond
)
!=
0
)
{
LOG_E
(
PHY
,
"[gNB] ERROR pthread_cond_signal for gNB RXn-TXnp4 thread
\n
"
);
exit_fun
(
"ERROR pthread_cond_signal"
);
return
(
-
1
);
}
//LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__);
pthread_mutex_unlock
(
&
L1_proc
->
mutex
);
//LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__);
return
(
0
);
}
int
wake_eNB_rxtx
(
PHY_VARS_eNB
*
eNB
,
uint16_t
sfn
,
uint16_t
sf
)
{
L1_proc_t
*
proc
=&
eNB
->
proc
;
L1_rxtx_proc_t
*
L1_proc
=
(
sf
&
1
)
?
&
proc
->
L1_proc
:
&
proc
->
L1_proc_tx
;
...
...
@@ -439,6 +500,29 @@ int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
return
(
0
);
}
int
phy_slot_indication
(
struct
nfapi_vnf_p7_config
*
config
,
uint16_t
phy_id
,
uint16_t
sfn
,
uint16_t
slot
)
{
static
uint8_t
first_time
=
1
;
if
(
first_time
)
{
printf
(
"[VNF] slot indication %d
\n
"
,
NFAPI_SFNSLOT2DEC
(
sfn
,
slot
));
first_time
=
0
;
}
if
(
RC
.
gNB
&&
RC
.
gNB
[
0
]
->
configured
)
{
// uint16_t sfn = NFAPI_SFNSF2SFN(sfn_sf);
// uint16_t sf = NFAPI_SFNSF2SF(sfn_sf);
//LOG_D(PHY,"[VNF] subframe indication sfn_sf:%d sfn:%d sf:%d\n", sfn_sf, sfn, sf);
wake_gNB_rxtx
(
RC
.
gNB
[
0
],
sfn
,
slot
);
// DONE: find NR equivalent
}
else
{
printf
(
"[VNF] %s() RC.gNB:%p
\n
"
,
__FUNCTION__
,
RC
.
gNB
);
if
(
RC
.
gNB
)
printf
(
"RC.gNB[0]->configured:%d
\n
"
,
RC
.
gNB
[
0
]
->
configured
);
}
return
0
;
}
int
phy_subframe_indication
(
struct
nfapi_vnf_p7_config
*
config
,
uint16_t
phy_id
,
uint16_t
sfn_sf
)
{
static
uint8_t
first_time
=
1
;
...
...
@@ -960,6 +1044,8 @@ void *vnf_p7_thread_start(void *ptr) {
p7_vnf
->
config
->
port
=
p7_vnf
->
local_port
;
p7_vnf
->
config
->
sync_indication
=
&
phy_sync_indication
;
p7_vnf
->
config
->
subframe_indication
=
&
phy_subframe_indication
;
p7_vnf
->
config
->
slot_indication
=
&
phy_slot_indication
;
p7_vnf
->
config
->
harq_indication
=
&
phy_harq_indication
;
p7_vnf
->
config
->
crc_indication
=
&
phy_crc_indication
;
p7_vnf
->
config
->
rx_indication
=
&
phy_rx_indication
;
...
...
nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
View file @
fde9c64f
...
...
@@ -64,7 +64,7 @@ typedef enum {
NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST
=
0X81
,
NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION
=
0X82
,
NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST
=
0X83
,
NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST
=
0X
54
,
NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST
=
0X
84
,
// CHANGED TO 0X84
NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION
=
0X85
,
NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION
=
0X86
,
NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION
=
0X87
,
...
...
nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
View file @
fde9c64f
...
...
@@ -29,6 +29,9 @@ extern "C" {
#include "nfapi_nr_interface_scf.h"
#include <sys/types.h>
#include "openair1/PHY/defs_gNB.h"
/*! This enum is used to describe the states of the pnf
...
...
@@ -642,7 +645,7 @@ typedef struct nfapi_pnf_p7_config
* \param req A pointer to the dl config request message structure
* \return not currently used
*/
int
(
*
dl_tti_req_fn
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_dl_tti_request_t
*
req
);
int
(
*
dl_tti_req_fn
)(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_dl_tti_request_t
*
req
);
int
(
*
dl_config_req
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_dl_config_request_t
*
req
);
/*! A callback for the UL_CONFIG.request
...
...
@@ -650,7 +653,7 @@ typedef struct nfapi_pnf_p7_config
* \param req A pointer to the ul config request message structure
* \return not currently used
*/
int
(
*
ul_tti_req_fn
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_ul_tti_request_t
*
req
);
int
(
*
ul_tti_req_fn
)(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_ul_tti_request_t
*
req
);
int
(
*
ul_config_req
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_ul_config_request_t
*
req
);
/*! A callback for the HI_DCI0.request
...
...
@@ -658,7 +661,7 @@ typedef struct nfapi_pnf_p7_config
* \param req A pointer to the hi dci0 request message structure
* \return not currently used
*/
int
(
*
ul_dci_req_fn
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_ul_dci_request_t
*
req
);
int
(
*
ul_dci_req_fn
)(
gNB_
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_nr_ul_dci_request_t
*
req
);
int
(
*
hi_dci0_req
)(
L1_rxtx_proc_t
*
proc
,
nfapi_pnf_p7_config_t
*
config
,
nfapi_hi_dci0_request_t
*
req
);
/*! A callback for the TX_REQ.request
...
...
nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
View file @
fde9c64f
...
...
@@ -694,6 +694,7 @@ typedef struct nfapi_vnf_p7_config
*/
int
(
*
subframe_indication
)(
struct
nfapi_vnf_p7_config
*
config
,
uint16_t
phy_id
,
uint16_t
sfn_sf
);
int
(
*
slot_indication
)(
struct
nfapi_vnf_p7_config
*
config
,
uint16_t
phy_id
,
uint16_t
sfn
,
uint16_t
slot
);
/*! A callback for the HARQ.indication
* \param config A pointer to the vnf p7 configuration
...
...
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