📄 hci.c
字号:
D_CMD(__FUNCTION__ ": COMMAND_STATUS\n"); if (buf[0]) { /* fixme -- add parser for command status e.g when trying to connect an acl link which already is connected, a command status with "ACL link already exist" is returned. This must be signalled using lp_connect_cfm (neg) */ D_ERR(__FUNCTION__ ": COMMAND_STATUS: %s\n", get_err_msg(buf[0]));#ifdef USE_INQTIMER if (hci_inq_pending) release_inq_timer();#endif } update_nhcp(buf[1]); wake_up_interruptible(&hci_wq); break; case FLUSH_OCCURRED: D_CMD(__FUNCTION__ ": FLUSH_OCCURRED on hci_hdl %d\n", hci_handle(buf)); btmem_flushhandle(hci_handle(buf)); break; case HARDWARE_ERROR: D_ERR(__FUNCTION__ ": A hardware error with error code 0x%02X occurred.\n", buf[0]); D_ERR(__FUNCTION__ ": Please refer to your Bluetooth module's manual.\n"); break; case ROLE_CHANGED: DSYS(__FUNCTION__ ": ROLE_CHANGED\n"); if (buf[0]) { D_ERR(__FUNCTION__ ": Role changed failed due to %s\n", get_err_msg(buf[0])); /* fixme -- Notify l2cap that this BD will go down */ } else if (buf[7]) { DSYS(__FUNCTION__ ": Current master is 0x%04x%08x\n", le16_to_cpuu(&buf[5]), le32_to_cpuu(&buf[1])); } else { DSYS(__FUNCTION__ ": Our role is master for BD Address 0x%04x%08x\n", le16_to_cpuu(&buf[5]), le32_to_cpuu(&buf[1])); } break; case NBR_OF_COMPLETED_PACKETS: D_CMD(__FUNCTION__ ": NUMBER_OF_COMPLETED_PACKETS\n"); update_ncp(buf[0], buf + 1); break; case MODE_CHANGE: D_CMD(__FUNCTION__ ": MODE_CHANGE on hci_hdl %d\n", hci_handle(&buf[1])); break; case RETURN_LINK_KEYS: D_CMD(__FUNCTION__ ": RETURN_LINK_KEYS event\n");#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER { u8 tmp_str[23]; for (i = 0; i < buf[0]; i++) { D_CMD("%d: ", i); tmp_str[0] = i; memcpy(tmp_str + 1, (buf + 1) + (i * 6), 6); memcpy(tmp_str + 7, (buf + 1) + (buf[0] * 6) + (i * 16), 16); sec_man_event(HCI, buf + 1, RETURN_LINK_KEYS, tmp_str, 17); } }#endif break; case PIN_CODE_REQUEST: D_CMD(__FUNCTION__ ": PIN_CODE_REQUEST forwarding event to security manager\n");#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER sec_man_event(HCI, buf, PIN_CODE_REQUEST, NULL, 0);#endif break; case LINK_KEY_REQUEST: D_CMD(__FUNCTION__ ": LINK_KEY_REQUEST\n");#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER sec_man_event(HCI, buf, LINK_KEY_REQUEST, NULL, 0);#endif break; case LINK_KEY_NOTIFICATION: D_CMD(__FUNCTION__ ": LINK_KEY_NOTIFICATION forwarding event to security manager\n");#ifdef CONFIG_BLUETOOTH_USE_SECURITY_MANAGER sec_man_event(HCI, buf, LINK_KEY_NOTIFICATION, buf + 6, 16);#endif break; case LOOPBACK_COMMAND: DSYS(__FUNCTION__ ": LOOPBACK_COMMAND, loopback mode not supported\n"); break; case DATA_BUFFER_OVERFLOW: D_ERR(__FUNCTION__ ": DATA_BUFFER_OVERFLOW\n"); break; case MAX_SLOTS_CHANGE: D_CMD(__FUNCTION__ ": MAX_SLOTS_CHANGE to %d\n", (u32) buf[2]); break; case READ_CLOCK_OFFSET_COMPLETE: D_CMD(__FUNCTION__ ": READ_CLOCK_OFFSET_COMPLETE\n"); break; case CONNECTION_PACKET_TYPE_CHANGED: D_CMD(__FUNCTION__ ": CHANGE_CONNECTION_PACKET_TYPE\n"); break; case QOS_VIOLATION: D_CMD(__FUNCTION__ ": QOS_VIOLATION\n"); break; case PAGE_SCAN_MODE_CHANGE: DSYS(__FUNCTION__ ": PAGE_SCAN_MODE_CHANGE Not implemented\n"); break; case PAGE_SCAN_REPETITION_MODE_CHANGE: DSYS(__FUNCTION__ ": PAGE_SCAN_REPETITION_MODE_CHANGE Not implemented\n"); break; case VENDOR_EVENT: process_vendor_event(buf, len, event_code); break; default: DSYS(__FUNCTION__ ": UNKNOWN EVENT CODE 0x%x\n", event_code); break; }}/* Parses the return parameters from the command complete event, see the bluetooth baseband specification part H:1, chapter 5.2.14 for a further description of the command complete event. */void process_return_param(u8 *buf){ u32 ogf,ocf; u8 *r_val; /* buf points at the start of the event parameters of the command complete event. The second and third byte (buf[1] and buf[2]) contains the op-code, which consists of the OGF and the OCF values, see the baseband specification part H:1, chapter 4.4.1 for a description of these. r_val is set to point at the beginning of the return parameters at the command complete event */ ogf = (u32) buf[2] >> 2; ocf = le16_to_cpuu(&buf[1]) & 0x03FF; r_val = buf + 3; switch (ogf) { case HCI_LC: switch (ocf) { case LINK_KEY_REQUEST_REPLY: release_cmd_timer(); D_CMD(__FUNCTION__ ": LINK_KEY_REQUEST_REPLY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": LINK_KEY_REQUEST_REPLY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": LINK_KEY_REQUEST_REPLY Success\n"); result_param = 0; } wake_up_interruptible(&hci_wq); break; case LINK_KEY_REQUEST_NEGATIVE_REPLY: release_cmd_timer(); D_CMD(__FUNCTION__ ": LINK_KEY_REQUEST_NEGATIVE_REPLY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": LINK_KEY_REQUEST_NEGATIVE_REPLY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": LINK_KEY_REQUEST_NEGATIVE_REPLY Success\n"); result_param = 0; } wake_up_interruptible(&hci_wq); break; case PIN_CODE_REQUEST_REPLY: release_cmd_timer(); D_CMD(__FUNCTION__ ": PIN_CODE_REQUEST_REPLY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": PIN_CODE_REQUEST_REPLY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": PIN_CODE_REQUEST_REPLY Success\n"); result_param = 0; } wake_up_interruptible(&hci_wq); break; case PIN_CODE_REQUEST_NEGATIVE_REPLY: release_cmd_timer(); D_CMD(__FUNCTION__ ": PIN_CODE_REQUEST_NEGATIVE_REPLY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": PIN_CODE_REQUEST_NEGATIVE_REPLY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": PIN_CODE_REQUEST_NEGATIVE_REPLY Success\n"); result_param = 0; } wake_up_interruptible(&hci_wq); break; default: D_CMD(__FUNCTION__ ": HCI_LC, ocf %d not recognised!\n", ocf); break; } break; case HCI_HC: /* Host Controller commands */ release_cmd_timer(); /* FIXME -- correct timer should be released */ switch (ocf) { case CREATE_NEW_UNIT_KEY: D_CMD(__FUNCTION__ ": CREATE_NEW_UNIT_KEY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": CREATE_NEW_UNIT_KEY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": CREATE_NEW_UNIT_KEY Success\n"); result_param = 0; } break; case READ_STORED_LINK_KEY: DSYS(__FUNCTION__ ": READ_STORED_LINK_KEY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_STORED_LINK_KEY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": READ_STORED_LINK_KEY Success\n"); result_param = le32_to_cpuu(&r_val[1]); } DSYS(__FUNCTION__ ": Max number of Linkkeys: %d\n", le16_to_cpuu(&r_val[1])); DSYS(__FUNCTION__ ": Number of Linkkeys read: %d\n", le16_to_cpuu(&r_val[3])); break; case WRITE_STORED_LINK_KEY: D_CMD(__FUNCTION__ ": WRITE_STORED_LINK_KEY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_STORED_LINK_KEY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": WRITE_STORED_LINK_KEY Success\n"); result_param = 0; } break; case DELETE_STORED_LINK_KEY: D_CMD(__FUNCTION__ ": DELETE_STORED_LINK_KEY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": DELETE_STORED_LINK_KEY %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { D_CMD(__FUNCTION__ ": DELETE_STORED_LINK_KEY Success\n"); result_param = le16_to_cpuu(&r_val[1]); } D_CMD(__FUNCTION__ ": Number of Linkkeys deleted: %d\n", le16_to_cpuu(&r_val[1])); break; case READ_TRANSMIT_POWER_LEVEL: printk(__FUNCTION__ ": READ_TRANSMIT_POWER_LEVEL\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_TRANSMIT_POWER_LEVEL: %s\n", get_err_msg(r_val[0])); break; } else { DSYS("READ_TRANSMIT_POWER_LEVEL: handle %d, %d dBm\n", hci_handle(&r_val[1]), r_val[3]); } break; case SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL: D_CMD(__FUNCTION__ ": SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL: %s\n", get_err_msg(r_val[0])); break; } break; case HOST_BUFFER_SIZE: D_CMD(__FUNCTION__ ": HOST_BUFFER_SIZE\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": HOST_BUFFER_SIZE: %s\n", get_err_msg(r_val[0])); } break; case CHANGE_LOCAL_NAME: D_CMD(__FUNCTION__ ": CHANGE_LOCAL_NAME\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": CHANGE_LOCAL_NAME: %s\n", get_err_msg(r_val[0])); } break; case READ_SCAN_ENABLE: D_CMD(__FUNCTION__ ": READ_SCAN_ENABLE\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_SCAN_ENABLE: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { result_param = r_val[1]; } printk("READ_SCAN_ENABLE %d\n", result_param); break; case WRITE_SCAN_ENABLE: D_CMD(__FUNCTION__ ": WRITE_SCAN_ENABLE\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_SCAN_ENABLE: %s\n", get_err_msg(r_val[0])); } break; case WRITE_PAGESCAN_ACTIVITY: D_CMD(__FUNCTION__ ": WRITE_PAGESCAN_ACTIVITY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_PAGESCAN_ACTIVITY: %s\n", get_err_msg(r_val[0])); } break; case WRITE_INQUIRYSCAN_ACTIVITY: D_CMD(__FUNCTION__ ": WRITE_INQUIRYSCAN_ACTIVITY\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_INQUIRYSCAN_ACTIVITY: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } break; case READ_AUTHENTICATION_ENABLE: D_CMD(__FUNCTION__ ": READ_AUTHENTICATION_ENABLE\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_AUTHENTICATION_ENABLE: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { result_param = r_val[1]; } break; case WRITE_AUTHENTICATION_ENABLE: D_CMD(__FUNCTION__ ": WRITE_AUTHENTICATION_ENABLE\n"); if(r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_AUTHENTICATION_ENABLE: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } break; case READ_ENCRYPTION_MODE: D_CMD(__FUNCTION__ ": READ_ENCRYPTION_MODE\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_ENCRYPTION_MODE: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { result_param = r_val[1]; } break; case WRITE_ENCRYPTION_MODE: D_CMD(__FUNCTION__ ": WRITE_AUTHENTICATION_ENABLE\n"); if(r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_AUTHENTICATION_ENABLE: %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } break; case WRITE_CLASS_OF_DEVICE: D_CMD(__FUNCTION__ ": WRITE_CLASS_OF_DEVICE\n"); if(r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_CLASS_OF_DEVICE: %s\n", get_err_msg(r_val[0])); } break; case WRITE_AUTOMATIC_FLUSH_TIMEOUT: D_CMD(__FUNCTION__ ": WRITE_AUTOMATIC_FLUSH_TIMEOUT\n"); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_AUTOMATIC_FLUSH_TIMEOUT: %s\n", get_err_msg(r_val[0])); } else { D_CMD(__FUNCTION__ ": WRITE_AUTOMATIC_FLUSH_TIMEOUT Success\n"); } break; case READ_LINK_SUPERVISION_TIMEOUT: D_CMD(__FUNCTION__ ": Link supervision timeout is: %d\n", le16_to_cpuu(&buf[3])); break; case WRITE_LINK_SUPERVISION_TIMEOUT: D_CMD(__FUNCTION__ ": WRITE_LINK_SUPERVISION_TO (%d)\n", r_val[0]); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_LINK_SUPERVISION_TO: %s\n", get_err_msg(r_val[0])); } break; case RESET: D_CMD(__FUNCTION__ ": RESET\n"); break; case SET_EVENT_FILTER: D_CMD(__FUNCTION__ ": SET_EVENT_FILTER\n"); break; default: D_CMD(__FUNCTION__ ": HCI_HC, ocf %d not recognised!\n", ocf); break; } /* FIX ME : Wake up from the correct queue */ wake_up_interruptible(&hci_wq); break; case HCI_LP: /* Link policy commands */ switch (ocf) { case ROLE_DISCOVERY: D_CMD(__FUNCTION__ ": ROLE_DISCOVERY: "); if (r_val[0]) { D_ERR(__FUNCTION__ ": ROLE_DISCOVERY: %s\n", get_err_msg(r_val[0])); break; } if (r_val[3]) printk("Connected as Slave.\n"); else printk("Connected as Master. \n"); break; case WRITE_LINK_POLICY_SETTINGS: D_CMD(__FUNCTION__ ": WRITE_LINK_POLICY_SETTINGS \n "); if (r_val[0]) { D_ERR(__FUNCTION__ ": WRITE_LINK_POLICY_SETTINGS: %s\n", get_err_msg(r_val[0])); break; } break; default: D_CMD(__FUNCTION__ ": HCI_LP, ocf %d not recognised!\n", ocf); break; } break; case HCI_IP: /* Informational parameters */ release_cmd_timer(); switch (ocf) { case READ_COUNTRY_CODE: if (r_val[0]) { D_ERR(__FUNCTION__ ": READ_COUNTRY_CODE : %s\n", get_err_msg(r_val[0])); result_param = -r_val[0]; } else { result_param = r_val[1]; D_CMD(__FUNCTION__ ": READ_COUNTRY_CODE : %d\n", result_param); } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -