⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hci.c

📁 blue tooth protocol stack source code
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -