summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorRavi kumar Veeramally <ravikumar.veeramally@linux.intel.com>2012-05-03 15:40:57 +0300
committerSamuel Ortiz <sameo@linux.intel.com>2012-05-03 14:43:55 +0200
commit309d192d9311916210d8145db0da03c7d9c41d37 (patch)
treefdb0e8531d9b4735671c435358aae77005f2ca50 /plugins
parente07d344140de9aab250159580453074ccbedfe88 (diff)
downloadneard-309d192d9311916210d8145db0da03c7d9c41d37.tar.gz
neard-309d192d9311916210d8145db0da03c7d9c41d37.tar.bz2
neard-309d192d9311916210d8145db0da03c7d9c41d37.zip
snep: Implement initial part of snep push method
Implemented p2p push and snep push method. Right now sending data and closing socket file descriptor immediately. Actually this has to be done by attaching a listening event and push data when socket is ready to take data in.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/p2p.c60
-rw-r--r--plugins/p2p.h2
-rw-r--r--plugins/snep.c37
3 files changed, 99 insertions, 0 deletions
diff --git a/plugins/p2p.c b/plugins/p2p.c
index b48e02b..d8af16e 100644
--- a/plugins/p2p.c
+++ b/plugins/p2p.c
@@ -39,6 +39,7 @@
#include <near/device.h>
#include <near/adapter.h>
#include <near/tlv.h>
+#include <near/ndef.h>
#include "p2p.h"
@@ -253,9 +254,68 @@ static int p2p_listen(uint32_t adapter_idx,
return err;
}
+static int p2p_connect(uint32_t adapter_idx, uint32_t target_idx,
+ struct near_ndef_message *ndef,
+ near_device_io_cb cb, struct near_p2p_driver *driver)
+{
+ int fd, err = 0;
+ struct sockaddr_nfc_llcp addr;
+
+ DBG("");
+
+ fd = socket(AF_NFC, SOCK_STREAM, NFC_SOCKPROTO_LLCP);
+ if (fd < 0)
+ return -errno;
+
+ memset(&addr, 0, sizeof(struct sockaddr_nfc_llcp));
+ addr.sa_family = AF_NFC;
+ addr.dev_idx = adapter_idx;
+ addr.target_idx = target_idx;
+ addr.nfc_protocol = NFC_PROTO_NFC_DEP;
+ addr.service_name_len = strlen(driver->service_name);
+ strcpy(addr.service_name, driver->service_name);
+
+ err = connect(fd, (struct sockaddr *)&addr,
+ sizeof(struct sockaddr_nfc_llcp));
+ if (err < 0) {
+ near_error("Connect failed %d", err);
+ close(fd);
+
+ return err;
+ }
+
+ return fd;
+}
+
+static int p2p_push(uint32_t adapter_idx, uint32_t target_idx,
+ struct near_ndef_message *ndef,
+ near_device_io_cb cb)
+{
+ int fd;
+ GSList *list;
+
+ DBG("");
+
+ for (list = driver_list; list != NULL; list = list->next) {
+ struct near_p2p_driver *driver = list->data;
+
+ if (strcmp(driver->name, "SNEP") != 0)
+ continue;
+
+ fd = p2p_connect(adapter_idx, target_idx, ndef, cb, driver);
+ if (fd < 0)
+ return fd;
+
+ return driver->push(fd, adapter_idx, target_idx, ndef, cb);
+ }
+
+ return -1;
+}
+
static struct near_device_driver p2p_driver = {
.priority = NEAR_DEVICE_PRIORITY_HIGH,
.listen = p2p_listen,
+ .push = p2p_push,
};
diff --git a/plugins/p2p.h b/plugins/p2p.h
index e26c0ad..5b74fb6 100644
--- a/plugins/p2p.h
+++ b/plugins/p2p.h
@@ -29,6 +29,8 @@ struct near_p2p_driver {
near_bool_t (*read)(int client_fd,
uint32_t adapter_idx, uint32_t target_idx,
near_device_io_cb cb);
+ int (*push)(int client_fd, uint32_t adapter_idx, uint32_t target_idx,
+ struct near_ndef_message *ndef, near_device_io_cb cb);
void (*close)(int client_fd, int err);
};
diff --git a/plugins/snep.c b/plugins/snep.c
index 904a4df..44c3ba1 100644
--- a/plugins/snep.c
+++ b/plugins/snep.c
@@ -41,6 +41,8 @@
#include "p2p.h"
+#define SNEP_VERSION 0x10
+
/* Request codes */
#define SNEP_REQ_CONTINUE 0x00
#define SNEP_REQ_GET 0x01
@@ -247,10 +249,45 @@ static near_bool_t snep_read(int client_fd,
return FALSE;
}
+static int snep_push(int fd, uint32_t adapter_idx, uint32_t target_idx,
+ struct near_ndef_message *ndef,
+ near_device_io_cb cb)
+{
+ struct p2p_snep_req_frame *req;
+ size_t req_length;
+ int err;
+
+ DBG("");
+
+ req_length = sizeof(struct p2p_snep_req_frame) + ndef->length;
+ req = g_try_malloc0(req_length);
+ if (req == NULL)
+ return -ENOMEM;
+
+ req->version = SNEP_VERSION;
+ req->request = SNEP_REQ_PUT;
+ req->length = GUINT32_TO_BE(ndef->length);
+ memcpy(req->ndef, ndef->data, ndef->length);
+
+ err = send(fd, (uint8_t *)req, req_length, 0);
+ if (err < 0)
+ near_error("Sending failed %d", err);
+
+ close(fd);
+ cb(adapter_idx, target_idx, err);
+
+ g_free(req);
+ g_free(ndef->data);
+ g_free(ndef);
+
+ return 0;
+}
+
struct near_p2p_driver snep_driver = {
.name = "SNEP",
.service_name = "urn:nfc:sn:snep",
.read = snep_read,
+ .push = snep_push,
.close = snep_close,
};