|
@@ -1351,6 +1351,90 @@ static char * wpa_config_write_wep_key3(const struct parse_data *data,
|
|
|
#endif
|
|
|
|
|
|
|
|
|
+#ifdef CONFIG_P2P
|
|
|
+
|
|
|
+static int wpa_config_parse_p2p_client_list(const struct parse_data *data,
|
|
|
+ struct wpa_ssid *ssid, int line,
|
|
|
+ const char *value)
|
|
|
+{
|
|
|
+ const char *pos;
|
|
|
+ u8 *buf, *n, addr[ETH_ALEN];
|
|
|
+ size_t count;
|
|
|
+
|
|
|
+ buf = NULL;
|
|
|
+ count = 0;
|
|
|
+
|
|
|
+ pos = value;
|
|
|
+ while (pos && *pos) {
|
|
|
+ while (*pos == ' ')
|
|
|
+ pos++;
|
|
|
+
|
|
|
+ if (hwaddr_aton(pos, addr)) {
|
|
|
+ wpa_printf(MSG_ERROR, "Line %d: Invalid "
|
|
|
+ "p2p_client_list address '%s'.",
|
|
|
+ line, value);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ n = os_realloc(buf, (count + 1) * ETH_ALEN);
|
|
|
+ if (n == NULL) {
|
|
|
+ os_free(buf);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ buf = n;
|
|
|
+ os_memcpy(buf + count * ETH_ALEN, addr, ETH_ALEN);
|
|
|
+ count++;
|
|
|
+ wpa_hexdump(MSG_MSGDUMP, "p2p_client_list",
|
|
|
+ addr, ETH_ALEN);
|
|
|
+ }
|
|
|
+
|
|
|
+ pos = os_strchr(pos, ' ');
|
|
|
+ }
|
|
|
+
|
|
|
+ os_free(ssid->p2p_client_list);
|
|
|
+ ssid->p2p_client_list = buf;
|
|
|
+ ssid->num_p2p_clients = count;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#ifndef NO_CONFIG_WRITE
|
|
|
+static char * wpa_config_write_p2p_client_list(const struct parse_data *data,
|
|
|
+ struct wpa_ssid *ssid)
|
|
|
+{
|
|
|
+ char *value, *end, *pos;
|
|
|
+ int res;
|
|
|
+ size_t i;
|
|
|
+
|
|
|
+ if (ssid->p2p_client_list == NULL || ssid->num_p2p_clients == 0)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ value = os_malloc(20 * ssid->num_p2p_clients);
|
|
|
+ if (value == NULL)
|
|
|
+ return NULL;
|
|
|
+ pos = value;
|
|
|
+ end = value + 20 * ssid->num_p2p_clients;
|
|
|
+
|
|
|
+ for (i = 0; i < ssid->num_p2p_clients; i++) {
|
|
|
+ res = os_snprintf(pos, end - pos, MACSTR " ",
|
|
|
+ MAC2STR(ssid->p2p_client_list +
|
|
|
+ i * ETH_ALEN));
|
|
|
+ if (res < 0 || res >= end - pos) {
|
|
|
+ os_free(value);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ pos += res;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pos > value)
|
|
|
+ pos[-1] = '\0';
|
|
|
+
|
|
|
+ return value;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
|
|
|
|
|
|
#ifdef OFFSET
|
|
@@ -1511,6 +1595,9 @@ static const struct parse_data ssid_fields[] = {
|
|
|
{ INT_RANGE(frequency, 0, 10000) },
|
|
|
{ INT(wpa_ptk_rekey) },
|
|
|
{ STR(bgscan) },
|
|
|
+#ifdef CONFIG_P2P
|
|
|
+ { FUNC(p2p_client_list) },
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
#undef OFFSET
|
|
@@ -1677,6 +1764,7 @@ void wpa_config_free_ssid(struct wpa_ssid *ssid)
|
|
|
os_free(ssid->scan_freq);
|
|
|
os_free(ssid->freq_list);
|
|
|
os_free(ssid->bgscan);
|
|
|
+ os_free(ssid->p2p_client_list);
|
|
|
os_free(ssid);
|
|
|
}
|
|
|
|