diff options
author | Alfonso Acosta <fons@spotify.com> | 2014-10-20 14:51:00 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2014-10-25 16:31:53 +0200 |
commit | 4101c18debce1c065861d31c6a39326fa053e130 (patch) | |
tree | d8fa5bc60e28ef7b9bfe2f8161dbb29ada5b556e /src/eir.c | |
parent | b7fcba9c5c9c8f85431fb05c95d1fa86a0731f3d (diff) | |
download | bluez-4101c18debce1c065861d31c6a39326fa053e130.tar.gz |
core: Add Manufacturer Specific Data EIR field
Add data structure and parsing support.
Diffstat (limited to 'src/eir.c')
-rw-r--r-- | src/eir.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -53,6 +53,8 @@ void eir_data_free(struct eir_data *eir) eir->hash = NULL; g_free(eir->randomizer); eir->randomizer = NULL; + g_slist_free_full(eir->msd_list, g_free); + eir->msd_list = NULL; } static void eir_parse_uuid16(struct eir_data *eir, const void *data, @@ -137,6 +139,22 @@ static char *name2utf8(const uint8_t *name, uint8_t len) return g_strdup(utf8_name); } +static void eir_parse_msd(struct eir_data *eir, const uint8_t *data, + uint8_t len) +{ + struct eir_msd *msd; + + if (len < 2 || len > 2 + sizeof(msd->data)) + return; + + msd = g_malloc(sizeof(*msd)); + msd->company = get_le16(data); + msd->data_len = len - 2; + memcpy(&msd->data, data + 2, msd->data_len); + + eir->msd_list = g_slist_append(eir->msd_list, msd); +} + void eir_parse(struct eir_data *eir, const uint8_t *eir_data, uint8_t eir_len) { uint16_t len = 0; @@ -240,6 +258,10 @@ void eir_parse(struct eir_data *eir, const uint8_t *eir_data, uint8_t eir_len) eir->did_product = data[4] | (data[5] << 8); eir->did_version = data[6] | (data[7] << 8); break; + + case EIR_MANUFACTURER_DATA: + eir_parse_msd(eir, data, data_len); + break; } eir_data += field_len + 1; |