From 11cad350eef44308d2c61f855ce6a1c39e496e20 Mon Sep 17 00:00:00 2001 From: emanuel Date: Thu, 19 Oct 2023 16:23:16 +0100 Subject: [PATCH] Split configuration --- src/CMakeLists.txt | 2 +- src/config.c | 203 +++++++++++++++++++++++---------------------- src/cpm.c | 1 - 3 files changed, 107 insertions(+), 99 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index be24d68..55e4e32 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/config.c b/src/config.c index d5891ff..42ee2ca 100644 --- a/src/config.c +++ b/src/config.c @@ -8,7 +8,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -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; } diff --git a/src/cpm.c b/src/cpm.c index 41490ac..78d960e 100644 --- a/src/cpm.c +++ b/src/cpm.c @@ -3,7 +3,6 @@ #include #include -#include #include #include #include