diff --git a/src/eir.c b/src/eir.c
index d22ad91..2ea8731 100644
--- a/src/eir.c
+++ b/src/eir.c
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,
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;
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;
diff --git a/src/eir.h b/src/eir.h
index e486fa2..cf85c1b 100644
--- a/src/eir.h
+++ b/src/eir.h
#define EIR_SSP_RANDOMIZER 0x0F /* SSP Randomizer */
#define EIR_DEVICE_ID 0x10 /* device ID */
#define EIR_GAP_APPEARANCE 0x19 /* GAP appearance */
+#define EIR_MANUFACTURER_DATA 0xFF /* Manufacturer Specific Data */
/* Flags Descriptions */
#define EIR_LIM_DISC 0x01 /* LE Limited Discoverable Mode */
#define EIR_SIM_HOST 0x10 /* Simultaneous LE and BR/EDR to Same
Device Capable (Host) */
+#define EIR_MSD_MAX_LEN 236 /* 240 (EIR) - 2 (len & type) - 2 */
+
+struct eir_msd {
+ uint16_t company;
+ uint8_t data[EIR_MSD_MAX_LEN];
+ uint8_t data_len;
+};
+
struct eir_data {
GSList *services;
unsigned int flags;
uint16_t did_product;
uint16_t did_version;
uint16_t did_source;
+ GSList *msd_list;
};
void eir_data_free(struct eir_data *eir);