/* packet-btbrlmp.c * Routines for Bluetooth LMP dissection * Copyright 2009, Michael Ossmann * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include #include /* LMP opcodes */ #define LMP_VSC 0 #define LMP_NAME_REQ 1 #define LMP_NAME_RES 2 #define LMP_ACCEPTED 3 #define LMP_NOT_ACCEPTED 4 #define LMP_CLKOFFSET_REQ 5 #define LMP_CLKOFFSET_RES 6 #define LMP_DETACH 7 #define LMP_IN_RAND 8 #define LMP_COMB_KEY 9 #define LMP_UNIT_KEY 10 #define LMP_AU_RAND 11 #define LMP_SRES 12 #define LMP_TEMP_RAND 13 #define LMP_TEMP_KEY 14 #define LMP_ENCRYPTION_MODE_REQ 15 #define LMP_ENCRYPTION_KEY_SIZE_REQ 16 #define LMP_START_ENCRYPTION_REQ 17 #define LMP_STOP_ENCRYPTION_REQ 18 #define LMP_SWITCH_REQ 19 #define LMP_HOLD 20 #define LMP_HOLD_REQ 21 #define LMP_SNIFF_REQ 23 #define LMP_UNSNIFF_REQ 24 #define LMP_PARK_REQ 25 #define LMP_SET_BROADCAST_SCAN_WINDOW 27 #define LMP_MODIFY_BEACON 28 #define LMP_UNPARK_BD_ADDR_REQ 29 #define LMP_UNPARK_PM_ADDR_REQ 30 #define LMP_INCR_POWER_REQ 31 #define LMP_DECR_POWER_REQ 32 #define LMP_MAX_POWER 33 #define LMP_MIN_POWER 34 #define LMP_AUTO_RATE 35 #define LMP_PREFERRED_RATE 36 #define LMP_VERSION_REQ 37 #define LMP_VERSION_RES 38 #define LMP_FEATURES_REQ 39 #define LMP_FEATURES_RES 40 #define LMP_QUALITY_OF_SERVICE 41 #define LMP_QUALITY_OF_SERVICE_REQ 42 #define LMP_SCO_LINK_REQ 43 #define LMP_REMOVE_SCO_LINK_REQ 44 #define LMP_MAX_SLOT 45 #define LMP_MAX_SLOT_REQ 46 #define LMP_TIMING_ACCURACY_REQ 47 #define LMP_TIMING_ACCURACY_RES 48 #define LMP_SETUP_COMPLETE 49 #define LMP_USE_SEMI_PERMANENT_KEY 50 #define LMP_HOST_CONNECTION_REQ 51 #define LMP_SLOT_OFFSET 52 #define LMP_PAGE_MODE_REQ 53 #define LMP_PAGE_SCAN_MODE_REQ 54 #define LMP_SUPERVISION_TIMEOUT 55 #define LMP_TEST_ACTIVATE 56 #define LMP_TEST_CONTROL 57 #define LMP_ENCRYPTION_KEY_SIZE_MASK_REQ 58 #define LMP_ENCRYPTION_KEY_SIZE_MASK_RES 59 #define LMP_SET_AFH 60 #define LMP_ENCAPSULATED_HEADER 61 #define LMP_ENCAPSULATED_PAYLOAD 62 #define LMP_SIMPLE_PAIRING_CONFIRM 63 #define LMP_SIMPLE_PAIRING_NUMBER 64 #define LMP_DHKEY_CHECK 65 #define LMP_ESCAPE_1 124 #define LMP_ESCAPE_2 125 #define LMP_ESCAPE_3 126 #define LMP_ESCAPE_4 127 /* LMP extended opcodes */ #define LMP_ACCEPTED_EXT 1 #define LMP_NOT_ACCEPTED_EXT 2 #define LMP_FEATURES_REQ_EXT 3 #define LMP_FEATURES_RES_EXT 4 #define LMP_PACKET_TYPE_TABLE_REQ 11 #define LMP_ESCO_LINK_REQ 12 #define LMP_REMOVE_ESCO_LINK_REQ 13 #define LMP_CHANNEL_CLASSIFICATION_REQ 16 #define LMP_CHANNEL_CLASSIFICATION 17 #define LMP_SNIFF_SUBRATING_REQ 21 #define LMP_SNIFF_SUBRATING_RES 22 #define LMP_PAUSE_ENCRYPTION_REQ 23 #define LMP_RESUME_ENCRYPTION_REQ 24 #define LMP_IO_CAPABILITY_REQ 25 #define LMP_IO_CAPABILITY_RES 26 #define LMP_NUMERIC_COMPARISON_FAILED 27 #define LMP_PASSKEY_FAILED 28 #define LMP_OOB_FAILED 29 #define LMP_KEYPRESS_NOTIFICATION 30 #define LMP_POWER_CONTROL_REQ 31 #define LMP_POWER_CONTROL_RES 32 #define LMP_PING_REQ 33 #define LMP_PING_RES 34 /* initialize the protocol and registered fields */ static int proto_btbrlmp = -1; static int hf_lmp_accscheme = -1; static int hf_lmp_afhchmap = -1; static int hf_lmp_afhclass = -1; static int hf_lmp_afhinst = -1; static int hf_lmp_afhmaxintvl = -1; static int hf_lmp_afhminintvl = -1; static int hf_lmp_afhmode = -1; static int hf_lmp_afhrptmode = -1; static int hf_lmp_airmode = -1; static int hf_lmp_araddr = -1; static int hf_lmp_authreqs = -1; static int hf_lmp_authres = -1; static int hf_lmp_bdaddr = -1; static int hf_lmp_bdaddr1 = -1; static int hf_lmp_bdaddr2 = -1; static int hf_lmp_bsw = -1; static int hf_lmp_clkoffset = -1; static int hf_lmp_commit = -1; static int hf_lmp_confirm = -1; static int hf_lmp_compid = -1; static int hf_lmp_cryptmode = -1; static int hf_lmp_daccess = -1; static int hf_lmp_db = -1; static int hf_lmp_dbsleep = -1; static int hf_lmp_deltab = -1; static int hf_lmp_desco = -1; static int hf_lmp_drift = -1; static int hf_lmp_dsco = -1; static int hf_lmp_dsniff = -1; static int hf_lmp_encdata = -1; static int hf_lmp_enclen = -1; static int hf_lmp_encmaj = -1; static int hf_lmp_encmin = -1; static int hf_lmp_eop = -1; static int hf_lmp_eopinre = -1; static int hf_lmp_escolenms = -1; static int hf_lmp_escolensm = -1; static int hf_lmp_escotypems = -1; static int hf_lmp_escotypesm = -1; static int hf_lmp_err = -1; static int hf_lmp_escohdl = -1; static int hf_lmp_escoltaddr = -1; static int hf_lmp_features = -1; static int hf_lmp_feat_3slot = -1; static int hf_lmp_feat_5slot = -1; static int hf_lmp_feat_enc = -1; static int hf_lmp_feat_slotoff = -1; static int hf_lmp_feat_timacc = -1; static int hf_lmp_feat_rolesw = -1; static int hf_lmp_feat_holdmo = -1; static int hf_lmp_feat_sniffmo = -1; static int hf_lmp_feat_res0 = -1; static int hf_lmp_feat_pwrctlreq = -1; static int hf_lmp_feat_cqddr = -1; static int hf_lmp_feat_sco = -1; static int hf_lmp_feat_hv2 = -1; static int hf_lmp_feat_hv3 = -1; static int hf_lmp_feat_mulaw = -1; static int hf_lmp_feat_alaw = -1; static int hf_lmp_feat_cvsd = -1; static int hf_lmp_feat_pagneg = -1; static int hf_lmp_feat_pwrctl = -1; static int hf_lmp_feat_transsync = -1; static int hf_lmp_feat_flowctl1 = -1; static int hf_lmp_feat_flowctl2 = -1; static int hf_lmp_feat_flowctl3 = -1; static int hf_lmp_feat_bcenc = -1; static int hf_lmp_feat_res1 = -1; static int hf_lmp_feat_acl2 = -1; static int hf_lmp_feat_acl3 = -1; static int hf_lmp_feat_eninq = -1; static int hf_lmp_feat_intinq = -1; static int hf_lmp_feat_intpag = -1; static int hf_lmp_feat_rssiinq = -1; static int hf_lmp_feat_ev3 = -1; static int hf_lmp_feat_ev4 = -1; static int hf_lmp_feat_ev5 = -1; static int hf_lmp_feat_res2 = -1; static int hf_lmp_feat_afhcapsl = -1; static int hf_lmp_feat_afhclasl = -1; static int hf_lmp_feat_bredrnotsup = -1; static int hf_lmp_feat_lesup = -1; static int hf_lmp_feat_3slotenh = -1; static int hf_lmp_feat_5slotenh = -1; static int hf_lmp_feat_sniffsubr = -1; static int hf_lmp_feat_pauseenc = -1; static int hf_lmp_feat_afhcapma = -1; static int hf_lmp_feat_afhclama = -1; static int hf_lmp_feat_esco2 = -1; static int hf_lmp_feat_esco3 = -1; static int hf_lmp_feat_3slotenhesco = -1; static int hf_lmp_feat_extinqres = -1; static int hf_lmp_feat_simlebredr = -1; static int hf_lmp_feat_res3 = -1; static int hf_lmp_feat_ssp = -1; static int hf_lmp_feat_enpdu = -1; static int hf_lmp_feat_edr = -1; static int hf_lmp_feat_nonflush = -1; static int hf_lmp_feat_res4 = -1; static int hf_lmp_feat_lstimche = -1; static int hf_lmp_feat_inqtxpwr = -1; static int hf_lmp_feat_enhpwr = -1; static int hf_lmp_feat_res5 = -1; static int hf_lmp_feat_res6 = -1; static int hf_lmp_feat_res7 = -1; static int hf_lmp_feat_res8 = -1; static int hf_lmp_feat_extfeat = -1; static int hf_lmp_featuresext = -1; static int hf_lmp_efeat_ssp = -1; static int hf_lmp_efeat_lesup = -1; static int hf_lmp_efeat_lebredr = -1; static int hf_lmp_efeat_sch = -1; static int hf_lmp_efeat_csbma = -1; static int hf_lmp_efeat_csbsl = -1; static int hf_lmp_efeat_syntr = -1; static int hf_lmp_efeat_synsc = -1; static int hf_lmp_efeat_inqresnote = -1; static int hf_lmp_efeat_genintsc = -1; static int hf_lmp_efeat_ccadj = -1; static int hf_lmp_efeat_res0 = -1; static int hf_lmp_efeat_scc = -1; static int hf_lmp_efeat_ping = -1; static int hf_lmp_efeat_res1 = -1; static int hf_lmp_efeat_trnud = -1; static int hf_lmp_efeat_sam = -1; static int hf_lmp_fpage = -1; static int hf_lmp_htime = -1; static int hf_lmp_hinst = -1; static int hf_lmp_hopmode = -1; static int hf_lmp_iocaps = -1; static int hf_lmp_jitter = -1; static int hf_lmp_key = -1; static int hf_lmp_keysz = -1; static int hf_lmp_ksmask = -1; static int hf_lmp_ltaddr1 = -1; static int hf_lmp_ltaddr2 = -1; static int hf_lmp_ltaddr3 = -1; static int hf_lmp_ltaddr4 = -1; static int hf_lmp_ltaddr5 = -1; static int hf_lmp_ltaddr6 = -1; static int hf_lmp_ltaddr7 = -1; static int hf_lmp_maccess = -1; static int hf_lmp_maxslots = -1; static int hf_lmp_maxsp = -1; static int hf_lmp_maxss = -1; static int hf_lmp_minsmt = -1; static int hf_lmp_naccslots = -1; static int hf_lmp_namefrag = -1; static int hf_lmp_namelen = -1; static int hf_lmp_nameoffset = -1; static int hf_lmp_nb = -1; static int hf_lmp_nbc = -1; static int hf_lmp_nbsleep = -1; static int hf_lmp_negstate = -1; static int hf_lmp_nonce = -1; static int hf_lmp_nottype = -1; static int hf_lmp_npoll = -1; static int hf_lmp_oobauthdata = -1; static int hf_lmp_op = -1; static int hf_lmp_opinre = -1; static int hf_lmp_pagesch = -1; static int hf_lmp_pcmode = -1; static int hf_lmp_pkttype = -1; static int hf_lmp_pkttypetbl = -1; static int hf_lmp_pmaddr = -1; static int hf_lmp_pmaddr1 = -1; static int hf_lmp_pmaddr2 = -1; static int hf_lmp_pmaddr3 = -1; static int hf_lmp_pmaddr4 = -1; static int hf_lmp_pmaddr5 = -1; static int hf_lmp_pmaddr6 = -1; static int hf_lmp_pmaddr7 = -1; static int hf_lmp_pollintvl = -1; static int hf_lmp_pollper = -1; static int hf_lmp_pssettings = -1; static int hf_lmp_pwradjreq = -1; static int hf_lmp_pwradjres = -1; static int hf_lmp_pwradj_8dpsk = -1; static int hf_lmp_pwradj_dqpsk = -1; static int hf_lmp_pwradj_gfsk = -1; static int hf_lmp_rand = -1; static int hf_lmp_rate = -1; static int hf_lmp_rate_fec = -1; static int hf_lmp_rate_size = -1; static int hf_lmp_rate_type = -1; static int hf_lmp_rate_edrsize = -1; static int hf_lmp_rxfreq = -1; static int hf_lmp_scohdl = -1; static int hf_lmp_scopkt = -1; static int hf_lmp_slotoffset = -1; static int hf_lmp_sniffatt = -1; static int hf_lmp_sniffsi = -1; static int hf_lmp_sniffto = -1; static int hf_lmp_subversnr = -1; static int hf_lmp_suptimeout = -1; static int hf_lmp_swinst = -1; static int hf_lmp_taccess = -1; static int hf_lmp_tb = -1; static int hf_lmp_tesco = -1; static int hf_lmp_testlen = -1; static int hf_lmp_testscen = -1; static int hf_lmp_tid = -1; static int hf_lmp_timectrl = -1; static int hf_lmp_time_change = -1; static int hf_lmp_time_init = -1; static int hf_lmp_time_accwin = -1; static int hf_lmp_tsco = -1; static int hf_lmp_tsniff = -1; static int hf_lmp_txfreq = -1; static int hf_lmp_versnr = -1; static int hf_lmp_wesco = -1; /* supported features page 0 (standard p. 528) */ static const int *features_fields[] = { &hf_lmp_feat_3slot, &hf_lmp_feat_5slot, &hf_lmp_feat_enc, &hf_lmp_feat_slotoff, &hf_lmp_feat_timacc, &hf_lmp_feat_rolesw, &hf_lmp_feat_holdmo, &hf_lmp_feat_sniffmo, &hf_lmp_feat_res0, &hf_lmp_feat_pwrctlreq, &hf_lmp_feat_cqddr, &hf_lmp_feat_sco, &hf_lmp_feat_hv2, &hf_lmp_feat_hv3, &hf_lmp_feat_mulaw, &hf_lmp_feat_alaw, &hf_lmp_feat_cvsd, &hf_lmp_feat_pagneg, &hf_lmp_feat_pwrctl, &hf_lmp_feat_transsync, &hf_lmp_feat_flowctl1, &hf_lmp_feat_flowctl2, &hf_lmp_feat_flowctl3, &hf_lmp_feat_bcenc, &hf_lmp_feat_res1, &hf_lmp_feat_acl2, &hf_lmp_feat_acl3, &hf_lmp_feat_eninq, &hf_lmp_feat_intinq, &hf_lmp_feat_intpag, &hf_lmp_feat_rssiinq, &hf_lmp_feat_ev3, &hf_lmp_feat_ev4, &hf_lmp_feat_ev5, &hf_lmp_feat_res2, &hf_lmp_feat_afhcapsl, &hf_lmp_feat_afhclasl, &hf_lmp_feat_bredrnotsup, &hf_lmp_feat_lesup, &hf_lmp_feat_3slotenh, &hf_lmp_feat_5slotenh, &hf_lmp_feat_sniffsubr, &hf_lmp_feat_pauseenc, &hf_lmp_feat_afhcapma, &hf_lmp_feat_afhclama, &hf_lmp_feat_esco2, &hf_lmp_feat_esco3, &hf_lmp_feat_3slotenhesco, &hf_lmp_feat_extinqres, &hf_lmp_feat_simlebredr, &hf_lmp_feat_res3, &hf_lmp_feat_ssp, &hf_lmp_feat_enpdu, &hf_lmp_feat_edr, &hf_lmp_feat_nonflush, &hf_lmp_feat_res4, &hf_lmp_feat_lstimche, &hf_lmp_feat_inqtxpwr, &hf_lmp_feat_enhpwr, &hf_lmp_feat_res5, &hf_lmp_feat_res6, &hf_lmp_feat_res7, &hf_lmp_feat_res8, &hf_lmp_feat_extfeat, NULL}; /* supported features page 1+2 (standard p. 530) */ static const int *extfeatures1_fields[] = { &hf_lmp_efeat_ssp, &hf_lmp_efeat_lesup, &hf_lmp_efeat_lebredr, &hf_lmp_efeat_sch, NULL}; static const int *extfeatures2_fields[] = { &hf_lmp_efeat_csbma, &hf_lmp_efeat_csbsl, &hf_lmp_efeat_syntr, &hf_lmp_efeat_synsc, &hf_lmp_efeat_inqresnote, &hf_lmp_efeat_genintsc, &hf_lmp_efeat_ccadj, &hf_lmp_efeat_res0, &hf_lmp_efeat_scc, &hf_lmp_efeat_ping, &hf_lmp_efeat_res1, &hf_lmp_efeat_trnud, &hf_lmp_efeat_sam, NULL}; /* timing control flags */ static const int *timectrl_fields[] = { &hf_lmp_time_change, &hf_lmp_time_init, &hf_lmp_time_accwin, /* bits 3-7 reserved */ NULL}; static const true_false_string time_change = { "timing change", "no timing change"}; static const true_false_string time_init = { "use initialization 2", "use initialization 1"}; static const true_false_string time_accwin = { "no access window", "access window"}; static const true_false_string fec = { "do not use FEC", "use FEC"}; static const true_false_string tid = { "transaction initiated by slave", "transaction initiated by master"}; /* short LMP opcodes */ static const value_string opcode[] = { {LMP_VSC, "LMP_Broadcom_BPCS"}, {LMP_NAME_REQ, "LMP_name_req"}, {LMP_NAME_RES, "LMP_name_res"}, {LMP_ACCEPTED, "LMP_accepted"}, {LMP_NOT_ACCEPTED, "LMP_not_accepted"}, {LMP_CLKOFFSET_REQ, "LMP_clkoffset_req"}, {LMP_CLKOFFSET_RES, "LMP_clkoffset_res"}, {LMP_DETACH, "LMP_detach"}, {LMP_IN_RAND, "LMP_in_rand"}, {LMP_COMB_KEY, "LMP_comb_key"}, {LMP_UNIT_KEY, "LMP_unit_key"}, {LMP_AU_RAND, "LMP_au_rand"}, {LMP_SRES, "LMP_sres"}, {LMP_TEMP_RAND, "LMP_temp_rand"}, {LMP_TEMP_KEY, "LMP_temp_key"}, {LMP_ENCRYPTION_MODE_REQ, "LMP_encryption_mode_req"}, {LMP_ENCRYPTION_KEY_SIZE_REQ, "LMP_encryption_key_size_req"}, {LMP_START_ENCRYPTION_REQ, "LMP_start_encryption_req"}, {LMP_STOP_ENCRYPTION_REQ, "LMP_stop_encryption_req"}, {LMP_SWITCH_REQ, "LMP_switch_req"}, {LMP_HOLD, "LMP_hold"}, {LMP_HOLD_REQ, "LMP_hold_req"}, {LMP_SNIFF_REQ, "LMP_sniff_req"}, {LMP_UNSNIFF_REQ, "LMP_unsniff_req"}, {LMP_PARK_REQ, "LMP_park_req"}, {LMP_SET_BROADCAST_SCAN_WINDOW, "LMP_set_broadcast_scan_window"}, {LMP_MODIFY_BEACON, "LMP_modify_beacon"}, {LMP_UNPARK_BD_ADDR_REQ, "LMP_unpark_BD_ADDR_req"}, {LMP_UNPARK_PM_ADDR_REQ, "LMP_unpark_PM_ADDR_req"}, {LMP_INCR_POWER_REQ, "LMP_incr_power_req"}, {LMP_DECR_POWER_REQ, "LMP_decr_power_req"}, {LMP_MAX_POWER, "LMP_max_power"}, {LMP_MIN_POWER, "LMP_min_power"}, {LMP_AUTO_RATE, "LMP_auto_rate"}, {LMP_PREFERRED_RATE, "LMP_preferred_rate"}, {LMP_VERSION_REQ, "LMP_version_req"}, {LMP_VERSION_RES, "LMP_version_res"}, {LMP_FEATURES_REQ, "LMP_features_req"}, {LMP_FEATURES_RES, "LMP_features_res"}, {LMP_QUALITY_OF_SERVICE, "LMP_quality_of_service"}, {LMP_QUALITY_OF_SERVICE_REQ, "LMP_quality_of_service_req"}, {LMP_SCO_LINK_REQ, "LMP_SCO_link_req"}, {LMP_REMOVE_SCO_LINK_REQ, "LMP_remove_SCO_link_req"}, {LMP_MAX_SLOT, "LMP_max_slot"}, {LMP_MAX_SLOT_REQ, "LMP_max_slot_req"}, {LMP_TIMING_ACCURACY_REQ, "LMP_timing_accuracy_req"}, {LMP_TIMING_ACCURACY_RES, "LMP_timing_accuracy_res"}, {LMP_SETUP_COMPLETE, "LMP_setup_complete"}, {LMP_USE_SEMI_PERMANENT_KEY, "LMP_use_semi_permanent_key"}, {LMP_HOST_CONNECTION_REQ, "LMP_host_connection_req"}, {LMP_SLOT_OFFSET, "LMP_slot_offset"}, {LMP_PAGE_MODE_REQ, "LMP_page_mode_req"}, {LMP_PAGE_SCAN_MODE_REQ, "LMP_page_scan_mode_req"}, {LMP_SUPERVISION_TIMEOUT, "LMP_supervision_timeout"}, {LMP_TEST_ACTIVATE, "LMP_test_activate"}, {LMP_TEST_CONTROL, "LMP_test_control"}, {LMP_ENCRYPTION_KEY_SIZE_MASK_REQ, "LMP_encryption_key_size_mask_req"}, {LMP_ENCRYPTION_KEY_SIZE_MASK_RES, "LMP_encryption_key_size_mask_res"}, {LMP_SET_AFH, "LMP_set_AFH"}, {LMP_ENCAPSULATED_HEADER, "LMP_encapsulated_header"}, {LMP_ENCAPSULATED_PAYLOAD, "LMP_encapsulated_payload"}, {LMP_SIMPLE_PAIRING_CONFIRM, "LMP_Simple_Pairing_Confirm"}, {LMP_SIMPLE_PAIRING_NUMBER, "LMP_Simple_Pairing_Number"}, {LMP_DHKEY_CHECK, "LMP_DHkey_Check"}, {LMP_ESCAPE_1, "Escape 1"}, {LMP_ESCAPE_2, "Escape 2"}, {LMP_ESCAPE_3, "Escape 3"}, {LMP_ESCAPE_4, "Escape 4"}, {0, NULL}}; /* extended LMP opcodes */ static const value_string ext_opcode[] = { {LMP_ACCEPTED_EXT, "LMP_accepted_ext"}, {LMP_NOT_ACCEPTED_EXT, "LMP_not_accepted_ext"}, {LMP_FEATURES_REQ_EXT, "LMP_features_req_ext"}, {LMP_FEATURES_RES_EXT, "LMP_features_res_ext"}, {LMP_PACKET_TYPE_TABLE_REQ, "LMP_packet_type_table_req"}, {LMP_ESCO_LINK_REQ, "LMP_eSCO_link_req"}, {LMP_REMOVE_ESCO_LINK_REQ, "LMP_remove_eSCO_link_req"}, {LMP_CHANNEL_CLASSIFICATION_REQ, "LMP_channel_classification_req"}, {LMP_CHANNEL_CLASSIFICATION, "LMP_channel_classification"}, {LMP_SNIFF_SUBRATING_REQ, "LMP_sniff_subrating_req"}, {LMP_SNIFF_SUBRATING_RES, "LMP_sniff_subrating_res"}, {LMP_PAUSE_ENCRYPTION_REQ, "LMP_pause_encryption_req"}, {LMP_RESUME_ENCRYPTION_REQ, "LMP_resume_encryption_req"}, {LMP_IO_CAPABILITY_REQ, "LMP_IO_Capability_req"}, {LMP_IO_CAPABILITY_RES, "LMP_IO_Capability_res"}, {LMP_NUMERIC_COMPARISON_FAILED, "LMP_numeric_comparison_failed"}, {LMP_PASSKEY_FAILED, "LMP_passkey_failed"}, {LMP_OOB_FAILED, "LMP_oob_failed"}, {LMP_KEYPRESS_NOTIFICATION, "LMP_keypress_notification"}, {LMP_POWER_CONTROL_REQ, "LMP_power_control_req"}, {LMP_POWER_CONTROL_RES, "LMP_power_control_res"}, {LMP_PING_REQ, "LMP_ping_req"}, {LMP_PING_RES, "LMP_ping_res"}, {0, NULL}}; /* LMP error codes */ static const value_string error_code[] = { {0x00, "Success"}, {0x01, "Unknown HCI Command"}, {0x02, "Unknown Connection Identifier"}, {0x03, "Hardware Failure"}, {0x04, "Page Timeout"}, {0x05, "Authentication Failure"}, {0x06, "PIN or Key Missing"}, {0x07, "Memory Capacity Exceeded"}, {0x08, "Connection Timeout"}, {0x09, "Connection Limit Exceeded"}, {0x0A, "Synchronous Connection Limit To A Device Exceeded"}, {0x0B, "ACL Connection Already Exists"}, {0x0C, "Command Disallowed"}, {0x0D, "Connection Rejected due to Limited Resources"}, {0x0E, "Connection Rejected Due To Security Reasons"}, {0x0F, "Connection Rejected due to Unacceptable BD_ADDR"}, {0x10, "Connection Accept Timeout Exceeded"}, {0x11, "Unsupported Feature or Parameter Value"}, {0x12, "Invalid HCI Command Parameters"}, {0x13, "Remote User Terminated Connection"}, {0x14, "Remote Device Terminated Connection due to Low Resources"}, {0x15, "Remote Device Terminated Connection due to Power Off"}, {0x16, "Connection Terminated By Local Host"}, {0x17, "Repeated Attempts"}, {0x18, "Pairing Not Allowed"}, {0x19, "Unknown LMP PDU"}, {0x1A, "Unsupported Remote Feature / Unsupported LMP Feature"}, {0x1B, "SCO Offset Rejected"}, {0x1C, "SCO Interval Rejected"}, {0x1D, "SCO Air Mode Rejected"}, {0x1E, "Invalid LMP Parameters"}, {0x1F, "Unspecified Error"}, {0x20, "Unsupported LMP Parameter Value"}, {0x21, "Role Change Not Allowed"}, {0x22, "LMP Response Timeout"}, {0x23, "LMP Error Transaction Collision"}, {0x24, "LMP PDU Not Allowed"}, {0x25, "Encryption Mode Not Acceptable"}, {0x26, "Link Key Can Not be Changed"}, {0x27, "Requested QoS Not Supported"}, {0x28, "Instant Passed"}, {0x29, "Pairing With Unit Key Not Supported"}, {0x2A, "Different Transaction Collision"}, {0x2B, "Reserved"}, {0x2C, "QoS Unacceptable Parameter"}, {0x2D, "QoS Rejected"}, {0x2E, "Channel Classification Not Supported"}, {0x2F, "Insufficient Security"}, {0x30, "Parameter Out Of Mandatory Range"}, {0x31, "Reserved"}, {0x32, "Role Switch Pending"}, {0x33, "Reserved"}, {0x34, "Reserved Slot Violation"}, {0x35, "Role Switch Failed"}, {0x36, "Extended Inquiry Response Too Large"}, {0x37, "Secure Simple Pairing Not Supported By Host."}, {0x38, "Host Busy - Pairing"}, {0x39, "Connection Rejected due to No Suitable Channel Found"}, {0, NULL}}; static const value_string encryption_mode[] = { {0, "no encryption"}, {1, "encryption"}, {2, "encryption"}, /* 3 - 255 reserved */ {0, NULL}}; static const value_string access_scheme[] = { {0, "polling technique"}, /* 1 - 15 reserved */ {0, NULL}}; static const value_string packet_size[] = { {0, "no packet-size preference available"}, {1, "use 1-slot packets"}, {2, "use 3-slot packets"}, {3, "use 5-slot packets"}, {0, NULL}}; static const value_string edr_type[] = { {0, "use DM1 packets"}, {1, "use 2 Mbps packets"}, {2, "use 3 Mbps packets"}, /* 3 reserved */ {0, NULL}}; static const value_string versnr[] = { {0, "Bluetooth Core Specification 1.0b"}, {1, "Bluetooth Core Specification 1.1"}, {2, "Bluetooth Core Specification 1.2"}, {3, "Bluetooth Core Specification 2.0 + EDR"}, {4, "Bluetooth Core Specification 2.1 + EDR"}, {5, "Bluetooth Core Specification 3.0 + HS"}, {6, "Bluetooth Core Specification 4.0"}, {7, "Bluetooth Core Specification 4.1"}, {8, "Bluetooth Core Specification 4.2"}, {9, "Bluetooth Core Specification 5.0"}, {10, "Bluetooth Core Specification 5.1"}, {11, "Bluetooth Core Specification 5.2"}, /* 12 - 255 reserved */ {0, NULL}}; static const value_string compid[] = { {0, "Ericsson Technology Licensing"}, {1, "Nokia Mobile Phones"}, {2, "Intel Corp."}, {3, "IBM Corp."}, {4, "Toshiba Corp."}, {5, "3Com"}, {6, "Microsoft"}, {7, "Lucent"}, {8, "Motorola"}, {9, "Infineon Technologies AG"}, {10, "Cambridge Silicon Radio"}, {11, "Silicon Wave"}, {12, "Digianswer A/S"}, {13, "Texas Instruments Inc."}, {14, "Parthus Technologies Inc."}, {15, "Broadcom Corporation"}, {16, "Mitel Semiconductor"}, {17, "Widcomm, Inc."}, {18, "Zeevo, Inc."}, {19, "Atmel Corporation"}, {20, "Mitsubishi Electric Corporation"}, {21, "RTX Telecom A/S"}, {22, "KC Technology Inc."}, {23, "Newlogic"}, {24, "Transilica, Inc."}, {25, "Rohde & Schwarz GmbH & Co. KG"}, {26, "TTPCom Limited"}, {27, "Signia Technologies, Inc."}, {28, "Conexant Systems Inc."}, {29, "Qualcomm"}, {30, "Inventel"}, {31, "AVM Berlin"}, {32, "BandSpeed, Inc."}, {33, "Mansella Ltd"}, {34, "NEC Corporation"}, {35, "WavePlus Technology Co., Ltd."}, {36, "Alcatel"}, {37, "Philips Semiconductors"}, {38, "C Technologies"}, {39, "Open Interface"}, {40, "R F Micro Devices"}, {41, "Hitachi Ltd"}, {42, "Symbol Technologies, Inc."}, {43, "Tenovis"}, {44, "Macronix International Co. Ltd."}, {45, "GCT Semiconductor"}, {46, "Norwood Systems"}, {47, "MewTel Technology Inc."}, {48, "ST Microelectronics"}, {49, "Synopsys"}, {50, "Red-M (Communications) Ltd"}, {51, "Commil Ltd"}, {52, "Computer Access Technology Corporation (CATC)"}, {53, "Eclipse (HQ Espana) S.L."}, {54, "Renesas Technology Corp."}, {55, "Mobilian Corporation"}, {56, "Terax"}, {57, "Integrated System Solution Corp."}, {58, "Matsushita Electric Industrial Co., Ltd."}, {59, "Gennum Corporation"}, {60, "Research In Motion"}, {61, "IPextreme, Inc."}, {62, "Systems and Chips, Inc"}, {63, "Bluetooth SIG, Inc"}, {64, "Seiko Epson Corporation"}, {65, "Integrated Silicon Solution Taiwan, Inc."}, {66, "CONWISE Technology Corporation Ltd"}, {67, "PARROT SA"}, {68, "Socket Mobile"}, {69, "Atheros Communications, Inc."}, {70, "MediaTek, Inc."}, {71, "Bluegiga (tentative)"}, {72, "Marvell Technology Group Ltd."}, {73, "3DSP Corporation"}, {74, "Accel Semiconductor Ltd."}, {75, "Continental Automotive Systems"}, {76, "Apple, Inc."}, {77, "Staccato Communications, Inc."}, {78, "Avago Technologies"}, {79, "APT Ltd."}, {80, "SiRF Technology, Inc."}, {81, "Tzero Technologies, Inc."}, {82, "J&M Corporation"}, {83, "Free2move AB"}, {84, "3DiJoyCorporation"}, {85, "Plantronics,Inc."}, {86, "SonyEricssonMobileCommunications"}, {87, "HarmanInternationalIndustries,Inc."}, {88, "Vizio,Inc."}, {89, "NordicSemiconductorASA"}, {90, "EMMicroelectronic-MarinSA"}, {91, "RalinkTechnologyCorporation"}, {92, "BelkinInternational,Inc."}, {93, "RealtekSemiconductorCorporation"}, {94, "StonestreetOne,LLC"}, {95, "Wicentric,Inc."}, {96, "RivieraWavesS.A.S"}, {97, "RDAMicroelectronics"}, {98, "GibsonGuitars"}, {99, "MiCommandInc."}, {100, "BandXIInternational,LLC"}, {101, "Hewlett-PackardCompany"}, {102, "9SolutionsOy"}, {103, "GNNetcomA/S"}, {104, "GeneralMotors"}, {105, "A&DEngineering,Inc."}, {106, "MindTreeLtd."}, {107, "PolarElectroOY"}, {108, "BeautifulEnterpriseCo.,Ltd."}, {109, "BriarTek,Inc"}, {110, "SummitDataCommunications,Inc."}, {111, "SoundID"}, {112, "Monster,LLC"}, {113, "connectBlueAB"}, {114, "ShangHaiSuperSmartElectronicsCo.Ltd."}, {115, "GroupSenseLtd."}, {116, "Zomm,LLC"}, {117, "SamsungElectronicsCo.Ltd."}, {118, "CreativeTechnologyLtd."}, {119, "LairdTechnologies"}, {120, "Nike,Inc."}, {121, "lesswireAG"}, {122, "MStarSemiconductor,Inc."}, {123, "HanlynnTechnologies"}, {124, "A&RCambridge"}, {125, "SeersTechnologyCo.,Ltd."}, {126, "SportsTrackingTechnologiesLtd."}, {127, "AutonetMobile"}, {128, "DeLormePublishingCompany,Inc."}, {129, "WuXiVimicro"}, {130, "SennheiserCommunicationsA/S"}, {131, "TimeKeepingSystems,Inc."}, {132, "LudusHelsinkiLtd."}, {133, "BlueRadios,Inc."}, {134, "EquinuxAG"}, {135, "GarminInternational,Inc."}, {136, "Ecotest"}, {137, "GNReSoundA/S"}, {138, "Jawbone"}, {139, "TopconPositioningSystems,LLC"}, {140, "GimbalInc.(formerlyQualcommLabs,Inc.andQualcommRetailSolutions,Inc.)"}, {141, "ZscanSoftware"}, {142, "QuinticCorp"}, {143, "TelitWirelessSolutionsGmbH(formerlyStollmannE+VGmbH)"}, {144, "FunaiElectricCo.,Ltd."}, {145, "AdvancedPANMOBILsystemsGmbH&Co.KG"}, {146, "ThinkOptics,Inc."}, {147, "UniversalElectronics,Inc."}, {148, "AirohaTechnologyCorp."}, {149, "NECLighting,Ltd."}, {150, "ODMTechnology,Inc."}, {151, "ConnecteDeviceLtd."}, {152, "zero1.tvGmbH"}, {153, "i.TechDynamicGlobalDistributionLtd."}, {154, "Alpwise"}, {155, "JiangsuToppowerAutomotiveElectronicsCo.,Ltd."}, {156, "Colorfy,Inc."}, {157, "GeoforceInc."}, {158, "BoseCorporation"}, {159, "SuuntoOy"}, {160, "KensingtonComputerProductsGroup"}, {161, "SR-Medizinelektronik"}, {162, "VertuCorporationLimited"}, {163, "MetaWatchLtd."}, {164, "LINAKA/S"}, {165, "OTLDynamicsLLC"}, {166, "PandaOceanInc."}, {167, "VisteonCorporation"}, {168, "ARPDevicesLimited"}, {169, "MagnetiMarelliS.p.A"}, {170, "CAENRFIDsrl"}, {171, "Ingenieur-SystemgruppeZahnGmbH"}, {172, "GreenThrottleGames"}, {173, "PeterSystemtechnikGmbH"}, {174, "OmegawaveOy"}, {175, "Cinetix"}, {176, "PassifSemiconductorCorp"}, {177, "SarisCyclingGroup,Inc"}, {178, "BekeyA/S"}, {179, "ClarinoxTechnologiesPty.Ltd."}, {180, "BDETechnologyCo.,Ltd."}, {181, "SwirlNetworks"}, {182, "Mesointernational"}, {183, "TreLabLtd"}, {184, "QualcommInnovationCenter,Inc.(QuIC)"}, {185, "JohnsonControls,Inc."}, {186, "StarkeyLaboratoriesInc."}, {187, "S-PowerElectronicsLimited"}, {188, "AceSensorInc"}, {189, "AplixCorporation"}, {190, "AAMPofAmerica"}, {191, "StalmartTechnologyLimited"}, {192, "AMICCOMElectronicsCorporation"}, {193, "ShenzhenExcelsecuDataTechnologyCo.,Ltd"}, {194, "GeneqInc."}, {195, "adidasAG"}, {196, "LGElectronics"}, {197, "OnsetComputerCorporation"}, {198, "SelflyBV"}, {199, "QuuppaOy."}, {200, "GeLoInc"}, {201, "Evluma"}, {202, "MC10"}, {203, "BinauricSE"}, {204, "BeatsElectronics"}, {205, "MicrochipTechnologyInc."}, {206, "ElgatoSystemsGmbH"}, {207, "ARCHOSSA"}, {208, "Dexcom,Inc."}, {209, "PolarElectroEuropeB.V."}, {210, "DialogSemiconductorB.V."}, {211, "TaixingbangTechnology(HK)Co,.LTD."}, {212, "Kawantech"}, {213, "AustcoCommunicationSystems"}, {214, "TimexGroupUSA,Inc."}, {215, "QualcommTechnologies,Inc."}, {216, "QualcommConnectedExperiences,Inc."}, {217, "VoyetraTurtleBeach"}, {218, "txtrGmbH"}, {219, "Biosentronics"}, {220, "Procter&Gamble"}, {221, "HosidenCorporation"}, {222, "MuzikLLC"}, {223, "MisfitWearablesCorp"}, {224, "Google"}, {225, "DanlersLtd"}, {226, "SemilinkInc"}, {227, "inMusicBrands,Inc"}, {228, "L.S.ResearchInc."}, {229, "EdenSoftwareConsultantsLtd."}, {230, "Freshtemp"}, {231, "KSTechnologies"}, {232, "ACTSTechnologies"}, {233, "VtrackSystems"}, {234, "Nielsen-KellermanCompany"}, {235, "ServerTechnologyInc."}, {236, "BioResearchAssociates"}, {237, "JollyLogic,LLC"}, {238, "AboveAverageOutcomes,Inc."}, {239, "BitsplittersGmbH"}, {240, "PayPal,Inc."}, {241, "WitronTechnologyLimited"}, {242, "MorseProjectInc."}, {243, "KentDisplaysInc."}, {244, "NautilusInc."}, {245, "SmartifierOy"}, {246, "ElcometerLimited"}, {247, "VSNTechnologies,Inc."}, {248, "AceUniCorp.,Ltd."}, {249, "StickNFind"}, {250, "CrystalCodeAB"}, {251, "KOUKAAMa.s."}, {252, "DelphiCorporation"}, {253, "ValenceTechLimited"}, {254, "StanleyBlackandDecker"}, {255, "TypoProducts,LLC"}, {256, "TomTomInternationalBV"}, {257, "Fugoo,Inc."}, {258, "KeiserCorporation"}, {259, "Bang&OlufsenA/S"}, {260, "PLUSLocationSystemsPtyLtd"}, {261, "UbiquitousComputingTechnologyCorporation"}, {262, "InnovativeYachtterSolutions"}, {263, "WilliamDemantHoldingA/S"}, {264, "ChiconyElectronicsCo.,Ltd."}, {265, "AtusBV"}, {266, "CodegateLtd"}, {267, "ERi,Inc"}, {268, "TransducersDirect,LLC"}, {269, "FujitsuTenLImited"}, {270, "AudiAG"}, {271, "HiSiliconTechnologiesCol,Ltd."}, {272, "NipponSeikiCo.,Ltd."}, {273, "SteelseriesApS"}, {274, "VisyblInc."}, {275, "OpenbrainTechnologies,Co.,Ltd."}, {276, "Xensr"}, {277, "e.solutions"}, {278, "10AKTechnologies"}, {279, "WimotoTechnologiesInc"}, {280, "RadiusNetworks,Inc."}, {281, "WizeTechnologyCo.,Ltd."}, {282, "QualcommLabs,Inc."}, {283, "HewlettPackardEnterprise"}, {284, "Baidu"}, {285, "ArendiAG"}, {286, "SkodaAutoa.s."}, {287, "VolkswagenAG"}, {288, "PorscheAG"}, {289, "SinoWealthElectronicLtd."}, {290, "AirTurn,Inc."}, {291, "Kinsa,Inc"}, {292, "HIDGlobal"}, {293, "SEATes"}, {294, "PrometheanLtd."}, {295, "SaluticaAlliedSolutions"}, {296, "GPSIGroupPtyLtd"}, {297, "NimbleDevicesOy"}, {298, "ChangzhouYongseInfotechCo.,Ltd."}, {299, "SportIQ"}, {300, "TEMECInstrumentsB.V."}, {301, "SonyCorporation"}, {302, "ASSAABLOY"}, {303, "ClarionCo.Inc."}, {304, "WarehouseInnovations"}, {305, "CypressSemiconductor"}, {306, "MADSInc"}, {307, "BlueMaestroLimited"}, {308, "ResolutionProducts,Ltd."}, {309, "AirewareLLC"}, {310, "Silvair,Inc."}, {311, "PrestigioPlazaLtd."}, {312, "NTEOInc."}, {313, "FocusSystemsCorporation"}, {314, "TencentHoldingsLtd."}, {315, "Allegion"}, {316, "MurataManufacturingCo.,Ltd."}, {317, "WirelessWERX"}, {318, "Nod,Inc."}, {319, "B&BManufacturingCompany"}, {320, "AlpineElectronics(China)Co.,Ltd"}, {321, "FedExServices"}, {322, "GrapeSystemsInc."}, {323, "BkonConnect"}, {324, "LintechGmbH"}, {325, "NovatelWireless"}, {326, "Ciright"}, {327, "MightyCast,Inc."}, {328, "AmbimatElectronics"}, {329, "PerytonsLtd."}, {330, "TivoliAudio,LLC"}, {331, "MasterLock"}, {332, "Mesh-NetLtd"}, {333, "HUIZHOUDESAYSVAUTOMOTIVECO.,LTD."}, {334, "Tangerine,Inc."}, {335, "B&WGroupLtd."}, {336, "PioneerCorporation"}, {337, "OnBeep"}, {338, "VernierSoftware&Technology"}, {339, "ROLErgo"}, {340, "PebbleTechnology"}, {341, "NETATMO"}, {342, "AccumulateAB"}, {343, "AnhuiHuamiInformationTechnologyCo.,Ltd."}, {344, "Inmites.r.o."}, {345, "ChefSteps,Inc."}, {346, "micasAG"}, {347, "BiomedicalResearchLtd."}, {348, "PitiusTecS.L."}, {349, "Estimote,Inc."}, {350, "UnikeyTechnologies,Inc."}, {351, "TimerCapCo."}, {352, "AwoX"}, {353, "yikes"}, {354, "MADSGlobalNZLtd."}, {355, "PCHInternational"}, {356, "QingdaoYeelinkInformationTechnologyCo.,Ltd."}, {357, "MilwaukeeTool(FormallyMilwaukeeElectricTools)"}, {358, "MISHIKPteLtd"}, {359, "AscensiaDiabetesCareUSInc."}, {360, "SpiceboxLLC"}, {361, "emberlight"}, {362, "Cooper-AtkinsCorporation"}, {363, "Qblinks"}, {364, "MYSPHERA"}, {365, "LifeScanInc"}, {366, "VolanticAB"}, {367, "PodoLabs,Inc"}, {368, "RocheDiabetesCareAG"}, {369, "AmazonFulfillmentService"}, {370, "ConnovateTechnologyPrivateLimited"}, {371, "Kocomojo,LLC"}, {372, "EverykeyInc."}, {373, "DynamicControls"}, {374, "SentriLock"}, {375, "I-SYSTinc."}, {376, "CASIOCOMPUTERCO.,LTD."}, {377, "LAPISSemiconductorCo.,Ltd."}, {378, "Telemonitor,Inc."}, {379, "taskitGmbH"}, {380, "DaimlerAG"}, {381, "BatAndCat"}, {382, "BluDotzLtd"}, {383, "XTelWirelessApS"}, {384, "GigasetCommunicationsGmbH"}, {385, "GeckoHealthInnovations,Inc."}, {386, "HOPUbiquitous"}, {387, "WaltDisney"}, {388, "Nectar"}, {389, "bel'appsLLC"}, {390, "CORELightingLtd"}, {391, "SeraphimSenseLtd"}, {392, "UnicoRBC"}, {393, "PhysicalEnterprisesInc."}, {394, "AbleTrendTechnologyLimited"}, {395, "KonicaMinolta,Inc."}, {396, "WiloSE"}, {397, "ExtronDesignServices"}, {398, "Fitbit,Inc."}, {399, "FirefliesSystems"}, {400, "IntellettoTechnologiesInc."}, {401, "FDKCORPORATION"}, {402, "Cloudleaf,Inc"}, {403, "MavericAutomationLLC"}, {404, "AcousticStreamCorporation"}, {405, "Zuli"}, {406, "PaxtonAccessLtd"}, {407, "WiSilicaInc."}, {408, "VENGITKorlatoltFelelosseguTarsasag"}, {409, "SALTOSYSTEMSS.L."}, {410, "TRONForum(formerlyT-EngineForum)"}, {411, "CUBETECHs.r.o."}, {412, "CokiyaIncorporated"}, {413, "CVSHealth"}, {414, "Ceruus"}, {415, "StrainstallLtd"}, {416, "ChannelEnterprises(HK)Ltd."}, {417, "FIAMM"}, {418, "GIGALANE.CO.,LTD"}, {419, "EROAD"}, {420, "MineSafetyAppliances"}, {421, "IconHealthandFitness"}, {422, "WilleEngineering(formelyasAsandooGmbH)"}, {423, "ENERGOUSCORPORATION"}, {424, "Taobao"}, {425, "CanonInc."}, {426, "GeophysicalTechnologyInc."}, {427, "Facebook,Inc."}, {428, "TrividiaHealth,Inc."}, {429, "FlightSafetyInternational"}, {430, "EarlensCorporation"}, {431, "SunriseMicroDevices,Inc."}, {432, "StarMicronicsCo.,Ltd."}, {433, "NetizensSp.zo.o."}, {434, "NymiInc."}, {435, "Nytec,Inc."}, {436, "TrineoSp.zo.o."}, {437, "NestLabsInc."}, {438, "LMTechnologiesLtd"}, {439, "GeneralElectricCompany"}, {440, "i+D3S.L."}, {441, "HANAMicron"}, {442, "StagesCyclingLLC"}, {443, "CochlearBoneAnchoredSolutionsAB"}, {444, "SenionLabAB"}, {445, "SyszoneCo.,Ltd"}, {446, "PulsateMobileLtd."}, {447, "HongKongHunterSunElectronicLimited"}, {448, "pironexGmbH"}, {449, "BRADATECHCorp."}, {450, "TransenergooilAG"}, {451, "Bunch"}, {452, "DMEMicroelectronics"}, {453, "BitcrazeAB"}, {454, "HASWAREInc."}, {455, "AbiogenixInc."}, {456, "Poly-ControlApS"}, {457, "Avi-on"}, {458, "LaerdalMedicalAS"}, {459, "FetchMyPet"}, {460, "SamLabsLtd."}, {461, "ChengduSynwingTechnologyLtd"}, {462, "HOUWASYSTEMDESIGN,k.k."}, {463, "BSH"}, {464, "PrimusInterParesLtd"}, {465, "AugustHome,Inc"}, {466, "GillElectronics"}, {467, "SkyWaveDesign"}, {468, "NewlabS.r.l."}, {469, "ELADsrl"}, {470, "G-wearablesinc."}, {471, "SquadroneSystemsInc."}, {472, "CodeCorporation"}, {473, "SavantSystemsLLC"}, {474, "LogitechInternationalSA"}, {475, "InnblueConsulting"}, {476, "iParkingLtd."}, {477, "KoninklijkePhilipsElectronicsN.V."}, {478, "MinelabElectronicsPtyLimited"}, {479, "BisonGroupLtd."}, {480, "WidexA/S"}, {481, "JollaLtd"}, {482, "Lectronix,Inc."}, {483, "CaterpillarInc"}, {484, "FreedomInnovations"}, {485, "DynamicDevicesLtd"}, {486, "TechnologySolutions(UK)Ltd"}, {487, "IPSGroupInc."}, {488, "STIR"}, {489, "Sano,Inc."}, {490, "AdvancedApplicationDesign,Inc."}, {491, "AutoMapLLC"}, {492, "SpreadtrumCommunicationsShanghaiLtd"}, {493, "CuteCircuitLTD"}, {494, "ValeoService"}, {495, "FullpowerTechnologies,Inc."}, {496, "KloudNation"}, {497, "ZebraTechnologiesCorporation"}, {498, "Itron,Inc."}, {499, "TheUniversityofTokyo"}, {500, "UTCFireandSecurity"}, {501, "CoolWebthingsLimited"}, {502, "DJOGlobal"}, {503, "GellinerLimited"}, {504, "Anyka(Guangzhou)MicroelectronicsTechnologyCo,LTD"}, {505, "MedtronicInc."}, {506, "GozioInc."}, {507, "FormLifting,LLC"}, {508, "WahooFitness,LLC"}, {509, "KontaktMicro-LocationSp.zo.o."}, {510, "RadioSystemsCorporation"}, {511, "FreescaleSemiconductor,Inc."}, {512, "VerifoneSystemsPteLtd.TaiwanBranch"}, {513, "ARTiming"}, {514, "RigadoLLC"}, {515, "KemppiOy"}, {516, "TapcentiveInc."}, {517, "SmartboticsInc."}, {518, "OtterProducts,LLC"}, {519, "STEMPInc."}, {520, "LumiGeekLLC"}, {521, "InvisionHeartInc."}, {522, "MacnicaInc."}, {523, "JaguarLandRoverLimited"}, {524, "CoroWareTechnologies,Inc"}, {525, "SimploTechnologyCo.,LTD"}, {526, "OmronHealthcareCo.,LTD"}, {527, "ComoduleGMBH"}, {528, "ikeGPS"}, {529, "TelinkSemiconductorCo.Ltd"}, {530, "InterplanCo.,Ltd"}, {531, "WylerAG"}, {532, "IKMultimediaProductionsrl"}, {533, "LukotonExperienceOy"}, {534, "MTILtd"}, {535, "Tech4home,Lda"}, {536, "HiotechAB"}, {537, "DOTTLimited"}, {538, "BlueSpeckLabs,LLC"}, {539, "CiscoSystems,Inc"}, {540, "MobicommInc"}, {541, "Edamic"}, {542, "Goodnet,Ltd"}, {543, "LusterLeafProductsInc"}, {544, "ManusMachinaBV"}, {545, "MobiquityNetworksInc"}, {546, "PraxisDynamics"}, {547, "PhilipMorrisProductsS.A."}, {548, "ComarchSA"}, {549, "NestlNespressoS.A."}, {550, "MerliniaA/S"}, {551, "LifeBEAMTechnologies"}, {552, "TwocanoesLabs,LLC"}, {553, "MuovertiLimited"}, {554, "StamerMusikanlagenGMBH"}, {555, "TeslaMotors"}, {556, "PharynksCorporation"}, {557, "Lupine"}, {558, "SiemensAG"}, {559, "Huami(Shanghai)CultureCommunicationCO.,LTD"}, {560, "FosterElectricCompany,Ltd"}, {561, "ETASA"}, {562, "x-SensoSolutionsKft"}, {563, "ShenzhenSuLongCommunicationLtd"}, {564, "FengFan(BeiJing)TechnologyCo,Ltd"}, {565, "QrioInc"}, {566, "PitpatpetLtd"}, {567, "MSHelis.r.l."}, {568, "Trakm8Ltd"}, {569, "JINCO,Ltd"}, {570, "AlatechTehnology"}, {571, "BeijingCarePulseElectronicTechnologyCo,Ltd"}, {572, "Awarepoint"}, {573, "ViCentraB.V."}, {574, "RavenIndustries"}, {575, "WaveWareTechnologiesInc."}, {576, "ArgenoxTechnologies"}, {577, "BragiGmbH"}, {578, "16LabInc"}, {579, "MasimoCorp"}, {580, "IoteraInc"}, {581, "Endress+Hauser"}, {582, "ACKmeNetworks,Inc."}, {583, "FiftyThreeInc."}, {584, "ParkerHannifinCorp"}, {585, "TranscranialLtd"}, {586, "UwatecAG"}, {587, "OrlanLLC"}, {588, "BlueCloverDevices"}, {589, "M-WaySolutionsGmbH"}, {590, "MicrotronicsEngineeringGmbH"}, {591, "SchneiderSchreibgerteGmbH"}, {592, "SapphireCircuitsLLC"}, {593, "LumoBodytechInc."}, {594, "UKCTechnosolution"}, {595, "XicatoInc."}, {596, "Playbrush"}, {597, "DaiNipponPrintingCo.,Ltd."}, {598, "G24PowerLimited"}, {599, "AdBabbleLocalCommerceInc."}, {600, "DevialetSA"}, {601, "ALTYOR"}, {602, "UniversityofAppliedSciencesValais/HauteEcoleValaisanne"}, {603, "FiveInteractive,LLCdbaZendo"}, {604, "NetEaseHangzhouNetworkco.Ltd."}, {605, "LexmarkInternationalInc."}, {606, "FlukeCorporation"}, {607, "YardarmTechnologies"}, {608, "SensaRx"}, {609, "SECVREGmbH"}, {610, "GlacialRidgeTechnologies"}, {611, "Identiv,Inc."}, {612, "DDS,Inc."}, {613, "SMKCorporation"}, {614, "SchawbelTechnologiesLLC"}, {615, "XMISystemsSA"}, {616, "Cerevo"}, {617, "TorroxGmbH&CoKG"}, {618, "Gemalto"}, {619, "DEKAResearch&DevelopmentCorp."}, {620, "DomsterTadeuszSzydlowski"}, {621, "TechnogymSPA"}, {622, "FLEURBAEYBVBA"}, {623, "AptcodeSolutions"}, {624, "LSIADLTechnology"}, {625, "AnimasCorp"}, {626, "AlpsElectricCo.,Ltd."}, {627, "OCEASOFT"}, {628, "MotsaiResearch"}, {629, "Geotab"}, {630, "E.G.O.Elektro-GertebauGmbH"}, {631, "bewhereinc"}, {632, "JohnsonOutdoorsInc"}, {633, "steuteSchaltgerateGmbH&Co.KG"}, {634, "Ekominiinc."}, {635, "DEFAAS"}, {636, "AseptikaLtd"}, {637, "HUAWEITechnologiesCo.,Ltd.()"}, {638, "HabitAware,LLC"}, {639, "ruwidoaustriagmbh"}, {640, "ITECcorporation"}, {641, "StoneL"}, {642, "SonovaAG"}, {643, "MavenMachines,Inc."}, {644, "SynapseElectronics"}, {645, "StandardInnovationInc."}, {646, "RFCode,Inc."}, {647, "WallyVenturesS.L."}, {648, "WillowbankElectronicsLtd"}, {649, "SKTelecom"}, {650, "JetroAS"}, {651, "CodeGearsLTD"}, {652, "NANOLINKAPS"}, {653, "IF,LLC"}, {654, "RFDigitalCorp"}, {655, "Church&DwightCo.,Inc"}, {656, "MultibitOy"}, {657, "CliniCloudInc"}, {658, "SwiftSensors"}, {659, "BlueBite"}, {660, "ELIASGmbH"}, {661, "SivantosGmbH"}, {662, "Petzl"}, {663, "stormpowerltd"}, {664, "EISSTLtd"}, {665, "InexessTechnologySimmaKG"}, {666, "Currant,Inc."}, {667, "C2Development,Inc."}, {668, "BlueSkyScientific,LLC"}, {669, "ALOTTAZSLABS,LLC"}, {670, "Kupsonspol.sr.o."}, {671, "AreusEngineeringGmbH"}, {672, "ImpossibleCameraGmbH"}, {673, "InventureTrackSystems"}, {674, "LockedUp"}, {675, "Itude"}, {676, "PacificLockCompany"}, {677, "TendyronCorporation()"}, {678, "RobertBoschGmbH"}, {679, "IlluxtroninternationalB.V."}, {680, "miSportLtd."}, {681, "Chargelib"}, {682, "DopplerLab"}, {683, "BBPOSLimited"}, {684, "RTBElektronikGmbH&Co.KG"}, {685, "RxNetworks,Inc."}, {686, "WeatherFlow,Inc."}, {687, "TechnicolorUSAInc."}, {688, "Bestechnic(Shanghai),Ltd"}, {689, "RadenInc"}, {690, "JouZenOy"}, {691, "CLABERS.P.A."}, {692, "Hyginex,Inc."}, {693, "HANSHINELECTRICRAILWAYCO.,LTD."}, {694, "SchneiderElectric"}, {695, "OortTechnologiesLLC"}, {696, "ChronoTherapeutics"}, {697, "RinnaiCorporation"}, {698, "SwissprimeTechnologiesAG"}, {699, "Koha.,Co.Ltd"}, {700, "GenevacLtd"}, {701, "Chemtronics"}, {702, "SeguroTechnologySp.zo.o."}, {703, "RedbirdFlightSimulations"}, {704, "DashRobotics"}, {705, "LINECorporation"}, {706, "GuillemotCorporation"}, {707, "TechtronicPowerToolsTechnologyLimited"}, {708, "WilsonSportingGoods"}, {709, "Lenovo(Singapore)PteLtd.()"}, {710, "AyatanSensors"}, {711, "ElectronicsTomorrowLimited"}, {712, "VASCODataSecurityInternational,Inc."}, {713, "PayRangeInc."}, {714, "ABOVSemiconductor"}, {715, "AINA-WirelessInc."}, {716, "EijkelkampSoil&Water"}, {717, "BMAergonomicsb.v."}, {718, "TevaBrandedPharmaceuticalProductsR&D,Inc."}, {719, "Anima"}, {720, "3M"}, {721, "EmpaticaSrl"}, {722, "Afero,Inc."}, {723, "PowercastCorporation"}, {724, "SecuyouApS"}, {725, "OMRONCorporation"}, {726, "SendSolutions"}, {727, "NIPPONSYSTEMWARECO.,LTD."}, {728, "Neosfar"}, {729, "FlieglAgrartechnikGmbH"}, {730, "Gilvader"}, {731, "DigiInternationalInc(R)"}, {732, "DeWalchTechnologies,Inc."}, {733, "FlintRehabilitationDevices,LLC"}, {734, "SamsungSDSCo.,Ltd."}, {735, "BlurProductDevelopment"}, {736, "UniversityofMichigan"}, {737, "VictronEnergyBV"}, {738, "NTTdocomo"}, {739, "CarmanahTechnologiesCorp."}, {740, "BytestormLtd."}, {741, "EspressifIncorporated(())"}, {742, "Unwire"}, {743, "ConnectedYard,Inc."}, {744, "AmericanMusicEnvironments"}, {745, "SensogramTechnologies,Inc."}, {746, "FujitsuLimited"}, {747, "ArdicTechnology"}, {748, "DeltaSystems,Inc"}, {749, "HTCCorporation"}, {750, "CitizenHoldingsCo.,Ltd."}, {751, "SMART-INNOVATION.inc"}, {752, "BlackratSoftware"}, {753, "TheIdeaCave,LLC"}, {754, "GoPro,Inc."}, {755, "AuthAir,Inc"}, {756, "Vensi,Inc."}, {757, "IndagemTechLLC"}, {758, "IntemoTechnologies"}, {759, "DreamVisionsco.,Ltd."}, {760, "RunteqOyLtd"}, {761, "IMAGINATIONTECHNOLOGIESLTD"}, {762, "CoSTARTEchnologies"}, {763, "ClariusMobileHealthCorp."}, {764, "ShanghaiFrequenMicroelectronicsCo.,Ltd."}, {765, "Uwanna,Inc."}, {766, "LierdaScience&TechnologyGroupCo.,Ltd."}, {767, "SiliconLaboratories"}, {768, "WorldMotoInc."}, {769, "GiatecScientificInc."}, {770, "LoopDevices,Inc"}, {771, "IACAelectronique"}, {772, "ProxyTechnologies,Inc."}, {773, "SwippApS"}, {774, "LifeLaboratoryInc."}, {775, "FUJIINDUSTRIALCO.,LTD."}, {776, "Surefire,LLC"}, {777, "DolbyLabs"}, {778, "Ellisys"}, {779, "MagnitudeLightingConverters"}, {780, "HiltiAG"}, {781, "DevdataS.r.l."}, {782, "Deviceworx"}, {783, "ShortcutLabs"}, {784, "SGLItaliaS.r.l."}, {785, "PEEQDATA"}, {786, "DucereTechnologiesPvtLtd"}, {787, "DiveNav,Inc."}, {788, "RIIGAISp.zo.o."}, {789, "ThermoFisherScientific"}, {790, "AGMeasurematicsPvt.Ltd."}, {791, "CHUOElectronicsCO.,LTD."}, {792, "AspentaInternational"}, {793, "EugsterFrismagAG"}, {794, "AmberwirelessGmbH"}, {795, "HQInc"}, {796, "LabSensorSolutions"}, {797, "EnterlabApS"}, {798, "Eyefi,Inc."}, {799, "MetaSystemS.p.A."}, {800, "SONOELECTRONICS.CO.,LTD"}, {801, "Jewelbots"}, {802, "CompumedicsLimited"}, {803, "RotorBikeComponents"}, {804, "Astro,Inc."}, {805, "AmotusSolutions"}, {806, "HealthwearTechnologies(Changzhou)Ltd"}, {807, "EssexElectronics"}, {808, "GrundfosA/S"}, {809, "Eargo,Inc."}, {810, "ElectronicDesignLab"}, {811, "ESYLUX"}, {812, "NIPPONSMT.CO.,Ltd"}, {813, "BMinnovationsGmbH"}, {814, "indoormap"}, {815, "OttoQInc"}, {816, "NorthPoleEngineering"}, {817, "3flaresTechnologiesInc."}, {818, "ElectrocompanietA.S."}, {819, "Mul-T-Lock"}, {820, "CorentiumAS"}, {821, "EnlightedInc"}, {822, "GISTIC"}, {823, "AJP2Holdings,LLC"}, {824, "COBIGmbH"}, {825, "BlueSkyScientific,LLC"}, {826, "Appception,Inc."}, {827, "CourtneyThorneLimited"}, {828, "Virtuosys"}, {829, "TPVTechnologyLimited"}, {830, "MonitraSA"}, {831, "AutomationComponents,Inc."}, {832, "Letsenses.r.l."}, {833, "EtesianTechnologiesLLC"}, {834, "GERTECBRASILLTDA."}, {835, "DrekkerDevelopmentPty.Ltd."}, {836, "WhirlInc"}, {837, "LocusPositioning"}, {838, "AcuityBrandsLighting,Inc"}, {839, "PreventBiometrics"}, {840, "Arioneo"}, {841, "VersaMe"}, {842, "Vaddio"}, {843, "LibratoneA/S"}, {844, "HMElectronics,Inc."}, {845, "TASERInternational,Inc."}, {846, "SafeTrustInc."}, {847, "HeartlandPaymentSystems"}, {848, "BitstrataSystemsInc."}, {849, "PiepsGmbH"}, {850, "iRiding(Xiamen)TechnologyCo.,Ltd."}, {851, "AlphaAudiotronics,Inc."}, {852, "TOPPANFORMSCO.,LTD."}, {853, "SigmaDesigns,Inc."}, {854, "SpectrumBrands,Inc."}, {855, "PolymapWireless"}, {856, "MagniWareLtd."}, {857, "NovotecMedicalGmbH"}, {858, "MedicomInnovationPartnera/s"}, {859, "MatrixInc."}, {860, "EatonCorporation"}, {861, "KYS"}, {862, "NayaHealth,Inc."}, {863, "Acromag"}, {864, "InsuletCorporation"}, {865, "WellinksInc."}, {866, "ONSemiconductor"}, {867, "FREELAPSA"}, {868, "FaveroElectronicsSrl"}, {869, "BioMechSensorLLC"}, {870, "BOLTTSportstechnologiesPrivatelimited"}, {871, "SapheInternational"}, {872, "MetormoteAB"}, {873, "littleBits"}, {874, "SetPointMedical"}, {875, "BRControlsProductsBV"}, {876, "Zipcar"}, {877, "AirBoltPtyLtd"}, {878, "KeepTruckinInc"}, {879, "Motiv,Inc."}, {880, "WazombiLabsO"}, {881, "ORBCOMM"}, {882, "NixieLabs,Inc."}, {883, "AppNearMeLtd"}, {884, "HolmanIndustries"}, {885, "ExpainAS"}, {886, "ElectronicTemperatureInstrumentsLtd"}, {887, "PlejdAB"}, {888, "PropellerHealth"}, {889, "ShenzheniMCOElectronicTechnologyCo.,Ltd"}, {890, "Algoria"}, {891, "ApptionLabsInc."}, {892, "CronologicsCorporation"}, {893, "MICRODIALtd."}, {894, "lulabytesS.L."}, {895, "NestecS.A."}, {896, "LLC\"MEGA-Fservice\""}, {897, "SharpCorporation"}, {898, "PrecisionOutcomesLtd"}, {899, "KronosIncorporated"}, {900, "OCOSMOSCo.,Ltd."}, {901, "EmbeddedElectronicSolutionsLtd.dbae2Solutions"}, {902, "AtericaInc."}, {903, "BluStorPMC,Inc."}, {904, "KapschTrafficComAB"}, {905, "ActiveBluCorporation"}, {906, "KohlerMiraLimited"}, {907, "Noke"}, {908, "AppionInc."}, {909, "ResmedLtd"}, {910, "CrownstoneB.V."}, {911, "XiaomiInc."}, {912, "INFOTECHs.r.o."}, {913, "ThingsquareAB"}, {914, "T&D"}, {915, "LAVAZZAS.p.A."}, {916, "NetclearanceSystems,Inc."}, {917, "SDATAWAY"}, {918, "BLOKSGmbH"}, {919, "LEGOSystemA/S"}, {920, "ThetatronicsLtd"}, {921, "NikonCorporation"}, {922, "NeST"}, {923, "SouthSiliconValleyMicroelectronics"}, {924, "ALEInternational"}, {925, "CareViewCommunications,Inc."}, {926, "SchoolBoardLimited"}, {927, "MolexCorporation"}, {928, "IVTWirelessLimited"}, {929, "AlpineLabsLLC"}, {930, "CanduraInstruments"}, {931, "SmartMovtTechnologyCo.,Ltd"}, {932, "TokenZeroLtd"}, {933, "ACECADEnterpriseCo.,Ltd.(ACECAD)"}, {934, "Medela,Inc"}, {935, "AeroScout"}, {936, "EsrilleInc."}, {937, "THINKERLYSRL"}, {938, "ExonSp.zo.o."}, {939, "MeizuTechnologyCo.,Ltd."}, {940, "SmabloLTD"}, {941, "XiQ"}, {942, "AllswellInc."}, {943, "Comm-N-SenseCorpDBAVerigo"}, {944, "VIBRADORMGmbH"}, {945, "OtodataWirelessNetworkInc."}, {946, "PropagationSystemsLimited"}, {947, "MidwestInstruments&Controls"}, {948, "AlphaNodus,inc."}, {949, "petPOMM,Inc"}, {950, "Mattel"}, {951, "AirblyInc."}, {952, "A-SafeLimited"}, {953, "FREDERIQUECONSTANTSA"}, {954, "MaxscendMicroelectronicsCompanyLimited"}, {955, "AbbottDiabetesCare"}, {956, "ASBBankLtd"}, {957, "amadas"}, {958, "AppliedScience,Inc."}, {959, "iLumiSolutionsInc."}, {960, "ArchSystemsInc."}, {961, "EmberTechnologies,Inc."}, {962, "SnapchatInc"}, {963, "CasambiTechnologiesOy"}, {964, "PicoTechnologyInc."}, {965, "St.JudeMedical,Inc."}, {966, "Intricon"}, {967, "StructuralHealthSystems,Inc."}, {968, "AvvelInternational"}, {969, "GallagherGroup"}, {970, "In2thingsAutomationPvt.Ltd."}, {971, "SYSDEVSrl"}, {972, "VonkilTechnologiesLtd"}, {973, "WyndTechnologies,Inc."}, {974, "CONTRINEXS.A."}, {975, "MIRA,Inc."}, {976, "WatteamLtd"}, {977, "DensityInc."}, {978, "IOTPotIndiaPrivateLimited"}, {979, "SigmaConnectivityAB"}, {980, "PEGPEREGOSPA"}, {981, "WyzelinkSystemsInc."}, {982, "YotaDevicesLTD"}, {983, "FINSECUR"}, {984, "Zen-MeLabsLtd"}, {985, "3IWareCo.,Ltd."}, {986, "EnOceanGmbH"}, {987, "Instabeat,Inc"}, {988, "NimaLabs"}, {989, "AndreasStihlAG&Co.KG"}, {990, "NathanRhoadesLLC"}, {991, "GrobTechnologies,LLC"}, {992, "Actions(Zhuhai)TechnologyCo.,Limited"}, {993, "SPDDevelopmentCompanyLtd"}, {994, "SensoanOy"}, {995, "QualcommLifeInc"}, {996, "Chip-ingAG"}, {997, "ffly4u"}, {998, "IoTInstrumentsOy"}, {999, "TRUEFitnessTechnology"}, {1000, "ReinerKartengeraeteGmbH&Co.KG."}, {1001, "SHENZHENLEMONJOYTECHNOLOGYCO.,LTD."}, {1002, "HelloInc."}, {1003, "EvollveInc."}, {1004, "JigowattsInc."}, {1005, "BASICMICRO.COM,INC."}, {1006, "CUBETECHNOLOGIES"}, {1007, "foolographyGmbH"}, {1008, "CLINK"}, {1009, "HestanSmartCookingInc."}, {1010, "WindowMasterA/S"}, {1011, "FlowscapeAB"}, {1012, "PALTechnologiesLtd"}, {1013, "WHERE,Inc."}, {1014, "ItonTechnologyCorp."}, {1015, "OwlLabsInc."}, {1016, "RockfordCorp."}, {1017, "BeconTechnologiesCo.,Ltd."}, {1018, "VyassoftTechnologiesInc"}, {1019, "NoxMedical"}, {1020, "Kimberly-Clark"}, {1021, "TrimbleNavigationLtd."}, {1022, "Littelfuse"}, {1023, "Withings"}, {1024, "i-developerITBeratungUG"}, {1025, ""}, {1026, "SearsHoldingsCorporation"}, {1027, "GantnerElectronicGmbH"}, {1028, "AuthomateInc"}, {1029, "VertexInternational,Inc."}, {1030, "Airtago"}, {1031, "SwissAudioSA"}, {1032, "ToGetHomeInc."}, {1033, "AXIS"}, {1034, "Openmatics"}, {1035, "JanaCareInc."}, {1036, "SenixCorporation"}, {1037, "NorthStarBatteryCompany,LLC"}, {1038, "SKF(U.K.)Limited"}, {1039, "CO-AXTechnology,Inc."}, {1040, "FenderMusicalInstruments"}, {1041, "LuidiaInc"}, {1042, "SEFAM"}, {1043, "WirelessCablesInc"}, {1044, "LightningProtectionInternationalPtyLtd"}, {1045, "UberTechnologiesInc"}, {1046, "SODAGmbH"}, {1047, "FatigueScience"}, {1048, "AlpineElectronicsInc."}, {1049, "NovalogyLTD"}, {1050, "FridayLabsLimited"}, {1051, "OrthoAccelTechnologies"}, {1052, "WaterGuru,Inc."}, {1053, "BenningElektrotechnikundElektronikGmbH&Co.KG"}, {1054, "DellComputerCorporation"}, {1055, "KopinCorporation"}, {1056, "TecBakeryGmbH"}, {1057, "BackboneLabs,Inc."}, {1058, "DELSEYSA"}, {1059, "ChargifiLimited"}, {1060, "TrainesenseLtd."}, {1061, "UnifySoftwareandSolutionsGmbH&Co.KG"}, {1062, "HusqvarnaAB"}, {1063, "Focusfleetandfuelmanagementinc"}, {1064, "SmallLoop,LLC"}, {1065, "ProlonInc."}, {1066, "BDMedical"}, {1067, "iMicroMedIncorporated"}, {1068, "TictoN.V."}, {1069, "MeshtechAS"}, {1070, "MemCachierInc."}, {1071, "DanfossA/S"}, {1072, "SnapStykInc."}, {1073, "AmwayCorporation"}, {1074, "SilkLabs,Inc."}, {1075, "PillsyInc."}, {1076, "HatchBaby,Inc."}, {1077, "BlocksWearablesLtd."}, {1078, "DraysonTechnologies(Europe)Limited"}, {1079, "eBestIOTInc."}, {1080, "HelvarLtd"}, {1081, "RadianceTechnologies"}, {1082, "NuhearaLimited"}, {1083, "Appsideco.,ltd."}, {1084, "DeLaval"}, {1085, "CoilerCorporation"}, {1086, "Thermomedics,Inc."}, {1087, "TentacleSyncGmbH"}, {1088, "Valencell,Inc."}, {1089, "iProtoXiOy"}, {1090, "SECOMCO.,LTD."}, {1091, "TuckerInternationalLLC"}, {1092, "MetanateLimited"}, {1093, "KobianCanadaInc."}, {1094, "NETGEAR,Inc."}, {1095, "FabtronicsAustraliaPtyLtd"}, {1096, "GrandCentrixGmbH"}, {1097, "1UPUSA.comllc"}, {1098, "SHIMANOINC."}, {1099, "NainInc."}, {1100, "LifeStyleLock,LLC"}, {1101, "VEGAGrieshaberKG"}, {1102, "XtravaInc."}, {1103, "TTSTooltechnicSystemsAG&Co.KG"}, {1104, "TeenageEngineeringAB"}, {1105, "TunstallNordicAB"}, {1106, "SvepDesignCenterAB"}, {1107, "GreenPeakTechnologiesBV"}, {1108, "SphinxElectronicsGmbH&CoKG"}, {1109, "Atomation"}, {1110, "NemikConsultingInc"}, {1111, "RFINNOVATION"}, {1112, "MiniSolutionCo.,Ltd."}, {1113, "Lumenetix,Inc"}, {1114, "2048450OntarioInc"}, {1115, "SPACEEKLTD"}, {1116, "DeltaTCorporation"}, {1117, "BostonScientificCorporation"}, {1118, "Nuviz,Inc."}, {1119, "RealTimeAutomation,Inc."}, {1120, "Kolibree"}, {1121, "vhfelektronikGmbH"}, {1122, "BonsaiSystemsGmbH"}, {1123, "FathomSystemsInc."}, {1124, "Bellman&Symfon"}, {1125, "InternationalForteGroupLLC"}, {1126, "CycleLabsSolutionsinc."}, {1127, "CodenexOy"}, {1128, "KynesimLtd"}, {1129, "PalagoAB"}, {1130, "INSIGMAINC."}, {1131, "PMDSolutions"}, {1132, "QingdaoRealtimeTechnologyCo.,Ltd."}, {1133, "BEGAGantenbrink-LeuchtenKG"}, {1134, "PamborLtd."}, {1135, "DevelcoProductsA/S"}, {1136, "iDesigns.r.l."}, {1137, "TiVoCorp"}, {1138, "Control-JPtyLtd"}, {1139, "Steelcase,Inc."}, {1140, "iApartmentco.,ltd."}, {1141, "Icominc."}, {1142, "OxstrenWearableTechnologiesPrivateLimited"}, {1143, "BlueSparkTechnologies"}, {1144, "FarSiteCommunicationsLimited"}, {1145, "mywerksystemGmbH"}, {1146, "SinosunTechnologyCo.,Ltd."}, {1147, "MIYOSHIELECTRONICSCORPORATION"}, {1148, "POWERMATLTD"}, {1149, "OcclyLLC"}, {1150, "OurHubDevIvS"}, {1151, "Pro-Mark,Inc."}, {1152, "DynometricsInc."}, {1153, "QuintraxLimited"}, {1154, "POSTuningUdoVosshenrichGmbH&Co.KG"}, {1155, "MultiCareSystemsB.V."}, {1156, "RevolTechnologiesInc"}, {1157, "SKIDATAAG"}, {1158, "DEVTECNOLOGIAINDUSTRIA,COMERCIOEMANUTENCAODEEQUIPAMENTOSLTDA.-ME"}, {1159, "CentricaConnectedHome"}, {1160, "AutomotiveDataSolutionsInc"}, {1161, "IgarashiEngineering"}, {1162, "TaelekOy"}, {1163, "CPElectronicsLimited"}, {1164, "VectronixAG"}, {1165, "S-LabsSp.zo.o."}, {1166, "CompanionMedical,Inc."}, {1167, "BlueKitchenGmbH"}, {1168, "MattingAB"}, {1169, "SOREX-WirelessSolutionsGmbH"}, {1170, "ADCTechnology,Inc."}, {1171, "LynxemiPteLtd"}, {1172, "SENNHEISERelectronicGmbH&Co.KG"}, {1173, "LMTMercerGroup,Inc"}, {1174, "PolymorphicLabsLLC"}, {1175, "CochlearLimited"}, {1176, "METERGroup,Inc.USA"}, {1177, "RuuviInnovationsLtd."}, {1178, "SituneAS"}, {1179, "nVisti,LLC"}, {1180, "DyOcean"}, {1181, "Uhlmann&ZacherGmbH"}, {1182, "AND!XORLLC"}, {1183, "tictoteAB"}, {1184, "Vypin,LLC"}, {1185, "PNISensorCorporation"}, {1186, "ovrEngineered,LLC"}, {1187, "GT-tronicsHKLtd"}, {1188, "HerbertWaldmannGmbH&Co.KG"}, {1189, "GuangzhouFiiOElectronicsTechnologyCo.,Ltd"}, {1190, "VinetechCo.,Ltd"}, {1191, "DallasLogicCorporation"}, {1192, "BioTex,Inc."}, {1193, "DISCOVERYSOUNDTECHNOLOGY,LLC"}, {1194, "LINKIOSAS"}, {1195, "Harbortronics,Inc."}, {1196, "UndagridB.V."}, {1197, "ShureInc"}, {1198, "ERMElectronicSystemsLTD"}, {1199, "BIOROWERHandelsagenturGmbH"}, {1200, "WebaSportundMed.ArtikelGmbH"}, {1201, "KartographersTechnologiesPvt.Ltd."}, {1202, "TheShadowontheMoon"}, {1203, "mobike(HongKong)Limited"}, {1204, "InuheatGroupAB"}, {1205, "SwiftronixAB"}, {1206, "DiagnopticsTechnologies"}, {1207, "AnalogDevices,Inc."}, {1208, "SoraaInc."}, {1209, "CSRBuildingProductsLimited"}, {1210, "CrestronElectronics,Inc."}, {1211, "NeateboxLtd"}, {1212, "DraegerwerkAG&Co.KGaA"}, {1213, "AlbynMedical"}, {1214, "AverosFZCO"}, {1215, "VITInitiative,LLC"}, {1216, "StatsportsInternational"}, {1217, "Sospitas,s.r.o."}, {1218, "DmetProductsCorp."}, {1219, "MantracourtElectronicsLimited"}, {1220, "TeAMHutchinsAB"}, {1221, "SeibertWilliamsGlass,LLC"}, {1222, "InstaGmbH"}, {1223, "SvantekSp.zo.o."}, {1224, "ShanghaiFlycoElectricalApplianceCo.,Ltd."}, {1225, "ThornwaveLabsInc"}, {1226, "Steiner-OptikGmbH"}, {1227, "NovoNordiskA/S"}, {1228, "EnfluxInc."}, {1229, "SafetechProductsLLC"}, {1230, "GOOOLEDS.R.L."}, {1231, "DOMSicherheitstechnikGmbH&Co.KG"}, {1232, "OlympusCorporation"}, {1233, "KTSGmbH"}, {1234, "AnloqTechnologiesInc."}, {1235, "Queercon,Inc"}, {1236, "5thElementLtd"}, {1237, "GooeeLimited"}, {1238, "LUGLOCLLC"}, {1239, "Blincam,Inc."}, {1240, "FUJIFILMCorporation"}, {1241, "RandMcNally"}, {1242, "FranceschiMarinasnc"}, {1243, "EngineeredAudio,LLC."}, {1244, "IOTTIVE(OPC)PRIVATELIMITED"}, {1245, "4MODTechnology"}, {1246, "LutronElectronicsCo.,Inc."}, {1247, "Emerson"}, {1248, "Guardtec,Inc."}, {1249, "REACTECLIMITED"}, {1250, "EllieGrid"}, {1251, "UnderArmour"}, {1252, "Woodenshark"}, {1253, "AvackOy"}, {1254, "SmartSolutionTechnology,Inc."}, {1255, "REHABTRONICSINC."}, {1256, "STABILOInternational"}, {1257, "BuschJaegerElektroGmbH"}, {1258, "PacificBioscienceLaboratories,Inc"}, {1259, "BirdHomeAutomationGmbH"}, {1260, "MotorolaSolutions"}, {1261, "R9Technology,Inc."}, {1262, "Auxivia"}, {1263, "DaisyWorks,Inc"}, {1264, "KosiLimited"}, {1265, "ThebenAG"}, {1266, "InDreamerTechsolPrivateLimited"}, {1267, "CerevastMedical"}, {1268, "ZanComputeInc."}, {1269, "PirelliTyreS.P.A."}, {1270, "McLearLimited"}, {1271, "ShenzhenHuidingTechnologyCo.,Ltd."}, {1272, "ConvergenceSystemsLimited"}, {1273, "Interactio"}, {1274, "AndrotecGmbH"}, {1275, "BenchmarkDrivesGmbH&Co.KG"}, {1276, "SwingLyncL.L.C."}, {1277, "TapkeyGmbH"}, {1278, "WoosimSystemsInc."}, {1279, "MicrosemiCorporation"}, {1280, "WiliotLTD."}, {1281, "PolarisIND"}, {1282, "Specifi-KaliLLC"}, {1283, "Locoroll,Inc"}, {1284, "PHYPLUSInc"}, {1285, "InplayTechnologiesLLC"}, {1286, "Hager"}, {1287, "Yellowcog"}, {1288, "AxesSystemsp.zo.o."}, {1289, "myLIFTERInc."}, {1290, "Shake-onB.V."}, {1291, "VibrissaInc."}, {1292, "OSRAMGmbH"}, {1293, "TRSystemsGmbH"}, {1294, "YichipMicroelectronics(Hangzhou)Co.,Ltd."}, {1295, "FoundationEngineeringLLC"}, {1296, "UNI-ELECTRONICS,INC."}, {1297, "BrookfieldEquinoxLLC"}, {1298, "SoprodSA"}, {1299, "9974091CanadaInc."}, {1300, "FIBROGmbH"}, {1301, "RBControlsCo.,Ltd."}, {1302, "Footmarks"}, {1303, "AmtronicSverigeAB(formerlyAmcoreAB)"}, {1304, "MAMORIO.inc"}, {1305, "TytoLifeLLC"}, {1306, "LeicaCameraAG"}, {1307, "AngeeTechnologiesLtd."}, {1308, "EDPS"}, {1309, "OFFLineCo.,Ltd."}, {1310, "DetectBlueLimited"}, {1311, "SetecPtyLtd"}, {1312, "TargetCorporation"}, {1313, "IAICorporation"}, {1314, "NSTech,Inc."}, {1315, "MTGCo.,Ltd."}, {1316, "HangzhouiMagicTechnologyCo.,Ltd"}, {1317, "HONGKONGNANOICTECHNOLOGIESCO.,LIMITED"}, {1318, "HoneywellInternationalInc."}, {1319, "AlbrechtJUNG"}, {1320, "LuneraLightingInc."}, {1321, "LumenUAB"}, {1322, "KeynesControlsLtd"}, {1323, "NovartisAG"}, {1324, "GeosatisSA"}, {1325, "EXFO,Inc."}, {1326, "LEDVANCEGmbH"}, {1327, "CenterIDCorp."}, {1328, "Adolene,Inc."}, {1329, "D&MHoldingsInc."}, {1330, "CRESCOWireless,Inc."}, {1331, "NuraOperationsPtyLtd"}, {1332, "Frontiergadget,Inc."}, {1333, "SmartComponentTechnologiesLimited"}, {1334, "ZTRControlSystemsLLC"}, {1335, "MetaLogicsCorporation"}, {1336, "MedelaAG"}, {1337, "OPPLELightingCo.,Ltd"}, {1338, "SavitechCorp.,"}, {1339, "prodigy"}, {1340, "ScreenovateTechnologiesLtd"}, {1341, "TESASA"}, {1342, "CLIM8LIMITED"}, {1343, "SilergyCorp"}, {1344, "SilverPlus,Inc"}, {1345, "Sharknetsrl"}, {1346, "MistSystems,Inc."}, {1347, "MIWALOCKCO.,Ltd"}, {1348, "OrthoSensor,Inc."}, {1349, "CandyHooverGroups.r.l"}, {1350, "ApexarTechnologiesS.A."}, {1351, "LOGICDATAd.o.o."}, {1352, "KnickElektronischeMessgeraeteGmbH&Co.KG"}, {1353, "SmartTechnologiesandInvestmentLimited"}, {1354, "LinoughInc."}, {1355, "AdvancedElectronicDesigns,Inc."}, {1356, "CarefreeScottFetzerCoInc"}, {1357, "Sensome"}, {1358, "FORTRONIKstoritved.o.o."}, {1359, "Sinnoz"}, {1360, "VersaNetworks,Inc."}, {1361, "Sylero"}, {1362, "AvempaceSARL"}, {1363, "NintendoCo.,Ltd."}, {1364, "NationalInstruments"}, {1365, "KROHNEMesstechnikGmbH"}, {1366, "OtodynamicsLtd"}, {1367, "ArwinTechnologyLimited"}, {1368, "benegear,inc."}, {1369, "NewconOptik"}, {1370, "CANDYHOUSE,Inc."}, {1371, "FRANKLINTECHNOLOGYINC"}, {1372, "Lely"}, {1373, "ValveCorporation"}, {1374, "HekatronVertriebsGmbH"}, {1375, "PROTECHS.A.S.DIGIRARDIANDREA&C."}, {1376, "SaritaCareTechAPS(formerlySaritaCareTechIVS)"}, {1377, "FinderS.p.A."}, {1378, "ThalmicLabsInc."}, {1379, "SteinelVertriebGmbH"}, {1380, "BeghelliSpa"}, {1381, "BeijingSmartspaceTechnologiesInc."}, {1382, "CORETRANSPORTTECHNOLOGIESNZLIMITED"}, {1383, "XiamenEveresportsGoodsCo.,Ltd"}, {1384, "BodyportInc."}, {1385, "AudionicsSystem,INC."}, {1386, "FlipnaviCo.,Ltd."}, {1387, "RionCo.,Ltd."}, {1388, "LongRangeSystems,LLC"}, {1389, "RedmondIndustrialGroupLLC"}, {1390, "VIZPININC."}, {1391, "BikeFinderAS"}, {1392, "ConsumerSleepSolutionsLLC"}, {1393, "PSIKICK,INC."}, {1394, "AntTail.com"}, {1395, "LightingScienceGroupCorp."}, {1396, "AFFORDABLEELECTRONICSINC"}, {1397, "IntegralMemroyPlc"}, {1398, "Globalstar,Inc."}, {1399, "TrueWearables,Inc."}, {1400, "WellingtonDriveTechnologiesLtd"}, {1401, "EnsembleTechPrivateLimited"}, {1402, "OMNIRemotes"}, {1403, "DuracellU.S.OperationsInc."}, {1404, "ToorTechnologiesLLC"}, {1405, "InstinctPerformance"}, {1406, "Beco,Inc"}, {1407, "ScufGamingInternational,LLC"}, {1408, "ARANZMedicalLimited"}, {1409, "LYSTECHNOLOGIESLTD"}, {1410, "BreakwallAnalytics,LLC"}, {1411, "CodeBlueCommunications"}, {1412, "GiraGiersiepenGmbH&Co.KG"}, {1413, "HearingLabTechnology"}, {1414, "LEGRAND"}, {1415, "DerichsGmbH"}, {1416, "ALT-TEKNIKLLC"}, {1417, "StarTechnologies"}, {1418, "STARTTODAYCO.,LTD."}, {1419, "MaximIntegratedProducts"}, {1420, "MERCKKommanditgesellschaftaufAktien"}, {1421, "JungheinrichAktiengesellschaft"}, {1422, "OculusVR,LLC"}, {1423, "HENDONSEMICONDUCTORSPTYLTD"}, {1424, "Pur3Ltd"}, {1425, "ViasatGroupS.p.A."}, {1426, "IZITHERM"}, {1427, "SpauldingClinicalResearch"}, {1428, "KohlerCompany"}, {1429, "InorProcessAB"}, {1430, "MySmartBlinds"}, {1431, "RadioPulseInc"}, {1432, "rapitagGmbH"}, {1433, "Lazlo326,LLC."}, {1434, "TeledyneLecroy,Inc."}, {1435, "DataflowSystemsLimited"}, {1436, "MacrogigaElectronics"}, {1437, "TandemDiabetesCare"}, {1438, "Polycom,Inc."}, {1439, "Fisher&PaykelHealthcare"}, {1440, "RCPSoftwareOy"}, {1441, "ShanghaiXiaoyiTechnologyCo.,Ltd."}, {1442, "ADHERIUM(NZ)LIMITED"}, {1443, "AxiomwareSystemsIncorporated"}, {1444, "O.E.M.Controls,Inc."}, {1445, "KiirooBV"}, {1446, "TeleconMobileLimited"}, {1447, "SonosInc"}, {1448, "TomAllebrandiConsulting"}, {1449, "Monidor"}, {1450, "TramexLimited"}, {1451, "NofenceAS"}, {1452, "GoerTekDynaudioCo.,Ltd."}, {1453, "INIA"}, {1454, "CARMATEMFG.CO.,LTD"}, {1455, "ONvocal"}, {1456, "NewTecGmbH"}, {1457, "MedallionInstrumentationSystems"}, {1458, "CARELINDUSTRIESS.P.A."}, {1459, "ParabitSystems,Inc."}, {1460, "WhiteHorseScientificltd"}, {1461, "verisilicon"}, {1462, "ElecsIndustryCo.,Ltd."}, {1463, "BeijingPineconeElectronicsCo.,Ltd."}, {1464, "AmbystomaLabsInc."}, {1465, "SuzhouPairlinkNetworkTechnology"}, {1466, "igloohome"}, {1467, "OxfordMetricsplc"}, {1468, "LevitonMfg.Co.,Inc."}, {1469, "ULCRoboticsInc."}, {1470, "RFIDGlobalbySoftworkSrL"}, {1471, "Real-World-SystemsCorporation"}, {1472, "NaluMedical,Inc."}, {1473, "P.I.Engineering"}, {1474, "GroteIndustries"}, {1475, "Runtime,Inc."}, {1476, "Codecoupsp.zo.o.sp.k."}, {1477, "SELVEGmbH&Co.KG"}, {1478, "SmartAnimalTrainingSystems,LLC"}, {1479, "LippertComponents,INC"}, {1480, "SOMFYSAS"}, {1481, "TBSElectronicsB.V."}, {1482, "MHLCustomInc"}, {1483, "LucentWearLLC"}, {1484, "WATTSELECTRONICS"}, {1485, "RJBrandsLLC"}, {1486, "V-ZUGLtd"}, {1487, "BiowatchSA"}, {1488, "AnovaAppliedElectronics"}, {1489, "LindabAB"}, {1490, "frogblueTECHNOLOGYGmbH"}, {1491, "AcurableLimited"}, {1492, "LAMPLIGHTCo.,Ltd."}, {1493, "TEGAM,Inc."}, {1494, "ZhuhaiJielitechnologyCo.,Ltd"}, {1495, "modum.ioAG"}, {1496, "FarmJennyLLC"}, {1497, "ToyoElectronicsCorporation"}, {1498, "AppliedNeuralResearchCorp"}, {1499, "AvidIdentificationSystems,Inc."}, {1500, "PetronicsInc."}, {1501, "essentimGmbH"}, {1502, "QTMedicalINC."}, {1503, "VIRTUALCLINIC.DIRECTLIMITED"}, {1504, "ViperDesignLLC"}, {1505, "Human,Incorporated"}, {1506, "stAPPtronicsGmbH"}, {1507, "ElementalMachines,Inc."}, {1508, "TaiyoYudenCo.,Ltd"}, {1509, "INEOENERGY&SYSTEMS"}, {1510, "MotionInstrumentsInc."}, {1511, "PressurePro"}, {1512, "COWBOY"}, {1513, "iconmobileGmbH"}, {1514, "ACS-Control-SystemGmbH"}, {1515, "BayerischeMotorenWerkeAG"}, {1516, "GycomSvenskaAB"}, {1517, "FujiXeroxCo.,Ltd"}, {1518, "GlideInc."}, {1519, "SIKOMAS"}, {1520, "beken"}, {1521, "TheLinuxFoundation"}, {1522, "TryandECO.,LTD."}, {1523, "SeeScan"}, {1524, "Clearity,LLC"}, {1525, "GSTAG"}, {1526, "DPTechnics"}, {1527, "TRACMO,INC."}, {1528, "AnkiInc."}, {1529, "HagleitnerHygieneInternationalGmbH"}, {1530, "KonamiSportsLifeCo.,Ltd."}, {1531, "ArbletInc."}, {1532, "MasbandoGmbH"}, {1533, "Innoseis"}, {1534, "Niko"}, {1535, "WellnomicsLtd"}, {1536, "iRobotCorporation"}, {1537, "SchraderElectronics"}, {1538, "GeberitInternationalAG"}, {1539, "FourthEvolutionInc"}, {1540, "Cell2JackLLC"}, {1541, "FMWelectronicFuttereru.Maier-WolfOHG"}, {1542, "JohnDeere"}, {1543, "RookeryTechnologyLtd"}, {1544, "KeySafe-Cloud"}, {1545, "BUCHILabortechnikAG"}, {1546, "IQAirAG"}, {1547, "TriaxTechnologiesInc"}, {1548, "VuzixCorporation"}, {1549, "TDKCorporation"}, {1550, "BlueairAB"}, {1551, "SignifyNetherlands"}, {1552, "ADHGUARDIANUSALLC"}, {1553, "BeurerGmbH"}, {1554, "PlayfinityAS"}, {1555, "HansDinslageGmbH"}, {1556, "OnAssetIntelligence,Inc."}, {1557, "INTERACTIONCorporation"}, {1558, "OS42UG(haftungsbeschraenkt)"}, {1559, "WIZCONNECTEDCOMPANYLIMITED"}, {1560, "Audio-TechnicaCorporation"}, {1561, "SixGuysLabs,s.r.o."}, {1562, "R.W.BeckettCorporation"}, {1563, "silextechnology,inc."}, {1564, "UnivationsLimited"}, {1565, "SENSInnovationApS"}, {1566, "DiamondKinetics,Inc."}, {1567, "PhrameInc."}, {1568, "ForciotOy"}, {1569, "Noordungd.o.o."}, {1570, "BeamLabs,LLC"}, {1571, "PhiladelphiaScientific(U.K.)Limited"}, {1572, "BiovotionAG"}, {1573, "SquarePanda,Inc."}, {1574, "Amplifico"}, {1575, "WEGS.A."}, {1576, "EnstoOy"}, {1577, "PHONEPEPVTLTD"}, {1578, "LunaticoAstronomiaSL"}, {1579, "MinebeaMitsumiInc."}, {1580, "ASPionGmbH"}, {1581, "Vossloh-SchwabeDeutschlandGmbH"}, {1582, "Procept"}, {1583, "ONKYOCorporation"}, {1584, "AsthreaD.O.O."}, {1585, "FortioriDesignLLC"}, {1586, "HugoMullerGmbH&CoKG"}, {1587, "WangiLaiPLT"}, {1588, "FanstelCorp"}, {1589, "Crookwood"}, {1590, "ELECTRONICAINTEGRALDESONIDOS.A."}, {1591, "GiPInnovationToolsGmbH"}, {1592, "LXSOLUTIONSPTYLIMITED"}, {1593, "ShenzhenMinewTechnologiesCo.,Ltd."}, {1594, "ProlojikLimited"}, {1595, "KromekGroupPlc"}, {1596, "ContecMedicalSystemsCo.,Ltd."}, {1597, "XradioTechnologyCo.,Ltd."}, {1598, "TheIndoorLab,LLC"}, {1599, "LDLTECHNOLOGY"}, {1600, "Parkifi"}, {1601, "RevenueCollectionSystemsFRANCESAS"}, {1602, "BluetrumTechnologyCo.,Ltd"}, {1603, "makitacorporation"}, {1604, "ApogeeInstruments"}, {1605, "BM3"}, {1606, "SGVGroupHoldingGmbH&Co.KG"}, {1607, "MED-EL"}, {1608, "UltuneTechnologies"}, {1609, "RyeexTechnologyCo.,Ltd."}, {1610, "OpenResearchInstitute,Inc."}, {1611, "Scale-Tec,Ltd"}, {1612, "ZumtobelGroupAG"}, {1613, "iLOQOy"}, {1614, "KRUXWorksTechnologiesPrivateLimited"}, {1615, "DigitalMatterPtyLtd"}, {1616, "Coravin,Inc."}, {1617, "StasisLabs,Inc."}, {1618, "ITZInnovations-undTechnologiezentrumGmbH"}, {1619, "MeggittSA"}, {1620, "LedlenserGmbH&Co.KG"}, {1621, "RenishawPLC"}, {1622, "ZhuHaiAdvanProTechnologyCompanyLimited"}, {1623, "MeshtronixLimited"}, {1624, "PayexNorgeAS"}, {1625, "UnSeenTechnologiesOy"}, {1626, "ZoundIndustriesInternationalAB"}, {1627, "SesamSolutionsBV"}, {1628, "PixArtImagingInc."}, {1629, "PanduitCorp."}, {1630, "AloAB"}, {1631, "RicohCompanyLtd"}, {1632, "RTCIndustries,Inc."}, {1633, "ModeLightingLimited"}, {1634, "ParticleIndustries,Inc."}, {1635, "AdvancedTelemetrySystems,Inc."}, {1636, "RHATECHNOLOGIESLTD"}, {1637, "PureInternationalLimited"}, {1638, "WTOWerkzeug-EinrichtungenGmbH"}, {1639, "SparkTechnologyLabsInc."}, {1640, "BlebTechnologysrl"}, {1641, "LivanovaUSA,Inc."}, {1642, "BradyWorldwideInc."}, {1643, "DewertOkinGmbH"}, {1644, "ZtoveApS"}, {1645, "VensoEcoSolutionsAB"}, {1646, "EurotronikKranjd.o.o."}, {1647, "HugTechnologyLtd"}, {1648, "GemaSwitzerlandGmbH"}, {1649, "BuzzProductsLtd."}, {1650, "Kopi"}, {1651, "InnovaIdeasLimited"}, {1652, "BeSpoon"}, {1653, "DecoEnterprises,Inc."}, {1654, "ExpaiSolutionsPrivateLimited"}, {1655, "InnovationFirst,Inc."}, {1656, "SABIKOffshoreGmbH"}, {1657, "4iiiiInnovationsInc."}, {1658, "TheEnergyConservatory,Inc."}, {1659, "I.FARM,INC."}, {1660, "Tile,Inc."}, {1661, "FormAthleticaInc."}, {1662, "MbientLabInc"}, {1663, "NETGRIDS.N.C.DIBISSOLIMATTEO,CAMPOREALESIMONE,TOGNETTIFEDERICO"}, {1664, "MannkindCorporation"}, {1665, "TradeFIDESa.s."}, {1666, "PhotronLimited"}, {1667, "EltakoGmbH"}, {1668, "Dermalapps,LLC"}, {1669, "GreenwaldIndustries"}, {1670, "inQsCo.,Ltd."}, {1671, "CherryGmbH"}, {1672, "AmstedDigitalSolutionsInc."}, {1673, "Tacxb.v."}, {1674, "RaytacCorporation"}, {1675, "JiangsuTeranovoTechCo.,Ltd."}, {1676, "ChangzhouSoundDragonElectronicsandAcousticsCo.,Ltd"}, {1677, "JetBeepInc."}, {1678, "RazerInc."}, {1679, "JRMGroupLimited"}, {1680, "EccrineSystems,Inc."}, {1681, "CuriePointAB"}, {1682, "GeorgFischerAG"}, {1683, "Hach-Danaher"}, {1684, "T&ALaboratoriesLLC"}, {1685, "KokiHoldingsCo.,Ltd."}, {1686, "GunakarPrivateLimited"}, {1687, "StemcoProductsInc"}, {1688, "WoodITSecurity,LLC"}, {1689, "RandomLabSAS"}, {1690, "Adero,Inc.(formerlyasTrackR,Inc.)"}, {1691, "DragonchipLimited"}, {1692, "NoomiAB"}, {1693, "VakarosLLC"}, {1694, "DeltaElectronics,Inc."}, {1695, "FlowMotionTechnologiesAS"}, {1696, "OBIQLocationTechnologyInc."}, {1697, "CardoSystems,Ltd"}, {1698, "GlobalworxGmbH"}, {1699, "Nymbus,LLC"}, {1700, "SanyoTechnoSolutionsTottoriCo.,Ltd."}, {1701, "TEKZITELPTYLTD"}, {1702, "RoambeeCorporation"}, {1703, "ChipseaTechnologies(ShenZhen)Corp."}, {1704, "GDMideaAir-ConditioningEquipmentCo.,Ltd."}, {1705, "SoundmaxElectronicsLimited"}, {1706, "ProdualOy"}, {1707, "HMSIndustrialNetworksAB"}, {1708, "IngchipsTechnologyCo.,Ltd."}, {1709, "InnovaSeaSystemsInc."}, {1710, "SenseQInc."}, {1711, "ShoofTechnologies"}, {1712, "BRKBrands,Inc."}, {1713, "SimpliSafe,Inc."}, {1714, "TussockInnovation2013Limited"}, {1715, "TheHablabApS"}, {1716, "SencilionOy"}, {1717, "WabilogicLtd."}, {1718, "SociometricSolutions,Inc."}, {1719, "iCOGNIZEGmbH"}, {1720, "ShadeCraft,Inc"}, {1721, "BeflexInc."}, {1722, "BeaconzoneLtd"}, {1723, "LeaftronixAnalogicSolutionsPrivateLimited"}, {1724, "TWSSrl"}, {1725, "ABBOy"}, {1726, "HitSeedOy"}, {1727, "DelcomProductsInc."}, {1728, "CAMES.p.A."}, {1729, "Alarm.comHoldings,Inc"}, {1730, "MeasurlogicInc."}, {1731, "KingIElectronics.Co.,Ltd"}, {1732, "DreamLabsGmbH"}, {1733, "UrbanCompass,Inc"}, {1734, "SimmTronicLimited"}, {1735, "SomatixInc"}, {1736, "Storz&BickelGmbH&Co.KG"}, {1737, "MYLAPSB.V."}, {1738, "ShenzhenZhongguangInfotechTechnologyDevelopmentCo.,Ltd"}, {1739, "Dyeware,LLC"}, {1740, "DongguanSmartActionTechnologyCo.,Ltd."}, {1741, "DIGCorporation"}, {1742, "FIOR&GENTZ"}, {1743, "BelpartsN.V."}, {1744, "EtekcityCorporation"}, {1745, "MeyerSoundLaboratories,Incorporated"}, {1746, "CeoTronicsAG"}, {1747, "TriTeqLockandSecurity,LLC"}, {1748, "DYNAKODETECHNOLOGYPRIVATELIMITED"}, {1749, "SensirionAG"}, {1750, "JCTHealthcarePtyLtd"}, {1751, "FUBAAutomotiveElectronicsGmbH"}, {1752, "AWCompany"}, {1753, "ShanghaiMountainViewSiliconCo.,Ltd."}, {1754, "ZliideTechnologiesApS"}, {1755, "AutomaticLabs,Inc."}, {1756, "IndustrialNetworkControls,LLC"}, {1757, "IntellithingsLtd."}, {1758, "Navcast,Inc."}, {1759, "HubbellLighting,Inc."}, {1760, "Avaya"}, {1761, "MilestoneAVTechnologiesLLC"}, {1762, "AlangoTechnologiesLtd"}, {1763, "SpinlockLtd"}, {1764, "Aluna"}, {1765, "OPTEXCO.,LTD."}, {1766, "NIHONDENGYOKOUSAKU"}, {1767, "VELUXA/S"}, {1768, "AlmendoTechnologiesGmbH"}, {1769, "ZmartfunElectronics,Inc."}, {1770, "SafeLineSwedenAB"}, {1771, "HoustonRadarLLC"}, {1772, "Sigur"}, {1773, "JNeadesLtd"}, {1774, "AvantisSystemsLimited"}, {1775, "ALCARECo.,Ltd."}, {1776, "ChargyTechnologies,SL"}, {1777, "ShibutaniCo.,Ltd."}, {1778, "TrapperDataAB"}, {1779, "AlfredInternationalInc."}, {1780, "NearFieldSolutionsLtd"}, {1781, "VigilTechnologiesInc."}, {1782, "VituloPlusBV"}, {1783, "WILKASchliesstechnikGmbH"}, {1784, "BodyPlusTechnologyCo.,Ltd"}, {1785, "happybrushGmbH"}, {1786, "EnequiAB"}, {1787, "SartoriusAG"}, {1788, "TomCommunicationIndustrialCo.,Ltd."}, {1789, "ESSEmbeddedSystemSolutionsInc."}, {1790, "MahrGmbH"}, {1791, "RedpineSignalsInc"}, {1792, "TraqFreqLLC"}, {1793, "PAFERSTECH"}, {1794, "Akcijusabiedriba\"SAFTEHNIKA\""}, {1795, "BeijingJingdongCenturyTradingCo.,Ltd."}, {1796, "JBXDesignsInc."}, {1797, "ABElectrolux"}, {1798, "WernhervonBraunCenterforASdvancedResearch"}, {1799, "EssityHygieneandHealthAktiebolag"}, {1800, "BeInteractiveCo.,Ltd"}, {1801, "CarewearCorp."}, {1802, "HufHlsbeck&FrstGmbH&Co.KG"}, {1803, "ElementProducts,Inc."}, {1804, "BeijingWinnerMicroelectronicsCo.,Ltd"}, {1805, "SmartSnuggPtyLtd"}, {1806, "FiveCoSarl"}, {1807, "CaliforniaThingsInc."}, {1808, "AudiodoAB"}, {1809, "ABAXAS"}, {1810, "BullGroupCompanyLimited"}, {1811, "RespiriLimited"}, {1812, "MindPeaceSafetyLLC"}, {1813, "VgyanSolutions"}, {1814, "Altonics"}, {1815, "iQsquareBV"}, {1816, "IDIBAIXenginneering"}, {1817, "ECSG"}, {1818, "REVSMARTWEARABLEHKCOLTD"}, {1819, "Precor"}, {1820, "F5Sports,Inc"}, /* 1821 - 65534 reserved */ {65535, "test"}, {0, NULL}}; static const value_string sco_packet[] = { {0, "HV1"}, {1, "HV2"}, {2, "HV3"}, /* 3 - 255 reserved */ {0, NULL}}; static const value_string air_mode[] = { {0, "mu-law log"}, {1, "A-law log"}, {2, "CVSD"}, {3, "transparent data"}, /* 4 - 255 reserved */ {0, NULL}}; static const value_string paging_scheme[] = { {0, "mandatory scheme"}, /* 1 - 255 reserved */ {0, NULL}}; static const value_string paging_scheme_settings[] = { /* for mandatory scheme: */ {0, "R0"}, {1, "R1"}, {2, "R2"}, /* 3 - 255 reserved */ {0, NULL}}; static const value_string afh_mode[] = { {0, "AFH disabled"}, {1, "AFH enabled"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string features_page[] = { {0, "standard features"}, {1, "extended features 64-67"}, {2, "extended features 128-140"}, /* 3 - 255 other feature pages */ {0, NULL}}; static const value_string packet_type_table[] = { {0, "1 Mbps only"}, {1, "2/3 Mbps"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string negotiation_state[] = { {0, "Initiate negotiation"}, {1, "The latest received set of negotiable parameters were possible but these parameters are preferred."}, {2, "The latest received set of negotiable parameters would cause a reserved slot violation."}, {3, "The latest received set of negotiable parameters would cause a latency violation."}, {4, "The latest received set of negotiable parameters are not supported."}, /* 5 - 255 reserved */ {0, NULL}}; static const value_string afh_reporting_mode[] = { {0, "AFH reporting disabled"}, {1, "AFH reporting enabled"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string io_capabilities[] = { {0, "Display Only"}, {1, "Display Yes/No"}, {2, "Keyboard Only"}, {3, "No Input/No Output"}, /* 4 - 255 reserved */ {0, NULL}}; static const value_string oob_auth_data[] = { {0, "No OOB Authentication Data received"}, {1, "OOB Authentication Data received"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string auth_requirements[] = { {0x00, "MITM Protection Not Required - No Bonding"}, {0x01, "MITM Protection Required - No Bonding"}, {0x02, "MITM Protection Not Required - Dedicated Bonding"}, {0x03, "MITM Protection Required - Dedicated Bonding"}, {0x04, "MITM Protection Not Required - General Bonding"}, {0x05, "MITM Protection Required - General Bonding"}, /* 0x06 - 0xff reserved */ {0, NULL}}; static const value_string power_adjust_req[] = { {0, "decrement power one step"}, {1, "increment power one step"}, {2, "increase to maximum power"}, /* 3 - 255 reserved */ {0, NULL}}; static const value_string power_adjust_res[] = { {0, "not supported"}, {1, "changed one step (not min or max)"}, {2, "max power"}, {3, "min power"}, /* 4 - 255 reserved */ {0, NULL}}; static const value_string test_scenario[] = { {0, "Pause Test Mode"}, {1, "Transmitter test - 0 pattern"}, {2, "Transmitter test - 1 pattern"}, {3, "Transmitter test - 1010 pattern"}, {4, "Pseudorandom bit sequence"}, {5, "Closed Loop Back - ACL packets"}, {6, "Closed Loop Back - Synchronous packets"}, {7, "ACL Packets without whitening"}, {8, "Synchronous Packets without whitening"}, {9, "Transmitter test - 1111 0000 pattern"}, /* 10 - 254 reserved */ {255, "Exit Test Mode"}, {0, NULL}}; static const value_string hopping_mode[] = { {0, "RX/TX on single frequency"}, {1, "Normal hopping"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string power_control_mode[] = { {0, "fixed TX output power"}, {1, "adaptive power control"}, /* 2 - 255 reserved */ {0, NULL}}; static const value_string esco_packet_type[] = { {0x00, "NULL/POLL"}, {0x07, "EV3"}, {0x0C, "EV4"}, {0x0D, "EV5"}, {0x26, "2-EV3"}, {0x2C, "2-EV5"}, {0x37, "3-EV3"}, {0x3D, "3-EV5"}, /* other values reserved */ {0, NULL}}; static const value_string notification_value[] = { {0, "passkey entry started"}, {1, "passkey digit entered"}, {2, "passkey digit erased"}, {3, "passkey cleared"}, {4, "passkey entry completed"}, /* 5 - 255 reserved */ {0, NULL}}; /* initialize the subtree pointers */ static gint ett_lmp = -1; static gint ett_lmp_pwradjres = -1; static gint ett_lmp_rate = -1; static gint ett_lmp_timectrl = -1; static gint ett_lmp_features = -1; static gint ett_lmp_featuresext = -1; /* LMP PDUs with short opcodes */ void dissect_vsc(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { /* TODO implement Broadcom VSC opcodes here: * 0: Features Request * 1: Features Response * 0 and 1: Features: 0x%02X%02X%02X%02X * 2: Not Accept * Rejection BPCS Opcode: 0x%02X * Rejection Error Code: 0x%02X * 3: BFC Suspend * 4: BFC Resume Request * if receive direction: * BFC Resume Response (instead) * BFC Link State: 0x%02X * BFC Stack State: 0x%02X * BFC Reserved: 0x%02X\ * 5: BFC Accept * BPCS Accepted Opcode: 0x%02X * */ } void dissect_name_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_nameoffset, tvb, offset, 1, ENC_NA); } void dissect_name_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); proto_tree_add_item(tree, hf_lmp_nameoffset, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_lmp_namelen, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_lmp_namefrag, tvb, offset, 14, ENC_ASCII | ENC_NA); } void dissect_accepted(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_NA); } void dissect_not_accepted(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA); } void dissect_clkoffset_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_clkoffset_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_clkoffset, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_detach(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA); } void dissect_in_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA); } void dissect_comb_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA); } void dissect_unit_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_key, tvb, offset, 16, ENC_NA); } void dissect_au_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA); } void dissect_sres(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 5); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4); proto_tree_add_item(tree, hf_lmp_authres, tvb, offset, 4, ENC_NA); } void dissect_temp_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA); } void dissect_temp_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_key, tvb, offset, 16, ENC_NA); } void dissect_encryption_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_cryptmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_encryption_key_size_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_keysz, tvb, offset, 1, ENC_LITTLE_ENDIAN); int ret = tvb_get_guint8(tvb, offset); DISSECTOR_ASSERT(ret >= 7); } void dissect_start_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA); } void dissect_stop_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_switch_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 5); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4); proto_tree_add_item(tree, hf_lmp_swinst, tvb, offset, 4, ENC_LITTLE_ENDIAN); } void dissect_hold(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 7); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6); proto_tree_add_item(tree, hf_lmp_htime, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_hinst, tvb, offset, 4, ENC_LITTLE_ENDIAN); } void dissect_hold_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 7); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6); proto_tree_add_item(tree, hf_lmp_htime, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_hinst, tvb, offset, 4, ENC_LITTLE_ENDIAN); } void dissect_sniff_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 10); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_dsniff, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_tsniff, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_sniffatt, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_sniffto, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_unsniff_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_park_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_tb, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_nb, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_deltab, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_araddr, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_nbsleep, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_dbsleep, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_daccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_taccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_naccslots, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_npoll, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_maccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_accscheme, tvb, offset, 1, ENC_NA); } void dissect_set_broadcast_scan_window(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int db_present; DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); /* bit0 of timing control flags indicates presence of db */ db_present = tvb_get_guint8(tvb, offset) & 0x01; offset += 1; if (db_present) { DISSECTOR_ASSERT(len == 6); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4); proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; } else { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); } proto_tree_add_item(tree, hf_lmp_bsw, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_modify_beacon(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int db_present; DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); /* bit0 of timing control flags indicates presence of db */ db_present = tvb_get_guint8(tvb, offset) & 0x01; offset += 1; if (db_present) { DISSECTOR_ASSERT(len == 13); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 11); proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; } else { DISSECTOR_ASSERT(len == 11); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9); } proto_tree_add_item(tree, hf_lmp_tb, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_nb, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_deltab, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_daccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_taccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_naccslots, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_npoll, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_maccess, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_accscheme, tvb, offset, 1, ENC_NA); } void dissect_unpark_bd_addr_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int db_present; proto_item; DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); /* bit0 of timing control flags indicates presence of db */ db_present = tvb_get_guint8(tvb, offset) & 0x01; offset += 1; if (db_present) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 15); proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; } else { DISSECTOR_ASSERT(len == 15); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 13); } proto_tree_add_item(tree, hf_lmp_ltaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_ltaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_bdaddr1, tvb, offset, 6, ENC_LITTLE_ENDIAN); offset += 6; proto_tree_add_item(tree, hf_lmp_bdaddr2, tvb, offset, 6, ENC_LITTLE_ENDIAN); offset += 6; } void dissect_unpark_pm_addr_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int db_present; DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); /* bit0 of timing control flags indicates presence of db */ db_present = tvb_get_guint8(tvb, offset) & 0x01; offset += 1; if (db_present) { DISSECTOR_ASSERT(len == 15); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 13); proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; } else { DISSECTOR_ASSERT(len == 13); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 11); } proto_tree_add_item(tree, hf_lmp_ltaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_ltaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_ltaddr3, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_ltaddr4, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr3, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr4, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_ltaddr5, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_lmp_ltaddr6, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr5, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr6, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_ltaddr7, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pmaddr7, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_incr_power_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); /* skipping one byte "for future use" */ } void dissect_decr_power_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); /* skipping one byte "for future use" */ } void dissect_max_power(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_min_power(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_auto_rate(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_preferred_rate(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { proto_item *rate_item; proto_tree *rate_tree; DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); rate_item = proto_tree_add_item(tree, hf_lmp_rate, tvb, offset, 1, ENC_LITTLE_ENDIAN); rate_tree = proto_item_add_subtree(rate_item, ett_lmp_rate); proto_tree_add_item(rate_tree, hf_lmp_rate_fec, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(rate_tree, hf_lmp_rate_size, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(rate_tree, hf_lmp_rate_type, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(rate_tree, hf_lmp_rate_edrsize, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_version_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 6); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5); proto_tree_add_item(tree, hf_lmp_versnr, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_compid, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_subversnr, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_version_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 6); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5); proto_tree_add_item(tree, hf_lmp_versnr, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_compid, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_subversnr, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_features_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 9); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_features, ett_lmp_features, features_fields, ENC_LITTLE_ENDIAN); } void dissect_features_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 9); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8); proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_features, ett_lmp_features, features_fields, ENC_LITTLE_ENDIAN); } void dissect_quality_of_service(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_pollintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_nbc, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_quality_of_service_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_pollintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_nbc, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_sco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 7); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6); proto_tree_add_item(tree, hf_lmp_scohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_dsco, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_tsco, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_scopkt, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_airmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_remove_sco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_scohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA); } void dissect_max_slot(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_maxslots, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_max_slot_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_maxslots, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_timing_accuracy_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_timing_accuracy_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_drift, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_jitter, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_setup_complete(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_use_semi_permanent_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_host_connection_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_slot_offset(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 9); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8); proto_tree_add_item(tree, hf_lmp_slotoffset, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_bdaddr, tvb, offset, 6, ENC_LITTLE_ENDIAN); } void dissect_page_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_pagesch, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pssettings, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_page_scan_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_pagesch, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_pssettings, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_supervision_timeout(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_suptimeout, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_test_activate(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_test_control(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 10); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9); proto_tree_add_uint(tree, hf_lmp_testscen, tvb, offset, 1, tvb_get_guint8(tvb, offset) ^ 0x55); offset += 1; proto_tree_add_uint(tree, hf_lmp_hopmode, tvb, offset, 1, tvb_get_guint8(tvb, offset) ^ 0x55); offset += 1; proto_tree_add_uint(tree, hf_lmp_txfreq, tvb, offset, 1, (tvb_get_guint8(tvb, offset) ^ 0x55) + 2402); //MHz offset += 1; proto_tree_add_uint(tree, hf_lmp_rxfreq, tvb, offset, 1, (tvb_get_guint8(tvb, offset) ^ 0x55) + 2402); offset += 1; proto_tree_add_uint(tree, hf_lmp_pcmode, tvb, offset, 1, tvb_get_guint8(tvb, offset) ^ 0x55); offset += 1; proto_tree_add_uint(tree, hf_lmp_pollper, tvb, offset, 1, (tvb_get_guint8(tvb, offset) ^ 0x55) * 1.25); //ms offset += 1; proto_tree_add_uint(tree, hf_lmp_pkttype, tvb, offset, 1, tvb_get_guint8(tvb, offset) ^ 0x55); offset += 1; proto_tree_add_uint(tree, hf_lmp_testlen, tvb, offset, 2, tvb_get_bits16(tvb, offset * 8, 16, ENC_LITTLE_ENDIAN) ^ 0x5555); } void dissect_encryption_key_size_mask_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 1); } void dissect_encryption_key_size_mask_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_ksmask, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_set_afh(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 16); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 15); proto_tree_add_item(tree, hf_lmp_afhinst, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; proto_tree_add_item(tree, hf_lmp_afhmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_afhchmap, tvb, offset, 10, ENC_NA); } void dissect_encapsulated_header(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_encmaj, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_encmin, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_enclen, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_encapsulated_payload(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_encdata, tvb, offset, 16, ENC_NA); } void dissect_simple_pairing_confirm(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_commit, tvb, offset, 16, ENC_NA); } void dissect_simple_pairing_number(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_nonce, tvb, offset, 16, ENC_NA); } void dissect_dhkey_check(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 17); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16); proto_tree_add_item(tree, hf_lmp_confirm, tvb, offset, 16, ENC_NA); } /* LMP PDUs with extended opcodes */ void dissect_accepted_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_eopinre, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_not_accepted_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 5); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_eopinre, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA); } void dissect_features_req_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int feat_page = 0; DISSECTOR_ASSERT(len == 12); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10); proto_tree_add_item(tree, hf_lmp_fpage, tvb, offset, 1, ENC_LITTLE_ENDIAN); feat_page = tvb_get_guint8(tvb, offset); offset += 1; proto_tree_add_item(tree, hf_lmp_maxsp, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; if (feat_page == 1) { proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_featuresext, ett_lmp_featuresext, extfeatures1_fields, ENC_LITTLE_ENDIAN); } else { proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_featuresext, ett_lmp_featuresext, extfeatures2_fields, ENC_LITTLE_ENDIAN); } } void dissect_features_res_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { int feat_page = 0; DISSECTOR_ASSERT(len == 12); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10); proto_tree_add_item(tree, hf_lmp_fpage, tvb, offset, 1, ENC_LITTLE_ENDIAN); feat_page = tvb_get_guint8(tvb, offset); offset += 1; proto_tree_add_item(tree, hf_lmp_maxsp, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; if (feat_page == 1) { proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_featuresext, ett_lmp_featuresext, extfeatures1_fields, ENC_LITTLE_ENDIAN); } else { proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_featuresext, ett_lmp_featuresext, extfeatures2_fields, ENC_LITTLE_ENDIAN); } } void dissect_packet_type_table_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_pkttypetbl, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_esco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 16); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 14); proto_tree_add_item(tree, hf_lmp_escohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_escoltaddr, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl, ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_desco, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_tesco, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_wesco, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_escotypems, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_lmp_escotypesm, tvb, offset, 1, ENC_NA); offset += 1; proto_tree_add_item(tree, hf_lmp_escolenms, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_escolensm, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_airmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_negstate, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_remove_esco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 4); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2); proto_tree_add_item(tree, hf_lmp_escohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA); } void dissect_channel_classification_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 7); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5); proto_tree_add_item(tree, hf_lmp_afhrptmode, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_afhminintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_afhmaxintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_channel_classification(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 12); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10); proto_tree_add_item(tree, hf_lmp_afhclass, tvb, offset, 10, ENC_NA); } void dissect_sniff_subrating_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 9); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 7); proto_tree_add_item(tree, hf_lmp_maxss, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_minsmt, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_sniffsi, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_sniff_subrating_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 9); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 7); proto_tree_add_item(tree, hf_lmp_maxss, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_minsmt, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; proto_tree_add_item(tree, hf_lmp_sniffsi, tvb, offset, 2, ENC_LITTLE_ENDIAN); } void dissect_pause_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_resume_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_io_capability_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 5); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_iocaps, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_oobauthdata, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_authreqs, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_io_capability_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 5); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3); proto_tree_add_item(tree, hf_lmp_iocaps, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_oobauthdata, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; proto_tree_add_item(tree, hf_lmp_authreqs, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_numeric_comparison_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_passkey_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_oob_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_keypress_notification(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_nottype, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_power_control_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); proto_tree_add_item(tree, hf_lmp_pwradjreq, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_power_control_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { proto_item *pa_item; proto_tree *pa_tree; DISSECTOR_ASSERT(len == 3); DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1); pa_item = proto_tree_add_item(tree, hf_lmp_pwradjres, tvb, offset, 1, ENC_LITTLE_ENDIAN); pa_tree = proto_item_add_subtree(pa_item, ett_lmp_pwradjres); proto_tree_add_item(pa_tree, hf_lmp_pwradj_gfsk, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(pa_tree, hf_lmp_pwradj_dqpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(pa_tree, hf_lmp_pwradj_8dpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN); } void dissect_ping_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } void dissect_ping_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len) { DISSECTOR_ASSERT(len == 2); } /* Link Manager Protocol */ static int dissect_btbrlmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *lmp_item; proto_tree *lmp_tree; int offset; int len; int op; /* opcode */ int eop; /* extended opcode */ // struct timespec start_time; // struct timespec end_time; // clock_gettime(CLOCK_MONOTONIC, &start_time); offset = 0; len = tvb_reported_length(tvb); DISSECTOR_ASSERT(len >= 1); /* make entries in protocol column and info column on summary display */ col_set_str(pinfo->cinfo, COL_PROTOCOL, "LMP"); /* clear the info column first just in case of type fetching failure. */ col_clear(pinfo->cinfo, COL_INFO); // printf("pinfo->p2p_dir:%d\n",pinfo->p2p_dir); switch (pinfo->p2p_dir) { case P2P_DIR_SENT: col_set_str(pinfo->cinfo, COL_INFO, "TX --> "); break; case P2P_DIR_RECV: col_set_str(pinfo->cinfo, COL_INFO, "RX <-- "); break; default: break; } op = tvb_get_guint8(tvb, offset) >> 1; if (op == LMP_ESCAPE_4) { DISSECTOR_ASSERT(len >= 2); eop = tvb_get_guint8(tvb, offset + 1); col_append_str(pinfo->cinfo, COL_INFO, val_to_str(eop, ext_opcode, "Unknown Extended Opcode (%d)")); } else { col_append_str(pinfo->cinfo, COL_INFO, val_to_str(op, opcode, "Unknown Opcode (%d)")); } /* see if we are being asked for details */ if (!tree) return tvb_reported_length(tvb); lmp_item = proto_tree_add_item(tree, proto_btbrlmp, tvb, offset, -1, ENC_NA); lmp_tree = proto_item_add_subtree(lmp_item, ett_lmp); proto_tree_add_item(lmp_tree, hf_lmp_tid, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(lmp_tree, hf_lmp_op, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; switch (op) { case LMP_NAME_REQ: dissect_name_req(lmp_tree, tvb, offset, len); break; case LMP_NAME_RES: dissect_name_res(lmp_tree, tvb, offset, len); break; case LMP_ACCEPTED: dissect_accepted(lmp_tree, tvb, offset, len); break; case LMP_NOT_ACCEPTED: dissect_not_accepted(lmp_tree, tvb, offset, len); break; case LMP_CLKOFFSET_REQ: dissect_clkoffset_req(lmp_tree, tvb, offset, len); break; case LMP_CLKOFFSET_RES: dissect_clkoffset_res(lmp_tree, tvb, offset, len); break; case LMP_DETACH: dissect_detach(lmp_tree, tvb, offset, len); break; case LMP_IN_RAND: dissect_in_rand(lmp_tree, tvb, offset, len); break; case LMP_COMB_KEY: dissect_comb_key(lmp_tree, tvb, offset, len); break; case LMP_UNIT_KEY: dissect_unit_key(lmp_tree, tvb, offset, len); break; case LMP_AU_RAND: dissect_au_rand(lmp_tree, tvb, offset, len); break; case LMP_SRES: dissect_sres(lmp_tree, tvb, offset, len); break; case LMP_TEMP_RAND: dissect_temp_rand(lmp_tree, tvb, offset, len); break; case LMP_TEMP_KEY: dissect_temp_key(lmp_tree, tvb, offset, len); break; case LMP_ENCRYPTION_MODE_REQ: dissect_encryption_mode_req(lmp_tree, tvb, offset, len); break; case LMP_ENCRYPTION_KEY_SIZE_REQ: dissect_encryption_key_size_req(lmp_tree, tvb, offset, len); break; case LMP_START_ENCRYPTION_REQ: dissect_start_encryption_req(lmp_tree, tvb, offset, len); break; case LMP_STOP_ENCRYPTION_REQ: dissect_stop_encryption_req(lmp_tree, tvb, offset, len); break; case LMP_SWITCH_REQ: dissect_switch_req(lmp_tree, tvb, offset, len); break; case LMP_HOLD: dissect_hold(lmp_tree, tvb, offset, len); break; case LMP_HOLD_REQ: dissect_hold_req(lmp_tree, tvb, offset, len); break; case LMP_SNIFF_REQ: dissect_sniff_req(lmp_tree, tvb, offset, len); break; case LMP_UNSNIFF_REQ: dissect_unsniff_req(lmp_tree, tvb, offset, len); break; case LMP_PARK_REQ: dissect_park_req(lmp_tree, tvb, offset, len); break; case LMP_SET_BROADCAST_SCAN_WINDOW: dissect_set_broadcast_scan_window(lmp_tree, tvb, offset, len); break; case LMP_MODIFY_BEACON: dissect_modify_beacon(lmp_tree, tvb, offset, len); break; case LMP_UNPARK_BD_ADDR_REQ: dissect_unpark_bd_addr_req(lmp_tree, tvb, offset, len); break; case LMP_UNPARK_PM_ADDR_REQ: dissect_unpark_pm_addr_req(lmp_tree, tvb, offset, len); break; case LMP_INCR_POWER_REQ: dissect_incr_power_req(lmp_tree, tvb, offset, len); break; case LMP_DECR_POWER_REQ: dissect_decr_power_req(lmp_tree, tvb, offset, len); break; case LMP_MAX_POWER: dissect_max_power(lmp_tree, tvb, offset, len); break; case LMP_MIN_POWER: dissect_min_power(lmp_tree, tvb, offset, len); break; case LMP_AUTO_RATE: dissect_auto_rate(lmp_tree, tvb, offset, len); break; case LMP_PREFERRED_RATE: dissect_preferred_rate(lmp_tree, tvb, offset, len); break; case LMP_VERSION_REQ: dissect_version_req(lmp_tree, tvb, offset, len); break; case LMP_VERSION_RES: dissect_version_res(lmp_tree, tvb, offset, len); break; case LMP_FEATURES_REQ: dissect_features_req(lmp_tree, tvb, offset, len); break; case LMP_FEATURES_RES: dissect_features_res(lmp_tree, tvb, offset, len); break; case LMP_QUALITY_OF_SERVICE: dissect_quality_of_service(lmp_tree, tvb, offset, len); break; case LMP_QUALITY_OF_SERVICE_REQ: dissect_quality_of_service_req(lmp_tree, tvb, offset, len); break; case LMP_SCO_LINK_REQ: dissect_sco_link_req(lmp_tree, tvb, offset, len); break; case LMP_REMOVE_SCO_LINK_REQ: dissect_remove_sco_link_req(lmp_tree, tvb, offset, len); break; case LMP_MAX_SLOT: dissect_max_slot(lmp_tree, tvb, offset, len); break; case LMP_MAX_SLOT_REQ: dissect_max_slot_req(lmp_tree, tvb, offset, len); break; case LMP_TIMING_ACCURACY_REQ: dissect_timing_accuracy_req(lmp_tree, tvb, offset, len); break; case LMP_TIMING_ACCURACY_RES: dissect_timing_accuracy_res(lmp_tree, tvb, offset, len); break; case LMP_SETUP_COMPLETE: dissect_setup_complete(lmp_tree, tvb, offset, len); break; case LMP_USE_SEMI_PERMANENT_KEY: dissect_use_semi_permanent_key(lmp_tree, tvb, offset, len); break; case LMP_HOST_CONNECTION_REQ: dissect_host_connection_req(lmp_tree, tvb, offset, len); break; case LMP_SLOT_OFFSET: dissect_slot_offset(lmp_tree, tvb, offset, len); break; case LMP_PAGE_MODE_REQ: dissect_page_mode_req(lmp_tree, tvb, offset, len); break; case LMP_PAGE_SCAN_MODE_REQ: dissect_page_scan_mode_req(lmp_tree, tvb, offset, len); break; case LMP_SUPERVISION_TIMEOUT: dissect_supervision_timeout(lmp_tree, tvb, offset, len); break; case LMP_TEST_ACTIVATE: dissect_test_activate(lmp_tree, tvb, offset, len); break; case LMP_TEST_CONTROL: dissect_test_control(lmp_tree, tvb, offset, len); break; case LMP_ENCRYPTION_KEY_SIZE_MASK_REQ: dissect_encryption_key_size_mask_req(lmp_tree, tvb, offset, len); break; case LMP_ENCRYPTION_KEY_SIZE_MASK_RES: dissect_encryption_key_size_mask_res(lmp_tree, tvb, offset, len); break; case LMP_SET_AFH: dissect_set_afh(lmp_tree, tvb, offset, len); break; case LMP_ENCAPSULATED_HEADER: dissect_encapsulated_header(lmp_tree, tvb, offset, len); break; case LMP_ENCAPSULATED_PAYLOAD: dissect_encapsulated_payload(lmp_tree, tvb, offset, len); break; case LMP_SIMPLE_PAIRING_CONFIRM: dissect_simple_pairing_confirm(lmp_tree, tvb, offset, len); break; case LMP_SIMPLE_PAIRING_NUMBER: dissect_simple_pairing_number(lmp_tree, tvb, offset, len); break; case LMP_DHKEY_CHECK: dissect_dhkey_check(lmp_tree, tvb, offset, len); break; /* If the initial 7 bits of the opcode have one of the special escape values 124-127 then an additional byte of opcode is located in the second byte of the payload */ case LMP_ESCAPE_1: break; case LMP_ESCAPE_2: break; case LMP_ESCAPE_3: break; case LMP_ESCAPE_4: /* extended opcode */ DISSECTOR_ASSERT(len >= 2); proto_tree_add_item(lmp_tree, hf_lmp_eop, tvb, offset, 1, ENC_NA); offset += 1; switch (eop) { case LMP_ACCEPTED_EXT: dissect_accepted_ext(lmp_tree, tvb, offset, len); break; case LMP_NOT_ACCEPTED_EXT: dissect_not_accepted_ext(lmp_tree, tvb, offset, len); break; case LMP_FEATURES_REQ_EXT: dissect_features_req_ext(lmp_tree, tvb, offset, len); break; case LMP_FEATURES_RES_EXT: dissect_features_res_ext(lmp_tree, tvb, offset, len); break; case LMP_PACKET_TYPE_TABLE_REQ: dissect_packet_type_table_req(lmp_tree, tvb, offset, len); break; case LMP_ESCO_LINK_REQ: dissect_esco_link_req(lmp_tree, tvb, offset, len); break; case LMP_REMOVE_ESCO_LINK_REQ: dissect_remove_esco_link_req(lmp_tree, tvb, offset, len); break; case LMP_CHANNEL_CLASSIFICATION_REQ: dissect_channel_classification_req(lmp_tree, tvb, offset, len); break; case LMP_CHANNEL_CLASSIFICATION: dissect_channel_classification(lmp_tree, tvb, offset, len); break; case LMP_SNIFF_SUBRATING_REQ: dissect_sniff_subrating_req(lmp_tree, tvb, offset, len); break; case LMP_SNIFF_SUBRATING_RES: dissect_sniff_subrating_res(lmp_tree, tvb, offset, len); break; case LMP_PAUSE_ENCRYPTION_REQ: dissect_pause_encryption_req(lmp_tree, tvb, offset, len); break; case LMP_RESUME_ENCRYPTION_REQ: dissect_resume_encryption_req(lmp_tree, tvb, offset, len); break; case LMP_IO_CAPABILITY_REQ: dissect_io_capability_req(lmp_tree, tvb, offset, len); break; case LMP_IO_CAPABILITY_RES: dissect_io_capability_res(lmp_tree, tvb, offset, len); break; case LMP_NUMERIC_COMPARISON_FAILED: dissect_numeric_comparison_failed(lmp_tree, tvb, offset, len); break; case LMP_PASSKEY_FAILED: dissect_passkey_failed(lmp_tree, tvb, offset, len); break; case LMP_OOB_FAILED: dissect_oob_failed(lmp_tree, tvb, offset, len); break; case LMP_KEYPRESS_NOTIFICATION: dissect_keypress_notification(lmp_tree, tvb, offset, len); break; case LMP_POWER_CONTROL_REQ: dissect_power_control_req(lmp_tree, tvb, offset, len); break; case LMP_POWER_CONTROL_RES: dissect_power_control_res(lmp_tree, tvb, offset, len); break; case LMP_PING_REQ: dissect_ping_req(lmp_tree, tvb, offset, len); break; case LMP_PING_RES: dissect_ping_res(lmp_tree, tvb, offset, len); break; default: break; } default: break; } // clock_gettime(CLOCK_MONOTONIC, &end_time); // long measured_latency_ns = ((end_time.tv_sec - start_time.tv_sec) * 1000000000UL) + (end_time.tv_nsec - start_time.tv_nsec) / 1000; // printf("lmp=%ld\n", measured_latency_ns); /* Return the amount of data this dissector was able to dissect */ return tvb_reported_length(tvb); }; /* register the protocol with Wireshark */ void proto_register_btbrlmp(void) { /* list of fields */ static hf_register_info hf[] = { {&hf_lmp_accscheme, {"Access Scheme", "btbrlmp.accscheme", FT_UINT8, BASE_DEC, VALS(access_scheme), 0xf0, NULL, HFILL}}, {&hf_lmp_afhchmap, {"AFH Channel Map", "btbrlmp.afhchmap", /* could break out individual channels but long */ FT_BYTES, BASE_NONE, NULL, 0x0, "Adaptive Frequency Hopping Channel Map", HFILL}}, {&hf_lmp_afhclass, {"AFH Channel Classification", "btbrlmp.afhclass", /* could break out individual channels but long */ FT_BYTES, BASE_NONE, NULL, 0x0, "Adaptive Frequency Hopping Channel Classification", HFILL}}, {&hf_lmp_afhinst, {"AFH Instant", "btbrlmp.afhinst", FT_UINT32, BASE_HEX, NULL, 0x0, "Adaptive Frequency Hopping Instant (slot)", HFILL}}, {&hf_lmp_afhmaxintvl, {"AFH Max Interval", "btbrlmp.maxintvl", FT_UINT16, BASE_HEX, NULL, 0x0, "Adaptive Maximum Interval in slots", HFILL}}, {&hf_lmp_afhminintvl, {"AFH Min Interval", "btbrlmp.minintvl", FT_UINT16, BASE_HEX, NULL, 0x0, "Adaptive Minimum Interval in slots", HFILL}}, {&hf_lmp_afhmode, {"AFH Mode", "btbrlmp.afhmode", FT_UINT8, BASE_DEC, VALS(afh_mode), 0x0, "Adaptive Frequency Hopping Mode", HFILL}}, {&hf_lmp_afhrptmode, {"AFH Reporting Mode", "btbrlmp.afhrptmode", FT_UINT8, BASE_DEC, VALS(afh_reporting_mode), 0x0, "Adaptive Frequency Hopping Reporting Mode", HFILL}}, {&hf_lmp_airmode, {"Air Mode", "btbrlmp.airmode", FT_UINT8, BASE_HEX, VALS(air_mode), 0x0, NULL, HFILL}}, {&hf_lmp_araddr, {"AR_ADDR", "btbrlmp.araddr", FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}}, {&hf_lmp_authreqs, {"Authentication Requirements", "btbrlmp.authreqs", FT_UINT8, BASE_HEX, VALS(auth_requirements), 0x00, NULL, HFILL}}, {&hf_lmp_authres, {"Authentication Response", "btbrlmp.authres", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_bdaddr, {"BD_ADDR", "btbrlmp.bdaddr", FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff, NULL, HFILL}}, {&hf_lmp_bdaddr1, {"BD_ADDR 1", "btbrlmp.bdaddr", FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff, NULL, HFILL}}, {&hf_lmp_bdaddr2, {"BD_ADDR2", "btbrlmp.bdaddr", FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff, "BD_ADDR 2", HFILL}}, {&hf_lmp_bsw, {"Broadcast Scan Window", "btbrlmp.bsw", FT_UINT16, BASE_HEX, NULL, 0x0, "Broadcast Scan Window in slots", HFILL}}, {&hf_lmp_clkoffset, {"Clock Offset", "btbrlmp.clkoffset", FT_UINT16, BASE_DEC, NULL, 0x0, "Clock Offset in units of 1.25 ms", HFILL}}, {&hf_lmp_commit, {"Commitment Value", "btbrlmp.commit", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_confirm, {"Confirmation Value", "btbrlmp.confirm", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_compid, {"Company ID", "btbrlmp.compid", FT_UINT16, BASE_DEC, VALS(compid), 0x0, NULL, HFILL}}, {&hf_lmp_cryptmode, {"Encryption Mode", "btbrlmp.cryptmode", FT_UINT8, BASE_DEC, VALS(encryption_mode), 0x0, NULL, HFILL}}, {&hf_lmp_daccess, {"Daccess", "btbrlmp.daccess", FT_UINT8, BASE_HEX, NULL, 0x0, "Daccess in slots", HFILL}}, {&hf_lmp_db, {"Db", "btbrlmp.db", FT_UINT16, BASE_HEX, NULL, 0x0, "Db in slots", HFILL}}, {&hf_lmp_dbsleep, {"Dbsleep", "btbrlmp.dbsleep", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_deltab, {"Deltab", "btbrlmp.deltab", FT_UINT8, BASE_HEX, NULL, 0x0, "Deltab in slots", HFILL}}, {&hf_lmp_desco, {"Desco", "btbrlmp.desco", FT_UINT8, BASE_HEX, NULL, 0x0, "Desco in slots", HFILL}}, {&hf_lmp_drift, {"Drift", "btbrlmp.drift", FT_UINT8, BASE_DEC, NULL, 0x0, "Drift in ppm", HFILL}}, {&hf_lmp_dsco, {"Dsco", "btbrlmp.dsco", FT_UINT8, BASE_HEX, NULL, 0x0, "Dsco in slots", HFILL}}, {&hf_lmp_dsniff, {"Dsniff", "btbrlmp.dsniff", FT_UINT16, BASE_HEX, NULL, 0x0, "Dsniff in slots", HFILL}}, {&hf_lmp_encdata, {"Encapsulated Data", "btbrlmp.encdata", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_enclen, {"Encapsulated Length", "btbrlmp.enclen", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_encmaj, {"Encapsulated Major Type", "btbrlmp.encmaj", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_encmin, {"Encapsulated Minor Type", "btbrlmp.encmin", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_eop, {"Extended Opcode", "btbrlmp.eop", FT_UINT8, BASE_DEC, VALS(ext_opcode), 0x0, NULL, HFILL}}, {&hf_lmp_eopinre, {"In Response To", "btbrlmp.eopinre", FT_UINT8, BASE_DEC, VALS(ext_opcode), 0x0, "Extended Opcode this is in response to", HFILL}}, {&hf_lmp_escolenms, {"Packet Length M -> S", "btbrlmp.escolenms", FT_UINT16, BASE_DEC, NULL, 0x0, "Packet Length in bytes Master to Slave", HFILL}}, {&hf_lmp_escolensm, {"Packet Length S -> M", "btbrlmp.escolensm", FT_UINT16, BASE_DEC, NULL, 0x0, "Packet Length in bytes Slave to Master", HFILL}}, {&hf_lmp_escotypems, {"eSCO Packet Type M -> S", "btbrlmp.escotypems", FT_UINT8, BASE_HEX, VALS(esco_packet_type), 0x0, "eSCO Packet Type Master to Slave", HFILL}}, {&hf_lmp_escotypesm, {"eSCO Packet Type S -> M", "btbrlmp.escotypesm", FT_UINT8, BASE_HEX, VALS(esco_packet_type), 0x0, "eSCO Packet Type Slave to Master", HFILL}}, {&hf_lmp_err, {"Error Code", "btbrlmp.err", FT_UINT8, BASE_HEX, VALS(error_code), 0x0, NULL, HFILL}}, {&hf_lmp_escohdl, {"eSCO Handle", "btbrlmp.escohdl", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_escoltaddr, {"eSCO LT_ADDR", "btbrlmp.escoltaddr", FT_UINT8, BASE_HEX, NULL, 0x0, "eSCO Logical Transport Address", HFILL}}, {&hf_lmp_features, {"Features", "btbrlmp.features", FT_UINT64, BASE_HEX, NULL, 0x0, "Feature Mask", HFILL}}, {&hf_lmp_feat_3slot, {"3 slot packets", "btbrlmp.feat.3slot", FT_BOOLEAN, 64, NULL, 0x1, NULL, HFILL}}, {&hf_lmp_feat_5slot, {"5 slot packets", "btbrlmp.feat.5slot", FT_BOOLEAN, 64, NULL, 0x1 << 1, NULL, HFILL}}, {&hf_lmp_feat_enc, {"Encryption", "btbrlmp.feat.enc", FT_BOOLEAN, 64, NULL, 0x1 << 2, NULL, HFILL}}, {&hf_lmp_feat_slotoff, {"Slot offset", "btbrlmp.feat.slotoff", FT_BOOLEAN, 64, NULL, 0x1 << 3, NULL, HFILL}}, {&hf_lmp_feat_timacc, {"Timing accuracy", "btbrlmp.feat.timacc", FT_BOOLEAN, 64, NULL, 0x1 << 4, NULL, HFILL}}, {&hf_lmp_feat_rolesw, {"Role switch", "btbrlmp.feat.rolesw", FT_BOOLEAN, 64, NULL, 0x1 << 5, NULL, HFILL}}, {&hf_lmp_feat_holdmo, {"Hold mode", "btbrlmp.feat.holdmo", FT_BOOLEAN, 64, NULL, 0x1 << 6, NULL, HFILL}}, {&hf_lmp_feat_sniffmo, {"Sniff mode", "btbrlmp.feat.sniffmo", FT_BOOLEAN, 64, NULL, 0x1 << 7, NULL, HFILL}}, {&hf_lmp_feat_res0, {"Reserved", "btbrlmp.feat.res0", FT_BOOLEAN, 64, NULL, 0x1 << 8, NULL, HFILL}}, {&hf_lmp_feat_pwrctlreq, {"Power control requests", "btbrlmp.feat.pwrctlreq", FT_BOOLEAN, 64, NULL, 0x1 << 9, NULL, HFILL}}, {&hf_lmp_feat_cqddr, {"Channel quality driven data rate (CQDDR)", "btbrlmp.feat.cqddr", FT_BOOLEAN, 64, NULL, 0x1 << 10, NULL, HFILL}}, {&hf_lmp_feat_sco, {"SCO link", "btbrlmp.feat.sco", FT_BOOLEAN, 64, NULL, 0x1 << 11, NULL, HFILL}}, {&hf_lmp_feat_hv2, {"HV2 packets", "btbrlmp.feat.hv2", FT_BOOLEAN, 64, NULL, 0x1 << 12, NULL, HFILL}}, {&hf_lmp_feat_hv3, {"HV3 packets", "btbrlmp.feat.hv3", FT_BOOLEAN, 64, NULL, 0x1 << 13, NULL, HFILL}}, {&hf_lmp_feat_mulaw, {"u-law log synchronous data", "btbrlmp.feat.mulaw", FT_BOOLEAN, 64, NULL, 0x1 << 14, NULL, HFILL}}, {&hf_lmp_feat_alaw, {"A-law log synchronous data", "btbrlmp.feat.alaw", FT_BOOLEAN, 64, NULL, 0x1 << 15, NULL, HFILL}}, {&hf_lmp_feat_cvsd, {"CVSD synchronous data", "btbrlmp.feat.cvsd", FT_BOOLEAN, 64, NULL, 0x1 << 16, NULL, HFILL}}, {&hf_lmp_feat_pagneg, {"Paging parameter negotiation", "btbrlmp.feat.pagneg", FT_BOOLEAN, 64, NULL, 0x1 << 17, NULL, HFILL}}, {&hf_lmp_feat_pwrctl, {"Power control", "btbrlmp.feat.pwrctl", FT_BOOLEAN, 64, NULL, 0x1 << 18, NULL, HFILL}}, {&hf_lmp_feat_transsync, {"Transparent synchronous data", "btbrlmp.feat.transsync", FT_BOOLEAN, 64, NULL, 0x1 << 19, NULL, HFILL}}, {&hf_lmp_feat_flowctl1, {"Flow control lag (least significant bit)", "btbrlmp.feat.flowctl1", FT_BOOLEAN, 64, NULL, 0x1 << 20, NULL, HFILL}}, {&hf_lmp_feat_flowctl2, {"Flow control lag (middle bit)", "btbrlmp.feat.flowctl2", FT_BOOLEAN, 64, NULL, 0x1 << 21, NULL, HFILL}}, {&hf_lmp_feat_flowctl3, {"Flow control lag (most significant bit)", "btbrlmp.feat.flowctl3", FT_BOOLEAN, 64, NULL, 0x1 << 22, NULL, HFILL}}, {&hf_lmp_feat_bcenc, {"Broadcast Encryption", "btbrlmp.feat.bcenc", FT_BOOLEAN, 64, NULL, 0x1 << 23, NULL, HFILL}}, {&hf_lmp_feat_res1, {"Reserved for future use", "btbrlmp.feat.res1", FT_BOOLEAN, 64, NULL, 0x1 << 24, NULL, HFILL}}, {&hf_lmp_feat_acl2, {"Enhanced Data Rate ACL 2 Mb/s mode", "btbrlmp.feat.acl2", FT_BOOLEAN, 64, NULL, 0x1 << 25, NULL, HFILL}}, {&hf_lmp_feat_acl3, {"Enhanced Data Rate ACL 3 Mb/s mode", "btbrlmp.feat.acl3", FT_BOOLEAN, 64, NULL, 0x1 << 26, NULL, HFILL}}, {&hf_lmp_feat_eninq, {"Enhanced inquiry scan", "btbrlmp.feat.eninq", FT_BOOLEAN, 64, NULL, 0x1 << 27, NULL, HFILL}}, {&hf_lmp_feat_intinq, {"Interlaced inquiry scan", "btbrlmp.feat.intinq", FT_BOOLEAN, 64, NULL, 0x1 << 28, NULL, HFILL}}, {&hf_lmp_feat_intpag, {"Interlaced page scan", "btbrlmp.feat.intpag", FT_BOOLEAN, 64, NULL, 0x1 << 29, NULL, HFILL}}, {&hf_lmp_feat_rssiinq, {"RSSI with inquiry results", "btbrlmp.feat.rssiinq", FT_BOOLEAN, 64, NULL, 0x1 << 30, NULL, HFILL}}, {&hf_lmp_feat_ev3, {"Extended SCO link (EV3 packets)", "btbrlmp.feat.ev3", FT_BOOLEAN, 64, NULL, 0x80000000, NULL, HFILL}}, {&hf_lmp_feat_ev4, {"EV4 packets", "btbrlmp.feat.ev4", FT_BOOLEAN, 64, NULL, 0x100000000, NULL, HFILL}}, {&hf_lmp_feat_ev5, {"EV5 packets", "btbrlmp.feat.ev5", FT_BOOLEAN, 64, NULL, 0x100000000 << 1, NULL, HFILL}}, {&hf_lmp_feat_res2, {"Reserved", "btbrlmp.feat.res2", FT_BOOLEAN, 64, NULL, 0x100000000 << 2, NULL, HFILL}}, {&hf_lmp_feat_afhcapsl, {"AFH capable slave", "btbrlmp.feat.afhcapsl", FT_BOOLEAN, 64, NULL, 0x100000000 << 3, NULL, HFILL}}, {&hf_lmp_feat_afhclasl, {"AFH classification slave", "btbrlmp.feat.afhclasl", FT_BOOLEAN, 64, NULL, 0x100000000 << 4, NULL, HFILL}}, {&hf_lmp_feat_bredrnotsup, {"BR/EDR Not Supported", "btbrlmp.feat.bredrnotsup", FT_BOOLEAN, 64, NULL, 0x100000000 << 5, NULL, HFILL}}, {&hf_lmp_feat_lesup, {"LE Supported (Controller)", "btbrlmp.feat.lesup", FT_BOOLEAN, 64, NULL, 0x100000000 << 6, NULL, HFILL}}, {&hf_lmp_feat_3slotenh, {"3-slot Enhanced Data Rate ACL packets", "btbrlmp.feat.3slotenh", FT_BOOLEAN, 64, NULL, 0x100000000 << 7, NULL, HFILL}}, {&hf_lmp_feat_5slotenh, {"5-slot Enhanced Data Rate ACL packets", "btbrlmp.feat.5slotenh", FT_BOOLEAN, 64, NULL, 0x100000000 << 8, NULL, HFILL}}, {&hf_lmp_feat_sniffsubr, {"Sniff subrating", "btbrlmp.feat.sniffsubr", FT_BOOLEAN, 64, NULL, 0x100000000 << 9, NULL, HFILL}}, {&hf_lmp_feat_pauseenc, {"Pause encryption", "btbrlmp.feat.pauseenc", FT_BOOLEAN, 64, NULL, 0x100000000 << 10, NULL, HFILL}}, {&hf_lmp_feat_afhcapma, {"AFH capable master", "btbrlmp.feat.afhcapma", FT_BOOLEAN, 64, NULL, 0x100000000 << 11, NULL, HFILL}}, {&hf_lmp_feat_afhclama, {"AFH classification master", "btbrlmp.feat.afhclama", FT_BOOLEAN, 64, NULL, 0x100000000 << 12, NULL, HFILL}}, {&hf_lmp_feat_esco2, {"Enhanced Data Rate eSCO 2 Mb/s mode", "btbrlmp.feat.esco2", FT_BOOLEAN, 64, NULL, 0x100000000 << 13, NULL, HFILL}}, {&hf_lmp_feat_esco3, {"Enhanced Data Rate eSCO 3 Mb/s mode", "btbrlmp.feat.esco3", FT_BOOLEAN, 64, NULL, 0x100000000 << 14, NULL, HFILL}}, {&hf_lmp_feat_3slotenhesco, {"3-slot Enhanced Data Rate eSCO packets", "btbrlmp.feat.3slotenhesco", FT_BOOLEAN, 64, NULL, 0x100000000 << 15, NULL, HFILL}}, {&hf_lmp_feat_extinqres, {"Extended Inquiry Response", "btbrlmp.feat.extinqres", FT_BOOLEAN, 64, NULL, 0x100000000 << 16, NULL, HFILL}}, {&hf_lmp_feat_simlebredr, {"Simultaneous LE and BR/EDR to Same Device Capable (Controller)", "btbrlmp.feat.simlebredr", FT_BOOLEAN, 64, NULL, 0x100000000 << 17, NULL, HFILL}}, {&hf_lmp_feat_res3, {"Reserved", "btbrlmp.feat.res3", FT_BOOLEAN, 64, NULL, 0x100000000 << 18, NULL, HFILL}}, {&hf_lmp_feat_ssp, {"Secure Simple Pairing", "btbrlmp.feat.ssp", FT_BOOLEAN, 64, NULL, 0x100000000 << 19, NULL, HFILL}}, {&hf_lmp_feat_enpdu, {"Encapsulated PDU", "btbrlmp.feat.enpdu", FT_BOOLEAN, 64, NULL, 0x100000000 << 20, NULL, HFILL}}, {&hf_lmp_feat_edr, {"Erroneous Data Reporting", "btbrlmp.feat.edr", FT_BOOLEAN, 64, NULL, 0x100000000 << 21, NULL, HFILL}}, {&hf_lmp_feat_nonflush, {"Non-flushable Packet Boundary Flag", "btbrlmp.feat.nonflush", FT_BOOLEAN, 64, NULL, 0x100000000 << 22, NULL, HFILL}}, {&hf_lmp_feat_res4, {"Reserved", "btbrlmp.feat.res4", FT_BOOLEAN, 64, NULL, 0x100000000 << 23, NULL, HFILL}}, {&hf_lmp_feat_lstimche, {"Link Supervision Timeout Changed Event", "btbrlmp.feat.lstimche", FT_BOOLEAN, 64, NULL, 0x100000000 << 24, NULL, HFILL}}, {&hf_lmp_feat_inqtxpwr, {"Inquiry TX Power Level", "btbrlmp.feat.inqtxpwr", FT_BOOLEAN, 64, NULL, 0x100000000 << 25, NULL, HFILL}}, {&hf_lmp_feat_enhpwr, {"Enhanced Power Control", "btbrlmp.feat.enhpwr", FT_BOOLEAN, 64, NULL, 0x100000000 << 26, NULL, HFILL}}, {&hf_lmp_feat_res5, {"Reserved", "btbrlmp.feat.res5", FT_BOOLEAN, 64, NULL, 0x100000000 << 27, NULL, HFILL}}, {&hf_lmp_feat_res6, {"Reserved", "btbrlmp.feat.res6", FT_BOOLEAN, 64, NULL, 0x100000000 << 28, NULL, HFILL}}, {&hf_lmp_feat_res7, {"Reserved", "btbrlmp.feat.res7", FT_BOOLEAN, 64, NULL, 0x100000000 << 29, NULL, HFILL}}, {&hf_lmp_feat_res8, {"Reserved", "btbrlmp.feat.res8", FT_BOOLEAN, 64, NULL, 0x100000000 << 30, NULL, HFILL}}, {&hf_lmp_feat_extfeat, {"Extended features", "btbrlmp.feat.extfeat", FT_BOOLEAN, 64, NULL, 0x100000000 << 31, NULL, HFILL}}, {&hf_lmp_featuresext, {"Extended Features", "btbrlmp.featuresext", FT_UINT64, BASE_HEX, NULL, 0x0, "Extended Feature Mask", HFILL}}, /* extended features page 1 */ {&hf_lmp_efeat_ssp, {"Secure Simple Pairing (Host Support)", "btbrlmp.efeat.ssp", FT_BOOLEAN, 64, NULL, 0x1 << 0, NULL, HFILL}}, {&hf_lmp_efeat_lesup, {"LE Supported (Host)", "btbrlmp.efeat.lesup", FT_BOOLEAN, 64, NULL, 0x1 << 1, NULL, HFILL}}, {&hf_lmp_efeat_lebredr, {"Simultaneous LE and BR/EDR to Same Device Capable (Host)", "btbrlmp.efeat.lebredr", FT_BOOLEAN, 64, NULL, 0x1 << 2, NULL, HFILL}}, {&hf_lmp_efeat_sch, {"Secure Connections (Host Support)", "btbrlmp.efeat.sch", FT_BOOLEAN, 64, NULL, 0x1 << 3, NULL, HFILL}}, /* extended features page 2 */ {&hf_lmp_efeat_csbma, {"Connectionless Slave Broadcast - Master Operation", "btbrlmp.efeat.csbma", FT_BOOLEAN, 64, NULL, 0x1 << 0, NULL, HFILL}}, {&hf_lmp_efeat_csbsl, {"Connectionless Slave Broadcast - Slave Operation", "btbrlmp.efeat.csbsl", FT_BOOLEAN, 64, NULL, 0x1 << 1, NULL, HFILL}}, {&hf_lmp_efeat_syntr, {"Synchronization Train", "btbrlmp.efeat.syntr", FT_BOOLEAN, 64, NULL, 0x1 << 2, NULL, HFILL}}, {&hf_lmp_efeat_synsc, {"Synchronization Scan", "btbrlmp.efeat.synsc", FT_BOOLEAN, 64, NULL, 0x1 << 3, NULL, HFILL}}, {&hf_lmp_efeat_inqresnote, {"Inquiry Response Notification Event", "btbrlmp.efeat.inqresnote", FT_BOOLEAN, 64, NULL, 0x1 << 4, NULL, HFILL}}, {&hf_lmp_efeat_genintsc, {"Generalized interlaced scan", "btbrlmp.efeat.genintsc", FT_BOOLEAN, 64, NULL, 0x1 << 5, NULL, HFILL}}, {&hf_lmp_efeat_ccadj, {"Coarse Clock Adjustment", "btbrlmp.efeat.ccadj", FT_BOOLEAN, 64, NULL, 0x1 << 6, NULL, HFILL}}, {&hf_lmp_efeat_res0, {"Reserved for future use", "btbrlmp.efeat.res0", FT_BOOLEAN, 64, NULL, 0x1 << 7, NULL, HFILL}}, {&hf_lmp_efeat_scc, {"Secure Connections (Controller Support)", "btbrlmp.efeat.scc", FT_BOOLEAN, 64, NULL, 0x1 << 8, NULL, HFILL}}, {&hf_lmp_efeat_ping, {"Ping", "btbrlmp.efeat.ping", FT_BOOLEAN, 64, NULL, 0x1 << 9, NULL, HFILL}}, {&hf_lmp_efeat_res1, {"Reserved for future use", "btbrlmp.efeat.res1", FT_BOOLEAN, 64, NULL, 0x1 << 10, NULL, HFILL}}, {&hf_lmp_efeat_trnud, {"Train nudging", "btbrlmp.efeat.trnud", FT_BOOLEAN, 64, NULL, 0x1 << 11, NULL, HFILL}}, {&hf_lmp_efeat_sam, {"Slot Availability Mask", "btbrlmp.efeat.sam", FT_BOOLEAN, 64, NULL, 0x1 << 12, //typo in the BT standard defines this as >>10 ... NULL, HFILL}}, {&hf_lmp_fpage, {"Features Page", "btbrlmp.fpage", FT_UINT8, BASE_DEC, VALS(features_page), 0x0, NULL, HFILL}}, {&hf_lmp_htime, {"Hold Time", "btbrlmp.htime", FT_UINT16, BASE_HEX, NULL, 0x0, "Hold Time in slots", HFILL}}, {&hf_lmp_hinst, {"Hold Instant", "btbrlmp.hinst", FT_UINT32, BASE_HEX, NULL, 0x0, "Hold Instant (slot)", HFILL}}, {&hf_lmp_hopmode, {"Hopping Mode", "btbrlmp.hopmode", FT_UINT8, BASE_DEC, VALS(hopping_mode), 0x0, NULL, HFILL}}, {&hf_lmp_iocaps, {"IO Capabilities", "btbrlmp.iocaps", FT_UINT8, BASE_DEC, VALS(io_capabilities), 0x0, "Input/Output Capabilities", HFILL}}, {&hf_lmp_jitter, {"Jitter", "btbrlmp.jitter", FT_UINT8, BASE_DEC, NULL, 0x0, "Jitter in microseconds", HFILL}}, {&hf_lmp_key, {"Key", "btbrlmp.key", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_keysz, {"Key Size", "btbrlmp.keysz", FT_UINT8, BASE_DEC, NULL, 0x0, "Key Size in bytes", HFILL}}, {&hf_lmp_ksmask, {"Key Size Mask", "btbrlmp.ksmask", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_ltaddr1, {"LT_ADDR 1", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0x0f, "Logical Transport Address 1", HFILL}}, {&hf_lmp_ltaddr2, {"LT_ADDR 2", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0xf0, "Logical Transport Address 2", HFILL}}, {&hf_lmp_ltaddr3, {"LT_ADDR 3", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0x0f, "Logical Transport Address 3", HFILL}}, {&hf_lmp_ltaddr4, {"LT_ADDR 4", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0xf0, "Logical Transport Address 4", HFILL}}, {&hf_lmp_ltaddr5, {"LT_ADDR 5", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0x0f, "Logical Transport Address 5", HFILL}}, {&hf_lmp_ltaddr6, {"LT_ADDR 6", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0xf0, "Logical Transport Address 6", HFILL}}, {&hf_lmp_ltaddr7, {"LT_ADDR 7", "btbrlmp.ltaddr", FT_UINT8, BASE_HEX, NULL, 0x0f, "Logical Transport Address 7", HFILL}}, {&hf_lmp_maccess, {"Maccess", "btbrlmp.maccess", FT_UINT8, BASE_HEX, NULL, 0x0f, "Number of access windows", HFILL}}, {&hf_lmp_maxslots, {"Max Slots", "btbrlmp.maxslots", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_maxsp, {"Max Supported Page", "btbrlmp.maxsp", FT_UINT8, BASE_DEC, NULL, 0x0, "Highest extended features page with non-zero bit", HFILL}}, {&hf_lmp_maxss, {"Max Sniff Subrate", "btbrlmp.maxss", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_minsmt, {"Min Sniff Mode Timeout", "btbrlmp.minsmt", FT_UINT16, BASE_HEX, NULL, 0x0, "Min Sniff Mode Timeout in slots", HFILL}}, {&hf_lmp_naccslots, {"Nacc-slots", "btbrlmp.naccslots", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_namefrag, {"Name Fragment", "btbrlmp.namefrag", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_namelen, {"Name Length", "btbrlmp.namelen", FT_UINT8, BASE_DEC, NULL, 0x0, "Name Length in bytes", HFILL}}, {&hf_lmp_nameoffset, {"Name Offset", "btbrlmp.nameoffset", FT_UINT8, BASE_DEC, NULL, 0x0, "Name Offset in bytes", HFILL}}, {&hf_lmp_nb, {"Nb", "btbrlmp.nb", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_nbc, {"Nbc", "btbrlmp.nbc", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_nbsleep, {"Nbsleep", "btbrlmp.nbsleep", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_negstate, {"Negotiation State", "btbrlmp.negstate", FT_UINT8, BASE_DEC, VALS(negotiation_state), 0x0, NULL, HFILL}}, {&hf_lmp_nonce, {"Nonce Value", "btbrlmp.nonce", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_nottype, {"Notification Type", "btbrlmp.nottype", FT_UINT8, BASE_DEC, VALS(notification_value), 0x0, NULL, HFILL}}, {&hf_lmp_npoll, {"Npoll", "btbrlmp.npoll", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_oobauthdata, {"OOB Authentication Data", "btbrlmp.oobauthdata", FT_UINT8, BASE_DEC, VALS(oob_auth_data), 0x00, NULL, HFILL}}, {&hf_lmp_op, {"Opcode", "btbrlmp.op", FT_UINT8, BASE_DEC, VALS(opcode), 0xfe, NULL, HFILL}}, {&hf_lmp_opinre, {"In Response To", "btbrlmp.opinre", FT_UINT8, BASE_DEC, VALS(opcode), 0x7f, "Opcode this is in response to", HFILL}}, {&hf_lmp_pagesch, {"Paging Scheme", "btbrlmp.pagesch", FT_UINT8, BASE_DEC, VALS(paging_scheme), 0x0, NULL, HFILL}}, {&hf_lmp_pcmode, {"Power Control Mode", "btbrlmp.pcmode", FT_UINT8, BASE_DEC, VALS(power_control_mode), 0x0, NULL, HFILL}}, {&hf_lmp_pkttype, {"Packet Type", "btbrlmp.pkttype", /* FIXME break out further */ FT_UINT8, BASE_HEX, NULL, 0x0, "Packet Type", HFILL}}, {&hf_lmp_pkttypetbl, {"Packet Type Table", "btbrlmp.pkttypetbl", FT_UINT8, BASE_DEC, VALS(packet_type_table), 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr, {"PM_ADDR", "btbrlmp.pmaddr", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr1, {"PM_ADDR 1", "btbrlmp.pmaddr1", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr2, {"PM_ADDR 2", "btbrlmp.pmaddr2", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr3, {"PM_ADDR 3", "btbrlmp.pmaddr3", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr4, {"PM_ADDR 4", "btbrlmp.pmaddr4", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr5, {"PM_ADDR 5", "btbrlmp.pmaddr5", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr6, {"PM_ADDR 6", "btbrlmp.pmaddr6", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pmaddr7, {"PM_ADDR 7", "btbrlmp.pmaddr7", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pollintvl, {"Poll Interval", "btbrlmp.pollintvl", FT_UINT16, BASE_HEX, NULL, 0x0, "Poll Interval in slots", HFILL}}, {&hf_lmp_pollper, {"Poll Period (ms)", "btbrlmp.pollper", FT_UINT8, BASE_DEC, NULL, 0x0, "Poll Period in units of 1.25 ms", HFILL}}, {&hf_lmp_pssettings, {"Paging Scheme Settings", "btbrlmp.pssettings", FT_UINT8, BASE_DEC, VALS(paging_scheme_settings), 0x0, NULL, HFILL}}, {&hf_lmp_pwradjreq, {"Power Adjustment Request", "btbrlmp.pwradjreq", FT_UINT8, BASE_DEC, VALS(power_adjust_req), 0x0, NULL, HFILL}}, {&hf_lmp_pwradjres, {"Power Adjustment Response", "btbrlmp.pwradjres", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_pwradj_8dpsk, {"8DPSK", "btbrlmp.pwradj_8dpsk", FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x30, "8DPSK Power Adjustment Response", HFILL}}, {&hf_lmp_pwradj_dqpsk, {"DQPSK", "btbrlmp.pwradj_dqpsk", FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x0C, "DQPSK Power Adjustment Response", HFILL}}, {&hf_lmp_pwradj_gfsk, {"GFSK", "btbrlmp.pwradj_gfsk", FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x03, "GFSK Power Adjustment Response", HFILL}}, {&hf_lmp_rand, {"Random Number", "btbrlmp.rand", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_rate, {"Data Rate", "btbrlmp.rate", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_rate_fec, {"FEC", "btbrlmp.rate.fec", FT_BOOLEAN, BASE_DEC, TFS(&fec), 0x01, "Forward Error Correction", HFILL}}, {&hf_lmp_rate_size, {"Packet Size", "btbrlmp.rate.size", FT_UINT8, BASE_HEX, VALS(packet_size), 0x06, "Basic Rate Packet Size", HFILL}}, {&hf_lmp_rate_type, {"EDR Type", "btbrlmp.rate.type", FT_UINT8, BASE_HEX, VALS(edr_type), 0x18, "Enhanced Data Rate type", HFILL}}, {&hf_lmp_rate_edrsize, {"EDR Size", "btbrlmp.rate.edrsize", FT_UINT8, BASE_HEX, VALS(packet_size), 0x60, "Enhanced Data Rate packet size", HFILL}}, {&hf_lmp_rxfreq, {"RX Frequency (MHz)", "btbrlmp.rxfreq", FT_UINT8, BASE_DEC, NULL, 0x0, "Receive Frequency in MHz above 2402", HFILL}}, {&hf_lmp_scohdl, {"SCO Handle", "btbrlmp.scohdl", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_scopkt, {"SCO Packet", "btbrlmp.scopkt", FT_UINT8, BASE_DEC, VALS(sco_packet), 0x0, NULL, HFILL}}, {&hf_lmp_slotoffset, {"Slot Offset", "btbrlmp.slotoffset", FT_UINT16, BASE_DEC, NULL, 0x0, "Slot Offset in microseconds", HFILL}}, {&hf_lmp_sniffatt, {"Sniff Attempt", "btbrlmp.sniffatt", FT_UINT16, BASE_HEX, NULL, 0x0, "Number of receive slots", HFILL}}, {&hf_lmp_sniffsi, {"Sniff Subrating Instant", "btbrlmp.sniffsi", FT_UINT32, BASE_HEX, NULL, 0x0, "Sniff Subrating Instant (slot)", HFILL}}, {&hf_lmp_sniffto, {"Sniff Timeout", "btbrlmp.sniffto", FT_UINT16, BASE_HEX, NULL, 0x0, "Number of receive slots", HFILL}}, {&hf_lmp_subversnr, {"SubVersNr", "btbrlmp.subversnr", FT_UINT16, BASE_DEC, NULL, 0x0, "SubVersion", HFILL}}, {&hf_lmp_suptimeout, {"Supervision Timeout", "btbrlmp.suptimeout", FT_UINT16, BASE_HEX, NULL, 0x0, "Supervision Timeout in slots", HFILL}}, {&hf_lmp_swinst, {"Switch Instant", "btbrlmp.swinst", FT_UINT32, BASE_HEX, NULL, 0x0, "Switch Instant (slot)", HFILL}}, {&hf_lmp_taccess, {"Taccess", "btbrlmp.taccess", FT_UINT8, BASE_HEX, NULL, 0x0, "Taccess in slots", HFILL}}, {&hf_lmp_tb, {"Tb", "btbrlmp.tb", FT_UINT16, BASE_HEX, NULL, 0x0, "Tb in slots", HFILL}}, {&hf_lmp_tesco, {"Tesco", "btbrlmp.tesco", FT_UINT8, BASE_HEX, NULL, 0x0, "Tesco in slots", HFILL}}, {&hf_lmp_testlen, {"Test Length", "btbrlmp.testlen", FT_UINT16, BASE_DEC, NULL, 0x00, "Length of test sequence in bytes", HFILL}}, {&hf_lmp_testscen, {"Test Scenario", "btbrlmp.testscen", FT_UINT8, BASE_DEC, VALS(test_scenario), 0x00, NULL, HFILL}}, {&hf_lmp_tid, {"TID", "btbrlmp.tid", FT_BOOLEAN, BASE_DEC, TFS(&tid), 0x01, "Transaction ID", HFILL}}, {&hf_lmp_timectrl, {"Timing Control Flags", "btbrlmp.timectrl", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}}, {&hf_lmp_time_change, {"Timing Change", "btbrlmp.time.change", FT_BOOLEAN, 8, TFS(&time_change), 0x01, NULL, HFILL}}, {&hf_lmp_time_init, {"Initialization", "btbrlmp.time.init", FT_BOOLEAN, 8, TFS(&time_init), 0x02, NULL, HFILL}}, {&hf_lmp_time_accwin, {"Access Window", "btbrlmp.time.accwin", FT_BOOLEAN, 8, TFS(&time_accwin), 0x04, NULL, HFILL}}, {&hf_lmp_tsco, {"Tsco", "btbrlmp.tsco", FT_UINT8, BASE_HEX, NULL, 0x0, "Tsco in slots", HFILL}}, {&hf_lmp_tsniff, {"Tsniff", "btbrlmp.tsniff", FT_UINT16, BASE_HEX, NULL, 0x0, "Tsniff in slots", HFILL}}, {&hf_lmp_txfreq, {"TX Frequency (MHz)", "btbrlmp.txfreq", FT_UINT8, BASE_DEC, NULL, 0x0, "Transmit Frequency in MHz above 2402", HFILL}}, {&hf_lmp_versnr, {"VersNr", "btbrlmp.versnr", FT_UINT8, BASE_DEC, VALS(versnr), 0x0, "Version", HFILL}}, {&hf_lmp_wesco, {"Wesco", "btbrlmp.wesco", FT_UINT8, BASE_HEX, NULL, 0x0, "Number of slots in retransmission window", HFILL}}, }; /* protocol subtree arrays */ static gint *ett[] = { &ett_lmp, &ett_lmp_pwradjres, &ett_lmp_rate, &ett_lmp_timectrl, &ett_lmp_features, &ett_lmp_featuresext, }; /* register the protocol name and description */ proto_btbrlmp = proto_register_protocol( "Bluetooth Link Manager Protocol", /* full name */ "btlmp", /* short name */ "btlmp" /* abbreviation (e.g. for filters) */ ); register_dissector("btlmp", dissect_btbrlmp, proto_btbrlmp); /* register the header fields and subtrees used */ proto_register_field_array(proto_btbrlmp, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } void proto_reg_handoff_btbrlmp(void) { } /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * * Local variables: * c-basic-offset: 4 * tab-width: 8 * indent-tabs-mode: nil * End: * * vi: set shiftwidth=4 tabstop=8 expandtab: * :indentSize=4:tabSize=8:noTabs=true: */