From: Yun-Hao Chung <howardchung@xxxxxxxxxx> This implements the missing fields in the ESCO connection setup and accept commands. --- An example of output looks like below: < HCI Command: Enhanced Setup Synchronous Connection (0x01|0x003d) plen 59 Handle: 256 Address: 00:11:22:33:44:55 (Google, Inc.) Transmit bandwidth: 8000 Receive bandwidth: 8000 Transmit Coding Format: Codec: Transparent (0x03) Receive Coding Format: Codec: Transparent (0x03) Transmit Codec Frame Size: 60 Receive Codec Frame Size: 60 Input Coding Format: Codec: Transparent (0x03) Output Coding Format: Codec: Transparent (0x03) Input Coded Data Size: 16 Output Coded Data Size: 16 Input PCM Data Format: 2's complement Output PCM Data Format: 2's complement Input PCM Sample Payload MSB Position: 0 Output PCM Sample Payload MSB Position: 0 Input Data Path: HCI Output Data Path: HCI Input Transport Unit Size: 0 Output Transport Unit Size: 0 Max latency: 13 Packet type: 0x0380 3-EV3 may not be used 2-EV5 may not be used 3-EV5 may not be used Retransmission effort: Optimize for link quality (0x02) monitor/packet.c | 98 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/monitor/packet.c b/monitor/packet.c index 5abf164eb..c2599fe68 100644 --- a/monitor/packet.c +++ b/monitor/packet.c @@ -4845,6 +4845,50 @@ static void flow_spec_modify_cmd(uint16_t index, const void *data, uint8_t size) print_flow_spec("RX", cmd->rx_flow_spec); } +static void print_coding_format(const char *label, + const uint8_t coding_format[5]) +{ + print_field("%s:", label); + packet_print_codec_id(" Codec", coding_format[0]); + if (coding_format[0] == 0xff) { + print_field(" Company: %s", + bt_compidtostr(get_le16(coding_format + 1))); + print_field(" Vendor Specific Codec: 0x%4.4x", + get_le16(coding_format + 3)); + } +} + +static void print_pcm_data_format(const char *label, uint8_t pcm) +{ + switch (pcm) { + case 0: + print_field("%s: NA", label); + break; + case 1: + print_field("%s: 1's complement", label); + break; + case 2: + print_field("%s: 2's complement", label); + break; + case 3: + print_field("%s: Sign-magnitude", label); + break; + case 4: + print_field("%s: Unsigned", label); + break; + default: + print_field("%s: Unknown (0x%2.2x)", label, pcm); + } +} + +static void print_data_path(const char *label, uint8_t data_path) +{ + if (data_path == 0) + print_field("%s: HCI", label); + else + print_field("%s: Vendor Specific (0x%2.2x)", label, data_path); +} + static void enhanced_setup_sync_conn_cmd(uint16_t index, const void *data, uint8_t size) { @@ -4853,9 +4897,30 @@ static void enhanced_setup_sync_conn_cmd(uint16_t index, const void *data, print_handle(cmd->handle); print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth)); print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth)); - - /* TODO */ - + print_coding_format("Transmit Coding Format", cmd->tx_coding_format); + print_coding_format("Receive Coding Format", cmd->rx_coding_format); + print_field("Transmit Codec Frame Size: %d", + le16_to_cpu(cmd->tx_codec_frame_size)); + print_field("Receive Codec Frame Size: %d", + le16_to_cpu(cmd->rx_codec_frame_size)); + print_coding_format("Input Coding Format", cmd->input_coding_format); + print_coding_format("Output Coding Format", cmd->output_coding_format); + print_field("Input Coded Data Size: %d", + le16_to_cpu(cmd->input_coded_data_size)); + print_field("Output Coded Data Size: %d", + le16_to_cpu(cmd->output_coded_data_size)); + print_pcm_data_format("Input PCM Data Format", + cmd->input_pcm_data_format); + print_pcm_data_format("Output PCM Data Format", + cmd->output_pcm_data_format); + print_field("Input PCM Sample Payload MSB Position: %d", + cmd->input_pcm_msb_position); + print_field("Output PCM Sample Payload MSB Position: %d", + cmd->output_pcm_msb_position); + print_data_path("Input Data Path", cmd->input_data_path); + print_data_path("Output Data Path", cmd->output_data_path); + print_field("Input Transport Unit Size: %d", cmd->input_unit_size); + print_field("Output Transport Unit Size: %d", cmd->output_unit_size); print_field("Max latency: %d", le16_to_cpu(cmd->max_latency)); print_pkt_type_sco(cmd->pkt_type); print_retransmission_effort(cmd->retrans_effort); @@ -4870,9 +4935,30 @@ static void enhanced_accept_sync_conn_request_cmd(uint16_t index, print_bdaddr(cmd->bdaddr); print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth)); print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth)); - - /* TODO */ - + print_coding_format("Transmit Coding Format", cmd->tx_coding_format); + print_coding_format("Receive Coding Format", cmd->rx_coding_format); + print_field("Transmit Codec Frame Size: %d", + le16_to_cpu(cmd->tx_codec_frame_size)); + print_field("Receive Codec Frame Size: %d", + le16_to_cpu(cmd->rx_codec_frame_size)); + print_coding_format("Input Coding Format", cmd->input_coding_format); + print_coding_format("Output Coding Format", cmd->output_coding_format); + print_field("Input Coded Data Size: %d", + le16_to_cpu(cmd->input_coded_data_size)); + print_field("Output Coded Data Size: %d", + le16_to_cpu(cmd->output_coded_data_size)); + print_pcm_data_format("Input PCM Data Format", + cmd->input_pcm_data_format); + print_pcm_data_format("Output PCM Data Format", + cmd->output_pcm_data_format); + print_field("Input PCM Sample Payload MSB Position: %d", + cmd->input_pcm_msb_position); + print_field("Output PCM Sample Payload MSB Position: %d", + cmd->output_pcm_msb_position); + print_data_path("Input Data Path", cmd->input_data_path); + print_data_path("Output Data Path", cmd->output_data_path); + print_field("Input Transport Unit Size: %d", cmd->input_unit_size); + print_field("Output Transport Unit Size: %d", cmd->output_unit_size); print_field("Max latency: %d", le16_to_cpu(cmd->max_latency)); print_pkt_type_sco(cmd->pkt_type); print_retransmission_effort(cmd->retrans_effort); -- 2.46.0.184.g6999bdac58-goog