static void hci_host_control(uint16_t ocf, int plen, uint8_t *data) { read_local_name_rp ln; read_class_of_dev_rp cd; read_inquiry_mode_rp im; read_ext_inquiry_response_rp ir; uint8_t status; const uint16_t ogf = OGF_HOST_CTL; switch (ocf) { case OCF_RESET: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_SET_EVENT_FLT: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_CHANGE_LOCAL_NAME: status = 0x00; memcpy(vdev.name, data, sizeof(vdev.name)); command_complete(ogf, ocf, 1, &status); break; case OCF_READ_LOCAL_NAME: ln.status = 0x00; memcpy(ln.name, vdev.name, sizeof(ln.name)); command_complete(ogf, ocf, sizeof(ln), &ln); break; case OCF_WRITE_CONN_ACCEPT_TIMEOUT: case OCF_WRITE_PAGE_TIMEOUT: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_WRITE_SCAN_ENABLE: status = scan_enable(data); command_complete(ogf, ocf, 1, &status); break; case OCF_WRITE_AUTH_ENABLE: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_WRITE_ENCRYPT_MODE: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_CLASS_OF_DEV: cd.status = 0x00; memcpy(cd.dev_class, vdev.dev_class, 3); command_complete(ogf, ocf, sizeof(cd), &cd); break; case OCF_WRITE_CLASS_OF_DEV: status = 0x00; memcpy(vdev.dev_class, data, 3); command_complete(ogf, ocf, 1, &status); break; case OCF_READ_INQUIRY_MODE: im.status = 0x00; im.mode = vdev.inq_mode; command_complete(ogf, ocf, sizeof(im), &im); break; case OCF_WRITE_INQUIRY_MODE: status = 0x00; vdev.inq_mode = data[0]; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_EXT_INQUIRY_RESPONSE: ir.status = 0x00; ir.fec = vdev.eir_fec; memcpy(ir.data, vdev.eir_data, HCI_MAX_EIR_LENGTH); command_complete(ogf, ocf, sizeof(ir), &ir); break; case OCF_WRITE_EXT_INQUIRY_RESPONSE: status = 0x00; vdev.eir_fec = data[0]; memcpy(vdev.eir_data, data + 1, HCI_MAX_EIR_LENGTH); command_complete(ogf, ocf, 1, &status); break; default: status = 0x01; command_complete(ogf, ocf, 1, &status); break; } }
static void hci_host_control(uint16_t ocf, int plen, uint8_t *data) { read_scan_enable_rp se; read_local_name_rp ln; read_class_of_dev_rp cd; read_inquiry_mode_rp im; read_ext_inquiry_response_rp ir; read_simple_pairing_mode_rp pm; read_le_host_supported_rp hs; uint8_t status; const uint16_t ogf = OGF_HOST_CTL; switch (ocf) { case OCF_RESET: status = 0x00; reset_vdev(); command_complete(ogf, ocf, 1, &status); break; case OCF_SET_EVENT_FLT: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_CHANGE_LOCAL_NAME: status = 0x00; memcpy(vdev.name, data, sizeof(vdev.name)); command_complete(ogf, ocf, 1, &status); break; case OCF_READ_LOCAL_NAME: ln.status = 0x00; memcpy(ln.name, vdev.name, sizeof(ln.name)); command_complete(ogf, ocf, sizeof(ln), &ln); break; case OCF_WRITE_CONN_ACCEPT_TIMEOUT: case OCF_WRITE_PAGE_TIMEOUT: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_SCAN_ENABLE: se.status = 0x00; se.enable = vdev.scan_enable; command_complete(ogf, ocf, sizeof(se), &se); break; case OCF_WRITE_SCAN_ENABLE: status = 0x00; vdev.scan_enable = scan_enable(data); command_complete(ogf, ocf, 1, &status); break; case OCF_WRITE_AUTH_ENABLE: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_WRITE_ENCRYPT_MODE: status = 0x00; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_CLASS_OF_DEV: cd.status = 0x00; memcpy(cd.dev_class, vdev.dev_class, 3); command_complete(ogf, ocf, sizeof(cd), &cd); break; case OCF_WRITE_CLASS_OF_DEV: status = 0x00; memcpy(vdev.dev_class, data, 3); command_complete(ogf, ocf, 1, &status); break; case OCF_READ_INQUIRY_MODE: im.status = 0x00; im.mode = vdev.inq_mode; command_complete(ogf, ocf, sizeof(im), &im); break; case OCF_WRITE_INQUIRY_MODE: status = 0x00; vdev.inq_mode = data[0]; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_EXT_INQUIRY_RESPONSE: ir.status = 0x00; ir.fec = vdev.eir_fec; memcpy(ir.data, vdev.eir_data, HCI_MAX_EIR_LENGTH); command_complete(ogf, ocf, sizeof(ir), &ir); break; case OCF_WRITE_EXT_INQUIRY_RESPONSE: status = 0x00; vdev.eir_fec = data[0]; memcpy(vdev.eir_data, data + 1, HCI_MAX_EIR_LENGTH); command_complete(ogf, ocf, 1, &status); break; case OCF_READ_SIMPLE_PAIRING_MODE: pm.status = 0x00; pm.mode = vdev.ssp_mode; command_complete(ogf, ocf, sizeof(pm), &pm); break; case OCF_WRITE_SIMPLE_PAIRING_MODE: status = 0x00; vdev.ssp_mode = data[0]; command_complete(ogf, ocf, 1, &status); break; case OCF_READ_LE_HOST_SUPPORTED: hs.status = 0x00; hs.le = vdev.le_mode; hs.simul = vdev.le_simul; command_complete(ogf, ocf, sizeof(hs), &hs); break; case OCF_WRITE_LE_HOST_SUPPORTED: status = 0x00; vdev.le_mode = data[0]; vdev.le_simul = data[1]; command_complete(ogf, ocf, 1, &status); break; default: command_status(ogf, ocf, 0x01); break; } }