From 3c64d21e3475c5ac2514ae1ccbf6df15a5538996 Mon Sep 17 00:00:00 2001 From: Andrew Zaborowski Date: Sat, 30 Sep 2017 04:28:07 +0200 Subject: [PATCH] ap: Use ie_tlv_builder in ap_build_beacon_pr_head --- src/ap.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/ap.c b/src/ap.c index 3250db29..27bda08e 100644 --- a/src/ap.c +++ b/src/ap.c @@ -523,10 +523,12 @@ static size_t ap_build_beacon_pr_head(struct ap_state *ap, const uint8_t *dest, uint8_t *out_buf) { struct mmpdu_header *mpdu = (void *) out_buf; - size_t len; + unsigned int len; uint16_t capability = IE_BSS_CAP_ESS | IE_BSS_CAP_PRIVACY; const uint8_t *bssid = device_get_address(ap->device); uint32_t minr, maxr, count, r; + uint8_t *rates; + struct ie_tlv_builder builder; memset(mpdu, 0, 36); /* Zero out header + non-IE fields */ @@ -541,16 +543,18 @@ static size_t ap_build_beacon_pr_head(struct ap_state *ap, /* Body non-IE fields */ l_put_le16(ap->beacon_interval, out_buf + 32); /* Beacon Interval */ l_put_le16(capability, out_buf + 34); /* Capability Info */ - len = 36; + + ie_tlv_builder_init(&builder); + builder.tlv = out_buf + 36; /* SSID IE */ - out_buf[len++] = IE_TYPE_SSID; - out_buf[len++] = strlen(ap->ssid); - memcpy(out_buf + len, ap->ssid, strlen(ap->ssid)); - len += strlen(ap->ssid); + ie_tlv_builder_next(&builder, IE_TYPE_SSID); + ie_tlv_builder_set_length(&builder, strlen(ap->ssid)); + memcpy(ie_tlv_builder_get_data(&builder), ap->ssid, strlen(ap->ssid)); /* Supported Rates IE */ - out_buf[len++] = IE_TYPE_SUPPORTED_RATES; + ie_tlv_builder_next(&builder, IE_TYPE_SUPPORTED_RATES); + rates = ie_tlv_builder_get_data(&builder); minr = l_uintset_find_min(ap->rates); maxr = l_uintset_find_max(ap->rates); @@ -563,18 +567,19 @@ static size_t ap_build_beacon_pr_head(struct ap_state *ap, if (count == 0) flag = 0x80; - out_buf[len + 1 + count++] = r | flag; + *rates++ = r | flag; } - out_buf[len++] = count; - len += count; + ie_tlv_builder_set_length(&builder, rates - + ie_tlv_builder_get_data(&builder)); /* DSSS Parameter Set IE for DSSS, HR, ERP and HT PHY rates */ - out_buf[len++] = IE_TYPE_DSSS_PARAMETER_SET; - out_buf[len++] = 1; - out_buf[len++] = ap->channel; + ie_tlv_builder_next(&builder, IE_TYPE_DSSS_PARAMETER_SET); + ie_tlv_builder_set_length(&builder, 1); + ((uint8_t *) ie_tlv_builder_get_data(&builder))[0] = ap->channel; - return len; + ie_tlv_builder_finalize(&builder, &len); + return 36 + len; } /* Beacon / Probe Response frame portion after the TIM IE */