Bluetooth: Controller: Unify handling of unknown command

Handle all instances of an unknown OCF in a common place
instead of it being spread in multiple functions.

Jira: ZEP-726

Change-Id: Ibd9ebe429754980b243cb8772702cfeb59b0a18b
Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2016-08-29 20:23:03 +02:00 committed by Johan Hedberg
commit 4ecc06c1e2

View file

@ -19,6 +19,7 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <toolchain.h> #include <toolchain.h>
#include <errno.h>
#include "defines.h" #include "defines.h"
#include "ticker.h" #include "ticker.h"
@ -30,6 +31,7 @@
#include "ctrl.h" #include "ctrl.h"
#include "ll.h" #include "ll.h"
#include <bluetooth/hci.h>
#include "hci.h" #include "hci.h"
#include "debug.h" #include "debug.h"
@ -748,7 +750,7 @@ static struct {
#define HCI_CC_LEN(s)((uint8_t)(offsetof(struct hci_evt_cmd_cmplt, params) + \ #define HCI_CC_LEN(s)((uint8_t)(offsetof(struct hci_evt_cmd_cmplt, params) + \
sizeof(struct s))) sizeof(struct s)))
static void link_control_cmd_handle(struct hci_cmd *cmd, uint8_t *len) static int link_control_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
{ {
uint32_t status; uint32_t status;
struct hci_evt *evt; struct hci_evt *evt;
@ -794,21 +796,15 @@ static void link_control_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
break; break;
default: default:
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE; return -EINVAL;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
break;
} }
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
return 0;
} }
static void ctrl_bb_cmd_handle(struct hci_cmd *cmd, uint8_t *len) static int ctrl_bb_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
{ {
struct hci_evt *evt; struct hci_evt *evt;
struct hci_evt_cmd_cmplt *cc; struct hci_evt_cmd_cmplt *cc;
@ -846,21 +842,15 @@ static void ctrl_bb_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
break; break;
default: default:
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE; return -EINVAL;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
break;
} }
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
return 0;
} }
static void info_cmd_handle(struct hci_cmd *cmd, uint8_t *len) static int info_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
{ {
struct hci_evt *evt; struct hci_evt *evt;
struct hci_evt_cmd_cmplt *cc; struct hci_evt_cmd_cmplt *cc;
@ -954,20 +944,15 @@ static void info_cmd_handle(struct hci_cmd *cmd, uint8_t *len)
break; break;
default: default:
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE; return -EINVAL;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
break;
} }
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
return 0;
} }
static void controller_cmd_handle(struct hci_cmd *cmd, uint8_t *len, static int controller_cmd_handle(struct hci_cmd *cmd, uint8_t *len,
uint8_t **out) uint8_t **out)
{ {
uint32_t status; uint32_t status;
@ -1410,20 +1395,15 @@ static void controller_cmd_handle(struct hci_cmd *cmd, uint8_t *len,
break; break;
default: default:
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE; return -EINVAL;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
break;
} }
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
return 0;
} }
static void vs_cmd_handle(struct hci_cmd *cmd, static int vs_cmd_handle(struct hci_cmd *cmd,
uint8_t *len, uint8_t **out) uint8_t *len, uint8_t **out)
{ {
struct hci_evt *evt; struct hci_evt *evt;
@ -1469,21 +1449,12 @@ static void vs_cmd_handle(struct hci_cmd *cmd,
break; break;
default: default:
hci_context.tx[0] = HCI_EVT; return -EINVAL;
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
*out = &hci_context.tx[0];
break;
} }
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
return 0;
} }
static void hci_cmd_handle(struct hci_cmd *cmd, uint8_t *len, uint8_t **out) static void hci_cmd_handle(struct hci_cmd *cmd, uint8_t *len, uint8_t **out)
@ -1491,6 +1462,7 @@ static void hci_cmd_handle(struct hci_cmd *cmd, uint8_t *len, uint8_t **out)
struct hci_evt *evt; struct hci_evt *evt;
struct hci_evt_cmd_cmplt *cc; struct hci_evt_cmd_cmplt *cc;
union hci_evt_cmd_cmplt_params *ccp; union hci_evt_cmd_cmplt_params *ccp;
int err;
*out = &hci_context.tx[0]; *out = &hci_context.tx[0];
hci_context.tx[0] = HCI_EVT; hci_context.tx[0] = HCI_EVT;
@ -1500,33 +1472,33 @@ static void hci_cmd_handle(struct hci_cmd *cmd, uint8_t *len, uint8_t **out)
switch (cmd->opcode.ogf) { switch (cmd->opcode.ogf) {
case HCI_OGF_LINK_CONTROL: case HCI_OGF_LINK_CONTROL:
link_control_cmd_handle(cmd, len); err = link_control_cmd_handle(cmd, len);
break; break;
case HCI_OGF_CONTROL_AND_BASEBAND: case HCI_OGF_CONTROL_AND_BASEBAND:
ctrl_bb_cmd_handle(cmd, len); err = ctrl_bb_cmd_handle(cmd, len);
break; break;
case HCI_OGF_INFORMATIONAL: case HCI_OGF_INFORMATIONAL:
info_cmd_handle(cmd, len); err = info_cmd_handle(cmd, len);
break; break;
case HCI_OGF_LE_CONTROLLER: case HCI_OGF_LE_CONTROLLER:
controller_cmd_handle(cmd, len, out); err = controller_cmd_handle(cmd, len, out);
break; break;
case HCI_OGF_VENDOR_SPECIFIC: case HCI_OGF_VENDOR_SPECIFIC:
vs_cmd_handle(cmd, len, out); err = vs_cmd_handle(cmd, len, out);
break; break;
default: default:
err = -EINVAL;
}
if (err == -EINVAL) {
evt->code = HCI_EVT_CODE_COMMAND_COMPLETE; evt->code = HCI_EVT_CODE_COMMAND_COMPLETE;
evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command); evt->len = HCI_CC_LEN(hci_evt_cmd_cmplt_unknown_hci_command);
cc->num_cmd_pkt = 1; cc->num_cmd_pkt = 1;
cc->opcode = cmd->opcode; cc->opcode = cmd->opcode;
ccp->unknown_hci_command.status = ccp->unknown_hci_command.status =
HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND; HCI_EVT_ERROR_CODE_UNKNOWN_HCI_COMMAND;
*len = HCI_EVT_LEN(evt); *len = HCI_EVT_LEN(evt);
break;
} }
} }