p2p: Add support for connection less binding
authorOlivier Guiter <olivier.guiter@linux.intel.com>
Thu, 4 Apr 2013 12:02:12 +0000 (14:02 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 5 Apr 2013 14:29:59 +0000 (16:29 +0200)
Some validation tests are done in connection less mode. near_p2p_driver
now handles not only stream socket but also datagram socket.

plugins/handover.c
plugins/npp.c
plugins/p2p.c
plugins/p2p.h
plugins/snep-validation.c
plugins/snep.c

index 5fa33f5..bd3b4cd 100644 (file)
@@ -472,6 +472,7 @@ struct near_p2p_driver handover_driver = {
        .name = "Handover",
        .service_name = NEAR_DEVICE_SN_HANDOVER,
        .fallback_service_name = NEAR_DEVICE_SN_SNEP,
+       .sock_type = SOCK_STREAM,
        .read = handover_read,
        .push = handover_push,
        .close = handover_close,
index e9fb420..b5a12ff 100644 (file)
@@ -145,6 +145,7 @@ struct near_p2p_driver npp_driver = {
        .name = "NPP",
        .service_name = NEAR_DEVICE_SN_NPP,
        .fallback_service_name = NULL,
+       .sock_type = SOCK_STREAM,
        .read = npp_read,
 };
 
index 26d9f18..0c82ea1 100644 (file)
@@ -58,6 +58,7 @@ struct p2p_data {
        GList *client_list;
 };
 
+/* common function for socket binding */
 static int __p2p_bind(struct p2p_data *server_data, GIOFunc listener)
 {
        int err, fd = server_data->fd;
@@ -79,20 +80,20 @@ static int __p2p_bind(struct p2p_data *server_data, GIOFunc listener)
        if (err < 0) {
                if (errno == EADDRINUSE) {
                        DBG("%s is already bound", driver->name);
-                       close(fd);
-                       return 0;
+                       err = 0;
+                       goto out_err;
                }
 
                near_error("%s bind failed %d %d", driver->name, err, errno);
-               close(fd);
-               return err;
+               goto out_err;
        }
 
-       err = listen(fd, 10);
-       if (err < 0) {
-               near_error("%s listen failed %d", driver->name, err);
-               close(fd);
-               return err;
+       if (server_data->driver->sock_type == SOCK_STREAM) {
+               err = listen(fd, 10);
+               if (err < 0) {
+                       near_error("%s listen failed %d", driver->name, err);
+                       goto out_err;
+               }
        }
 
        channel = g_io_channel_unix_new(fd);
@@ -104,6 +105,10 @@ static int __p2p_bind(struct p2p_data *server_data, GIOFunc listener)
        g_io_channel_unref(channel);
 
        return 0;
+
+out_err:
+       close(fd);
+       return err;
 }
 
 static gboolean p2p_listener_event(GIOChannel *channel, GIOCondition condition,
@@ -148,7 +153,8 @@ static gboolean p2p_client_event(GIOChannel *channel, GIOCondition condition,
                                __p2p_bind(server_data, p2p_listener_event);
                }
 
-               g_free(client_data);
+               if (client_data->driver->sock_type == SOCK_STREAM)
+                       g_free(client_data);
 
                return FALSE;
        }
@@ -272,8 +278,22 @@ static int p2p_bind(struct near_p2p_driver *driver, uint32_t adapter_idx,
 {
        int err, fd;
        struct p2p_data *server_data;
+       GIOFunc g_func;
 
-       fd = socket(AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP);
+       DBG("");
+
+       if (driver->sock_type == SOCK_DGRAM)
+               g_func = p2p_client_event;
+       else
+               g_func = p2p_listener_event;
+
+       if (driver->sock_type != SOCK_DGRAM &&
+                                       driver->sock_type != SOCK_STREAM) {
+               near_error("Undefined socket type for %s ", driver->name);
+               return -EINVAL;
+       }
+
+       fd = socket(AF_NFC, driver->sock_type, NFC_SOCKPROTO_LLCP);
        if (fd < 0)
                return -errno;
 
@@ -288,7 +308,7 @@ static int p2p_bind(struct near_p2p_driver *driver, uint32_t adapter_idx,
        server_data->fd = fd;
        server_data->cb = cb;
 
-       err = __p2p_bind(server_data, p2p_listener_event);
+       err = __p2p_bind(server_data, g_func);
        if (err < 0) {
                g_free(server_data);
                return err;
index 214dbe3..a65036e 100644 (file)
@@ -28,6 +28,7 @@ struct near_p2p_driver {
        const char *service_name;
        const char *fallback_service_name;
        near_bool_t single_connection;
+       int sock_type;
        near_bool_t (*read)(int client_fd,
                                uint32_t adapter_idx, uint32_t target_idx,
                                near_device_io_cb cb);
index 682a090..d08a628 100644 (file)
@@ -234,6 +234,7 @@ struct near_p2p_driver validation_snep_driver = {
        .name = "VALIDATION_SNEP",
        .service_name = "urn:nfc:xsn:nfc-forum.org:snep-validation",
        .fallback_service_name = NULL,
+       .sock_type = SOCK_STREAM,
        .read = snep_validation_read,
        .push = near_snep_core_push,
        .close = snep_validation_close,
index 4cb4f7c..9ad6e92 100644 (file)
@@ -127,6 +127,7 @@ struct near_p2p_driver snep_driver = {
        .name = "SNEP",
        .service_name = NEAR_DEVICE_SN_SNEP,
        .fallback_service_name = NEAR_DEVICE_SN_NPP,
+       .sock_type = SOCK_STREAM,
        .read = snep_default_read,
        .push = near_snep_core_push,
        .close = near_snep_core_close,