Re: [PATCH v6 7/8] core: adapter: filter discovery results when filered discovery is used

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

 



Hi Jakub,

> On Mon, Mar 30, 2015 at 4:32 PM, Jakub Pawlowski <jpawlowski@xxxxxxxxxx> wrote:
> This patch adds filtering to device found event, and enforces lack
> of RSSI delta for filtered scan.
>
> When filtering, we compare against each client filter. That
> additionally removes some of reports.
> ---
>  src/adapter.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 68 insertions(+), 1 deletion(-)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index 67db99c..8d78e0a 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -5297,6 +5297,63 @@ static void adapter_msd_notify(struct btd_adapter *adapter,
>         }
>  }
>
> +static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
> +                                                               int8_t rssi)
> +{
> +       GSList *l, *m;
> +       bool got_match = false;
> +
> +       for (l = discovery_filter; l != NULL && got_match != true;
> +                                                       l = g_slist_next(l)) {
> +               struct watch_client *client = l->data;
> +               struct discovery_filter *item = client->discovery_filter;
> +
> +               /*
> +                * If one of currently running scans is regular scan, then
> +                * return all devices as matches
> +                */
> +               if (!item) {
> +                       got_match = true;
> +                       continue;
> +               }
> +
> +               /* if someone started discovery with empty uuids, he wants all
> +                * devices in given proximity.
> +                */
> +               if (!item->uuids)
> +                       got_match = true;
> +               else
> +                       for (m = item->uuids; m != NULL && got_match != true;
> +                                                          m = g_slist_next(m))
> +                               /* m->data contains string representation of
> +                                * uuid.
> +                                */
> +                               if (g_slist_find_custom(eir_data->services,
> +                                                       m->data,
> +                                                       g_strcmp) != NULL)
> +                                       got_match = true;

Use curly braces for the else statement here. It's contents are
difficult to parse otherwise. Same for the for loop.

> +
> +               if (got_match) {
> +                       /* we have service match, check proximity */
> +                       if (item->rssi != DISTANCE_VAL_INVALID &&
> +                           item->rssi > rssi)
> +                               got_match = false;
> +                       if (item->pathloss != DISTANCE_VAL_INVALID &&
> +                          (eir_data->tx_power == 127 ||
> +                          eir_data->tx_power - rssi > item->pathloss))
> +                               got_match = false;

Just return true if both of these if statements evaluate to false?

> +
> +                       if (got_match)
> +                               return true;
> +               }
> +       }
> +
> +       if (!got_match)
> +               return false;
> +
> +       return true;
> +}
> +
>  static void update_found_devices(struct btd_adapter *adapter,
>                                         const bdaddr_t *bdaddr,
>                                         uint8_t bdaddr_type, int8_t rssi,
> @@ -5363,8 +5420,18 @@ static void update_found_devices(struct btd_adapter *adapter,
>                 return;
>         }
>
> +       if (adapter->filtered_discovery &&
> +           !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
> +               eir_data_free(&eir_data);
> +               return;
> +       }
> +
>         device_set_legacy(dev, legacy);
> -       device_set_rssi(dev, rssi);
> +
> +       if (adapter->filtered_discovery)
> +               device_set_rssi_with_delta(dev, rssi, 0);
> +       else
> +               device_set_rssi(dev, rssi);
>
>         if (eir_data.appearance != 0)
>                 device_set_appearance(dev, eir_data.appearance);
> --
> 2.2.0.rc0.207.ga3a616c
>
> --
> 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

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