be consistent in generating the hash for the key value for keyless topics

Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
Erik Boasson 2019-01-03 17:33:21 +01:00
parent d51a67f74b
commit c60f4fb797

View file

@ -167,6 +167,12 @@ static struct ddsi_serdata *fix_serdata_default(struct ddsi_serdata_default *d,
return &d->c; 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) static uint32_t serdata_default_get_size(const struct ddsi_serdata *dcmn)
{ {
const struct ddsi_serdata_default *d = (const struct ddsi_serdata_default *) 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 */ /* 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; const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn;
struct ddsi_serdata_default *d = serdata_default_new(tp, kind); 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_t is;
dds_stream_from_serdata_default (&is, d); dds_stream_from_serdata_default (&is, d);
dds_stream_read_keyhash (&is, &d->keyhash, (const dds_topic_descriptor_t *)tp->type, kind == SDK_KEY); 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) 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; (void)keyhash;
d->keyhash.m_set = 1; d->keyhash.m_set = 1;
d->keyhash.m_iskey = 1; d->keyhash.m_iskey = 1;
d->c.hash = tp->c.serdata_basehash; return fix_serdata_default_nokey(d, tp->c.serdata_basehash);
return (struct ddsi_serdata *)d;
} }
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; const struct ddsi_sertopic_default *tp = (const struct ddsi_sertopic_default *)tpcmn;
struct ddsi_serdata_default *d = serdata_default_new(tp, kind); 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; break;
} }
dds_stream_add_to_serdata_default (&os, &d); 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) 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); serdata_default_append_blob (&d, 1, sample->size, sample->blob);
d->keyhash.m_set = 1; d->keyhash.m_set = 1;
d->keyhash.m_iskey = 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); 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) 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, .get_size = serdata_default_get_size,
.eqkey = serdata_default_eqkey_nokey, .eqkey = serdata_default_eqkey_nokey,
.free = serdata_default_free, .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_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_ser = serdata_default_to_ser,
.to_sample = serdata_default_to_sample_cdr, .to_sample = serdata_default_to_sample_cdr,
.to_ser_ref = serdata_default_to_ser_ref, .to_ser_ref = serdata_default_to_ser_ref,