summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/hcid.h14
-rw-r--r--hcid/kword.c1
-rw-r--r--hcid/main.c34
-rw-r--r--hcid/parser.y13
4 files changed, 48 insertions, 14 deletions
diff --git a/hcid/hcid.h b/hcid/hcid.h
index 5523d4b7..e275939f 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -40,14 +40,26 @@
#define HCID_KEY_FILE CONFIGDIR "/link_key"
#define HCID_PIN_HELPER "/usr/bin/bluepin"
+enum {
+ HCID_SET_NAME,
+ HCID_SET_CLASS,
+ HCID_SET_VOICE,
+ HCID_SET_INQMODE,
+ HCID_SET_PTYPE,
+ HCID_SET_LM,
+ HCID_SET_LP,
+};
+
struct device_opts {
+ unsigned long flags;
char *name;
uint32_t class;
+ uint16_t voice;
uint8_t inqmode;
uint16_t pkt_type;
- uint16_t scan;
uint16_t link_mode;
uint16_t link_policy;
+ uint16_t scan;
uint16_t auth;
uint16_t encrypt;
};
diff --git a/hcid/kword.c b/hcid/kword.c
index bd2294b2..51c92e1d 100644
--- a/hcid/kword.c
+++ b/hcid/kword.c
@@ -59,6 +59,7 @@ struct kword cfg_keyword[] = {
{ "pscan", K_PSCAN },
{ "name", K_NAME },
{ "class", K_CLASS },
+ { "voice", K_VOICE },
{ "inqmode", K_INQMODE },
{ "auth", K_AUTH },
{ "encrypt", K_ENCRYPT },
diff --git a/hcid/main.c b/hcid/main.c
index 45b8231d..f4736940 100644
--- a/hcid/main.c
+++ b/hcid/main.c
@@ -222,8 +222,18 @@ static void configure_device(int hdev)
hdev, strerror(errno), errno);
}
+ /* Set device name */
+ if ((device_opts->flags & (1 << HCID_SET_NAME)) && device_opts->name) {
+ change_local_name_cp cp;
+ memset(cp.name, 0, sizeof(cp.name));
+ expand_name(cp.name, sizeof(cp.name), device_opts->name, hdev);
+
+ hci_send_cmd(s, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
+ CHANGE_LOCAL_NAME_CP_SIZE, (void *) &cp);
+ }
+
/* Set device class */
- if (device_opts->class) {
+ if ((device_opts->flags & (1 << HCID_SET_CLASS))) {
uint32_t class = htobl(device_opts->class);
write_class_of_dev_cp cp;
@@ -232,18 +242,18 @@ static void configure_device(int hdev)
WRITE_CLASS_OF_DEV_CP_SIZE, (void *) &cp);
}
- /* Set device name */
- if (device_opts->name) {
- change_local_name_cp cp;
- memset(cp.name, 0, sizeof(cp.name));
- expand_name(cp.name, sizeof(cp.name), device_opts->name, hdev);
+ /* Set voice setting */
+ if ((device_opts->flags & (1 << HCID_SET_VOICE))) {
+ write_voice_setting_cp cp;
- hci_send_cmd(s, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
- CHANGE_LOCAL_NAME_CP_SIZE, (void *) &cp);
+ cp.voice_setting = htobl(device_opts->voice);
+ hci_send_cmd(s, OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING,
+ WRITE_VOICE_SETTING_CP_SIZE, (void *) &cp);
}
/* Set inquiry mode */
- if (di.features[3] & LMP_RSSI_INQ) {
+ if ((device_opts->flags & (1 << HCID_SET_INQMODE)) &&
+ (di.features[3] & LMP_RSSI_INQ)) {
write_inquiry_mode_cp cp;
cp.mode = device_opts->inqmode;
@@ -298,7 +308,7 @@ static void init_device(int hdev)
device_opts = get_device_opts(s, hdev);
/* Set packet type */
- if (device_opts->pkt_type) {
+ if ((device_opts->flags & (1 << HCID_SET_PTYPE))) {
dr.dev_opt = device_opts->pkt_type;
if (ioctl(s, HCISETPTYPE, (unsigned long) &dr) < 0) {
syslog(LOG_ERR, "Can't set packet type on hci%d: %s (%d)",
@@ -307,7 +317,7 @@ static void init_device(int hdev)
}
/* Set link mode */
- if (device_opts->link_mode) {
+ if ((device_opts->flags & (1 << HCID_SET_LM))) {
dr.dev_opt = device_opts->link_mode;
if (ioctl(s, HCISETLINKMODE, (unsigned long) &dr) < 0) {
syslog(LOG_ERR, "Can't set link mode on hci%d: %s (%d)",
@@ -316,7 +326,7 @@ static void init_device(int hdev)
}
/* Set link policy */
- if (device_opts->link_policy) {
+ if ((device_opts->flags & (1 << HCID_SET_LP))) {
dr.dev_opt = device_opts->link_policy;
if (ioctl(s, HCISETLINKPOL, (unsigned long) &dr) < 0) {
syslog(LOG_ERR, "Can't set link policy on hci%d: %s (%d)",
diff --git a/hcid/parser.y b/hcid/parser.y
index 3534fb2b..a0eb13de 100644
--- a/hcid/parser.y
+++ b/hcid/parser.y
@@ -64,7 +64,7 @@ int yyerror(char *s);
%token K_OPTIONS K_DEVICE
%token K_AUTOINIT K_SECURITY K_PAIRING
-%token K_PTYPE K_NAME K_CLASS K_INQMODE K_LM K_LP K_AUTH K_ENCRYPT K_ISCAN K_PSCAN
+%token K_PTYPE K_NAME K_CLASS K_VOICE K_INQMODE K_LM K_LP K_AUTH K_ENCRYPT K_ISCAN K_PSCAN
%token K_PINHELP K_DBUSPINHELP
%token K_YES K_NO
@@ -169,28 +169,39 @@ device_options: '{' device_opts '}';
device_opts: | device_opt ';' | error ';' | device_opts device_opt ';';
device_opt:
K_PTYPE pkt_type {
+ parser_device->flags |= (1 << HCID_SET_PTYPE);
parser_device->pkt_type = $2;
}
| K_LM link_mode {
+ parser_device->flags |= (1 << HCID_SET_LM);
parser_device->link_mode = $2;
}
| K_LP link_policy {
+ parser_device->flags |= (1 << HCID_SET_LP);
parser_device->link_policy = $2;
}
| K_NAME dev_name {
if (parser_device->name)
free(parser_device->name);
+ parser_device->flags |= (1 << HCID_SET_NAME);
parser_device->name = strdup($2);
}
| K_CLASS NUM {
+ parser_device->flags |= (1 << HCID_SET_CLASS);
parser_device->class = $2;
}
+ | K_VOICE NUM {
+ parser_device->flags |= (1 << HCID_SET_VOICE);
+ parser_device->voice = $2;
+ }
+
| K_INQMODE NUM {
+ parser_device->flags |= (1 << HCID_SET_INQMODE);
parser_device->inqmode = $2;
}