From d6316a3f9c65524fbf72c2e740f54bcb12eb4a2a Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 1 Nov 2005 12:19:19 +0000 Subject: [PATCH] hcidump: Add SCO/eSCO decoding for LMP --- tools/parser/lmp.c | 109 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 105 insertions(+), 4 deletions(-) diff --git a/tools/parser/lmp.c b/tools/parser/lmp.c index 96cd961b6..2ddcc6601 100644 --- a/tools/parser/lmp.c +++ b/tools/parser/lmp.c @@ -453,7 +453,7 @@ static inline void switch_req_dump(int level, struct frame *frm) uint32_t instant = LMP_U32(frm); p_indent(level, frm); - printf("switch instant 0x%04x\n", instant); + printf("switch instant 0x%4.4x\n", instant); } static inline void hold_dump(int level, struct frame *frm) @@ -465,7 +465,7 @@ static inline void hold_dump(int level, struct frame *frm) printf("hold time 0x%4.4x\n", time); p_indent(level, frm); - printf("hold instant 0x%04x\n", instant); + printf("hold instant 0x%4.4x\n", instant); } static inline void sniff_req_dump(int level, struct frame *frm) @@ -673,6 +673,43 @@ static inline void quality_of_service_dump(int level, struct frame *frm) printf("N_BC %d\n", nbc); } +static inline void sco_link_req_dump(int level, struct frame *frm) +{ + uint8_t handle = LMP_U8(frm); + uint8_t timing = LMP_U8(frm); + uint8_t dsco = LMP_U8(frm); + uint8_t tsco = LMP_U8(frm); + uint8_t packet = LMP_U8(frm); + uint8_t airmode = LMP_U8(frm); + + p_indent(level, frm); + printf("SCO handle %d\n", handle); + + p_indent(level, frm); + printf("timing control flags 0x%2.2x\n", timing); + + p_indent(level, frm); + printf("D_SCO %d T_SCO %d\n", dsco, tsco); + + p_indent(level, frm); + printf("SCO packet 0x%2.2x\n", packet); + + p_indent(level, frm); + printf("air mode 0x%2.2x\n", airmode); +} + +static inline void remove_sco_link_req_dump(int level, struct frame *frm) +{ + uint8_t handle = LMP_U8(frm); + uint8_t error = LMP_U8(frm); + + p_indent(level, frm); + printf("SCO handle %d\n", handle); + + p_indent(level, frm); + printf("error code 0x%2.2x\n", error); +} + static inline void max_slots_dump(int level, struct frame *frm) { uint8_t slots = LMP_U8(frm); @@ -727,7 +764,7 @@ static inline void supervision_timeout_dump(int level, struct frame *frm) printf("supervision timeout %d\n", timeout); } -static inline void encryption_key_size_mask_res(int level, struct frame *frm) +static inline void encryption_key_size_mask_res_dump(int level, struct frame *frm) { uint16_t mask = LMP_U16(frm); @@ -754,6 +791,58 @@ static inline void packet_type_table_dump(int level, struct frame *frm) } } +static inline void esco_link_req_dump(int level, struct frame *frm) +{ + uint8_t handle = LMP_U8(frm); + uint8_t ltaddr = LMP_U8(frm); + uint8_t timing = LMP_U8(frm); + uint8_t desco = LMP_U8(frm); + uint8_t tesco = LMP_U8(frm); + uint8_t wesco = LMP_U8(frm); + uint8_t mspkt = LMP_U8(frm); + uint8_t smpkt = LMP_U8(frm); + uint16_t mslen = LMP_U16(frm); + uint16_t smlen = LMP_U16(frm); + uint8_t airmode = LMP_U8(frm); + uint8_t negstate = LMP_U8(frm); + + p_indent(level, frm); + printf("eSCO handle %d\n", handle); + + p_indent(level, frm); + printf("eSCO LT_ADDR %d\n", ltaddr); + + p_indent(level, frm); + printf("timing control flags 0x%2.2x\n", timing); + + p_indent(level, frm); + printf("D_eSCO %d T_eSCO %d W_eSCO %d\n", desco, tesco, wesco); + + p_indent(level, frm); + printf("eSCO M->S packet type 0x%2.2x length %d\n", mspkt, mslen); + + p_indent(level, frm); + printf("eSCO S->M packet type 0x%2.2x length %d\n", smpkt, smlen); + + p_indent(level, frm); + printf("air mode 0x%2.2x\n", airmode); + + p_indent(level, frm); + printf("negotiation state 0x%2.2x\n", negstate); +} + +static inline void remove_esco_link_req_dump(int level, struct frame *frm) +{ + uint8_t handle = LMP_U8(frm); + uint8_t error = LMP_U8(frm); + + p_indent(level, frm); + printf("eSCO handle %d\n", handle); + + p_indent(level, frm); + printf("error code 0x%2.2x\n", error); +} + static inline void channel_classification_req_dump(int level, struct frame *frm) { uint8_t mode = LMP_U8(frm); @@ -896,6 +985,12 @@ void lmp_dump(int level, struct frame *frm) case 42: quality_of_service_dump(level + 1, frm); return; + case 43: + sco_link_req_dump(level + 1, frm); + return; + case 44: + remove_sco_link_req_dump(level + 1, frm); + return; case 45: case 46: max_slots_dump(level + 1, frm); @@ -914,7 +1009,7 @@ void lmp_dump(int level, struct frame *frm) supervision_timeout_dump(level + 1, frm); return; case 59: - encryption_key_size_mask_res(level + 1, frm); + encryption_key_size_mask_res_dump(level + 1, frm); return; case 60: set_afh_dump(level + 1, frm); @@ -945,6 +1040,12 @@ void lmp_dump(int level, struct frame *frm) case 127 + (11 << 7): packet_type_table_dump(level + 1, frm); return; + case 127 + (12 << 7): + esco_link_req_dump(level + 1, frm); + return; + case 127 + (13 << 7): + remove_esco_link_req_dump(level + 1, frm); + return; case 127 + (16 << 7): channel_classification_req_dump(level + 1, frm); return; -- 2.47.3