This is a useful addition only for testing purposes as connmanctl will
never serve any WiFi Display service. The wfd_ies is the tlv formated
array of WiFi Display IE expressed in hexadecimal.
---
 client/commands.c | 60 +++++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/client/commands.c b/client/commands.c
index d7b76a6..ed38cb8 100644
--- a/client/commands.c
+++ b/client/commands.c
@@ -2117,6 +2117,8 @@ struct _peer_service {
        int bjr_query_len;
        unsigned char *bjr_response;
        int bjr_response_len;
+       unsigned char *wfd_ies;
+       int wfd_ies_len;
        char *upnp_service;
        int version;
        int master;
@@ -2157,6 +2159,9 @@ static void append_peer_service_dict(DBusMessageIter 
*iter, void *user_data)
                                        DBUS_TYPE_INT32, &service->version);
                __connmanctl_dbus_append_dict_entry(iter, "UpnpService",
                                DBUS_TYPE_STRING, &service->upnp_service);
+       } else if (service->wfd_ies) {
+               append_dict_entry_fixed_array(iter, "WiFiDisplayIEs",
+                               &service->wfd_ies, service->wfd_ies_len);
        }
 }
 
@@ -2177,7 +2182,8 @@ static void peer_service_append(DBusMessageIter *iter, 
void *user_data)
 static struct _peer_service *fill_in_peer_service(unsigned char *bjr_query,
                                int bjr_query_len, unsigned char *bjr_response,
                                int bjr_response_len, char *upnp_service,
-                               int version)
+                               int version, unsigned char *wfd_ies,
+                               int wfd_ies_len)
 {
        struct _peer_service *service;
 
@@ -2194,6 +2200,13 @@ static struct _peer_service 
*fill_in_peer_service(unsigned char *bjr_query,
        } else if (upnp_service && version) {
                service->upnp_service = strdup(upnp_service);
                service->version = version;
+       } else if (wfd_ies && wfd_ies_len) {
+               service->wfd_ies = dbus_malloc0(wfd_ies_len);
+               memcpy(service->wfd_ies, wfd_ies, wfd_ies_len);
+               service->wfd_ies_len = wfd_ies_len;
+       } else {
+               dbus_free(service);
+               service = NULL;
        }
 
        return service;
@@ -2203,20 +2216,26 @@ static void free_peer_service(struct _peer_service 
*service)
 {
        dbus_free(service->bjr_query);
        dbus_free(service->bjr_response);
+       dbus_free(service->wfd_ies);
        free(service->upnp_service);
        dbus_free(service);
 }
 
 static int peer_service_register(unsigned char *bjr_query, int bjr_query_len,
                        unsigned char *bjr_response, int bjr_response_len,
-                       char *upnp_service, int version, int master)
+                       char *upnp_service, int version,
+                       unsigned char *wfd_ies, int wfd_ies_len, int master)
 {
        struct _peer_service *service;
        bool registration = true;
        int ret;
 
        service = fill_in_peer_service(bjr_query, bjr_query_len, bjr_response,
-                               bjr_response_len, upnp_service, version);
+                               bjr_response_len, upnp_service, version,
+                               wfd_ies, wfd_ies_len);
+       if (!service)
+               return -EINVAL;
+
        service->master = master;
 
        ret = __connmanctl_dbus_method_call(connection, "net.connman", "/",
@@ -2231,14 +2250,19 @@ static int peer_service_register(unsigned char 
*bjr_query, int bjr_query_len,
 
 static int peer_service_unregister(unsigned char *bjr_query, int bjr_query_len,
                        unsigned char *bjr_response, int bjr_response_len,
-                       char *upnp_service, int version)
+                       char *upnp_service, int version,
+                       unsigned char *wfd_ies, int wfd_ies_len)
 {
        struct _peer_service *service;
        bool registration = false;
        int ret;
 
        service = fill_in_peer_service(bjr_query, bjr_query_len, bjr_response,
-                               bjr_response_len, upnp_service, version);
+                               bjr_response_len, upnp_service, version,
+                               wfd_ies, wfd_ies_len);
+       if (!service)
+               return -EINVAL;
+
        service->master = -1;
 
        ret = __connmanctl_dbus_method_call(connection, "net.connman", "/",
@@ -2280,13 +2304,27 @@ static int cmd_peer_service(char *args[], int num,
 {
        unsigned char bjr_query[1024] = {};
        unsigned char bjr_response[1024] = {};
+       unsigned char wfd_ies[1024] = {};
        char *upnp_service = NULL;
        int bjr_query_len = 0, bjr_response_len = 0;
-       int version = 0, master = 0;
+       int version = 0, master = 0, wfd_ies_len = 0;;
+       int limit;
+
+       if (num < 4)
+               return -EINVAL;
+
+       if (!strcmp(args[2], "wfd_ies")) {
+               wfd_ies_len = parse_spec_array(args[3], wfd_ies);
+               if (wfd_ies_len == -EINVAL)
+                       return -EINVAL;
+               limit = 5;
+               goto master;
+       }
 
        if (num < 6)
                return -EINVAL;
 
+       limit = 7;
        if (!strcmp(args[2], "bjr_query")) {
                if (strcmp(args[4], "bjr_response"))
                        return -EINVAL;
@@ -2306,7 +2344,8 @@ static int cmd_peer_service(char *args[], int num,
                        return -EINVAL;
        }
 
-       if (num == 7) {
+master:
+       if (num == limit) {
                master = parse_boolean(args[6]);
                if (master < 0)
                        return -EINVAL;
@@ -2315,11 +2354,11 @@ static int cmd_peer_service(char *args[], int num,
        if (!strcmp(args[1], "register")) {
                return peer_service_register(bjr_query, bjr_query_len,
                                bjr_response, bjr_response_len, upnp_service,
-                               version, master);
+                               version, wfd_ies, wfd_ies_len, master);
        } else if (!strcmp(args[1], "unregister")) {
                return peer_service_unregister(bjr_query, bjr_query_len,
                                bjr_response, bjr_response_len, upnp_service,
-                               version);
+                               version, wfd_ies, wfd_ies_len);
        }
 
        return -EINVAL;
@@ -2374,7 +2413,8 @@ static const struct {
        { "peer_service", "register|unregister <specs> <master>\n"
                          "Where specs are:\n"
                          "\tbjr_query <query> bjr_response <response>\n"
-                         "\tupnp_service <service> upnp_version <version>\n", 
NULL,
+                         "\tupnp_service <service> upnp_version <version>\n"
+                         "\twfd_ies <ies>\n", NULL,
          cmd_peer_service, "(Un)Register a Peer Service", NULL },
        { "help",         NULL,           NULL,            cmd_help,
          "Show help", NULL },
-- 
1.8.5.5

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to