From ddbb295ab5bf203fcb00512a802956746e0a0709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laheurte?= Date: Sun, 13 Sep 2020 13:46:44 +0200 Subject: [PATCH 1/3] Don't set MTU on socket --- l2cap_con.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/l2cap_con.c b/l2cap_con.c index aa09dbb..0fc6e93 100644 --- a/l2cap_con.c +++ b/l2cap_con.c @@ -154,34 +154,14 @@ int acl_send_data (const char *bdaddr_dst, unsigned short cid, const unsigned ch return ret; } -#define L2CAP_MTU 1024 - static void l2cap_setsockopt(int fd) { - struct l2cap_options l2o; - socklen_t len = sizeof(l2o); - int opt = L2CAP_LM_MASTER; if (setsockopt(fd, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) { perror("setsockopt L2CAP_LM"); } - memset(&l2o, 0, sizeof(l2o)); - if(getsockopt(fd, SOL_L2CAP, L2CAP_OPTIONS, &l2o, &len) < 0) - { - perror("getsockopt L2CAP_OPTIONS"); - } - else - { - l2o.omtu = L2CAP_MTU; - l2o.imtu = L2CAP_MTU; - if(setsockopt(fd, SOL_L2CAP, L2CAP_OPTIONS, &l2o, sizeof(l2o)) < 0) - { - perror("setsockopt L2CAP_OPTIONS"); - } - } - /*if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { perror("fcntl O_NONBLOCK"); From ae837b63464aa8b759db99137bb6edac394b14e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laheurte?= Date: Sun, 27 Dec 2020 13:07:59 +0100 Subject: [PATCH 2/3] Add gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4454dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +l2cap_proxy + From 75fac26dd456e5249dc2f2fa4915b5a451ae5c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Laheurte?= Date: Fri, 3 Sep 2021 15:23:50 +0200 Subject: [PATCH 3/3] Add command-line arguments parsing --- README.md | 2 +- l2cap_proxy.c | 81 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index ccaecfe..0f1e0b7 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Run the proxy ``` sudo service bluetooth stop sudo hciconfig hci up pscan -sudo ./l2cap_proxy +sudo ./l2cap_proxy -h [-d ] [-c ] ``` ``` : the device number (type hciconfig to list the available adapters) diff --git a/l2cap_proxy.c b/l2cap_proxy.c index c6cc9cf..7e2a881 100644 --- a/l2cap_proxy.c +++ b/l2cap_proxy.c @@ -103,6 +103,14 @@ static void close_fd(struct pollfd* pfd) pfd->fd = -1; } +void usage() +{ + printf("Usage: l2cap_proxy [options] \n"); + printf("Options:\n"); + printf(" -d , --dongle Dongle address\n"); + printf(" -c , --class Device class\n"); +} + int main(int argc, char *argv[]) { char* master = NULL; @@ -120,6 +128,12 @@ int main(int argc, char *argv[]) char slave[sizeof("00:00:00:00:00:00")+1] = {}; unsigned short cid[CID_MAX_INDEX][PSM_MAX_INDEX]; + enum { + ARGSTATE_NONE, + ARGSTATE_DONGLEADDR, + ARGSTATE_DEVCLASS + } argstate = ARGSTATE_NONE; + /* * Set highest priority & scheduler policy. */ @@ -132,18 +146,67 @@ int main(int argc, char *argv[]) (void) signal(SIGINT, terminate); - /* Check args */ - if (argc >= 1) - master = argv[1]; + /* Parse command line args */ + for (int i = 1; i < argc; ++i) { + switch (argstate) { + case ARGSTATE_NONE: + if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--dongle")) + { + argstate = ARGSTATE_DONGLEADDR; + } + else if (!strcmp(argv[i], "-c") || !strcmp(argv[i], "--class")) + { + argstate = ARGSTATE_DEVCLASS; + } + else + { + if (bachk(argv[i]) == -1) + { + fprintf(stderr, "Invalid host address \"%s\"\n", argv[i]); + usage(); + return 1; + } + master = argv[i]; + } + break; + case ARGSTATE_DONGLEADDR: + if (bachk(argv[i]) == -1) + { + fprintf(stderr, "Invalid dongle address \"%s\"\n", argv[i]); + usage(); + return 1; + } + local = argv[i]; + argstate = ARGSTATE_NONE; + break; + case ARGSTATE_DEVCLASS: + device_class = strtol(argv[i], NULL, 0); + argstate = ARGSTATE_NONE; + break; + } + } - if (argc >= 2) - local = argv[2]; + switch (argstate) { + case ARGSTATE_NONE: + break; + case ARGSTATE_DONGLEADDR: + fprintf(stderr, "Missing argument to -d\n"); + break; + case ARGSTATE_DEVCLASS: + fprintf(stderr, "Missing argument to -c\n"); + break; + } - if (argc >= 3) - device_class = strtol(argv[3], NULL, 0); + if (argstate != ARGSTATE_NONE) + { + usage(); + return 1; + } - if (!master || bachk(master) == -1 || (local && bachk(local) == -1)) { - printf("usage: %s \n", *argv); + if (!master) + { + fprintf(stderr, "Missing host address\n"); + usage(); return 1; }