Re: [PATCH v7 2/3] Bluetooth: Extract generic start and stop discovery

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

 



On Thu, Nov 20, 2014 at 2:14 PM, Arman Uguray <armansito@xxxxxxxxxxxx> wrote:
> Hi Jakub,
>
>> On Thu, Nov 20, 2014 at 9:51 AM, Jakub Pawlowski <jpawlowski@xxxxxxxxxx> wrote:
>> This commit extract generic_start_discovery and generic_stop_discovery
>> in preparation for start and stop service discovery. The reason behind
>> that is that both functions will share big part of code, and it would
>> be much easier to maintain just one generic method.
>>
>> Signed-off-by: Jakub Pawlowski <jpawlowski@xxxxxxxxxx>
>> ---
>>  net/bluetooth/mgmt.c | 147 ++++++++++++++++++++++++++++++---------------------
>>  1 file changed, 86 insertions(+), 61 deletions(-)
>>
>> diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
>> index cbeef5f..f650d30 100644
>> --- a/net/bluetooth/mgmt.c
>> +++ b/net/bluetooth/mgmt.c
>> @@ -3675,7 +3675,8 @@ done:
>>         return err;
>>  }
>>
>> -static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
>> +static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status,
>> +                                      uint16_t opcode)
>>  {
>>         struct pending_cmd *cmd;
>>         u8 type;
>> @@ -3683,7 +3684,7 @@ static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
>>
>>         hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
>>
>> -       cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
>> +       cmd = mgmt_pending_find(opcode, hdev);
>>         if (!cmd)
>>                 return -ENOENT;
>>
>> @@ -3696,7 +3697,8 @@ static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
>>         return err;
>>  }
>>
>> -static void start_discovery_complete(struct hci_dev *hdev, u8 status)
>> +static void generic_start_discovery_complete(struct hci_dev *hdev, u8 status,
>> +                                            uint16_t opcode)
>
> I'm not that big on calling these generic functions "generic_*". Let's
> try to come up with something better.
>
>>  {
>>         unsigned long timeout = 0;
>>
>> @@ -3704,7 +3706,7 @@ static void start_discovery_complete(struct hci_dev *hdev, u8 status)
>>
>>         if (status) {
>>                 hci_dev_lock(hdev);
>> -               mgmt_start_discovery_failed(hdev, status);
>> +               mgmt_start_discovery_failed(hdev, status, opcode);
>>                 hci_dev_unlock(hdev);
>>                 return;
>>         }
>> @@ -3735,8 +3737,13 @@ static void start_discovery_complete(struct hci_dev *hdev, u8 status)
>>         queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable, timeout);
>>  }
>>
>> -static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>> -                          void *data, u16 len)
>> +static void start_discovery_complete(struct hci_dev *hdev, u8 status)
>> +{
>> +       generic_start_discovery_complete(hdev, status, MGMT_OP_START_DISCOVERY);
>> +}
>> +
>> +static int generic_start_discovery(struct sock *sk, struct hci_dev *hdev,
>> +                                  void *data, u16 len, uint16_t opcode)
>>  {
>>         struct mgmt_cp_start_discovery *cp = data;
>>         struct pending_cmd *cmd;
>> @@ -3746,41 +3753,41 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>         struct hci_request req;
>>         /* General inquiry access code (GIAC) */
>>         u8 lap[3] = { 0x33, 0x8b, 0x9e };
>> -       u8 status, own_addr_type;
>> +       u8 status, own_addr_type, type;
>>         int err;
>>
>>         BT_DBG("%s", hdev->name);
>>
>> +       type = cp->type;
>> +
>
> I don't see the point of this local variable & assignment. Why not
> just leave it as it is, "cp->type" isn't that wordy.

So this patch is preparation for next patch which will have if/else
statement here that would pick proper type for different cases.
The next patch is already big so I wanted to make this change from
cp->type to  type in this one. If that's a bad idea I'll move that to
next patch.

>
>>         hci_dev_lock(hdev);
>>
>>         if (!hdev_is_powered(hdev)) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
>> -                                  MGMT_STATUS_NOT_POWERED,
>> -                                  &cp->type, sizeof(cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_NOT_POWERED, &type,
>> +                                  sizeof(type));
>>                 goto failed;
>>         }
>>
>>         if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
>> -                                  MGMT_STATUS_BUSY, &cp->type,
>> -                                  sizeof(cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_BUSY, &type, sizeof(type));
>>                 goto failed;
>>         }
>>
>>         if (hdev->discovery.state != DISCOVERY_STOPPED) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
>> -                                  MGMT_STATUS_BUSY, &cp->type,
>> -                                  sizeof(cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_BUSY, &type, sizeof(type));
>>                 goto failed;
>>         }
>>
>> -       cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
>> +       cmd = mgmt_pending_add(sk, opcode, hdev, NULL, 0);
>>         if (!cmd) {
>>                 err = -ENOMEM;
>>                 goto failed;
>>         }
>>
>> -       hdev->discovery.type = cp->type;
>> +       hdev->discovery.type = type;
>>
>>         hci_req_init(&req, hdev);
>>
>> @@ -3788,18 +3795,16 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>         case DISCOV_TYPE_BREDR:
>>                 status = mgmt_bredr_support(hdev);
>>                 if (status) {
>> -                       err = cmd_complete(sk, hdev->id,
>> -                                          MGMT_OP_START_DISCOVERY, status,
>> -                                          &cp->type, sizeof(cp->type));
>> +                       err = cmd_complete(sk, hdev->id, opcode, status, &type,
>> +                                          sizeof(type));
>>                         mgmt_pending_remove(cmd);
>>                         goto failed;
>>                 }
>>
>>                 if (test_bit(HCI_INQUIRY, &hdev->flags)) {
>> -                       err = cmd_complete(sk, hdev->id,
>> -                                          MGMT_OP_START_DISCOVERY,
>> -                                          MGMT_STATUS_BUSY, &cp->type,
>> -                                          sizeof(cp->type));
>> +                       err = cmd_complete(sk, hdev->id, opcode,
>> +                                          MGMT_STATUS_BUSY, &type,
>> +                                          sizeof(type));
>>                         mgmt_pending_remove(cmd);
>>                         goto failed;
>>                 }
>> @@ -3816,19 +3821,17 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>         case DISCOV_TYPE_INTERLEAVED:
>>                 status = mgmt_le_support(hdev);
>>                 if (status) {
>> -                       err = cmd_complete(sk, hdev->id,
>> -                                          MGMT_OP_START_DISCOVERY, status,
>> -                                          &cp->type, sizeof(cp->type));
>> +                       err = cmd_complete(sk, hdev->id, opcode, status, &type,
>> +                                          sizeof(type));
>>                         mgmt_pending_remove(cmd);
>>                         goto failed;
>>                 }
>>
>>                 if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
>>                     !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
>> -                       err = cmd_complete(sk, hdev->id,
>> -                                          MGMT_OP_START_DISCOVERY,
>> -                                          MGMT_STATUS_NOT_SUPPORTED,
>> -                                          &cp->type, sizeof(cp->type));
>> +                       err = cmd_complete(sk, hdev->id, opcode,
>> +                                          MGMT_STATUS_NOT_SUPPORTED, &type,
>> +                                          sizeof(type));
>>                         mgmt_pending_remove(cmd);
>>                         goto failed;
>>                 }
>> @@ -3840,11 +3843,9 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>                          */
>>                         if (hci_conn_hash_lookup_state(hdev, LE_LINK,
>>                                                        BT_CONNECT)) {
>> -                               err = cmd_complete(sk, hdev->id,
>> -                                                  MGMT_OP_START_DISCOVERY,
>> -                                                  MGMT_STATUS_REJECTED,
>> -                                                  &cp->type,
>> -                                                  sizeof(cp->type));
>> +                               err = cmd_complete(sk, hdev->id, opcode,
>> +                                                  MGMT_STATUS_REJECTED, &type,
>> +                                                  sizeof(type));
>>                                 mgmt_pending_remove(cmd);
>>                                 goto failed;
>>                         }
>> @@ -3867,10 +3868,9 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>                  */
>>                 err = hci_update_random_address(&req, true, &own_addr_type);
>>                 if (err < 0) {
>> -                       err = cmd_complete(sk, hdev->id,
>> -                                          MGMT_OP_START_DISCOVERY,
>> -                                          MGMT_STATUS_FAILED,
>> -                                          &cp->type, sizeof(cp->type));
>> +                       err = cmd_complete(sk, hdev->id, opcode,
>> +                                          MGMT_STATUS_FAILED, &type,
>> +                                          sizeof(type));
>>                         mgmt_pending_remove(cmd);
>>                         goto failed;
>>                 }
>> @@ -3890,14 +3890,15 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>>                 break;
>>
>>         default:
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_START_DISCOVERY,
>> -                                  MGMT_STATUS_INVALID_PARAMS,
>> -                                  &cp->type, sizeof(cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_INVALID_PARAMS, &type,
>> +                                  sizeof(type));
>>                 mgmt_pending_remove(cmd);
>>                 goto failed;
>>         }
>>
>>         err = hci_req_run(&req, start_discovery_complete);
>> +
>>         if (err < 0)
>>                 mgmt_pending_remove(cmd);
>>         else
>> @@ -3908,12 +3909,20 @@ failed:
>>         return err;
>>  }
>>
>> -static int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
>> +static int start_discovery(struct sock *sk, struct hci_dev *hdev,
>> +                          void *data, u16 len)
>> +{
>> +       return generic_start_discovery(sk, hdev, data, len,
>> +                                      MGMT_OP_START_DISCOVERY);
>> +}
>> +
>> +static int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status,
>> +                                     uint16_t opcode)
>>  {
>>         struct pending_cmd *cmd;
>>         int err;
>>
>> -       cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
>> +       cmd = mgmt_pending_find(opcode, hdev);
>>         if (!cmd)
>>                 return -ENOENT;
>>
>> @@ -3924,14 +3933,15 @@ static int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
>>         return err;
>>  }
>>
>> -static void stop_discovery_complete(struct hci_dev *hdev, u8 status)
>> +static void generic_stop_discovery_complete(struct hci_dev *hdev, u8 status,
>> +                                           uint16_t opcode)
>>  {
>>         BT_DBG("status %d", status);
>>
>>         hci_dev_lock(hdev);
>>
>>         if (status) {
>> -               mgmt_stop_discovery_failed(hdev, status);
>> +               mgmt_stop_discovery_failed(hdev, status, opcode);
>>                 goto unlock;
>>         }
>>
>> @@ -3941,33 +3951,40 @@ unlock:
>>         hci_dev_unlock(hdev);
>>  }
>>
>> -static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
>> -                         u16 len)
>> +static void stop_discovery_complete(struct hci_dev *hdev, u8 status)
>> +{
>> +       generic_stop_discovery_complete(hdev, status, MGMT_OP_STOP_DISCOVERY);
>> +}
>> +
>> +static int generic_stop_discovery(struct sock *sk, struct hci_dev *hdev,
>> +                                 void *data, u16 len, uint16_t opcode)
>>  {
>> -       struct mgmt_cp_stop_discovery *mgmt_cp = data;
>>         struct pending_cmd *cmd;
>>         struct hci_request req;
>> +       struct mgmt_cp_stop_discovery *mgmt_cp = data;
>
> Why move this?

I'll fix that
>
>>         int err;
>> +       u8 type;
>>
>
> Again, there's no need for this variable.

same as aboce - this patch is preparation for next patch which will
have if/else statement here that would pick proper type for different
cases.

>
>>         BT_DBG("%s", hdev->name);
>>
>> +       type = mgmt_cp->type;
>> +
>>         hci_dev_lock(hdev);
>>
>>         if (!hci_discovery_active(hdev)) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
>> -                                  MGMT_STATUS_REJECTED, &mgmt_cp->type,
>> -                                  sizeof(mgmt_cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_REJECTED, &type, sizeof(type));
>>                 goto unlock;
>>         }
>>
>> -       if (hdev->discovery.type != mgmt_cp->type) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
>> -                                  MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
>> -                                  sizeof(mgmt_cp->type));
>> +       if (hdev->discovery.type != type) {
>> +               err = cmd_complete(sk, hdev->id, opcode,
>> +                                  MGMT_STATUS_INVALID_PARAMS, &type,
>> +                                  sizeof(type));
>>                 goto unlock;
>>         }
>>
>> -       cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
>> +       cmd = mgmt_pending_add(sk, opcode, hdev, NULL, 0);
>>         if (!cmd) {
>>                 err = -ENOMEM;
>>                 goto unlock;
>> @@ -3978,6 +3995,7 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
>>         hci_stop_discovery(&req);
>>
>>         err = hci_req_run(&req, stop_discovery_complete);
>> +
>>         if (!err) {
>>                 hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
>>                 goto unlock;
>> @@ -3987,8 +4005,8 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
>>
>>         /* If no HCI commands were sent we're done */
>>         if (err == -ENODATA) {
>> -               err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY, 0,
>> -                                  &mgmt_cp->type, sizeof(mgmt_cp->type));
>> +               err = cmd_complete(sk, hdev->id, opcode, 0,
>> +                                  &type, sizeof(type));
>>                 hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
>>         }
>>
>> @@ -3997,6 +4015,13 @@ unlock:
>>         return err;
>>  }
>>
>> +static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
>> +                         u16 len)
>> +{
>> +       return generic_stop_discovery(sk, hdev, data, len,
>> +                                     MGMT_OP_STOP_DISCOVERY);
>> +}
>> +
>>  static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
>>                         u16 len)
>>  {
>> --
>> 2.1.0.rc2.206.gedb03e5
>>
>> --
>> 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
>
> Overall I think this patch looks good, except for a few nits that I
> commented on above.
>
> Thanks,
> Arman
--
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