* [PATCH 2/6] android/pan: Return correct error value
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
@ 2015-02-19 14:16 ` Grzegorz Kolodziejczyk
2015-02-26 9:31 ` Szymon Janc
2015-02-19 14:16 ` [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd Grzegorz Kolodziejczyk
` (4 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-19 14:16 UTC (permalink / raw)
To: linux-bluetooth
If problem with bt_io_listen occurs the input/output error is the most
aproperiate error code to problem rather than invalid argument error
code.
---
android/pan.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/android/pan.c b/android/pan.c
index 3471805..972af89 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -636,7 +636,7 @@ static int register_nap_server(void)
destroy_nap_device();
error("%s", gerr->message);
g_error_free(gerr);
- return -EINVAL;
+ return -EIO;
}
return 0;
--
1.9.3
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 2/6] android/pan: Return correct error value
2015-02-19 14:16 ` [PATCH 2/6] android/pan: Return correct error value Grzegorz Kolodziejczyk
@ 2015-02-26 9:31 ` Szymon Janc
0 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-26 9:31 UTC (permalink / raw)
To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth
Hi Grzegorz,
On Thursday 19 of February 2015 15:16:35 Grzegorz Kolodziejczyk wrote:
> If problem with bt_io_listen occurs the input/output error is the most
> aproperiate error code to problem rather than invalid argument error
> code.
> ---
> android/pan.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/android/pan.c b/android/pan.c
> index 3471805..972af89 100644
> --- a/android/pan.c
> +++ b/android/pan.c
> @@ -636,7 +636,7 @@ static int register_nap_server(void)
> destroy_nap_device();
> error("%s", gerr->message);
> g_error_free(gerr);
> - return -EINVAL;
> + return -EIO;
> }
>
> return 0;
>
This patch is now applied, thanks.
--
Best regards,
Szymon Janc
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
2015-02-19 14:16 ` [PATCH 2/6] android/pan: Return correct error value Grzegorz Kolodziejczyk
@ 2015-02-19 14:16 ` Grzegorz Kolodziejczyk
2015-02-26 9:37 ` Szymon Janc
2015-02-19 14:16 ` [PATCH 4/6] profiles/network: Integrate get and check bnep setup services roles Grzegorz Kolodziejczyk
` (3 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-19 14:16 UTC (permalink / raw)
To: linux-bluetooth
Use dedicated control response function instead of assembling and
sending raw packet over socket.
---
profiles/network/server.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/profiles/network/server.c b/profiles/network/server.c
index ebbe056..37bfba4 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -307,14 +307,10 @@ static gboolean bnep_setup(GIOChannel *chan,
/* Highest known Control command ID
* is BNEP_FILTER_MULT_ADDR_RSP = 0x06 */
if (req->type == BNEP_CONTROL &&
- req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
- uint8_t pkt[3];
-
- pkt[0] = BNEP_CONTROL;
- pkt[1] = BNEP_CMD_NOT_UNDERSTOOD;
- pkt[2] = req->ctrl;
-
- send(sk, pkt, sizeof(pkt), 0);
+ req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
+ error("cmd not understood");
+ bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
+ req->ctrl);
return FALSE;
}
--
1.9.3
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd
2015-02-19 14:16 ` [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd Grzegorz Kolodziejczyk
@ 2015-02-26 9:37 ` Szymon Janc
2015-02-26 9:39 ` Grzegorz Kolodziejczyk
0 siblings, 1 reply; 10+ messages in thread
From: Szymon Janc @ 2015-02-26 9:37 UTC (permalink / raw)
To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth
Hi Grzegorz,
On Thursday 19 of February 2015 15:16:36 Grzegorz Kolodziejczyk wrote:
> Use dedicated control response function instead of assembling and
> sending raw packet over socket.
> ---
> profiles/network/server.c | 12 ++++--------
> 1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/profiles/network/server.c b/profiles/network/server.c
> index ebbe056..37bfba4 100644
> --- a/profiles/network/server.c
> +++ b/profiles/network/server.c
> @@ -307,14 +307,10 @@ static gboolean bnep_setup(GIOChannel *chan,
> /* Highest known Control command ID
> * is BNEP_FILTER_MULT_ADDR_RSP = 0x06 */
> if (req->type == BNEP_CONTROL &&
> - req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
> - uint8_t pkt[3];
> -
> - pkt[0] = BNEP_CONTROL;
> - pkt[1] = BNEP_CMD_NOT_UNDERSTOOD;
> - pkt[2] = req->ctrl;
> -
> - send(sk, pkt, sizeof(pkt), 0);
> + req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
> + error("cmd not understood");
> + bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
> + req->ctrl);
>
> return FALSE;
> }
As discussed offline, this is not correct since we need to handle
BNEP_CMD_NOT_UNDERSTOOD special case in bnep_send_ctrl_rsp.
--
Best regards,
Szymon Janc
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd
2015-02-26 9:37 ` Szymon Janc
@ 2015-02-26 9:39 ` Grzegorz Kolodziejczyk
0 siblings, 0 replies; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-26 9:39 UTC (permalink / raw)
To: Szymon Janc; +Cc: linux-bluetooth
Hi Szymon,
On 26 February 2015 at 10:37, Szymon Janc <szymon.janc@tieto.com> wrote:
>
> Hi Grzegorz,
>
> On Thursday 19 of February 2015 15:16:36 Grzegorz Kolodziejczyk wrote:
> > Use dedicated control response function instead of assembling and
> > sending raw packet over socket.
> > ---
> > profiles/network/server.c | 12 ++++--------
> > 1 file changed, 4 insertions(+), 8 deletions(-)
> >
> > diff --git a/profiles/network/server.c b/profiles/network/server.c
> > index ebbe056..37bfba4 100644
> > --- a/profiles/network/server.c
> > +++ b/profiles/network/server.c
> > @@ -307,14 +307,10 @@ static gboolean bnep_setup(GIOChannel *chan,
> > /* Highest known Control command ID
> > * is BNEP_FILTER_MULT_ADDR_RSP = 0x06 */
> > if (req->type == BNEP_CONTROL &&
> > - req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
> > - uint8_t pkt[3];
> > -
> > - pkt[0] = BNEP_CONTROL;
> > - pkt[1] = BNEP_CMD_NOT_UNDERSTOOD;
> > - pkt[2] = req->ctrl;
> > -
> > - send(sk, pkt, sizeof(pkt), 0);
> > + req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
> > + error("cmd not understood");
> > + bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
> > + req->ctrl);
> >
> > return FALSE;
> > }
>
> As discussed offline, this is not correct since we need to handle
> BNEP_CMD_NOT_UNDERSTOOD special case in bnep_send_ctrl_rsp.
>
Yes, I've prepared a patch since there is similar issue in pan android
profile code. Will rebase it.
>
> --
> Best regards,
> Szymon Janc
Best regards,
Grzegorz Kołodziejczyk
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/6] profiles/network: Integrate get and check bnep setup services roles
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
2015-02-19 14:16 ` [PATCH 2/6] android/pan: Return correct error value Grzegorz Kolodziejczyk
2015-02-19 14:16 ` [PATCH 3/6] profiles/network: Use send ctrl rsp to unknown BNEP ctrl cmd Grzegorz Kolodziejczyk
@ 2015-02-19 14:16 ` Grzegorz Kolodziejczyk
2015-02-19 14:16 ` [PATCH 5/6] profiles/network: Move bnep connection setup logic to bnep Grzegorz Kolodziejczyk
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-19 14:16 UTC (permalink / raw)
To: linux-bluetooth
While bnep setup, roles must be determined and checked if the connection
scanario is possible. Get and check possible service roles routines are
always performed in serie. So there is no need to split it to separate
calls.
---
android/pan.c | 8 +-------
profiles/network/bnep.c | 37 ++++++++++++++++---------------------
profiles/network/bnep.h | 1 -
profiles/network/server.c | 6 +-----
4 files changed, 18 insertions(+), 34 deletions(-)
diff --git a/android/pan.c b/android/pan.c
index 972af89..0bf5f71 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -497,17 +497,11 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
}
rsp = bnep_setup_decode(req, &dst_role, &src_role);
- if (rsp) {
+ if (rsp != BNEP_SUCCESS) {
error("bnep_setup_decode failed");
goto failed;
}
- rsp = bnep_setup_chk(dst_role, src_role);
- if (rsp) {
- error("benp_setup_chk failed");
- goto failed;
- }
-
err = nap_create_bridge();
if (err < 0) {
error("pan: Failed to create bridge: %s (%d)", strerror(-err),
diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
index 70d2e56..919d995 100644
--- a/profiles/network/bnep.c
+++ b/profiles/network/bnep.c
@@ -591,26 +591,6 @@ ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp)
return send(sk, &rsp, sizeof(rsp), 0);
}
-uint16_t bnep_setup_chk(uint16_t dst, uint16_t src)
-{
- /* Allowed PAN Profile scenarios */
- switch (dst) {
- case BNEP_SVC_NAP:
- case BNEP_SVC_GN:
- if (src == BNEP_SVC_PANU)
- return 0;
- return BNEP_CONN_INVALID_SRC;
- case BNEP_SVC_PANU:
- if (src == BNEP_SVC_PANU || src == BNEP_SVC_GN ||
- src == BNEP_SVC_NAP)
- return 0;
-
- return BNEP_CONN_INVALID_SRC;
- }
-
- return BNEP_CONN_INVALID_DST;
-}
-
uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
uint16_t *src)
{
@@ -655,5 +635,20 @@ uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
return BNEP_CONN_INVALID_SVC;
}
- return BNEP_SUCCESS;
+ /* Allowed PAN Profile scenarios */
+ switch (*dst) {
+ case BNEP_SVC_NAP:
+ case BNEP_SVC_GN:
+ if (*src == BNEP_SVC_PANU)
+ return BNEP_SUCCESS;
+ return BNEP_CONN_INVALID_SRC;
+ case BNEP_SVC_PANU:
+ if (*src == BNEP_SVC_PANU || *src == BNEP_SVC_GN ||
+ *src == BNEP_SVC_NAP)
+ return BNEP_SUCCESS;
+
+ return BNEP_CONN_INVALID_SRC;
+ }
+
+ return BNEP_CONN_INVALID_DST;
}
diff --git a/profiles/network/bnep.h b/profiles/network/bnep.h
index bc43d4f..5aedf38 100644
--- a/profiles/network/bnep.h
+++ b/profiles/network/bnep.h
@@ -46,6 +46,5 @@ int bnep_server_add(int sk, uint16_t dst, char *bridge, char *iface,
void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr);
ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp);
-uint16_t bnep_setup_chk(uint16_t dst_role, uint16_t src_role);
uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
uint16_t *src);
diff --git a/profiles/network/server.c b/profiles/network/server.c
index 37bfba4..2091fdd 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -319,11 +319,7 @@ static gboolean bnep_setup(GIOChannel *chan,
return FALSE;
rsp = bnep_setup_decode(req, &dst_role, &src_role);
- if (rsp)
- goto reply;
-
- rsp = bnep_setup_chk(dst_role, src_role);
- if (rsp)
+ if (rsp != BNEP_SUCCESS)
goto reply;
rsp = BNEP_CONN_NOT_ALLOWED;
--
1.9.3
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 5/6] profiles/network: Move bnep connection setup logic to bnep
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
` (2 preceding siblings ...)
2015-02-19 14:16 ` [PATCH 4/6] profiles/network: Integrate get and check bnep setup services roles Grzegorz Kolodziejczyk
@ 2015-02-19 14:16 ` Grzegorz Kolodziejczyk
2015-02-19 14:16 ` [PATCH 6/6] profiles/network: Handle ctrl rsp after conn setup by bnep Grzegorz Kolodziejczyk
2015-02-26 9:32 ` [PATCH 1/6] profiles/network: Minor style fix Szymon Janc
5 siblings, 0 replies; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-19 14:16 UTC (permalink / raw)
To: linux-bluetooth
BNEP connection set up logic which was added before bnep_server_add,
can be private method of bnep. Moved logic was almost doubled in two
cases: NAP role in PAN, server listening. Now set up and connect
scenario check of bnep connection is only handled in bnep part for
listen connections.
---
android/pan.c | 28 ++---------
profiles/network/bnep.c | 123 ++++++++++++++++++++++++++++------------------
profiles/network/bnep.h | 6 +--
profiles/network/server.c | 43 +++++++++-------
4 files changed, 103 insertions(+), 97 deletions(-)
diff --git a/android/pan.c b/android/pan.c
index 0bf5f71..8bafcd0 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -463,8 +463,7 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
{
struct pan_device *dev = user_data;
uint8_t packet[BNEP_MTU];
- struct bnep_setup_conn_req *req = (void *) packet;
- uint16_t src_role, dst_role, rsp = BNEP_CONN_NOT_ALLOWED;
+ uint16_t rsp = BNEP_CONN_NOT_ALLOWED;
int sk, n, err;
if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
@@ -481,27 +480,6 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
goto failed;
}
- /* Highest known control command id BNEP_FILTER_MULT_ADDR_RSP 0x06 */
- if (req->type == BNEP_CONTROL &&
- req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
- error("cmd not understood");
- bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
- req->ctrl);
- goto failed;
- }
-
- if (req->type != BNEP_CONTROL || req->ctrl != BNEP_SETUP_CONN_REQ) {
- error("cmd is not BNEP_SETUP_CONN_REQ %02X %02X", req->type,
- req->ctrl);
- goto failed;
- }
-
- rsp = bnep_setup_decode(req, &dst_role, &src_role);
- if (rsp != BNEP_SUCCESS) {
- error("bnep_setup_decode failed");
- goto failed;
- }
-
err = nap_create_bridge();
if (err < 0) {
error("pan: Failed to create bridge: %s (%d)", strerror(-err),
@@ -509,8 +487,8 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
goto failed;
}
- if (bnep_server_add(sk, dst_role, BNEP_BRIDGE, dev->iface,
- &dev->dst) < 0) {
+ if (bnep_server_add(sk, BNEP_BRIDGE, dev->iface, &dev->dst,
+ (void *) packet) < 0) {
nap_remove_bridge();
error("server_connadd failed");
rsp = BNEP_CONN_NOT_ALLOWED;
diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
index 919d995..1b6ebbc 100644
--- a/profiles/network/bnep.c
+++ b/profiles/network/bnep.c
@@ -549,63 +549,25 @@ static int bnep_del_from_bridge(const char *devname, const char *bridge)
return err;
}
-int bnep_server_add(int sk, uint16_t dst, char *bridge, char *iface,
- const bdaddr_t *addr)
-{
- int err;
-
- if (!bridge || !iface || !addr)
- return -EINVAL;
-
- err = bnep_connadd(sk, dst, iface);
- if (err < 0)
- return err;
-
- err = bnep_add_to_bridge(iface, bridge);
- if (err < 0) {
- bnep_conndel(addr);
- return err;
- }
-
- return bnep_if_up(iface);
-}
-
-void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr)
-{
- if (!bridge || !iface || !addr)
- return;
-
- bnep_del_from_bridge(iface, bridge);
- bnep_if_down(iface);
- bnep_conndel(addr);
-}
-
-ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp)
-{
- struct bnep_control_rsp rsp;
-
- rsp.type = type;
- rsp.ctrl = ctrl;
- rsp.resp = htons(resp);
-
- return send(sk, &rsp, sizeof(rsp), 0);
-}
-
-uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
- uint16_t *src)
+static uint16_t bnep_setup_decode(int sk, struct bnep_setup_conn_req *req,
+ uint16_t *dst)
{
const uint8_t bt_base[] = { 0x00, 0x00, 0x10, 0x00, 0x80, 0x00,
0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
+ uint16_t src;
uint8_t *dest, *source;
uint32_t val;
+ if (req->type != BNEP_CONTROL || req->ctrl != BNEP_SETUP_CONN_REQ)
+ return BNEP_CONN_NOT_ALLOWED;
+
dest = req->service;
source = req->service + req->uuid_size;
switch (req->uuid_size) {
case 2: /* UUID16 */
*dst = get_be16(dest);
- *src = get_be16(source);
+ src = get_be16(source);
break;
case 16: /* UUID128 */
/* Check that the bytes in the UUID, except the service ID
@@ -629,7 +591,7 @@ uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
if (val > 0xffff)
return BNEP_CONN_INVALID_SRC;
- *src = val;
+ src = val;
break;
default:
return BNEP_CONN_INVALID_SVC;
@@ -639,12 +601,13 @@ uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
switch (*dst) {
case BNEP_SVC_NAP:
case BNEP_SVC_GN:
- if (*src == BNEP_SVC_PANU)
+ if (src == BNEP_SVC_PANU)
return BNEP_SUCCESS;
+
return BNEP_CONN_INVALID_SRC;
case BNEP_SVC_PANU:
- if (*src == BNEP_SVC_PANU || *src == BNEP_SVC_GN ||
- *src == BNEP_SVC_NAP)
+ if (src == BNEP_SVC_PANU || src == BNEP_SVC_GN ||
+ src == BNEP_SVC_NAP)
return BNEP_SUCCESS;
return BNEP_CONN_INVALID_SRC;
@@ -652,3 +615,65 @@ uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
return BNEP_CONN_INVALID_DST;
}
+
+int bnep_server_add(int sk, char *bridge, char *iface, const bdaddr_t *addr,
+ void *setup_data)
+{
+ int err;
+ uint16_t dst = NULL;
+ struct bnep_setup_conn_req *req = setup_data;
+
+ /* Highest known Control command ID
+ * is BNEP_FILTER_MULT_ADDR_RSP = 0x06 */
+ if (req->type == BNEP_CONTROL &&
+ req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
+ error("cmd not understood");
+ bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
+ req->ctrl);
+
+ return -EINVAL;
+ }
+
+ /* Processing BNEP_SETUP_CONNECTION_REQUEST_MSG */
+ err = bnep_setup_decode(sk, setup_data, &dst);
+ if (err < 0) {
+ error("error while decoding setup connection request: %d", err);
+ return -EINVAL;
+ }
+
+ if (!bridge || !iface || !addr || !dst)
+ return -EINVAL;
+
+ err = bnep_connadd(sk, dst, iface);
+ if (err < 0)
+ return err;
+
+ err = bnep_add_to_bridge(iface, bridge);
+ if (err < 0) {
+ bnep_conndel(addr);
+ return err;
+ }
+
+ return bnep_if_up(iface);
+}
+
+void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr)
+{
+ if (!bridge || !iface || !addr)
+ return;
+
+ bnep_del_from_bridge(iface, bridge);
+ bnep_if_down(iface);
+ bnep_conndel(addr);
+}
+
+ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp)
+{
+ struct bnep_control_rsp rsp;
+
+ rsp.type = type;
+ rsp.ctrl = ctrl;
+ rsp.resp = htons(resp);
+
+ return send(sk, &rsp, sizeof(rsp), 0);
+}
diff --git a/profiles/network/bnep.h b/profiles/network/bnep.h
index 5aedf38..7a3efb6 100644
--- a/profiles/network/bnep.h
+++ b/profiles/network/bnep.h
@@ -41,10 +41,8 @@ void bnep_set_disconnect(struct bnep *session, bnep_disconnect_cb disconn_cb,
void *data);
void bnep_disconnect(struct bnep *session);
-int bnep_server_add(int sk, uint16_t dst, char *bridge, char *iface,
- const bdaddr_t *addr);
+int bnep_server_add(int sk, char *bridge, char *iface, const bdaddr_t *addr,
+ void *setup_data);
void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr);
ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp);
-uint16_t bnep_setup_decode(struct bnep_setup_conn_req *req, uint16_t *dst,
- uint16_t *src);
diff --git a/profiles/network/server.c b/profiles/network/server.c
index 2091fdd..061fedf 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -46,6 +46,7 @@
#include "src/log.h"
#include "src/error.h"
#include "src/sdpd.h"
+#include "src/shared/util.h"
#include "bnep.h"
#include "server.h"
@@ -280,11 +281,14 @@ static void setup_destroy(void *user_data)
static gboolean bnep_setup(GIOChannel *chan,
GIOCondition cond, gpointer user_data)
{
+ const uint8_t bt_base[] = { 0x00, 0x00, 0x10, 0x00, 0x80, 0x00,
+ 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
struct network_adapter *na = user_data;
struct network_server *ns;
uint8_t packet[BNEP_MTU];
struct bnep_setup_conn_req *req = (void *) packet;
- uint16_t src_role, dst_role, rsp = BNEP_CONN_NOT_ALLOWED;
+ uint16_t dst_role, rsp = BNEP_CONN_NOT_ALLOWED;
+ uint32_t val;
int n, sk;
if (cond & G_IO_NVAL)
@@ -304,25 +308,26 @@ static gboolean bnep_setup(GIOChannel *chan,
return FALSE;
}
- /* Highest known Control command ID
- * is BNEP_FILTER_MULT_ADDR_RSP = 0x06 */
- if (req->type == BNEP_CONTROL &&
- req->ctrl > BNEP_FILTER_MULT_ADDR_RSP) {
- error("cmd not understood");
- bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_CMD_NOT_UNDERSTOOD,
- req->ctrl);
-
- return FALSE;
- }
+ switch (req->uuid_size) {
+ case 2:
+ dst_role = get_be16(req->service);
+ break;
+ case 16:
+ if (memcmp(&req->service[4], bt_base, sizeof(bt_base)) != 0)
+ return FALSE;
- if (req->type != BNEP_CONTROL || req->ctrl != BNEP_SETUP_CONN_REQ)
- return FALSE;
+ /* Intentional no-brake */
- rsp = bnep_setup_decode(req, &dst_role, &src_role);
- if (rsp != BNEP_SUCCESS)
- goto reply;
+ case 4:
+ val = get_be32(req->service);
+ if (val > 0xffff)
+ return FALSE;
- rsp = BNEP_CONN_NOT_ALLOWED;
+ dst_role = val;
+ break;
+ default:
+ return FALSE;
+ }
ns = find_server(na->servers, dst_role);
if (!ns) {
@@ -343,8 +348,8 @@ static gboolean bnep_setup(GIOChannel *chan,
strncpy(na->setup->dev, BNEP_INTERFACE, 16);
na->setup->dev[15] = '\0';
- if (bnep_server_add(sk, dst_role, ns->bridge, na->setup->dev,
- &na->setup->dst) < 0)
+ if (bnep_server_add(sk, ns->bridge, na->setup->dev,
+ &na->setup->dst, (void *) packet) < 0)
goto reply;
na->setup = NULL;
--
1.9.3
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 6/6] profiles/network: Handle ctrl rsp after conn setup by bnep
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
` (3 preceding siblings ...)
2015-02-19 14:16 ` [PATCH 5/6] profiles/network: Move bnep connection setup logic to bnep Grzegorz Kolodziejczyk
@ 2015-02-19 14:16 ` Grzegorz Kolodziejczyk
2015-02-26 9:32 ` [PATCH 1/6] profiles/network: Minor style fix Szymon Janc
5 siblings, 0 replies; 10+ messages in thread
From: Grzegorz Kolodziejczyk @ 2015-02-19 14:16 UTC (permalink / raw)
To: linux-bluetooth
This patch moves setup control response to bnep and makes it private.
---
android/pan.c | 14 +++--------
profiles/network/bnep.c | 60 +++++++++++++++++++++++++++++------------------
profiles/network/bnep.h | 2 --
profiles/network/server.c | 36 +++++++++-------------------
4 files changed, 51 insertions(+), 61 deletions(-)
diff --git a/android/pan.c b/android/pan.c
index 8bafcd0..08c8134 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -463,7 +463,6 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
{
struct pan_device *dev = user_data;
uint8_t packet[BNEP_MTU];
- uint16_t rsp = BNEP_CONN_NOT_ALLOWED;
int sk, n, err;
if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) {
@@ -481,23 +480,17 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
}
err = nap_create_bridge();
- if (err < 0) {
+ if (err < 0)
error("pan: Failed to create bridge: %s (%d)", strerror(-err),
-err);
- goto failed;
- }
- if (bnep_server_add(sk, BNEP_BRIDGE, dev->iface, &dev->dst,
- (void *) packet) < 0) {
+ if (bnep_server_add(sk, (err < 0) ? NULL : BNEP_BRIDGE, dev->iface,
+ &dev->dst, (void *) packet) < 0) {
nap_remove_bridge();
error("server_connadd failed");
- rsp = BNEP_CONN_NOT_ALLOWED;
goto failed;
}
- rsp = BNEP_SUCCESS;
- bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_SETUP_CONN_RSP, rsp);
-
dev->watch = g_io_add_watch(chan, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
nap_watchdog_cb, dev);
g_io_channel_unref(dev->io);
@@ -509,7 +502,6 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
return FALSE;
failed:
- bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_SETUP_CONN_RSP, rsp);
pan_device_remove(dev);
return FALSE;
diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
index 1b6ebbc..967fd0f 100644
--- a/profiles/network/bnep.c
+++ b/profiles/network/bnep.c
@@ -549,6 +549,18 @@ static int bnep_del_from_bridge(const char *devname, const char *bridge)
return err;
}
+static ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl,
+ uint16_t resp)
+{
+ struct bnep_control_rsp rsp;
+
+ rsp.type = type;
+ rsp.ctrl = ctrl;
+ rsp.resp = htons(resp);
+
+ return send(sk, &rsp, sizeof(rsp), 0);
+}
+
static uint16_t bnep_setup_decode(int sk, struct bnep_setup_conn_req *req,
uint16_t *dst)
{
@@ -603,7 +615,6 @@ static uint16_t bnep_setup_decode(int sk, struct bnep_setup_conn_req *req,
case BNEP_SVC_GN:
if (src == BNEP_SVC_PANU)
return BNEP_SUCCESS;
-
return BNEP_CONN_INVALID_SRC;
case BNEP_SVC_PANU:
if (src == BNEP_SVC_PANU || src == BNEP_SVC_GN ||
@@ -620,7 +631,7 @@ int bnep_server_add(int sk, char *bridge, char *iface, const bdaddr_t *addr,
void *setup_data)
{
int err;
- uint16_t dst = NULL;
+ uint16_t rsp, dst = NULL;
struct bnep_setup_conn_req *req = setup_data;
/* Highest known Control command ID
@@ -635,26 +646,40 @@ int bnep_server_add(int sk, char *bridge, char *iface, const bdaddr_t *addr,
}
/* Processing BNEP_SETUP_CONNECTION_REQUEST_MSG */
- err = bnep_setup_decode(sk, setup_data, &dst);
- if (err < 0) {
- error("error while decoding setup connection request: %d", err);
- return -EINVAL;
+ rsp = bnep_setup_decode(sk, setup_data, &dst);
+ if (rsp != BNEP_SUCCESS || !dst) {
+ err = -rsp;
+ error("error while decoding setup connection request: %d", rsp);
+ goto reply;
}
- if (!bridge || !iface || !addr || !dst)
- return -EINVAL;
+ if (!dst) {
+ error("cannot decode proper destination service UUID");
+ rsp = BNEP_CONN_INVALID_DST;
+ goto reply;
+ }
err = bnep_connadd(sk, dst, iface);
- if (err < 0)
- return err;
+ if (err < 0) {
+ rsp = BNEP_CONN_NOT_ALLOWED;
+ goto reply;
+ }
err = bnep_add_to_bridge(iface, bridge);
if (err < 0) {
bnep_conndel(addr);
- return err;
+ rsp = BNEP_CONN_NOT_ALLOWED;
+ goto reply;
}
- return bnep_if_up(iface);
+ err = bnep_if_up(iface);
+ if (err < 0)
+ rsp = BNEP_CONN_NOT_ALLOWED;
+
+reply:
+ bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_SETUP_CONN_RSP, rsp);
+
+ return err;
}
void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr)
@@ -666,14 +691,3 @@ void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr)
bnep_if_down(iface);
bnep_conndel(addr);
}
-
-ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp)
-{
- struct bnep_control_rsp rsp;
-
- rsp.type = type;
- rsp.ctrl = ctrl;
- rsp.resp = htons(resp);
-
- return send(sk, &rsp, sizeof(rsp), 0);
-}
diff --git a/profiles/network/bnep.h b/profiles/network/bnep.h
index 7a3efb6..a9d9f98 100644
--- a/profiles/network/bnep.h
+++ b/profiles/network/bnep.h
@@ -44,5 +44,3 @@ void bnep_disconnect(struct bnep *session);
int bnep_server_add(int sk, char *bridge, char *iface, const bdaddr_t *addr,
void *setup_data);
void bnep_server_delete(char *bridge, char *iface, const bdaddr_t *addr);
-
-ssize_t bnep_send_ctrl_rsp(int sk, uint8_t type, uint8_t ctrl, uint16_t resp);
diff --git a/profiles/network/server.c b/profiles/network/server.c
index 061fedf..e5a64af 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -287,9 +287,10 @@ static gboolean bnep_setup(GIOChannel *chan,
struct network_server *ns;
uint8_t packet[BNEP_MTU];
struct bnep_setup_conn_req *req = (void *) packet;
- uint16_t dst_role, rsp = BNEP_CONN_NOT_ALLOWED;
+ uint16_t dst_role = 0;
uint32_t val;
int n, sk;
+ char *bridge = NULL;
if (cond & G_IO_NVAL)
return FALSE;
@@ -314,51 +315,36 @@ static gboolean bnep_setup(GIOChannel *chan,
break;
case 16:
if (memcmp(&req->service[4], bt_base, sizeof(bt_base)) != 0)
- return FALSE;
+ break;
/* Intentional no-brake */
case 4:
val = get_be32(req->service);
if (val > 0xffff)
- return FALSE;
+ break;
dst_role = val;
break;
default:
- return FALSE;
+ break;
}
ns = find_server(na->servers, dst_role);
- if (!ns) {
- error("Server unavailable: (0x%x)", dst_role);
- goto reply;
- }
-
- if (!ns->record_id) {
- error("Service record not available");
- goto reply;
- }
+ if (!ns || !ns->record_id || !ns->bridge)
+ error("Server error, bridge not initialized: (0x%x)", dst_role);
- if (!ns->bridge) {
- error("Bridge interface not configured");
- goto reply;
- }
+ bridge = ns->bridge;
strncpy(na->setup->dev, BNEP_INTERFACE, 16);
na->setup->dev[15] = '\0';
- if (bnep_server_add(sk, ns->bridge, na->setup->dev,
- &na->setup->dst, (void *) packet) < 0)
- goto reply;
+ if (bnep_server_add(sk, bridge, na->setup->dev, &na->setup->dst,
+ (void *) packet) < 0)
+ error("BNEP server cannot be added");
na->setup = NULL;
- rsp = BNEP_SUCCESS;
-
-reply:
- bnep_send_ctrl_rsp(sk, BNEP_CONTROL, BNEP_SETUP_CONN_RSP, rsp);
-
return FALSE;
}
--
1.9.3
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/6] profiles/network: Minor style fix
2015-02-19 14:16 [PATCH 1/6] profiles/network: Minor style fix Grzegorz Kolodziejczyk
` (4 preceding siblings ...)
2015-02-19 14:16 ` [PATCH 6/6] profiles/network: Handle ctrl rsp after conn setup by bnep Grzegorz Kolodziejczyk
@ 2015-02-26 9:32 ` Szymon Janc
5 siblings, 0 replies; 10+ messages in thread
From: Szymon Janc @ 2015-02-26 9:32 UTC (permalink / raw)
To: Grzegorz Kolodziejczyk; +Cc: linux-bluetooth
Hi Grzegorz,
On Thursday 19 of February 2015 15:16:34 Grzegorz Kolodziejczyk wrote:
> This patch fixes style issues e.g. line aligns, braces.
> ---
> profiles/network/bnep.c | 10 ++++++----
> profiles/network/server.c | 11 +++++------
> 2 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/profiles/network/bnep.c b/profiles/network/bnep.c
> index 09d4b65..70d2e56 100644
> --- a/profiles/network/bnep.c
> +++ b/profiles/network/bnep.c
> @@ -506,10 +506,11 @@ static int bnep_add_to_bridge(const char *devname, const char *bridge)
>
> if (ioctl(sk, SIOCBRADDIF, &ifr) < 0) {
> err = -errno;
> - error("bnep: Can't add %s to the bridge %s: %s(%d)",
> - devname, bridge, strerror(-err), -err);
> - } else
> + error("bnep: Can't add %s to the bridge %s: %s(%d)", devname,
> + bridge, strerror(-err), -err);
I find original code more readable(ie if all parameters fit in single line).
> + } else {
> info("bridge %s: interface %s added", bridge, devname);
> + }
>
> close(sk);
>
> @@ -539,8 +540,9 @@ static int bnep_del_from_bridge(const char *devname, const char *bridge)
> err = -errno;
> error("bnep: Can't delete %s from the bridge %s: %s(%d)",
> devname, bridge, strerror(-err), -err);
> - } else
> + } else {
> info("bridge %s: interface %s removed", bridge, devname);
> + }
>
> close(sk);
>
> diff --git a/profiles/network/server.c b/profiles/network/server.c
> index 3fb031f..ebbe056 100644
> --- a/profiles/network/server.c
> +++ b/profiles/network/server.c
> @@ -650,8 +650,7 @@ static struct network_adapter *create_adapter(struct btd_adapter *adapter)
> na = g_new0(struct network_adapter, 1);
> na->adapter = btd_adapter_ref(adapter);
>
> - na->io = bt_io_listen(NULL, confirm_event, na,
> - NULL, &err,
> + na->io = bt_io_listen(NULL, confirm_event, na, NULL, &err,
> BT_IO_OPT_SOURCE_BDADDR,
> btd_adapter_get_address(adapter),
> BT_IO_OPT_PSM, BNEP_PSM,
> @@ -697,10 +696,10 @@ int server_register(struct btd_adapter *adapter, uint16_t id)
> if (g_slist_length(na->servers) > 0)
> goto done;
>
> - if (!g_dbus_register_interface(btd_get_dbus_connection(),
> - path, NETWORK_SERVER_INTERFACE,
> - server_methods, NULL, NULL,
> - na, path_unregister)) {
> + if (!g_dbus_register_interface(btd_get_dbus_connection(), path,
> + NETWORK_SERVER_INTERFACE,
> + server_methods, NULL, NULL, na,
> + path_unregister)) {
> error("D-Bus failed to register %s interface",
> NETWORK_SERVER_INTERFACE);
> server_free(ns);
>
--
Best regards,
Szymon Janc
^ permalink raw reply [flat|nested] 10+ messages in thread