diff --git a/tools/parser/l2cap.c b/tools/parser/l2cap.c
index 3e95232..2637c01 100644
--- a/tools/parser/l2cap.c
+++ b/tools/parser/l2cap.c
#define SCID cid_table[0]
#define DCID cid_table[1]
+typedef struct {
+ uint16_t psm;
+ uint16_t num;
+} psm_info;
+#define PSM_TABLE_SIZE 20
+
+static psm_info psm_table[PSM_TABLE_SIZE];
+
static struct frame *add_handle(uint16_t handle)
{
register handle_info *t = handle_table;
table[i].psm = psm;
break;
}
+
+ if (in)
+ return;
+
+ for (i = 0; i < PSM_TABLE_SIZE; i++)
+ if (!psm_table[i].psm || psm_table[i].psm == psm) {
+ psm_table[i].psm = psm;
+ psm_table[i].num++;
+ break;
+ }
}
static void del_cid(int in, uint16_t dcid, uint16_t scid)
{
register int t, i;
- uint16_t cid[2];
+ uint16_t cid[2], psm = 0;
if (!in) {
cid[0] = dcid;
for (t = 0; t < 2; t++) {
for (i = 0; i < CID_TABLE_SIZE; i++)
if (cid_table[t][i].cid == cid[t]) {
+ psm = cid_table[t][i].psm;
cid_table[t][i].cid = 0;
break;
}
}
+
+ for (i = 0; i < PSM_TABLE_SIZE; i++)
+ if (psm_table[i].psm == psm) {
+ if (psm_table[i].num < 2) {
+ psm_table[i].psm = 0;
+ psm_table[i].num = 0;
+ } else
+ psm_table[i].num--;
+ break;
+ }
}
static uint16_t get_psm(int in, uint16_t cid)
return parser.defpsm;
}
+static uint16_t get_num(uint16_t psm)
+{
+ register psm_info *table = psm_table;
+ register int i;
+
+ for (i = 0; i < PSM_TABLE_SIZE; i++)
+ if (table[i].psm == psm)
+ return table[i].num;
+ return 0;
+}
+
static uint32_t get_val(uint8_t *ptr, uint8_t len)
{
switch (len) {
uint32_t proto;
frm->cid = cid;
+ frm->num = get_num(psm);
if (!p_filter(FILT_L2CAP)) {
p_indent(level, frm);
fr->ts = frm->ts;
fr->handle = frm->handle;
fr->cid = frm->cid;
+ fr->num = frm->num;
fr->channel = frm->channel;
} else {
if (!(fr = get_frame(frm->handle))) {
diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index 7b1d84e..eb5f387 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
int in;
int handle;
int cid;
- int channel;
+ int num;
+ int channel;
long flags;
struct timeval ts;
};