]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Store more WPS attributes for peers
authorJouni Malinen <jouni.malinen@atheros.com>
Mon, 28 Mar 2011 12:27:10 +0000 (15:27 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 28 Mar 2011 12:27:10 +0000 (15:27 +0300)
Store Manufacturer, Model Name, Model Number, and Serial Number
attributes for P2P peers and expose these through the existing
peer information mechanisms.

src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_i.h
src/p2p/p2p_parse.c

index 454645162a9f642e4e531b28f86ea788911a4774..653609e335a5abae1c7924c6fc45a9d606839363 100644 (file)
@@ -409,6 +409,77 @@ static int p2p_add_group_clients(struct p2p_data *p2p, const u8 *go_dev_addr,
 }
 
 
+static void p2p_copy_wps_info(struct p2p_device *dev, int probe_req,
+                             const struct p2p_message *msg)
+{
+       os_memcpy(dev->info.device_name, msg->device_name,
+                 sizeof(dev->info.device_name));
+
+       if (msg->manufacturer &&
+           msg->manufacturer_len < sizeof(dev->info.manufacturer)) {
+               os_memset(dev->info.manufacturer, 0,
+                         sizeof(dev->info.manufacturer));
+               os_memcpy(dev->info.manufacturer, msg->manufacturer,
+                         msg->manufacturer_len);
+       }
+
+       if (msg->model_name &&
+           msg->model_name_len < sizeof(dev->info.model_name)) {
+               os_memset(dev->info.model_name, 0,
+                         sizeof(dev->info.model_name));
+               os_memcpy(dev->info.model_name, msg->model_name,
+                         msg->model_name_len);
+       }
+
+       if (msg->model_number &&
+           msg->model_number_len < sizeof(dev->info.model_number)) {
+               os_memset(dev->info.model_number, 0,
+                         sizeof(dev->info.model_number));
+               os_memcpy(dev->info.model_number, msg->model_number,
+                         msg->model_number_len);
+       }
+
+       if (msg->serial_number &&
+           msg->serial_number_len < sizeof(dev->info.serial_number)) {
+               os_memset(dev->info.serial_number, 0,
+                         sizeof(dev->info.serial_number));
+               os_memcpy(dev->info.serial_number, msg->serial_number,
+                         msg->serial_number_len);
+       }
+
+       if (msg->pri_dev_type)
+               os_memcpy(dev->info.pri_dev_type, msg->pri_dev_type,
+                         sizeof(dev->info.pri_dev_type));
+       else if (msg->wps_pri_dev_type)
+               os_memcpy(dev->info.pri_dev_type, msg->wps_pri_dev_type,
+                         sizeof(dev->info.pri_dev_type));
+
+       if (msg->wps_sec_dev_type_list) {
+               os_memcpy(dev->info.wps_sec_dev_type_list,
+                         msg->wps_sec_dev_type_list,
+                         msg->wps_sec_dev_type_list_len);
+               dev->info.wps_sec_dev_type_list_len =
+                       msg->wps_sec_dev_type_list_len;
+       }
+
+       if (msg->capability) {
+               dev->info.dev_capab = msg->capability[0];
+               dev->info.group_capab = msg->capability[1];
+       }
+
+       if (msg->ext_listen_timing) {
+               dev->ext_listen_period = WPA_GET_LE16(msg->ext_listen_timing);
+               dev->ext_listen_interval =
+                       WPA_GET_LE16(msg->ext_listen_timing + 2);
+       }
+
+       if (!probe_req) {
+               dev->info.config_methods = msg->config_methods ?
+                       msg->config_methods : msg->wps_config_methods;
+       }
+}
+
+
 /**
  * p2p_add_device - Add peer entries based on scan results
  * @p2p: P2P module context from p2p_init()
@@ -507,21 +578,7 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
                dev->oper_freq = freq;
        dev->level = level;
 
-       if (msg.pri_dev_type)
-               os_memcpy(dev->info.pri_dev_type, msg.pri_dev_type,
-                         sizeof(dev->info.pri_dev_type));
-       os_memcpy(dev->info.device_name, msg.device_name,
-                 sizeof(dev->info.device_name));
-       dev->info.config_methods = msg.config_methods ? msg.config_methods :
-               msg.wps_config_methods;
-
-       if (msg.wps_sec_dev_type_list) {
-               os_memcpy(dev->info.wps_sec_dev_type_list,
-                         msg.wps_sec_dev_type_list,
-                         msg.wps_sec_dev_type_list_len);
-               dev->info.wps_sec_dev_type_list_len =
-                       msg.wps_sec_dev_type_list_len;
-       }
+       p2p_copy_wps_info(dev, 0, &msg);
 
        for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
                wpabuf_free(dev->info.wps_vendor_ext[i]);
@@ -537,17 +594,6 @@ int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq, int level,
                        break;
        }
 
-       if (msg.capability) {
-               dev->info.dev_capab = msg.capability[0];
-               dev->info.group_capab = msg.capability[1];
-       }
-
-       if (msg.ext_listen_timing) {
-               dev->ext_listen_period = WPA_GET_LE16(msg.ext_listen_timing);
-               dev->ext_listen_interval =
-                       WPA_GET_LE16(msg.ext_listen_timing + 2);
-       }
-
        p2p_add_group_clients(p2p, p2p_dev_addr, addr, freq, msg.group_info,
                              msg.group_info_len);
 
@@ -1122,26 +1168,8 @@ void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
 {
        os_get_time(&dev->last_seen);
 
-       if (msg->pri_dev_type)
-               os_memcpy(dev->info.pri_dev_type, msg->pri_dev_type,
-                         sizeof(dev->info.pri_dev_type));
-       os_memcpy(dev->info.device_name, msg->device_name,
-                 sizeof(dev->info.device_name));
-       dev->info.config_methods = msg->config_methods ? msg->config_methods :
-               msg->wps_config_methods;
+       p2p_copy_wps_info(dev, 0, msg);
 
-       if (msg->wps_sec_dev_type_list) {
-               os_memcpy(dev->info.wps_sec_dev_type_list,
-                         msg->wps_sec_dev_type_list,
-                         msg->wps_sec_dev_type_list_len);
-               dev->info.wps_sec_dev_type_list_len =
-                       msg->wps_sec_dev_type_list_len;
-       }
-
-       if (msg->capability) {
-               dev->info.dev_capab = msg->capability[0];
-               dev->info.group_capab = msg->capability[1];
-       }
        if (msg->listen_channel) {
                int freq;
                freq = p2p_channel_to_freq((char *) msg->listen_channel,
@@ -1164,11 +1192,6 @@ void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
                        dev->listen_freq = freq;
                }
        }
-       if (msg->ext_listen_timing) {
-               dev->ext_listen_period = WPA_GET_LE16(msg->ext_listen_timing);
-               dev->ext_listen_interval =
-                       WPA_GET_LE16(msg->ext_listen_timing + 2);
-       }
 
        if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
                dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
@@ -1492,11 +1515,6 @@ static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
        os_get_time(&dev->last_seen);
        dev->flags |= P2P_DEV_PROBE_REQ_ONLY;
 
-       if (msg.capability) {
-               dev->info.dev_capab = msg.capability[0];
-               dev->info.group_capab = msg.capability[1];
-       }
-
        if (msg.listen_channel) {
                os_memcpy(dev->country, msg.listen_channel, 3);
                dev->listen_freq = p2p_channel_to_freq(dev->country,
@@ -1504,20 +1522,7 @@ static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
                                                       msg.listen_channel[4]);
        }
 
-       os_memcpy(dev->info.device_name, msg.device_name,
-                 sizeof(dev->info.device_name));
-
-       if (msg.wps_pri_dev_type)
-               os_memcpy(dev->info.pri_dev_type, msg.wps_pri_dev_type,
-                         sizeof(dev->info.pri_dev_type));
-
-       if (msg.wps_sec_dev_type_list) {
-               os_memcpy(dev->info.wps_sec_dev_type_list,
-                         msg.wps_sec_dev_type_list,
-                         msg.wps_sec_dev_type_list_len);
-               dev->info.wps_sec_dev_type_list_len =
-                       msg.wps_sec_dev_type_list_len;
-       }
+       p2p_copy_wps_info(dev, 1, &msg);
 
        p2p_parse_free(&msg);
 
@@ -2836,6 +2841,10 @@ int p2p_get_peer_info(struct p2p_data *p2p, const u8 *addr, int next,
                          "member_in_go_iface=" MACSTR "\n"
                          "pri_dev_type=%s\n"
                          "device_name=%s\n"
+                         "manufacturer=%s\n"
+                         "model_name=%s\n"
+                         "model_number=%s\n"
+                         "serial_number=%s\n"
                          "config_methods=0x%x\n"
                          "dev_capab=0x%x\n"
                          "group_capab=0x%x\n"
@@ -2860,6 +2869,10 @@ int p2p_get_peer_info(struct p2p_data *p2p, const u8 *addr, int next,
                          wps_dev_type_bin2str(dev->info.pri_dev_type,
                                               devtype, sizeof(devtype)),
                          dev->info.device_name,
+                         dev->info.manufacturer,
+                         dev->info.model_name,
+                         dev->info.model_number,
+                         dev->info.serial_number,
                          dev->info.config_methods,
                          dev->info.dev_capab,
                          dev->info.group_capab,
index a7d9839d8a83d5ea4cdffafffad6cf2f8b51d8cb..954f562bf1ec25af321588268c2335c5e838e987 100644 (file)
@@ -155,10 +155,30 @@ struct p2p_peer_info {
        u8 pri_dev_type[8];
 
        /**
-        * device_name - Device Name
+        * device_name - Device Name (0..32 octets encoded in UTF-8)
         */
        char device_name[33];
 
+       /**
+        * manufacturer - Manufacturer (0..64 octets encoded in UTF-8)
+        */
+       char manufacturer[65];
+
+       /**
+        * model_name - Model Name (0..32 octets encoded in UTF-8)
+        */
+       char model_name[33];
+
+       /**
+        * model_number - Model Number (0..32 octets encoded in UTF-8)
+        */
+       char model_number[33];
+
+       /**
+        * serial_number - Serial Number (0..32 octets encoded in UTF-8)
+        */
+       char serial_number[33];
+
        /**
         * config_methods - WPS Configuration Methods
         */
index f913e005f3e177346f27ac491b166ad21e5ba467..68b1194062db0551252b29a9687e539028bcbb7f 100644 (file)
@@ -450,6 +450,14 @@ struct p2p_message {
        size_t wps_sec_dev_type_list_len;
        const u8 *wps_vendor_ext[P2P_MAX_WPS_VENDOR_EXT];
        size_t wps_vendor_ext_len[P2P_MAX_WPS_VENDOR_EXT];
+       const u8 *manufacturer;
+       size_t manufacturer_len;
+       const u8 *model_name;
+       size_t model_name_len;
+       const u8 *model_number;
+       size_t model_number_len;
+       const u8 *serial_number;
+       size_t serial_number_len;
 
        /* DS Parameter Set IE */
        const u8 *ds_params;
index 8787074c16a681a8789e292bc95e27b828223819..5c5445a5a145b1fc5fbf9182c4252bb5fad4d444 100644 (file)
@@ -364,6 +364,15 @@ static int p2p_parse_wps_ie(const struct wpabuf *buf, struct p2p_message *msg)
                msg->wps_vendor_ext_len[i] = attr.vendor_ext_len[i];
        }
 
+       msg->manufacturer = attr.manufacturer;
+       msg->manufacturer_len = attr.manufacturer_len;
+       msg->model_name = attr.model_name;
+       msg->model_name_len = attr.model_name_len;
+       msg->model_number = attr.model_number;
+       msg->model_number_len = attr.model_number_len;
+       msg->serial_number = attr.serial_number;
+       msg->serial_number_len = attr.serial_number_len;
+
        return 0;
 }