2010-08-19 15:43:07

by Anderson Briglia

[permalink] [raw]
Subject: [PATCH] hciconfig: add LE_SET_ADVERTISE_ENABLE cmd

This patch implements two new hciconfig commands: leadv and noleadv.
These new hciconfig flags are responsible to LE_SET_ADVERTISE_ENABLE
command implementation.
---
lib/hci.c | 1 +
lib/hci.h | 1 +
tools/hciconfig.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/lib/hci.c b/lib/hci.c
index 3304daa..64ac5f2 100644
--- a/lib/hci.c
+++ b/lib/hci.c
@@ -188,6 +188,7 @@ static hci_map dev_flags_map[] = {
{ "INQUIRY", HCI_INQUIRY },
{ "AUTH", HCI_AUTH },
{ "ENCRYPT", HCI_ENCRYPT },
+ { "LEADV", HCI_LE_ADV },
{ NULL }
};

diff --git a/lib/hci.h b/lib/hci.h
index 512dab9..8b9d33f 100644
--- a/lib/hci.h
+++ b/lib/hci.h
@@ -73,6 +73,7 @@ enum {
HCI_INQUIRY,

HCI_RAW,
+ HCI_LE_ADV,
};

/* HCI ioctl defines */
diff --git a/tools/hciconfig.c b/tools/hciconfig.c
index 87dd127..ba12a8a 100644
--- a/tools/hciconfig.c
+++ b/tools/hciconfig.c
@@ -149,6 +149,50 @@ static void cmd_scan(int ctl, int hdev, char *opt)
}
}

+static void cmd_le_adv(int ctl, int hdev, char *opt)
+{
+
+ struct hci_request rq;
+ le_set_advertise_enable_cp advertise_cp;
+ uint8_t status;
+ uint8_t enable;
+ int dd, ret;
+
+ if (hdev < 0)
+ hdev = hci_get_route(NULL);
+
+ dd = hci_open_dev(hdev);
+ if (dd < 0) {
+ perror("Could not open device");
+ exit(1);
+ }
+
+ enable = 0x01;
+ if (!strcmp(opt, "noleadv"))
+ enable = 0x00;
+
+ memset(&advertise_cp, 0, sizeof(advertise_cp));
+ advertise_cp.enable = enable;
+
+ memset(&rq, 0, sizeof(rq));
+ rq.ogf = OGF_LE_CTL;
+ rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;
+ rq.cparam = &advertise_cp;
+ rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;
+ rq.rparam = &status;
+ rq.rlen = 1;
+
+ ret = hci_send_req(dd, &rq, 100);
+
+ if (status || ret < 0) {
+ errno = EIO;
+ fprintf(stderr, "Can't set advertise mode on hci%d: %s (%d)\n",
+ hdev, strerror(errno), errno);
+ }
+
+ hci_close_dev(dd);
+}
+
static void cmd_iac(int ctl, int hdev, char *opt)
{
int s = hci_open_dev(hdev);
@@ -1728,6 +1772,8 @@ static struct {
{ "revision", cmd_revision, 0, "Display revision information" },
{ "block", cmd_block, "<bdaddr>", "Add a device to the blacklist" },
{ "unblock", cmd_unblock, "<bdaddr>", "Remove a device from the blacklist" },
+ { "leadv", cmd_le_adv, 0, "Enable LE advertising" },
+ { "noleadv", cmd_le_adv, 0, "Disable LE advertising" },
{ NULL, NULL, 0 }
};

--
1.7.0.4



2010-08-19 17:50:09

by Anderson Briglia

[permalink] [raw]
Subject: Re: [PATCH] hciconfig: add LE_SET_ADVERTISE_ENABLE cmd

Thanks for reviewing. I'll update and send again.

On 08/19/2010 12:36 PM, Claudio Takahasi wrote:
> Hi Briglia,
>
> On Thu, Aug 19, 2010 at 12:43 PM, Anderson Briglia
> <[email protected]> wrote:
>
>> This patch implements two new hciconfig commands: leadv and noleadv.
>> These new hciconfig flags are responsible to LE_SET_ADVERTISE_ENABLE
>> command implementation.
>> ---
>> lib/hci.c | 1 +
>> lib/hci.h | 1 +
>> tools/hciconfig.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 48 insertions(+), 0 deletions(-)
>>
>> diff --git a/lib/hci.c b/lib/hci.c
>> index 3304daa..64ac5f2 100644
>> --- a/lib/hci.c
>> +++ b/lib/hci.c
>> @@ -188,6 +188,7 @@ static hci_map dev_flags_map[] = {
>> { "INQUIRY", HCI_INQUIRY },
>> { "AUTH", HCI_AUTH },
>> { "ENCRYPT", HCI_ENCRYPT },
>> + { "LEADV", HCI_LE_ADV },
>> { NULL }
>> };
>>
>> diff --git a/lib/hci.h b/lib/hci.h
>> index 512dab9..8b9d33f 100644
>> --- a/lib/hci.h
>> +++ b/lib/hci.h
>> @@ -73,6 +73,7 @@ enum {
>> HCI_INQUIRY,
>>
>> HCI_RAW,
>> + HCI_LE_ADV,
>> };
>>
> I prefer this small change in another commit, it needs your previous
> kernel patch to work/test properly.
>
>
>> /* HCI ioctl defines */
>> diff --git a/tools/hciconfig.c b/tools/hciconfig.c
>> index 87dd127..ba12a8a 100644
>> --- a/tools/hciconfig.c
>> +++ b/tools/hciconfig.c
>> @@ -149,6 +149,50 @@ static void cmd_scan(int ctl, int hdev, char *opt)
>> }
>> }
>>
>> +static void cmd_le_adv(int ctl, int hdev, char *opt)
>> +{
>> +
>>
> No empty line here!
>
>
>> + struct hci_request rq;
>> + le_set_advertise_enable_cp advertise_cp;
>> + uint8_t status;
>> + uint8_t enable;
>>
> "enable" can be declared in the same line of "status"
>
>
>> + int dd, ret;
>> +
>> + if (hdev< 0)
>> + hdev = hci_get_route(NULL);
>> +
>> + dd = hci_open_dev(hdev);
>> + if (dd< 0) {
>> + perror("Could not open device");
>> + exit(1);
>> + }
>> +
>> + enable = 0x01;
>> + if (!strcmp(opt, "noleadv"))
>> + enable = 0x00;
>> +
>> + memset(&advertise_cp, 0, sizeof(advertise_cp));
>> + advertise_cp.enable = enable;
>> +
>> + memset(&rq, 0, sizeof(rq));
>> + rq.ogf = OGF_LE_CTL;
>> + rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;
>> + rq.cparam =&advertise_cp;
>> + rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;
>> + rq.rparam =&status;
>> + rq.rlen = 1;
>> +
>> + ret = hci_send_req(dd,&rq, 100);
>> +
>>
> No empty line here.
>
>> + if (status || ret< 0) {
>> + errno = EIO;
>>
> No need to set errno. hci_send_req sets errno when needed.
>
> Claudio
>
>
>> + fprintf(stderr, "Can't set advertise mode on hci%d: %s (%d)\n",
>> + hdev, strerror(errno), errno);
>> + }
>> +
>> + hci_close_dev(dd);
>> +}
>> +
>> static void cmd_iac(int ctl, int hdev, char *opt)
>> {
>> int s = hci_open_dev(hdev);
>> @@ -1728,6 +1772,8 @@ static struct {
>> { "revision", cmd_revision, 0, "Display revision information" },
>> { "block", cmd_block, "<bdaddr>", "Add a device to the blacklist" },
>> { "unblock", cmd_unblock, "<bdaddr>", "Remove a device from the blacklist" },
>> + { "leadv", cmd_le_adv, 0, "Enable LE advertising" },
>> + { "noleadv", cmd_le_adv, 0, "Disable LE advertising" },
>> { NULL, NULL, 0 }
>> };
>>
>> --
>> 1.7.0.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>>


2010-08-19 16:36:37

by Claudio Takahasi

[permalink] [raw]
Subject: Re: [PATCH] hciconfig: add LE_SET_ADVERTISE_ENABLE cmd

Hi Briglia,

On Thu, Aug 19, 2010 at 12:43 PM, Anderson Briglia
<[email protected]> wrote:
> This patch implements two new hciconfig commands: leadv and noleadv.
> These new hciconfig flags are responsible to LE_SET_ADVERTISE_ENABLE
> command implementation.
> ---
>  lib/hci.c         |    1 +
>  lib/hci.h         |    1 +
>  tools/hciconfig.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 48 insertions(+), 0 deletions(-)
>
> diff --git a/lib/hci.c b/lib/hci.c
> index 3304daa..64ac5f2 100644
> --- a/lib/hci.c
> +++ b/lib/hci.c
> @@ -188,6 +188,7 @@ static hci_map dev_flags_map[] = {
>        { "INQUIRY", HCI_INQUIRY },
>        { "AUTH",    HCI_AUTH    },
>        { "ENCRYPT", HCI_ENCRYPT },
> +       { "LEADV",   HCI_LE_ADV  },
>        { NULL }
>  };
>
> diff --git a/lib/hci.h b/lib/hci.h
> index 512dab9..8b9d33f 100644
> --- a/lib/hci.h
> +++ b/lib/hci.h
> @@ -73,6 +73,7 @@ enum {
>        HCI_INQUIRY,
>
>        HCI_RAW,
> +       HCI_LE_ADV,
>  };
I prefer this small change in another commit, it needs your previous
kernel patch to work/test properly.

>
>  /* HCI ioctl defines */
> diff --git a/tools/hciconfig.c b/tools/hciconfig.c
> index 87dd127..ba12a8a 100644
> --- a/tools/hciconfig.c
> +++ b/tools/hciconfig.c
> @@ -149,6 +149,50 @@ static void cmd_scan(int ctl, int hdev, char *opt)
>        }
>  }
>
> +static void cmd_le_adv(int ctl, int hdev, char *opt)
> +{
> +
No empty line here!

> +       struct hci_request rq;
> +       le_set_advertise_enable_cp advertise_cp;
> +       uint8_t status;
> +       uint8_t enable;
"enable" can be declared in the same line of "status"

> +       int dd, ret;
> +
> +       if (hdev < 0)
> +               hdev = hci_get_route(NULL);
> +
> +       dd = hci_open_dev(hdev);
> +       if (dd < 0) {
> +               perror("Could not open device");
> +               exit(1);
> +       }
> +
> +       enable = 0x01;
> +       if (!strcmp(opt, "noleadv"))
> +               enable = 0x00;
> +
> +       memset(&advertise_cp, 0, sizeof(advertise_cp));
> +       advertise_cp.enable = enable;
> +
> +       memset(&rq, 0, sizeof(rq));
> +       rq.ogf = OGF_LE_CTL;
> +       rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;
> +       rq.cparam = &advertise_cp;
> +       rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;
> +       rq.rparam = &status;
> +       rq.rlen = 1;
> +
> +       ret = hci_send_req(dd, &rq, 100);
> +
No empty line here.
> +       if (status || ret < 0) {
> +               errno = EIO;
No need to set errno. hci_send_req sets errno when needed.

Claudio

> +               fprintf(stderr, "Can't set advertise mode on hci%d: %s (%d)\n",
> +                                               hdev, strerror(errno), errno);
> +       }
> +
> +       hci_close_dev(dd);
> +}
> +
>  static void cmd_iac(int ctl, int hdev, char *opt)
>  {
>        int s = hci_open_dev(hdev);
> @@ -1728,6 +1772,8 @@ static struct {
>        { "revision",   cmd_revision,   0,              "Display revision information" },
>        { "block",      cmd_block,      "<bdaddr>",     "Add a device to the blacklist" },
>        { "unblock",    cmd_unblock,    "<bdaddr>",     "Remove a device from the blacklist" },
> +       { "leadv",      cmd_le_adv,     0,              "Enable LE advertising" },
> +       { "noleadv",    cmd_le_adv,     0,              "Disable LE advertising" },
>        { NULL, NULL, 0 }
>  };
>
> --
> 1.7.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>