From: Olivier Guiter Date: Thu, 4 Apr 2013 12:02:12 +0000 (+0200) Subject: p2p: Add support for connection less binding X-Git-Tag: 0.11~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3aaf81483e8c9aff10d70211efea92a9e991d57c;p=platform%2Fupstream%2Fneard.git p2p: Add support for connection less binding Some validation tests are done in connection less mode. near_p2p_driver now handles not only stream socket but also datagram socket. --- diff --git a/plugins/handover.c b/plugins/handover.c index 5fa33f5..bd3b4cd 100644 --- a/plugins/handover.c +++ b/plugins/handover.c @@ -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, diff --git a/plugins/npp.c b/plugins/npp.c index e9fb420..b5a12ff 100644 --- a/plugins/npp.c +++ b/plugins/npp.c @@ -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, }; diff --git a/plugins/p2p.c b/plugins/p2p.c index 26d9f18..0c82ea1 100644 --- a/plugins/p2p.c +++ b/plugins/p2p.c @@ -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; diff --git a/plugins/p2p.h b/plugins/p2p.h index 214dbe3..a65036e 100644 --- a/plugins/p2p.h +++ b/plugins/p2p.h @@ -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); diff --git a/plugins/snep-validation.c b/plugins/snep-validation.c index 682a090..d08a628 100644 --- a/plugins/snep-validation.c +++ b/plugins/snep-validation.c @@ -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, diff --git a/plugins/snep.c b/plugins/snep.c index 4cb4f7c..9ad6e92 100644 --- a/plugins/snep.c +++ b/plugins/snep.c @@ -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,