From f1efa6523bc5f0ea003311ce09a77d5fcc50d102 Mon Sep 17 00:00:00 2001 From: emanuel Date: Mon, 5 Dec 2022 12:26:55 +0000 Subject: [PATCH] VCM: multi-hash select --- src/requests.c | 13 ++++++++++--- src/requests.h | 2 +- src/vcm.c | 19 ++++++++++++++----- src/vcm.h | 3 ++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/requests.c b/src/requests.c index 151b9f3..894b7e9 100644 --- a/src/requests.c +++ b/src/requests.c @@ -553,12 +553,19 @@ cleanup: return rv; } -int facilities_request_chaininfo_set(void* responder, ChainInformation_t* cis) { +int facilities_request_chaininfo_set(void* responder, ChainInformationSet_t* cis) { int rv = 0; pthread_mutex_lock(&facilities.coordination.lock); - facilities.coordination.chain.id = cis->id; - memcpy(facilities.coordination.chain.link, cis->link.buf, cis->link.size); + facilities.coordination.chain.id = cis->idSet; + for (int i = 0; i < cis->linkSet.list.count; ++i) { + memcpy( + facilities.coordination.chain.links[i], + cis->linkSet.list.array[i]->buf, + cis->linkSet.list.array[i]->size + ); + } + facilities.coordination.chain.n_links = cis->linkSet.list.count; // TODO region pthread_mutex_unlock(&facilities.coordination.lock); diff --git a/src/requests.h b/src/requests.h index 0ff372d..cc118eb 100644 --- a/src/requests.h +++ b/src/requests.h @@ -12,7 +12,7 @@ int facilities_request_single_message(void* responder, FacilitiesMessageRequest_ int facilities_request_active_episodes(void* responder, FacilitiesRequest_t* fr); int facilities_request_attribute_types(void* responder, FacilitiesRequest_t* fr); int facilities_request_loaded_protected_zones(void* responder, FacilitiesRequest_t* fr); -int facilities_request_chaininfo_set(void* responder, ChainInformation_t* cis); +int facilities_request_chaininfo_set(void* responder, ChainInformationSet_t* cis); int transport_indication_data(TransportDataIndication_t* tdi); diff --git a/src/vcm.c b/src/vcm.c index 8b72964..a18465f 100644 --- a/src/vcm.c +++ b/src/vcm.c @@ -87,7 +87,7 @@ static void vcm_reject(VCM_t* vcm, mc_neighbour_s* neighbour) { vcm_rep->vcm.chain->id = coordination->chain.id; vcm_rep->vcm.chain->link.buf = malloc(32); vcm_rep->vcm.chain->link.size = 32; - memcpy(vcm_rep->vcm.chain->link.buf, coordination->chain.link, 32); + memcpy(vcm_rep->vcm.chain->link.buf, coordination->chain.links[0], 32); vcm->vcm.chain->area = calloc(1, sizeof(struct area)); vcm->vcm.chain->area->list.count = 1; vcm->vcm.chain->area->list.size = 1 * sizeof(OCTET_STRING_t*); @@ -325,12 +325,21 @@ static int vcm_check_handle_request(VCM_t* vcm, mc_neighbour_s* neighbour) { vcm_rep->vcm.currentPosition.longitude = lon; asn_ulong2INTEGER(&vcm_rep->vcm.currentPosition.timestamp, now); - if (coordination->chain.id) { + if (coordination->chain.id && vcm->vcm.chain) { vcm_rep->vcm.chain = calloc(1, sizeof(ChainInformation_t)); vcm_rep->vcm.chain->id = coordination->chain.id; vcm_rep->vcm.chain->link.buf = malloc(32); vcm_rep->vcm.chain->link.size = 32; - memcpy(vcm_rep->vcm.chain->link.buf, coordination->chain.link, 32); + + int to_link = 0; + for (int i = 0; i < coordination->chain.n_links; ++i) { + if (memcmp(coordination->chain.links[i], vcm->vcm.chain->link.buf, 32)) { + to_link = i; + break; + } + } + memcpy(vcm_rep->vcm.chain->link.buf, coordination->chain.links[to_link], 32); + vcm->vcm.chain->area = calloc(1, sizeof(struct area)); vcm->vcm.chain->area->list.count = 1; vcm->vcm.chain->area->list.size = 1 * sizeof(OCTET_STRING_t*); @@ -602,7 +611,7 @@ static int intersection_detected(VCM_t* vcm, mc_neighbour_s* neighbour) { vcm_req->vcm.chain->id = coordination->chain.id; vcm_req->vcm.chain->link.buf = malloc(32); vcm_req->vcm.chain->link.size = 32; - memcpy(vcm_req->vcm.chain->link.buf, coordination->chain.link, 32); + memcpy(vcm_req->vcm.chain->link.buf, coordination->chain.links[0], 32); vcm->vcm.chain->area = calloc(1, sizeof(struct area)); vcm->vcm.chain->area->list.count = 1; vcm->vcm.chain->area->list.size = 1 * sizeof(OCTET_STRING_t*); @@ -976,7 +985,7 @@ static int mk_vcm(uint8_t* vcm_uper, uint16_t* vcm_uper_len) { vcm->vcm.chain->id = coordination->chain.id; vcm->vcm.chain->link.buf = malloc(32); vcm->vcm.chain->link.size = 32; - memcpy(vcm->vcm.chain->link.buf, coordination->chain.link, 32); + memcpy(vcm->vcm.chain->link.buf, coordination->chain.links[0], 32); vcm->vcm.chain->area = calloc(1, sizeof(struct area)); vcm->vcm.chain->area->list.count = 1; vcm->vcm.chain->area->list.size = 1 * sizeof(OCTET_STRING_t*); diff --git a/src/vcm.h b/src/vcm.h index cd370bb..a745907 100644 --- a/src/vcm.h +++ b/src/vcm.h @@ -54,7 +54,8 @@ typedef struct coordination { struct { uint64_t id; - uint8_t link[MC_HASH_LINK_LEN]; + uint8_t links[MC_AFF_STATIONS_N_MAX + 1][MC_HASH_LINK_LEN]; + uint8_t n_links; itss_region_t region; } chain;