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

📄 hci.c

📁 Bluezan implementation of the Bluetooth&#8482 wireless standards specifications for Linux. The code
💻 C
📖 第 1 页 / 共 4 页
字号:
	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	}}static inline void encrypt_change_dump(int level, struct frame *frm){	evt_encrypt_change *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",		evt->status, btohs(evt->handle), evt->encrypt);	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	}}static inline void read_remote_features_complete_dump(int level, struct frame *frm){	evt_read_remote_features_complete *evt = frm->ptr;	int i;	p_indent(level, frm);	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Features:");		for (i = 0; i < 8; i++)			printf(" 0x%2.2x", evt->features[i]);		printf("\n");	}}static inline void read_remote_version_complete_dump(int level, struct frame *frm){	evt_read_remote_version_complete *evt = frm->ptr;	uint16_t manufacturer = btohs(evt->manufacturer);	p_indent(level, frm);	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,			btohs(evt->lmp_subver));		p_indent(level, frm);		printf("Manufacturer: %s (%d)\n",			bt_compidtostr(manufacturer), manufacturer);	}}static inline void qos_setup_complete_dump(int level, struct frame *frm){	evt_qos_setup_complete *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d flags %d\n",		evt->status, btohs(evt->handle), evt->flags);	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Service type: %d\n", evt->qos.service_type);		p_indent(level, frm);		printf("Token rate: %d\n", btohl(evt->qos.token_rate));		p_indent(level, frm);		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));		p_indent(level, frm);		printf("Latency: %d\n", btohl(evt->qos.latency));		p_indent(level, frm);		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));	}}static inline void role_change_dump(int level, struct frame *frm){	evt_role_change *evt = frm->ptr;	char addr[18];	p_indent(level, frm);	ba2str(&evt->bdaddr, addr);	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",		evt->status, addr, evt->role);	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Role: %s\n", role2str(evt->role));	}}static inline void num_comp_pkts_dump(int level, struct frame *frm){	uint8_t num = get_u8(frm);	int i;	p_indent(level, frm);	printf("handle%s", num > 1 ? "s" : "");	for (i = 0; i < num; i++) {		uint16_t handle = btohs(htons(get_u16(frm)));		printf(" %d", handle);	}	printf("\n");}static inline void mode_change_dump(int level, struct frame *frm){	evt_mode_change *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Mode: %s\n", mode2str(evt->mode));	}}static inline void pin_code_req_dump(int level, struct frame *frm){	evt_pin_code_req *evt = frm->ptr;	char addr[18];	p_indent(level, frm);	ba2str(&evt->bdaddr, addr);	printf("bdaddr %s\n", addr);}static inline void link_key_notify_dump(int level, struct frame *frm){	evt_link_key_notify *evt = frm->ptr;	char addr[18];	int i;	p_indent(level, frm);	ba2str(&evt->bdaddr, addr);	printf("bdaddr %s key ", addr);	for (i = 0; i < 16; i++)		printf("%2.2X", evt->link_key[i]);	printf(" type %d\n", evt->key_type);}static inline void max_slots_change_dump(int level, struct frame *frm){	evt_max_slots_change *evt = frm->ptr;	p_indent(level, frm);	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);}static inline void data_buffer_overflow_dump(int level, struct frame *frm){	evt_data_buffer_overflow *evt = frm->ptr;	p_indent(level, frm);	printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");}static inline void read_clock_offset_complete_dump(int level, struct frame *frm){	evt_read_clock_offset_complete *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",		evt->status, btohs(evt->handle), btohs(evt->clock_offset));	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	}}static inline void conn_ptype_changed_dump(int level, struct frame *frm){	evt_conn_ptype_changed *evt = frm->ptr;	uint16_t ptype = btohs(evt->ptype);	char *str;	p_indent(level, frm);	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",		evt->status, btohs(evt->handle), ptype);	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		str = hci_ptypetostr(ptype);		if (str) {			p_indent(level, frm);			printf("Packet type: %s\n", str);			free(str);		}	}}static inline void pscan_rep_mode_change_dump(int level, struct frame *frm){	evt_pscan_rep_mode_change *evt = frm->ptr;	char addr[18];	p_indent(level, frm);	ba2str(&evt->bdaddr, addr);	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);}static inline void flow_spec_complete_dump(int level, struct frame *frm){	evt_flow_spec_complete *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d flags %d %s\n",		evt->status, btohs(evt->handle), evt->flags,		evt->direction == 0 ? "outgoing" : "incoming");	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Service type: %d\n", evt->qos.service_type);		p_indent(level, frm);		printf("Token rate: %d\n", btohl(evt->qos.token_rate));		p_indent(level, frm);		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));		p_indent(level, frm);		printf("Latency: %d\n", btohl(evt->qos.latency));		p_indent(level, frm);		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));	}}static inline void inq_result_with_rssi_dump(int level, struct frame *frm){	uint8_t num = get_u8(frm);	char addr[18];	int i;	if (!num)		return;	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {		for (i = 0; i < num; i++) {			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;			p_indent(level, frm);			ba2str(&info->bdaddr, addr);			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",				addr, info->pscan_rep_mode, btohs(info->clock_offset),				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;		}	} else {		for (i = 0; i < num; i++) {			inquiry_info_with_rssi *info = frm->ptr;			p_indent(level, frm);			ba2str(&info->bdaddr, addr);			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",				addr, info->pscan_rep_mode, btohs(info->clock_offset),				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;		}	}}static inline void read_remote_ext_features_complete_dump(int level, struct frame *frm){	evt_read_remote_ext_features_complete *evt = frm->ptr;	int i;	p_indent(level, frm);	printf("status 0x%2.2x handle %d page %d max %d\n",		evt->status, btohs(evt->handle),		evt->page_num, evt->max_page_num);	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Features:");		for (i = 0; i < 8; i++)			printf(" 0x%2.2x", evt->features[i]);		printf("\n");	}}static inline void sync_conn_complete_dump(int level, struct frame *frm){	evt_sync_conn_complete *evt = frm->ptr;	char addr[18];	ba2str(&evt->bdaddr, addr);	p_indent(level, frm);	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",		evt->status, btohs(evt->handle), addr,		evt->link_type == 0 ? "SCO" : "eSCO");	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	} else {		p_indent(level, frm);		printf("Air mode: %s\n", airmode2str(evt->air_mode));	}}static inline void sync_conn_changed_dump(int level, struct frame *frm){	evt_sync_conn_changed *evt = frm->ptr;	p_indent(level, frm);	printf("status 0x%2.2x handle %d\n",		evt->status, btohs(evt->handle));	if (evt->status > 0) {		p_indent(level, frm);		printf("Error: %s\n", status2str(evt->status));	}}static inline void event_dump(int level, struct frame *frm){	hci_event_hdr *hdr = frm->ptr;	uint8_t event = hdr->evt;	if (p_filter(FILT_HCI))		return;	p_indent(level, frm);	if (event <= EVENT_NUM) {		printf("HCI Event: %s (0x%2.2x) plen %d\n",			event_str[hdr->evt], hdr->evt, hdr->plen);	} else if (hdr->evt == EVT_TESTING) {		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);	} else if (hdr->evt == EVT_VENDOR) {		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);		if (get_manufacturer() == 10) {			frm->ptr += HCI_EVENT_HDR_SIZE;			frm->len -= HCI_EVENT_HDR_SIZE;			csr_dump(level + 1, frm);			return;		}	} else		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);	frm->ptr += HCI_EVENT_HDR_SIZE;	frm->len -= HCI_EVENT_HDR_SIZE;	if (event == EVT_CMD_COMPLETE) {		evt_cmd_complete *cc = frm->ptr;		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;			manufacturer = rp->manufacturer;		}	}	if (event == EVT_DISCONN_COMPLETE) {		evt_disconn_complete *evt = frm->ptr;		l2cap_clear(btohs(evt->handle));	}	if (!(parser.flags & DUMP_VERBOSE)) {		raw_dump(level, frm);		return;	}	switch (event) {	case EVT_LOOPBACK_COMMAND:		command_dump(level + 1, frm);		break;	case EVT_CMD_COMPLETE:		cmd_complete_dump(level + 1, frm);		break;	case EVT_CMD_STATUS:		cmd_status_dump(level + 1, frm);		break;	case EVT_HARDWARE_ERROR:		hardware_error_dump(level + 1, frm);		break;	case EVT_FLUSH_OCCURRED:	case EVT_QOS_VIOLATION:		handle_response_dump(level + 1, frm);		break;	case EVT_INQUIRY_COMPLETE:		status_response_dump(level + 1, frm);		break;	case EVT_INQUIRY_RESULT:		inq_result_dump(level + 1, frm);		break;	case EVT_CONN_COMPLETE:		conn_complete_dump(level + 1, frm);		break;	case EVT_CONN_REQUEST:		conn_request_dump(level + 1, frm);		break;	case EVT_DISCONN_COMPLETE:		disconn_complete_dump(level + 1, frm);		break;	case EVT_AUTH_COMPLETE:	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:		generic_response_dump(level + 1, frm);		break;	case EVT_MASTER_LINK_KEY_COMPLETE:		master_link_key_complete_dump(level + 1, frm);		break;	case EVT_REMOTE_NAME_REQ_COMPLETE:		remote_name_req_complete_dump(level + 1, frm);		break;	case EVT_ENCRYPT_CHANGE:		encrypt_change_dump(level + 1, frm);		break;	case EVT_READ_REMOTE_FEATURES_COMPLETE:		read_remote_features_complete_dump(level + 1, frm);		break;	case EVT_READ_REMOTE_VERSION_COMPLETE:		read_remote_version_complete_dump(level + 1, frm);		break;	case EVT_QOS_SETUP_COMPLETE:		qos_setup_complete_dump(level + 1, frm);		break;	case EVT_ROLE_CHANGE:		role_change_dump(level + 1, frm);		break;	case EVT_NUM_COMP_PKTS:		num_comp_pkts_dump(level + 1, frm);		break;	case EVT_MODE_CHANGE:		mode_change_dump(level + 1, frm);		break;	case EVT_RETURN_LINK_KEYS:		return_link_keys_dump(level + 1, frm);		break;	case EVT_PIN_CODE_REQ:	case EVT_LINK_KEY_REQ:		pin_code_req_dump(level + 1, frm);		break;	case EVT_LINK_KEY_NOTIFY:		link_key_notify_dump(level + 1, frm);		break;	case EVT_DATA_BUFFER_OVERFLOW:		data_buffer_overflow_dump(level + 1, frm);		break;	case EVT_MAX_SLOTS_CHANGE:		max_slots_change_dump(level + 1, frm);		break;	case EVT_READ_CLOCK_OFFSET_COMPLETE:		read_clock_offset_complete_dump(level + 1, frm);		break;	case EVT_CONN_PTYPE_CHANGED:		conn_ptype_changed_dump(level + 1, frm);		break;	case EVT_PSCAN_REP_MODE_CHANGE:		pscan_rep_mode_change_dump(level + 1, frm);		break;	case EVT_FLOW_SPEC_COMPLETE:		flow_spec_complete_dump(level + 1, frm);		break;	case EVT_INQUIRY_RESULT_WITH_RSSI:		inq_result_with_rssi_dump(level + 1, frm);		break;	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:		read_remote_ext_features_complete_dump(level + 1, frm);		break;	case EVT_SYNC_CONN_COMPLETE:		sync_conn_complete_dump(level + 1, frm);		break;	case EVT_SYNC_CONN_CHANGED:		sync_conn_changed_dump(level + 1, frm);		break;	default:		raw_dump(level, frm);		break;	}}static inline void acl_dump(int level, struct frame *frm){	hci_acl_hdr *hdr = (void *) frm->ptr;	uint16_t handle = btohs(hdr->handle);	uint16_t dlen = btohs(hdr->dlen);	uint8_t flags = acl_flags(handle);	if (!p_filter(FILT_HCI)) {		p_indent(level, frm);		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",			acl_handle(handle), flags, dlen);		level++;	}	frm->ptr += HCI_ACL_HDR_SIZE;	frm->len -= HCI_ACL_HDR_SIZE;	frm->flags  = flags;	frm->handle = acl_handle(handle);	if (parser.filter & ~FILT_HCI)		l2cap_dump(level, frm);	else		raw_dump(level, frm);}static inline void sco_dump(int level, struct frame *frm){	hci_sco_hdr *hdr = (void *) frm->ptr;	uint16_t handle = btohs(hdr->handle);	if (!p_filter(FILT_SCO)) {		p_indent(level, frm);		printf("SCO data: handle %d dlen %d\n",			acl_handle(handle), hdr->dlen);		level++;		frm->ptr += HCI_SCO_HDR_SIZE;		frm->len -= HCI_SCO_HDR_SIZE;		raw_dump(level, frm);	}}static inline void vendor_dump(int level, struct frame *frm){	if (p_filter(FILT_HCI))		return;	if (get_manufacturer() == 12) {		bpa_dump(level, frm);		return;	}	p_indent(level, frm);	printf("Vendor data: len %d\n", frm->len);	raw_dump(level, frm);}void hci_dump(int level, struct frame *frm){	uint8_t type = *(uint8_t *)frm->ptr;	frm->ptr++; frm->len--;	switch (type) {	case HCI_COMMAND_PKT:		command_dump(level, frm);		break;	case HCI_EVENT_PKT:		event_dump(level, frm);		break;	case HCI_ACLDATA_PKT:		acl_dump(level, frm);		break;	case HCI_SCODATA_PKT:		sco_dump(level, frm);		break;	case HCI_VENDOR_PKT:		vendor_dump(level, frm);		break;	default:		if (p_filter(FILT_HCI))			break;		p_indent(level, frm);		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);		raw_dump(level, frm);		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -