VCM: multi-hash select

This commit is contained in:
emanuel 2022-12-05 12:26:55 +00:00
parent da8b2a90bb
commit f1efa6523b
4 changed files with 27 additions and 10 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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*);

View File

@ -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;