* [PATCH 1/2] hcidump: decode extended window size option @ 2011-08-25 10:34 Emeltchenko Andrei 2011-08-25 10:34 ` [PATCH 2/2] hcidump: parse extended control field in l2cap Emeltchenko Andrei 0 siblings, 1 reply; 4+ messages in thread From: Emeltchenko Andrei @ 2011-08-25 10:34 UTC (permalink / raw) To: linux-bluetooth From: Andrei Emeltchenko <andrei.emeltchenko@intel.com> --- parser/l2cap.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/parser/l2cap.c b/parser/l2cap.c index 6345f8d..217008d 100644 --- a/parser/l2cap.c +++ b/parser/l2cap.c @@ -560,6 +560,12 @@ static void conf_opt(int level, void *ptr, int len, int in, uint16_t cid) conf_efs(h->val); break; + case L2CAP_CONF_EWS: + printf("EWS"); + if (h->len > 0) + printf(" %d", get_val(h->val, h->len)); + break; + default: printf("Unknown (type %2.2x, len %d)", h->type & 0x7f, h->len); break; @@ -598,6 +604,9 @@ static void conf_list(int level, uint8_t *list, int len) case L2CAP_CONF_EFS: printf("EFS "); break; + case L2CAP_CONF_EWS: + printf("EWS "); + break; default: printf("%2.2x ", list[i] & 0x7f); break; -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] hcidump: parse extended control field in l2cap 2011-08-25 10:34 [PATCH 1/2] hcidump: decode extended window size option Emeltchenko Andrei @ 2011-08-25 10:34 ` Emeltchenko Andrei 2011-08-25 12:30 ` Gustavo Padovan 0 siblings, 1 reply; 4+ messages in thread From: Emeltchenko Andrei @ 2011-08-25 10:34 UTC (permalink / raw) To: linux-bluetooth From: Andrei Emeltchenko <andrei.emeltchenko@intel.com> Adds support for parsing extended control field. Extended control field may be used for ERTM and streaming mode (if EWS specified). Remove magic numbers concerning the subject. Patch to bluez with definitinos shall be applied. --- parser/l2cap.c | 129 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 93 insertions(+), 36 deletions(-) diff --git a/parser/l2cap.c b/parser/l2cap.c index 217008d..42d3974 100644 --- a/parser/l2cap.c +++ b/parser/l2cap.c @@ -60,6 +60,9 @@ typedef struct { } cid_info; #define CID_TABLE_SIZE 20 +/* FIXME */ +static int ext_ctrl; + static cid_info cid_table[2][CID_TABLE_SIZE]; #define SCID cid_table[0] @@ -352,13 +355,13 @@ static char *fcs2str(uint8_t fcs) static char *sar2str(uint8_t sar) { switch (sar) { - case 0x00: + case L2CAP_SAR_UNSEGMENTED: return "Unsegmented"; - case 0x01: + case L2CAP_SAR_START: return "Start"; - case 0x02: + case L2CAP_SAR_END: return "End"; - case 0x03: + case L2CAP_SAR_CONTINUE: return "Continuation"; default: return "Bad SAR"; @@ -369,13 +372,13 @@ static char *sar2str(uint8_t sar) static char *supervisory2str(uint8_t supervisory) { switch (supervisory) { - case 0x00: + case L2CAP_SUPER_RR: return "Receiver Ready (RR)"; - case 0x01: + case L2CAP_SUPER_REJ: return "Reject (REJ)"; - case 0x02: + case L2CAP_SUPER_RNR: return "Receiver Not Ready (RNR)"; - case 0x03: + case L2CAP_SUPER_SREJ: return "Select Reject (SREJ)"; default: return "Bad Supervisory"; @@ -564,6 +567,7 @@ static void conf_opt(int level, void *ptr, int len, int in, uint16_t cid) printf("EWS"); if (h->len > 0) printf(" %d", get_val(h->val, h->len)); + ext_ctrl = 1; break; default: @@ -763,6 +767,63 @@ static inline void info_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) } } +static void l2cap_ctrl_ext_parse(int level, struct frame *frm, uint32_t ctrl) +{ + p_indent(level, frm); + + printf("%s:", ctrl & L2CAP_EXT_CTRL_FRAME_TYPE ? "S-frame" : "I-frame"); + if (ctrl & L2CAP_EXT_CTRL_FRAME_TYPE) { + printf(" %s", supervisory2str((ctrl & L2CAP_EXT_CTRL_SUPERVISE_MASK) >> + L2CAP_EXT_CTRL_SUPER_SHIFT)); + } else { + uint8_t sar = (ctrl & L2CAP_EXT_CTRL_SAR_MASK) >> + L2CAP_EXT_CTRL_SAR_SHIFT; + printf(" %s", sar2str(sar)); + if (sar == L2CAP_SAR_START) { + uint16_t len; + len = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); + frm->ptr += L2CAP_SDULEN_SIZE; + frm->len -= L2CAP_SDULEN_SIZE; + printf(" (len %d)", len); + } + printf(" TxSeq %d", (ctrl & L2CAP_EXT_CTRL_TXSEQ_MASK) >> + L2CAP_EXT_CTRL_TXSEQ_SHIFT); + } + printf(" ReqSeq %d", (ctrl & L2CAP_EXT_CTRL_REQSEQ_MASK) >> + L2CAP_EXT_CTRL_REQSEQ_SHIFT); + if (ctrl & L2CAP_EXT_CTRL_FINAL) + printf(" F-bit"); + if (ctrl & L2CAP_EXT_CTRL_POLL) + printf(" P-bit"); +} + +static void l2cap_ctrl_parse(int level, struct frame *frm, uint32_t ctrl) +{ + p_indent(level, frm); + + printf("%s:", ctrl & L2CAP_CTRL_FRAME_TYPE ? "S-frame" : "I-frame"); + if (ctrl & 0x01) { + printf(" %s", supervisory2str((ctrl & L2CAP_CTRL_SUPERVISE_MASK) >> + L2CAP_CTRL_SUPER_SHIFT)); + } else { + uint8_t sar = (ctrl & L2CAP_CTRL_SAR_MASK) >> L2CAP_CTRL_SAR_SHIFT; + printf(" %s", sar2str(sar)); + if (sar == L2CAP_SAR_START) { + uint16_t len; + len = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); + frm->ptr += L2CAP_SDULEN_SIZE; + frm->len -= L2CAP_SDULEN_SIZE; + printf(" (len %d)", len); + } + printf(" TxSeq %d", (ctrl & L2CAP_CTRL_TXSEQ_MASK) >> L2CAP_CTRL_TXSEQ_SHIFT); + } + printf(" ReqSeq %d", (ctrl & L2CAP_CTRL_REQSEQ_MASK) >> L2CAP_CTRL_REQSEQ_SHIFT); + if (ctrl & L2CAP_CTRL_FINAL) + printf(" F-bit"); + if (ctrl & L2CAP_CTRL_POLL) + printf(" P-bit"); +} + static void l2cap_parse(int level, struct frame *frm) { l2cap_hdr *hdr = (void *)frm->ptr; @@ -874,48 +935,44 @@ static void l2cap_parse(int level, struct frame *frm) uint8_t mode = get_mode(!frm->in, cid); uint16_t psm = get_psm(!frm->in, cid); - uint16_t ctrl = 0, fcs = 0; - uint32_t proto; + uint16_t fcs = 0; + uint32_t proto, ctrl = 0; frm->cid = cid; frm->num = get_num(!frm->in, cid); if (mode > 0) { - ctrl = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); - frm->ptr += 2; - frm->len -= 4; + if (ext_ctrl) { + ctrl = get_val(frm->ptr, 4); + frm->ptr += 4; + frm->len -= 6; + } else { + + ctrl = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); + frm->ptr += 2; + frm->len -= 4; + } fcs = btohs(bt_get_unaligned((uint16_t *) (frm->ptr + frm->len))); } if (!p_filter(FILT_L2CAP)) { p_indent(level, frm); printf("L2CAP(d): cid 0x%4.4x len %d", cid, dlen); - if (mode > 0) - printf(" ctrl 0x%4.4x fcs 0x%4.4x", ctrl, fcs); + if (mode > 0) { + if (ext_ctrl) + printf(" ext_ctrl 0x%8.8x fcs 0x%4.4x", ctrl, fcs); + else + printf(" ctrl 0x%4.4x fcs 0x%4.4x", ctrl, fcs); + } + printf(" [psm %d]\n", psm); level++; if (mode > 0) { - p_indent(level, frm); - printf("%s:", ctrl & 0x01 ? "S-frame" : "I-frame"); - if (ctrl & 0x01) { - printf(" %s", supervisory2str((ctrl & 0x0c) >> 2)); - } else { - uint8_t sar = (ctrl & 0xc000) >> 14; - printf(" %s", sar2str(sar)); - if (sar == 1) { - uint16_t len; - len = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); - frm->ptr += 2; - frm->len -= 2; - printf(" (len %d)", len); - } - printf(" TxSeq %d", (ctrl & 0x7e) >> 1); - } - printf(" ReqSeq %d", (ctrl & 0x3f00) >> 8); - if (ctrl & 0x80) - printf(" F-bit"); - if (ctrl & 0x10) - printf(" P-bit"); + if (ext_ctrl) + l2cap_ctrl_ext_parse(level, frm, ctrl); + else + l2cap_ctrl_parse(level, frm, ctrl); + printf("\n"); } } -- 1.7.4.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] hcidump: parse extended control field in l2cap 2011-08-25 10:34 ` [PATCH 2/2] hcidump: parse extended control field in l2cap Emeltchenko Andrei @ 2011-08-25 12:30 ` Gustavo Padovan 2011-08-26 7:19 ` Emeltchenko Andrei 0 siblings, 1 reply; 4+ messages in thread From: Gustavo Padovan @ 2011-08-25 12:30 UTC (permalink / raw) To: Emeltchenko Andrei; +Cc: linux-bluetooth Hi Andrei, * Emeltchenko Andrei <Andrei.Emeltchenko.news@gmail.com> [2011-08-25 13:34:09 +0300]: > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com> > > Adds support for parsing extended control field. Extended control > field may be used for ERTM and streaming mode (if EWS specified). > Remove magic numbers concerning the subject. Patch to bluez with > definitinos shall be applied. > --- > parser/l2cap.c | 129 ++++++++++++++++++++++++++++++++++++++++---------------- > 1 files changed, 93 insertions(+), 36 deletions(-) > > diff --git a/parser/l2cap.c b/parser/l2cap.c > index 217008d..42d3974 100644 > --- a/parser/l2cap.c > +++ b/parser/l2cap.c > @@ -60,6 +60,9 @@ typedef struct { > } cid_info; > #define CID_TABLE_SIZE 20 > > +/* FIXME */ > +static int ext_ctrl; > + > static cid_info cid_table[2][CID_TABLE_SIZE]; > > #define SCID cid_table[0] > @@ -352,13 +355,13 @@ static char *fcs2str(uint8_t fcs) > static char *sar2str(uint8_t sar) > { > switch (sar) { > - case 0x00: > + case L2CAP_SAR_UNSEGMENTED: > return "Unsegmented"; > - case 0x01: > + case L2CAP_SAR_START: > return "Start"; > - case 0x02: > + case L2CAP_SAR_END: > return "End"; > - case 0x03: > + case L2CAP_SAR_CONTINUE: > return "Continuation"; > default: > return "Bad SAR"; > @@ -369,13 +372,13 @@ static char *sar2str(uint8_t sar) > static char *supervisory2str(uint8_t supervisory) > { > switch (supervisory) { > - case 0x00: > + case L2CAP_SUPER_RR: > return "Receiver Ready (RR)"; > - case 0x01: > + case L2CAP_SUPER_REJ: > return "Reject (REJ)"; > - case 0x02: > + case L2CAP_SUPER_RNR: > return "Receiver Not Ready (RNR)"; > - case 0x03: > + case L2CAP_SUPER_SREJ: > return "Select Reject (SREJ)"; > default: > return "Bad Supervisory"; > @@ -564,6 +567,7 @@ static void conf_opt(int level, void *ptr, int len, int in, uint16_t cid) > printf("EWS"); > if (h->len > 0) > printf(" %d", get_val(h->val, h->len)); > + ext_ctrl = 1; > break; > > default: > @@ -763,6 +767,63 @@ static inline void info_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) > } > } > > +static void l2cap_ctrl_ext_parse(int level, struct frame *frm, uint32_t ctrl) > +{ > + p_indent(level, frm); > + > + printf("%s:", ctrl & L2CAP_EXT_CTRL_FRAME_TYPE ? "S-frame" : "I-frame"); Blank line here. > + if (ctrl & L2CAP_EXT_CTRL_FRAME_TYPE) { > + printf(" %s", supervisory2str((ctrl & L2CAP_EXT_CTRL_SUPERVISE_MASK) >> > + L2CAP_EXT_CTRL_SUPER_SHIFT)); > + } else { > + uint8_t sar = (ctrl & L2CAP_EXT_CTRL_SAR_MASK) >> > + L2CAP_EXT_CTRL_SAR_SHIFT; > + printf(" %s", sar2str(sar)); > + if (sar == L2CAP_SAR_START) { > + uint16_t len; > + len = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); > + frm->ptr += L2CAP_SDULEN_SIZE; > + frm->len -= L2CAP_SDULEN_SIZE; > + printf(" (len %d)", len); > + } > + printf(" TxSeq %d", (ctrl & L2CAP_EXT_CTRL_TXSEQ_MASK) >> > + L2CAP_EXT_CTRL_TXSEQ_SHIFT); > + } and here. > + printf(" ReqSeq %d", (ctrl & L2CAP_EXT_CTRL_REQSEQ_MASK) >> > + L2CAP_EXT_CTRL_REQSEQ_SHIFT); and here. > + if (ctrl & L2CAP_EXT_CTRL_FINAL) > + printf(" F-bit"); and here. The same for the other function, these blank lines makes the code more readable. Gustavo ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] hcidump: parse extended control field in l2cap 2011-08-25 12:30 ` Gustavo Padovan @ 2011-08-26 7:19 ` Emeltchenko Andrei 0 siblings, 0 replies; 4+ messages in thread From: Emeltchenko Andrei @ 2011-08-26 7:19 UTC (permalink / raw) To: linux-bluetooth Hi Gustavo, On Thu, Aug 25, 2011 at 09:30:41AM -0300, Gustavo Padovan wrote: > Hi Andrei, > > * Emeltchenko Andrei <Andrei.Emeltchenko.news@gmail.com> [2011-08-25 13:34:09 +0300]: > > > From: Andrei Emeltchenko <andrei.emeltchenko@intel.com> > > > > Adds support for parsing extended control field. Extended control > > field may be used for ERTM and streaming mode (if EWS specified). > > Remove magic numbers concerning the subject. Patch to bluez with > > definitinos shall be applied. > > --- > > parser/l2cap.c | 129 ++++++++++++++++++++++++++++++++++++++++---------------- > > 1 files changed, 93 insertions(+), 36 deletions(-) > > > > diff --git a/parser/l2cap.c b/parser/l2cap.c > > index 217008d..42d3974 100644 > > --- a/parser/l2cap.c > > +++ b/parser/l2cap.c > > @@ -60,6 +60,9 @@ typedef struct { > > } cid_info; > > #define CID_TABLE_SIZE 20 > > > > +/* FIXME */ > > +static int ext_ctrl; > > + > > static cid_info cid_table[2][CID_TABLE_SIZE]; > > > > #define SCID cid_table[0] > > @@ -352,13 +355,13 @@ static char *fcs2str(uint8_t fcs) > > static char *sar2str(uint8_t sar) > > { > > switch (sar) { > > - case 0x00: > > + case L2CAP_SAR_UNSEGMENTED: > > return "Unsegmented"; > > - case 0x01: > > + case L2CAP_SAR_START: > > return "Start"; > > - case 0x02: > > + case L2CAP_SAR_END: > > return "End"; > > - case 0x03: > > + case L2CAP_SAR_CONTINUE: > > return "Continuation"; > > default: > > return "Bad SAR"; > > @@ -369,13 +372,13 @@ static char *sar2str(uint8_t sar) > > static char *supervisory2str(uint8_t supervisory) > > { > > switch (supervisory) { > > - case 0x00: > > + case L2CAP_SUPER_RR: > > return "Receiver Ready (RR)"; > > - case 0x01: > > + case L2CAP_SUPER_REJ: > > return "Reject (REJ)"; > > - case 0x02: > > + case L2CAP_SUPER_RNR: > > return "Receiver Not Ready (RNR)"; > > - case 0x03: > > + case L2CAP_SUPER_SREJ: > > return "Select Reject (SREJ)"; > > default: > > return "Bad Supervisory"; > > @@ -564,6 +567,7 @@ static void conf_opt(int level, void *ptr, int len, int in, uint16_t cid) > > printf("EWS"); > > if (h->len > 0) > > printf(" %d", get_val(h->val, h->len)); > > + ext_ctrl = 1; > > break; > > > > default: > > @@ -763,6 +767,63 @@ static inline void info_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) > > } > > } > > > > +static void l2cap_ctrl_ext_parse(int level, struct frame *frm, uint32_t ctrl) > > +{ > > + p_indent(level, frm); > > + > > + printf("%s:", ctrl & L2CAP_EXT_CTRL_FRAME_TYPE ? "S-frame" : "I-frame"); > > Blank line here. > > > + if (ctrl & L2CAP_EXT_CTRL_FRAME_TYPE) { > > + printf(" %s", supervisory2str((ctrl & L2CAP_EXT_CTRL_SUPERVISE_MASK) >> > > + L2CAP_EXT_CTRL_SUPER_SHIFT)); > > + } else { > > + uint8_t sar = (ctrl & L2CAP_EXT_CTRL_SAR_MASK) >> > > + L2CAP_EXT_CTRL_SAR_SHIFT; > > + printf(" %s", sar2str(sar)); > > + if (sar == L2CAP_SAR_START) { > > + uint16_t len; > > + len = btohs(bt_get_unaligned((uint16_t *) frm->ptr)); > > + frm->ptr += L2CAP_SDULEN_SIZE; > > + frm->len -= L2CAP_SDULEN_SIZE; > > + printf(" (len %d)", len); > > + } > > + printf(" TxSeq %d", (ctrl & L2CAP_EXT_CTRL_TXSEQ_MASK) >> > > + L2CAP_EXT_CTRL_TXSEQ_SHIFT); > > + } > > and here. > > > + printf(" ReqSeq %d", (ctrl & L2CAP_EXT_CTRL_REQSEQ_MASK) >> > > + L2CAP_EXT_CTRL_REQSEQ_SHIFT); > > and here. > > > + if (ctrl & L2CAP_EXT_CTRL_FINAL) > > + printf(" F-bit"); > > and here. > > The same for the other function, these blank lines makes the code more > readable. I have sent new version with blank lines. Best regards Andrei Emeltchenko ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-08-26 7:19 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-08-25 10:34 [PATCH 1/2] hcidump: decode extended window size option Emeltchenko Andrei 2011-08-25 10:34 ` [PATCH 2/2] hcidump: parse extended control field in l2cap Emeltchenko Andrei 2011-08-25 12:30 ` Gustavo Padovan 2011-08-26 7:19 ` Emeltchenko Andrei
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.