Split configuration

This commit is contained in:
emanuel 2023-10-19 16:23:16 +01:00
parent 4672dfaefd
commit 11cad350ee
3 changed files with 107 additions and 99 deletions

View File

@ -22,7 +22,7 @@ TARGET_LINK_LIBRARIES(it2s-itss-facilities
-lit2s-asn-itss-networking
-lzmq
-lpthread
-lit2s-config
-lit2s-config-etsi-its
-lit2s-asn-camv2
-lit2s-asn-ivim
-lit2s-asn-denmv2

View File

@ -8,7 +8,8 @@
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <it2s-config.h>
#include <it2s-config/t2c-itss.h>
#include <it2s-config/t2c-etsi-its.h>
#include <dirent.h>
#include <sys/time.h>
#include <it2s-asn/camv2/ProtectedCommunicationZone.h>
@ -51,21 +52,28 @@ static int fetch_target_address(char** addresses, uint16_t addresses_len) {
int facilities_config() {
int rv = 0;
it2s_config_t* config = calloc(1, sizeof(it2s_config_t));
rv = it2s_config_read("/etc/it2s/itss.toml", config);
t2c_itss_t* itss_cfg = NULL;
t2c_etsi_its_t* etsi_its_cfg = NULL;
rv = t2c_itss_read("/etc/it2s/itss.toml", &itss_cfg);
if (rv) {
log_error("[config] read config failed");
syslog_error("[config] read ITS-S config failed");
goto cleanup;
}
rv = t2c_etsi_its_read("/etc/it2s/etsi-its.toml", &etsi_its_cfg);
if (rv) {
syslog_error("[config] read ETSI ITS config failed");
goto cleanup;
}
// Logging - status messages
bool use_syslog = false, use_std = false, use_file = false;
for (int i = 0; i < config->general.logging.status_len; ++i) {
if (!strcmp(config->general.logging.status[i], "syslog")) {
for (int i = 0; i < itss_cfg->general.logging.status_len; ++i) {
if (!strcmp(itss_cfg->general.logging.status[i], "syslog")) {
use_syslog = true;
} else if (!strcmp(config->general.logging.status[i], "std")) {
} else if (!strcmp(itss_cfg->general.logging.status[i], "std")) {
use_std = true;
} else if (!strcmp(config->general.logging.status[i], "file")) {
} else if (!strcmp(itss_cfg->general.logging.status[i], "file")) {
use_file = true;
}
}
@ -77,7 +85,7 @@ int facilities_config() {
gettimeofday(&time,NULL);
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
facilities.zmq.responders = calloc(config->facilities.zmq.addresses_len + 1, sizeof(zmq_pollitem_t));
facilities.zmq.responders = calloc(etsi_its_cfg->facilities.zmq.addresses_len + 1, sizeof(zmq_pollitem_t));
facilities.zmq.n_responders = 1;
// Internal socket
@ -85,8 +93,8 @@ int facilities_config() {
facilities.zmq.responders[0].socket = socket;
facilities.zmq.responders[0].events = ZMQ_POLLIN;
for (int i = 0; i < config->facilities.zmq.addresses_len; ++i) {
char* addr = config->facilities.zmq.addresses[i];
for (int i = 0; i < etsi_its_cfg->facilities.zmq.addresses_len; ++i) {
char* addr = etsi_its_cfg->facilities.zmq.addresses[i];
// IPC
if (!memcmp(addr, "ipc", 3)) {
@ -140,10 +148,10 @@ int facilities_config() {
}
// Fetch [transport] address
int index = fetch_target_address(config->transport.zmq.addresses, config->transport.zmq.addresses_len);
int index = fetch_target_address(etsi_its_cfg->transport.zmq.addresses, etsi_its_cfg->transport.zmq.addresses_len);
if (index != -1) {
facilities.zmq.transport_address = malloc(strlen(config->transport.zmq.addresses[index])+1);
strcpy(facilities.zmq.transport_address, config->transport.zmq.addresses[index]);
facilities.zmq.transport_address = malloc(strlen(etsi_its_cfg->transport.zmq.addresses[index])+1);
strcpy(facilities.zmq.transport_address, etsi_its_cfg->transport.zmq.addresses[index]);
} else {
log_error("[config] a valid address for [transport] was not found");
rv = 1;
@ -151,10 +159,10 @@ int facilities_config() {
}
// Fetch [applications] address
index = fetch_target_address(config->applications.zmq.addresses, config->applications.zmq.addresses_len);
index = fetch_target_address(itss_cfg->applications.zmq.addresses, itss_cfg->applications.zmq.addresses_len);
if (index != -1) {
facilities.zmq.applications_address = malloc(strlen(config->applications.zmq.addresses[index])+1);
strcpy(facilities.zmq.applications_address, config->applications.zmq.addresses[index]);
facilities.zmq.applications_address = malloc(strlen(itss_cfg->applications.zmq.addresses[index])+1);
strcpy(facilities.zmq.applications_address, itss_cfg->applications.zmq.addresses[index]);
} else {
log_error("[config] a valid address for [applications] was not found");
rv = 1;
@ -162,10 +170,10 @@ int facilities_config() {
}
// Fetch [security] address
index = fetch_target_address(config->security.zmq.addresses, config->security.zmq.addresses_len);
index = fetch_target_address(itss_cfg->security.zmq.addresses, itss_cfg->security.zmq.addresses_len);
if (index != -1) {
facilities.zmq.security_address = malloc(strlen(config->security.zmq.addresses[index])+1);
strcpy(facilities.zmq.security_address, config->security.zmq.addresses[index]);
facilities.zmq.security_address = malloc(strlen(itss_cfg->security.zmq.addresses[index])+1);
strcpy(facilities.zmq.security_address, itss_cfg->security.zmq.addresses[index]);
} else {
log_error("[config] a valid address for [security] was not found");
rv = 1;
@ -173,10 +181,10 @@ int facilities_config() {
}
// Fetch [management] address
index = fetch_target_address(config->management.zmq.addresses, config->management.zmq.addresses_len);
index = fetch_target_address(etsi_its_cfg->management.zmq.addresses, etsi_its_cfg->management.zmq.addresses_len);
if (index != -1) {
facilities.zmq.management_address = malloc(strlen(config->management.zmq.addresses[index])+1);
strcpy(facilities.zmq.management_address, config->management.zmq.addresses[index]);
facilities.zmq.management_address = malloc(strlen(etsi_its_cfg->management.zmq.addresses[index])+1);
strcpy(facilities.zmq.management_address, etsi_its_cfg->management.zmq.addresses[index]);
} else {
log_error("[config] a valid address for [management] was not found");
rv = 1;
@ -185,35 +193,35 @@ int facilities_config() {
// Values
// General
if (!strcmp("obu", config->general.itss_type)) {
if (!strcmp("obu", itss_cfg->general.itss_type)) {
facilities.station_type = 5;
} else if (!strcmp("rsu", config->general.itss_type)) {
} else if (!strcmp("rsu", itss_cfg->general.itss_type)) {
facilities.station_type = 15;
} else if (!strcmp("unknown", config->general.itss_type)) {
} else if (!strcmp("unknown", itss_cfg->general.itss_type)) {
facilities.station_type = 0;
} else if (!strcmp("pedestrian", config->general.itss_type)) {
} else if (!strcmp("pedestrian", itss_cfg->general.itss_type)) {
facilities.station_type = 1;
} else if (!strcmp("cyclist", config->general.itss_type)) {
} else if (!strcmp("cyclist", itss_cfg->general.itss_type)) {
facilities.station_type = 2;
} else if (!strcmp("moped", config->general.itss_type)) {
} else if (!strcmp("moped", itss_cfg->general.itss_type)) {
facilities.station_type = 3;
} else if (!strcmp("motorcycle", config->general.itss_type)) {
} else if (!strcmp("motorcycle", itss_cfg->general.itss_type)) {
facilities.station_type = 4;
} else if (!strcmp("passengerCar", config->general.itss_type)) {
} else if (!strcmp("passengerCar", itss_cfg->general.itss_type)) {
facilities.station_type = 5;
} else if (!strcmp("bus", config->general.itss_type)) {
} else if (!strcmp("bus", itss_cfg->general.itss_type)) {
facilities.station_type = 6;
} else if (!strcmp("lightTruck", config->general.itss_type)) {
} else if (!strcmp("lightTruck", itss_cfg->general.itss_type)) {
facilities.station_type = 7;
} else if (!strcmp("heavyTruck", config->general.itss_type)) {
} else if (!strcmp("heavyTruck", itss_cfg->general.itss_type)) {
facilities.station_type = 8;
} else if (!strcmp("trailer", config->general.itss_type)) {
} else if (!strcmp("trailer", itss_cfg->general.itss_type)) {
facilities.station_type = 9;
} else if (!strcmp("specialVehicles", config->general.itss_type)) {
} else if (!strcmp("specialVehicles", itss_cfg->general.itss_type)) {
facilities.station_type = 10;
} else if (!strcmp("tram", config->general.itss_type)) {
} else if (!strcmp("tram", itss_cfg->general.itss_type)) {
facilities.station_type = 11;
} else if (!strcmp("roadSideUnit", config->general.itss_type)) {
} else if (!strcmp("roadSideUnit", itss_cfg->general.itss_type)) {
facilities.station_type = 15;
} else {
log_error("[config] unrecognized ITS-S type, running as OBU");
@ -221,12 +229,12 @@ int facilities_config() {
}
facilities.use_security = config->security.use_security;
facilities.use_security = itss_cfg->security.use_security;
pthread_mutex_init(&facilities.id.lock, NULL);
pthread_mutex_init(&facilities.id.change.lock, NULL);
facilities.id.change.random = config->security.identity.random;
facilities.id.change.random = itss_cfg->security.identity.random;
if (facilities.id.change.random) {
// Ask [security] for station id
@ -278,12 +286,12 @@ int facilities_config() {
ASN_STRUCT_FREE(asn_DEF_SecurityReply, sREP);
} else {
facilities.id.station_id = config->security.identity.station_id;
facilities.id.station_id = itss_cfg->security.identity.station_id;
uint8_t src_mac[6];
unsigned int tmp_uint[6];
sscanf(config->security.identity.mac_address, "%02x:%02x:%02x:%02x:%02x:%02x",
sscanf(itss_cfg->security.identity.mac_address, "%02x:%02x:%02x:%02x:%02x:%02x",
&tmp_uint[0],
&tmp_uint[1],
&tmp_uint[2],
@ -308,88 +316,88 @@ int facilities_config() {
// DENM
facilities.den.n_max_events = config->facilities.denm.nmax_active_events;
facilities.den.n_max_events = etsi_its_cfg->facilities.denm.nmax_active_events;
// CAM
facilities.lightship.active = config->facilities.cam.activate;
facilities.lightship.vehicle_gen_min = config->facilities.cam.obu_period_min;
facilities.lightship.vehicle_gen_max = config->facilities.cam.obu_period_max;
facilities.lightship.rsu_gen_min = config->facilities.cam.rsu_period_min;
facilities.lightship.rsu_vehicle_permanence = config->facilities.cam.rsu_vehicle_permanence;
facilities.lightship.active = etsi_its_cfg->facilities.cam.activate;
facilities.lightship.vehicle_gen_min = etsi_its_cfg->facilities.cam.obu_period_min;
facilities.lightship.vehicle_gen_max = etsi_its_cfg->facilities.cam.obu_period_max;
facilities.lightship.rsu_gen_min = etsi_its_cfg->facilities.cam.rsu_period_min;
facilities.lightship.rsu_vehicle_permanence = etsi_its_cfg->facilities.cam.rsu_vehicle_permanence;
// IVIM
facilities.infrastructure.n_max_services = config->facilities.ivim.nmax_active_services;
facilities.infrastructure.replay_interval = config->facilities.ivim.replay_interval;
facilities.infrastructure.default_service_duration = config->facilities.ivim.default_service_duration * 60000;
facilities.infrastructure.n_max_services = etsi_its_cfg->facilities.ivim.nmax_active_services;
facilities.infrastructure.replay_interval = etsi_its_cfg->facilities.ivim.replay_interval;
facilities.infrastructure.default_service_duration = etsi_its_cfg->facilities.ivim.default_service_duration * 60000;
// CPM
facilities.dissemination.active = config->facilities.cpm.activate;
facilities.dissemination.T_GenCpmMin = config->facilities.cpm.rsu_obu_period_min;
facilities.dissemination.T_GenCpmMax = config->facilities.cpm.rsu_obu_period_max;
facilities.dissemination.radar_rotation = config->applications.its_center.radar_rotation;
facilities.dissemination.tmc_connect = config->facilities.cpm.tmc_connected;
facilities.dissemination.active = etsi_its_cfg->facilities.cpm.activate;
facilities.dissemination.T_GenCpmMin = etsi_its_cfg->facilities.cpm.rsu_obu_period_min;
facilities.dissemination.T_GenCpmMax = etsi_its_cfg->facilities.cpm.rsu_obu_period_max;
facilities.dissemination.radar_rotation = itss_cfg->radar.radar_rotation;
facilities.dissemination.tmc_connect = etsi_its_cfg->facilities.cpm.tmc_connected;
facilities.dissemination.T_AddSensorInformation = 1000;
int oa_start = (360-facilities.dissemination.radar_rotation) * 10 - 500;
int oa_end = (360-facilities.dissemination.radar_rotation) * 10 + 500;
facilities.dissemination.opening_angle_start = (oa_start + 3600) % 3600;
facilities.dissemination.opening_angle_end = (oa_end + 3600) % 3600;
facilities.dissemination.int_radar = malloc(strlen(config->facilities.cpm.radar_interface)+1);
strcpy(facilities.dissemination.int_radar,config->facilities.cpm.radar_interface);
facilities.dissemination.ip_radar = malloc(strlen(config->facilities.cpm.radar_ip)+1);
strcpy(facilities.dissemination.ip_radar,config->facilities.cpm.radar_ip);
facilities.dissemination.int_radar = malloc(strlen(etsi_its_cfg->facilities.cpm.radar_interface)+1);
strcpy(facilities.dissemination.int_radar,etsi_its_cfg->facilities.cpm.radar_interface);
facilities.dissemination.ip_radar = malloc(strlen(etsi_its_cfg->facilities.cpm.radar_ip)+1);
strcpy(facilities.dissemination.ip_radar,etsi_its_cfg->facilities.cpm.radar_ip);
// TPM
facilities.tolling.enabled = config->facilities.tpm.activate;
if (!strcmp("gn-spki", config->facilities.tpm.protocol)) {
facilities.tolling.enabled = etsi_its_cfg->facilities.tpm.activate;
if (!strcmp("gn-spki", etsi_its_cfg->facilities.tpm.protocol)) {
facilities.tolling.protocol.p = TOLLING_PROTOCOL_GN_SPKI;
} else if (!strcmp("gn-dpki", config->facilities.tpm.protocol)) {
} else if (!strcmp("gn-dpki", etsi_its_cfg->facilities.tpm.protocol)) {
facilities.tolling.protocol.p = TOLLING_PROTOCOL_GN_DPKI;
} else if (!strcmp("tls", config->facilities.tpm.protocol)) {
} else if (!strcmp("tls", etsi_its_cfg->facilities.tpm.protocol)) {
facilities.tolling.protocol.p = TOLLING_PROTOCOL_TLS;
} else if (!strcmp("tls-gn", config->facilities.tpm.protocol)) {
} else if (!strcmp("tls-gn", etsi_its_cfg->facilities.tpm.protocol)) {
facilities.tolling.protocol.p = TOLLING_PROTOCOL_TLS_GN;
} else if (!strcmp("tls-shs", config->facilities.tpm.protocol)) {
} else if (!strcmp("tls-shs", etsi_its_cfg->facilities.tpm.protocol)) {
facilities.tolling.protocol.p = TOLLING_PROTOCOL_TLS_SHS;
} else {
log_error("[config] unrecognized tolling protocol, defaulting to 'gn-spki'");
facilities.tolling.protocol.p = TOLLING_PROTOCOL_GN_SPKI;
}
facilities.tolling.station.obu.client_id = config->facilities.tpm.client_id;
facilities.tolling.station.obu.client_id = etsi_its_cfg->facilities.tpm.client_id;
// MCM
facilities.coordination.active = config->facilities.mcm.activate;
if (!strcmp("vcm-RR", config->facilities.mcm.protocol)) {
facilities.coordination.active = etsi_its_cfg->facilities.mcm.activate;
if (!strcmp("vcm-RR", etsi_its_cfg->facilities.mcm.protocol)) {
facilities.coordination.protocol = MC_PROTOCOL_VCM_RR;
} else if (!strcmp("vcm-RR1C", config->facilities.mcm.protocol)) {
} else if (!strcmp("vcm-RR1C", etsi_its_cfg->facilities.mcm.protocol)) {
facilities.coordination.protocol = MC_PROTOCOL_VCM_RR1C;
} else if (!strcmp("vcm-RRAC", config->facilities.mcm.protocol)) {
} else if (!strcmp("vcm-RRAC", etsi_its_cfg->facilities.mcm.protocol)) {
facilities.coordination.protocol = MC_PROTOCOL_VCM_RRAC;
} else {
facilities.coordination.protocol = MC_PROTOCOL_VCM_RR;
}
facilities.coordination.vcm_period_min = config->facilities.mcm.period_min;
facilities.coordination.vcm_period_max = config->facilities.mcm.period_max;
facilities.coordination.vcm_period_min = etsi_its_cfg->facilities.mcm.period_min;
facilities.coordination.vcm_period_max = etsi_its_cfg->facilities.mcm.period_max;
// EVCSNM
facilities.evm_args.activate = config->facilities.evcsnm.activate;
facilities.evm_args.activate = etsi_its_cfg->facilities.evcsnm.activate;
// Replay
facilities.replay = config->networking.replay.activate;
facilities.replay = etsi_its_cfg->networking.replay.activate;
// PZ
if (facilities.station_type == 15) {
int i = 0;
DIR *d = opendir(config->facilities.protected_zones.path);
DIR *d = opendir(etsi_its_cfg->facilities.protected_zones.path);
struct dirent *dir;
char file[256];
char pz_xml[2048];
if (d) {
while ((dir = readdir(d)) != NULL && i < 16) {
if (dir->d_name[0] == '.') continue;
sprintf(file, "%s/%s", config->facilities.protected_zones.path, dir->d_name);
sprintf(file, "%s/%s", etsi_its_cfg->facilities.protected_zones.path, dir->d_name);
FILE *fp = fopen(file, "r");
if (!fp) continue;
fseek(fp, 0, SEEK_END);
@ -428,14 +436,14 @@ int facilities_config() {
int i = 0;
DIR *d = opendir(config->facilities.tpm.tis_path);
DIR *d = opendir(etsi_its_cfg->facilities.tpm.tis_path);
struct dirent *dir;
char file[256];
char ti_xml[2048];
if (d) {
while ((dir = readdir(d)) != NULL && i < TOLLING_INFOS_MAX_LENGTH) {
if (dir->d_name[0] == '.') continue;
sprintf(file, "%s/%s", config->facilities.tpm.tis_path, dir->d_name);
sprintf(file, "%s/%s", etsi_its_cfg->facilities.tpm.tis_path, dir->d_name);
FILE *fp = fopen(file, "r");
if (!fp) continue;
fseek(fp, 0, SEEK_END);
@ -475,7 +483,7 @@ int facilities_config() {
itss_epv_init();
facilities.edm.enabled = config->applications.extensions.enabled;
facilities.edm.enabled = itss_cfg->applications.extensions.enabled;
ManagementRequest_t* mreq = calloc(1, sizeof(ManagementRequest_t));
mreq->present = ManagementRequest_PR_attributes;
@ -489,7 +497,7 @@ int facilities_config() {
mreq->choice.attributes.choice.get.clockType = 1;
mreq->choice.attributes.choice.get.clock = 1;
mreq->choice.attributes.choice.get.clockOffset = 1;
mreq->choice.attributes.choice.get.trajectory = config->facilities.mcm.activate;
mreq->choice.attributes.choice.get.trajectory = etsi_its_cfg->facilities.mcm.activate;
void* management_socket = itss_0connect(facilities.zmq.management_address, ZMQ_REQ);
uint8_t b_tx[256], b_rx[256];
asn_enc_rval_t enc = oer_encode_to_buffer(&asn_DEF_ManagementRequest, NULL, mreq, b_tx, 256);
@ -535,7 +543,7 @@ int facilities_config() {
asn_INTEGER2ulong(mrep->data->choice.attributes.clock, (unsigned long long*) &epv.time.clock);
asn_INTEGER2ulong(mrep->data->choice.attributes.clockOffset,(unsigned long long*) &epv.time.offset);
if (config->facilities.mcm.activate) {
if (etsi_its_cfg->facilities.mcm.activate) {
epv.trajectory.len = mrep->data->choice.attributes.trajectory->list.count;
for (int i = 0; i < mrep->data->choice.attributes.trajectory->list.count; ++i) {
epv.trajectory.path[i].latitude = mrep->data->choice.attributes.trajectory->list.array[i]->latitude;
@ -551,30 +559,30 @@ int facilities_config() {
ASN_STRUCT_FREE(asn_DEF_ManagementRequest, mreq);
ASN_STRUCT_FREE(asn_DEF_ManagementReply, mrep);
if (config->facilities.saem.activate) { // TODO handle various services
if (etsi_its_cfg->facilities.saem.activate) { // TODO handle various services
facilities.bulletin.to_provide_len = 1;
facilities.bulletin.to_provide[0] = calloc(1, sizeof(announcement_t));
facilities.bulletin.to_provide[0]->endpoint.port = 7010 + config->facilities.saem.service_to_advertise;
facilities.bulletin.to_provide[0]->its_aid = config->facilities.saem.service_to_advertise;
facilities.bulletin.to_provide[0]->endpoint.port = 7010 + etsi_its_cfg->facilities.saem.service_to_advertise;
facilities.bulletin.to_provide[0]->its_aid = etsi_its_cfg->facilities.saem.service_to_advertise;
}
facilities.vehicle.length = config->facilities.vehicle.length;
facilities.vehicle.width = config->facilities.vehicle.width;
facilities.vehicle.role = config->facilities.vehicle.role;
facilities.vehicle.length = itss_cfg->vehicle.length;
facilities.vehicle.width = itss_cfg->vehicle.width;
facilities.vehicle.role = itss_cfg->vehicle.role;
// Logging
facilities.logging.recorder = config->facilities.logging.management;
if (config->general.logging.enabled && config->facilities.logging.dbms) {
facilities.logging.recorder = etsi_its_cfg->facilities.logging.management;
if (itss_cfg->general.logging.enabled && etsi_its_cfg->facilities.logging.dbms) {
facilities.logging.dbms = calloc(1, sizeof(itss_db_t));
if (itss_db_init(
facilities.logging.dbms,
config->general.logging.database,
config->general.logging.table_style,
itss_cfg->general.logging.database,
itss_cfg->general.logging.table_style,
ITSS_FACILITIES,
config->general.logging.host,
config->general.logging.port,
config->general.logging.username,
config->general.logging.password
itss_cfg->general.logging.host,
itss_cfg->general.logging.port,
itss_cfg->general.logging.username,
itss_cfg->general.logging.password
)) {
log_error("failed to initialize the database -> turning off logging");
free(facilities.logging.dbms);
@ -583,7 +591,8 @@ int facilities_config() {
}
cleanup:
it2s_config_free(config);
t2c_itss_free(itss_cfg);
t2c_etsi_its_free(etsi_its_cfg);
return rv;
}

View File

@ -3,7 +3,6 @@
#include <it2s-asn/cpm/CPM.h>
#include <it2s-asn/itss-transport/TransportRequest.h>
#include <it2s-config.h>
#include <math.h>
#include <signal.h>
#include <unistd.h>