Re: [PATCH v2 05/15] profiles/network: Handle ctrl rsp after conn setup by bnep

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Szymon,


On 9 March 2015 at 16:14, Szymon Janc <szymon.janc@xxxxxxxxx> wrote:
> Hi Grzegorz,
>
> On Tuesday 03 of March 2015 17:59:49 Grzegorz Kolodziejczyk wrote:
>> This patch moves setup control response to bnep and makes it private.
>> ---
>>  android/pan.c             | 14 +++--------
>>  profiles/network/bnep.c   | 61 +++++++++++++++++++++++++++++------------------
>>  profiles/network/bnep.h   |  2 --
>>  profiles/network/server.c | 36 +++++++++-------------------
>>  4 files changed, 52 insertions(+), 61 deletions(-)
>>
>> diff --git a/android/pan.c b/android/pan.c
>> index c4ec349..72d8a73 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)) {
>> @@ -486,22 +485,16 @@ 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, packet, n)
>> -                                                                     < 0) {
>> +     if (bnep_server_add(sk, (err < 0) ? NULL : BNEP_BRIDGE, dev->iface,
>> +                                             &dev->dst, packet, n) < 0) {
>>               error("pann: 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);
>> @@ -513,7 +506,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 160ad1f..e8f9698 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,
>>                                               uint8_t *setup_data, int len)
>>  {
>>       int err;
>> -     uint16_t dst = NULL;
>> +     uint16_t rsp, dst = NULL;
>>       struct bnep_setup_conn_req *req = (void *) setup_data;
>>
>>       /* Highest known Control command ID
>> @@ -639,26 +650,41 @@ 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, req, &dst);
>> -     if (err < 0) {
>> -             error("error while decoding setup connection request: %d", err);
>> -             return -EINVAL;
>> +     rsp = bnep_setup_decode(sk, req, &dst);
>> +     if (rsp != BNEP_SUCCESS || !dst) {
>> +             err = -rsp;
>> +             error("bnep: error while decoding setup connection request: %d",
>> +                                                                     rsp);
>> +             goto reply;
>>       }
>>
>> -     if (!bridge || !iface || !addr || !dst)
>> -             return -EINVAL;
>> +     if (!dst) {
>> +             error("bnep: 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)
>> @@ -670,14 +696,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 aa81dcb..4fe79ed 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,
>>                                               uint8_t *setup_data, int len);
>>  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 30bb190..5d2fbcc 100644
>> --- a/profiles/network/server.c
>> +++ b/profiles/network/server.c
>> @@ -288,9 +288,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;
>> @@ -320,51 +321,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);
>
> Lets be consistent and prefix info/error appropriately.
This file don't have any consistent prefixes, so that's why I've
decided to not do it here also.

>>
>> -     if (!ns->bridge) {
>> -             error("Bridge interface not configured");
>> -             goto reply;
>> -     }
>> +     bridge = ns->bridge;
>
> This would dereference possibly null ns.
>
Right, I'll fix it in v3.

>>
>>       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, packet, n) < 0)
>> -             goto reply;
>> +     if (bnep_server_add(sk, bridge, na->setup->dev, &na->setup->dst,
>> +                                                     packet, n) < 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;
>>  }
>>
>>
>
> --
> Best regards,
> Szymon Janc

BR,
Grzegorz Kołodziejczyk
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux