Interworking: Use generic language,string parser

Replace the Venue Name specific data structure and parser with a
generic mechanism that can be used with other fields that use the
same format.

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2012-08-25 20:49:30 +03:00
parent 4065a3092b
commit 1792e58dbb
3 changed files with 31 additions and 24 deletions

View file

@ -1289,45 +1289,52 @@ static int parse_roaming_consortium(struct hostapd_bss_config *bss, char *pos,
}
static int parse_venue_name(struct hostapd_bss_config *bss, char *pos,
int line)
static int parse_lang_string(struct hostapd_lang_string **array,
unsigned int *count, char *pos)
{
char *sep;
size_t clen, nlen;
struct hostapd_venue_name *vn;
struct hostapd_lang_string *ls;
sep = os_strchr(pos, ':');
if (sep == NULL)
goto fail;
return -1;
*sep++ = '\0';
clen = os_strlen(pos);
if (clen < 2)
goto fail;
return -1;
nlen = os_strlen(sep);
if (nlen > 252)
goto fail;
vn = os_realloc_array(bss->venue_name, bss->venue_name_count + 1,
sizeof(struct hostapd_venue_name));
if (vn == NULL)
return -1;
bss->venue_name = vn;
vn = &bss->venue_name[bss->venue_name_count];
bss->venue_name_count++;
ls = os_realloc_array(*array, *count + 1,
sizeof(struct hostapd_lang_string));
if (ls == NULL)
return -1;
os_memset(vn->lang, 0, sizeof(vn->lang));
os_memcpy(vn->lang, pos, clen);
vn->name_len = nlen;
os_memcpy(vn->name, sep, nlen);
*array = ls;
ls = &(*array)[*count];
(*count)++;
os_memset(ls->lang, 0, sizeof(ls->lang));
os_memcpy(ls->lang, pos, clen);
ls->name_len = nlen;
os_memcpy(ls->name, sep, nlen);
return 0;
}
fail:
wpa_printf(MSG_ERROR, "Line %d: Invalid venue_name '%s'",
line, pos);
return -1;
static int parse_venue_name(struct hostapd_bss_config *bss, char *pos,
int line)
{
if (parse_lang_string(&bss->venue_name, &bss->venue_name_count, pos)) {
wpa_printf(MSG_ERROR, "Line %d: Invalid venue_name '%s'",
line, pos);
return -1;
}
return 0;
}

View file

@ -145,7 +145,7 @@ struct hostapd_roaming_consortium {
u8 oi[MAX_ROAMING_CONSORTIUM_LEN];
};
struct hostapd_venue_name {
struct hostapd_lang_string {
u8 lang[3];
u8 name_len;
u8 name[252];
@ -386,7 +386,7 @@ struct hostapd_bss_config {
/* IEEE 802.11u - Venue Name duples */
unsigned int venue_name_count;
struct hostapd_venue_name *venue_name;
struct hostapd_lang_string *venue_name;
/* IEEE 802.11u - Network Authentication Type */
u8 *network_auth_type;

View file

@ -182,7 +182,7 @@ static void anqp_add_venue_name(struct hostapd_data *hapd, struct wpabuf *buf)
wpabuf_put_u8(buf, hapd->conf->venue_group);
wpabuf_put_u8(buf, hapd->conf->venue_type);
for (i = 0; i < hapd->conf->venue_name_count; i++) {
struct hostapd_venue_name *vn;
struct hostapd_lang_string *vn;
vn = &hapd->conf->venue_name[i];
wpabuf_put_u8(buf, 3 + vn->name_len);
wpabuf_put_data(buf, vn->lang, 3);