feat(NR PHY simulators): add a SIGINT handler to some PHY simulators
When using T2 virtual functions, it is important to properly stop DPDK and free the device. Otherwise the virtual functions may be blocked and a restart of the admin application is necessary. Up to now, SIGINT was shutting down the PHY simulators without freeing the device. This commit adds a signal handler to handle SIGINT in a way that allow to properly free the device. This feature is first added to the PHY simulators that use the T2 which are `nr_ulsim`, `nr_dlsim`, `nr_ulschsim` and `nr_dlschsim`.
This commit is contained in:
@@ -100,6 +100,10 @@ configmodule_interface_t *uniqCfg = NULL;
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
stop = false;
|
||||||
|
__attribute__((unused)) struct sigaction oldaction;
|
||||||
|
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0;
|
double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0;
|
||||||
double snr_step = 0.1;
|
double snr_step = 0.1;
|
||||||
@@ -519,11 +523,11 @@ int main(int argc, char **argv)
|
|||||||
nr_dlsch_encoding(gNB, &msgDataTx, frame, slot, frame_parms, output, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
nr_dlsch_encoding(gNB, &msgDataTx, frame, slot, frame_parms, output, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
for (SNR = snr0; SNR < snr1 && !stop; SNR += snr_step) {
|
||||||
n_errors = 0;
|
n_errors = 0;
|
||||||
n_false_positive = 0;
|
n_false_positive = 0;
|
||||||
|
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
for (trial = 0; trial < n_trials && !stop; trial++) {
|
||||||
for (i = 0; i < available_bits; i++) {
|
for (i = 0; i < available_bits; i++) {
|
||||||
#ifdef DEBUG_CODER
|
#ifdef DEBUG_CODER
|
||||||
if ((i&0xf)==0)
|
if ((i&0xf)==0)
|
||||||
|
|||||||
@@ -266,6 +266,10 @@ int NB_UE_INST = 1;
|
|||||||
configmodule_interface_t *uniqCfg = NULL;
|
configmodule_interface_t *uniqCfg = NULL;
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
stop = false;
|
||||||
|
__attribute__((unused)) struct sigaction oldaction;
|
||||||
|
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||||
|
|
||||||
FILE *csv_file = NULL;
|
FILE *csv_file = NULL;
|
||||||
char *filename_csv = NULL;
|
char *filename_csv = NULL;
|
||||||
setbuf(stdout, NULL);
|
setbuf(stdout, NULL);
|
||||||
@@ -955,7 +959,7 @@ printf("%d\n", slot);
|
|||||||
fprintf(csv_file,"avg_round,eff_rate,eff_throughput,TBS\n");
|
fprintf(csv_file,"avg_round,eff_rate,eff_throughput,TBS\n");
|
||||||
}
|
}
|
||||||
//---------------
|
//---------------
|
||||||
for (SNR = snr0; SNR < snr1; SNR += .2) {
|
for (SNR = snr0; SNR < snr1 && !stop; SNR += .2) {
|
||||||
|
|
||||||
varArray_t *table_tx=initVarArray(1000,sizeof(double));
|
varArray_t *table_tx=initVarArray(1000,sizeof(double));
|
||||||
reset_meas(&gNB->phy_proc_tx);
|
reset_meas(&gNB->phy_proc_tx);
|
||||||
@@ -985,7 +989,7 @@ printf("%d\n", slot);
|
|||||||
n_false_positive = 0;
|
n_false_positive = 0;
|
||||||
if (n_trials== 1) num_rounds = 1;
|
if (n_trials== 1) num_rounds = 1;
|
||||||
|
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
for (trial = 0; trial < n_trials && !stop; trial++) {
|
||||||
|
|
||||||
errors_bit = 0;
|
errors_bit = 0;
|
||||||
//multipath channel
|
//multipath channel
|
||||||
@@ -1016,7 +1020,7 @@ printf("%d\n", slot);
|
|||||||
memset(Sched_INFO, 0, sizeof(*Sched_INFO));
|
memset(Sched_INFO, 0, sizeof(*Sched_INFO));
|
||||||
Sched_INFO->sched_response_id = -1;
|
Sched_INFO->sched_response_id = -1;
|
||||||
|
|
||||||
while (round < num_rounds && !UE_harq_process->decodeResult) {
|
while (round < num_rounds && !UE_harq_process->decodeResult && !stop) {
|
||||||
round_trials[round]++;
|
round_trials[round]++;
|
||||||
|
|
||||||
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot, &Sched_INFO->DL_req, &Sched_INFO->TX_req, &Sched_INFO->UL_dci_req);
|
clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot, &Sched_INFO->DL_req, &Sched_INFO->TX_req, &Sched_INFO->UL_dci_req);
|
||||||
|
|||||||
@@ -5,6 +5,16 @@
|
|||||||
#include "openair1/PHY/defs_nr_UE.h"
|
#include "openair1/PHY/defs_nr_UE.h"
|
||||||
#include "position_interface.h"
|
#include "position_interface.h"
|
||||||
|
|
||||||
|
// Define signal handler to attempt graceful termination
|
||||||
|
bool stop = false;
|
||||||
|
|
||||||
|
void sigint_handler(int arg) {
|
||||||
|
static const char msg[] = "\nCaught SIGINT, shutting down\nPress again CTRL+C to force shutdown\n";
|
||||||
|
__attribute__((unused)) int unused = write(STDOUT_FILENO, msg, sizeof(msg) - 1);
|
||||||
|
|
||||||
|
stop = true;
|
||||||
|
}
|
||||||
|
|
||||||
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return (0); }
|
int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return (0); }
|
||||||
int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req) { return (0); }
|
int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req) { return (0); }
|
||||||
int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req) { return (0); }
|
int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req) { return (0); }
|
||||||
|
|||||||
@@ -36,6 +36,17 @@
|
|||||||
#include "NR_ServingCellConfigCommon.h"
|
#include "NR_ServingCellConfigCommon.h"
|
||||||
#include "NR_ServingCellConfig.h"
|
#include "NR_ServingCellConfig.h"
|
||||||
|
|
||||||
|
// Define signal handler to attempt graceful termination
|
||||||
|
extern bool stop;
|
||||||
|
|
||||||
|
void sigint_handler(int arg);
|
||||||
|
|
||||||
|
const struct sigaction sigint_action = {
|
||||||
|
.sa_handler = sigint_handler,
|
||||||
|
// restore handler to default upon entry to the signal handler
|
||||||
|
.sa_flags = SA_RESETHAND
|
||||||
|
};
|
||||||
|
|
||||||
int oai_exit=0;
|
int oai_exit=0;
|
||||||
|
|
||||||
void exit_function(const char* file, const char* function, const int line, const char *s, const int assert) {
|
void exit_function(const char* file, const char* function, const int line, const char *s, const int assert) {
|
||||||
|
|||||||
@@ -99,6 +99,10 @@ nrUE_params_t *get_nrUE_params(void) {
|
|||||||
configmodule_interface_t *uniqCfg = NULL;
|
configmodule_interface_t *uniqCfg = NULL;
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
stop = false;
|
||||||
|
__attribute__((unused)) struct sigaction oldaction;
|
||||||
|
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
double SNR, snr0 = -2.0, snr1 = 2.0, SNR_lin;
|
double SNR, snr0 = -2.0, snr1 = 2.0, SNR_lin;
|
||||||
double snr_step = 0.1;
|
double snr_step = 0.1;
|
||||||
@@ -521,11 +525,11 @@ int main(int argc, char **argv)
|
|||||||
///////////
|
///////////
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
for (SNR = snr0; SNR < snr1; SNR += snr_step) {
|
for (SNR = snr0; SNR < snr1 && !stop; SNR += snr_step) {
|
||||||
n_errors = 0;
|
n_errors = 0;
|
||||||
n_false_positive = 0;
|
n_false_positive = 0;
|
||||||
|
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
for (trial = 0; trial < n_trials && !stop; trial++) {
|
||||||
|
|
||||||
errors_bit_uncoded = 0;
|
errors_bit_uncoded = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -166,6 +166,10 @@ int NB_UE_INST = 1;
|
|||||||
configmodule_interface_t *uniqCfg = NULL;
|
configmodule_interface_t *uniqCfg = NULL;
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
stop = false;
|
||||||
|
__attribute__((unused)) struct sigaction oldaction;
|
||||||
|
sigaction(SIGINT, &sigint_action, &oldaction);
|
||||||
|
|
||||||
FILE *csv_file = NULL;
|
FILE *csv_file = NULL;
|
||||||
char *filename_csv = NULL;
|
char *filename_csv = NULL;
|
||||||
int i;
|
int i;
|
||||||
@@ -973,7 +977,7 @@ int main(int argc, char *argv[])
|
|||||||
//---------------
|
//---------------
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
int srs_ret = do_SRS;
|
int srs_ret = do_SRS;
|
||||||
for (SNR = snr0; SNR <= snr1; SNR += snr_step) {
|
for (SNR = snr0; SNR <= snr1 && !stop; SNR += snr_step) {
|
||||||
|
|
||||||
varArray_t *table_rx=initVarArray(1000,sizeof(double));
|
varArray_t *table_rx=initVarArray(1000,sizeof(double));
|
||||||
int error_flag = 0;
|
int error_flag = 0;
|
||||||
@@ -1012,13 +1016,13 @@ int main(int argc, char *argv[])
|
|||||||
int64_t sum_srs_snr = 0;
|
int64_t sum_srs_snr = 0;
|
||||||
int srs_snr_count = 0;
|
int srs_snr_count = 0;
|
||||||
|
|
||||||
for (trial = 0; trial < n_trials; trial++) {
|
for (trial = 0; trial < n_trials && !stop; trial++) {
|
||||||
|
|
||||||
uint8_t round = 0;
|
uint8_t round = 0;
|
||||||
crc_status = 1;
|
crc_status = 1;
|
||||||
errors_decoding = 0;
|
errors_decoding = 0;
|
||||||
|
|
||||||
while (round < max_rounds && crc_status) {
|
while (round < max_rounds && crc_status && !stop) {
|
||||||
|
|
||||||
round_trials[round]++;
|
round_trials[round]++;
|
||||||
rv_index = nr_get_rv(round % 4);
|
rv_index = nr_get_rv(round % 4);
|
||||||
|
|||||||
Reference in New Issue
Block a user