From c60f4fb797dffb8e6d62ce2a0f770f269a36b38c Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Thu, 3 Jan 2019 17:33:21 +0100 Subject: [PATCH] be consistent in generating the hash for the key value for keyless topics Signed-off-by: Erik Boasson --- src/core/ddsi/src/ddsi_serdata_default.c | 49 +++++++++++++++++++----- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/core/ddsi/src/ddsi_serdata_default.c b/src/core/ddsi/src/ddsi_serdata_default.c index 758b183..5704241 100644 --- a/src/core/ddsi/src/ddsi_serdata_default.c +++ b/src/core/ddsi/src/ddsi_serdata_default.c @@ -167,6 +167,12 @@ static struct ddsi_serdata *fix_serdata_default(struct ddsi_serdata_default *d, return &d->c; } +static struct ddsi_serdata *fix_serdata_default_nokey(struct ddsi_serdata_default *d, uint32_t basehash) +{ + d->c.hash = basehash; + return &d->c; +} + static uint32_t serdata_default_get_size(const struct ddsi_serdata *dcmn) { const struct ddsi_serdata_default *d = (const struct ddsi_serdata_default *) dcmn; @@ -240,7 +246,7 @@ static struct ddsi_serdata_default *serdata_default_new(const struct ddsi_sertop } /* Construct a serdata from a fragchain received over the network */ -static struct ddsi_serdata *serdata_default_from_ser (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const struct nn_rdata *fragchain, size_t size) +static struct ddsi_serdata_default *serdata_default_from_ser_common (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const struct nn_rdata *fragchain, size_t size) { const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn; struct ddsi_serdata_default *d = serdata_default_new(tp, kind); @@ -270,7 +276,17 @@ static struct ddsi_serdata *serdata_default_from_ser (const struct ddsi_sertopic dds_stream_t is; dds_stream_from_serdata_default (&is, d); dds_stream_read_keyhash (&is, &d->keyhash, (const dds_topic_descriptor_t *)tp->type, kind == SDK_KEY); - return fix_serdata_default (d, tp->c.serdata_basehash); + return d; +} + +static struct ddsi_serdata *serdata_default_from_ser (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const struct nn_rdata *fragchain, size_t size) +{ + return fix_serdata_default (serdata_default_from_ser_common (tpcmn, kind, fragchain, size), tpcmn->serdata_basehash); +} + +static struct ddsi_serdata *serdata_default_from_ser_nokey (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const struct nn_rdata *fragchain, size_t size) +{ + return fix_serdata_default_nokey (serdata_default_from_ser_common (tpcmn, kind, fragchain, size), tpcmn->serdata_basehash); } struct ddsi_serdata *ddsi_serdata_from_keyhash_cdr (const struct ddsi_sertopic *tpcmn, const nn_keyhash_t *keyhash) @@ -301,11 +317,10 @@ struct ddsi_serdata *ddsi_serdata_from_keyhash_cdr_nokey (const struct ddsi_sert (void)keyhash; d->keyhash.m_set = 1; d->keyhash.m_iskey = 1; - d->c.hash = tp->c.serdata_basehash; - return (struct ddsi_serdata *)d; + return fix_serdata_default_nokey(d, tp->c.serdata_basehash); } -static struct ddsi_serdata *serdata_default_from_sample_cdr (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const void *sample) +static struct ddsi_serdata_default *serdata_default_from_sample_cdr_common (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const void *sample) { const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn; struct ddsi_serdata_default *d = serdata_default_new(tp, kind); @@ -324,7 +339,17 @@ static struct ddsi_serdata *serdata_default_from_sample_cdr (const struct ddsi_s break; } dds_stream_add_to_serdata_default (&os, &d); - return fix_serdata_default (d, tp->c.serdata_basehash); + return d; +} + +static struct ddsi_serdata *serdata_default_from_sample_cdr (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const void *sample) +{ + return fix_serdata_default (serdata_default_from_sample_cdr_common (tpcmn, kind, sample), tpcmn->serdata_basehash); +} + +static struct ddsi_serdata *serdata_default_from_sample_cdr_nokey (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const void *sample) +{ + return fix_serdata_default_nokey (serdata_default_from_sample_cdr_common (tpcmn, kind, sample), tpcmn->serdata_basehash); } static struct ddsi_serdata *serdata_default_from_sample_plist (const struct ddsi_sertopic *tpcmn, enum ddsi_serdata_kind kind, const void *vsample) @@ -391,9 +416,13 @@ static struct ddsi_serdata *serdata_default_from_sample_rawcdr (const struct dds serdata_default_append_blob (&d, 1, sample->size, sample->blob); d->keyhash.m_set = 1; d->keyhash.m_iskey = 1; - if (sample->keysize > 0) + if (sample->keysize == 0) + return fix_serdata_default_nokey (d, tp->c.serdata_basehash); + else + { memcpy (&d->keyhash.m_hash, sample->key, sample->keysize); - return fix_serdata_default (d, tp->c.serdata_basehash); + return fix_serdata_default (d, tp->c.serdata_basehash); + } } static struct ddsi_serdata *serdata_default_to_topicless (const struct ddsi_serdata *serdata_common) @@ -518,9 +547,9 @@ const struct ddsi_serdata_ops ddsi_serdata_ops_cdr_nokey = { .get_size = serdata_default_get_size, .eqkey = serdata_default_eqkey_nokey, .free = serdata_default_free, - .from_ser = serdata_default_from_ser, + .from_ser = serdata_default_from_ser_nokey, .from_keyhash = ddsi_serdata_from_keyhash_cdr_nokey, - .from_sample = serdata_default_from_sample_cdr, + .from_sample = serdata_default_from_sample_cdr_nokey, .to_ser = serdata_default_to_ser, .to_sample = serdata_default_to_sample_cdr, .to_ser_ref = serdata_default_to_ser_ref,