diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c
index 9f38419..d58d70c 100644
--- a/tools/parser/sdp.c
+++ b/tools/parser/sdp.c
#include "parser.h"
#include "sdp.h"
-static inline void print_de(int, struct frame*, int *split);
-
-sdp_siz_idx_lookup_table_t sdp_siz_idx_lookup_table[] = {
+static sdp_siz_idx_lookup_table_t sdp_siz_idx_lookup_table[] = {
{ 0, 1 }, /* Size index = 0 */
{ 0, 2 }, /* 1 */
{ 0, 4 }, /* 2 */
{ 1, 4 }, /* 7 */
};
-sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
+static sdp_uuid_nam_lookup_table_t sdp_uuid_nam_lookup_table[] = {
{ SDP_UUID_SDP, "SDP" },
{ SDP_UUID_UDP, "UDP" },
{ SDP_UUID_RFCOMM, "RFCOMM" },
{ SDP_UUID_GENERIC_TELEPHONY, "Telephony" }
};
-sdp_attr_id_nam_lookup_table_t sdp_attr_id_nam_lookup_table[] = {
+static sdp_attr_id_nam_lookup_table_t sdp_attr_id_nam_lookup_table[] = {
{ SDP_ATTR_ID_SERVICE_RECORD_HANDLE, "SrvRecHndl" },
{ SDP_ATTR_ID_SERVICE_CLASS_ID_LIST, "SrvClassIDList" },
{ SDP_ATTR_ID_SERVICE_RECORD_STATE, "SrvRecState" },
return 0;
}
-static inline uint8_t parse_de_hdr(struct frame *frm, int* n)
+static inline uint8_t parse_de_hdr(struct frame *frm, int *n)
{
- uint8_t de_hdr = get_u8(frm);
- uint8_t de_type = de_hdr >> 3;
- uint8_t siz_idx = de_hdr & 0x07;
+ uint8_t de_hdr = get_u8(frm);
+ uint8_t de_type = de_hdr >> 3;
+ uint8_t siz_idx = de_hdr & 0x07;
/* Get the number of bytes */
if (sdp_siz_idx_lookup_table[siz_idx].addl_bits) {
return de_type;
}
-static inline void print_int(uint8_t de_type, int level, int n, struct frame *frm)
+static inline void print_int(uint8_t de_type, int level, int n, struct frame *frm, uint16_t *psm)
{
uint64_t val, val2;
break;
case 2: /* 16-bit */
val = get_u16(frm);
+ if (psm && de_type == SDP_DE_UINT)
+ if (*psm == 0)
+ *psm = val;
break;
case 4: /* 32-bit */
val = get_u32(frm);
printf(" 0x%llx", val);
}
-static inline void print_uuid(int n, struct frame *frm)
+static inline void print_uuid(int n, struct frame *frm, uint16_t *psm)
{
uint32_t uuid = 0;
char* s;
return;
}
+ if (psm && *psm > 0 && *psm != 0xffff) {
+ *psm = 0xffff;
+ }
+
printf(" %s 0x%04x", s, uuid);
if ((s = get_uuid_name(uuid)))
printf(" (%s)", s);
printf(" %s", name);
if ((s = malloc(n + 1))) {
- strncpy(s, frm->ptr, n);
+ strncpy(s, frm->ptr, n);
s[n] = '\0';
printf(" \"%s\"", s);
free(s);
frm->len -= n;
}
-static inline void print_des(uint8_t de_type, int level, int n, struct frame *frm, int *split)
+static inline void print_de(int, struct frame *frm, int *split, uint16_t *psm);
+
+static inline void print_des(uint8_t de_type, int level, int n, struct frame *frm, int *split, uint16_t *psm)
{
int len = frm->len;
- while (len - frm->len < n && frm->len > 0)
- print_de(level, frm, split);
+ while (len - frm->len < n && frm->len > 0)
+ print_de(level, frm, split, psm);
}
-static inline void print_de(int level, struct frame *frm, int *split)
+static inline void print_de(int level, struct frame *frm, int *split, uint16_t *psm)
{
- int n;
+ int n;
uint8_t de_type = parse_de_hdr(frm, &n);
- switch(de_type) {
+ switch (de_type) {
case SDP_DE_NULL:
printf(" null");
break;
case SDP_DE_UINT:
case SDP_DE_INT:
case SDP_DE_BOOL:
- print_int(de_type, level, n, frm);
+ print_int(de_type, level, n, frm, psm);
break;
case SDP_DE_UUID:
if (split) {
/* Split output by uuids.
* Used for printing Protocol Desc List */
- if (*split) {
+ if (*split) {
printf("\n");
p_indent(level, NULL);
}
++*split;
}
- print_uuid(n, frm);
+ print_uuid(n, frm, psm);
break;
case SDP_DE_URL:
case SDP_DE_STRING:
break;
case SDP_DE_SEQ:
printf(" <");
- print_des(de_type, level, n, frm, split);
+ print_des(de_type, level, n, frm, split, psm);
printf(" >");
break;
case SDP_DE_ALT:
printf(" [");
- print_des(de_type, level, n, frm, split);
+ print_des(de_type, level, n, frm, split, psm);
printf(" ]");
break;
}
printf("pat");
if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) {
- len = frm->len;
+ len = frm->len;
while (len - frm->len < n1 && frm->len > 0) {
if (parse_de_hdr(frm,&n2) == SDP_DE_UUID) {
- print_uuid(n2, frm);
+ print_uuid(n2, frm, NULL);
} else {
printf("\nERROR: Unexpected syntax (UUID)\n");
raw_dump(level, frm);
printf("aid(s)");
if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) {
- len = frm->len;
+ len = frm->len;
while (len - frm->len < n1 && frm->len > 0) {
/* Print AttributeID */
if (parse_de_hdr(frm, &n2) == SDP_DE_UINT) {
static inline void print_attr_list(int level, struct frame *frm)
{
- uint16_t attr_id;
+ uint16_t attr_id, psm;
int len, n1, n2, split;
if (parse_de_hdr(frm, &n1) == SDP_DE_SEQ) {
- len = frm->len;
+ len = frm->len;
while (len - frm->len < n1 && frm->len > 0) {
/* Print AttributeID */
if (parse_de_hdr(frm, &n2) == SDP_DE_UINT && n2 == sizeof(attr_id)) {
name = "unknown";
printf("aid 0x%04x (%s)\n", attr_id, name);
split = (attr_id != SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST);
-
+ psm = 0;
+
/* Print AttributeValue */
p_indent(level + 1, 0);
- print_de(level + 1, frm, split ? NULL: &split);
+ print_de(level + 1, frm, split ? NULL: &split,
+ attr_id == SDP_ATTR_ID_PROTOCOL_DESCRIPTOR_LIST ? &psm : NULL);
printf("\n");
} else {
printf("\nERROR: Unexpected syntax\n");
diff --git a/tools/parser/sdp.h b/tools/parser/sdp.h
index 1d97542..62ff12f 100644
--- a/tools/parser/sdp.h
+++ b/tools/parser/sdp.h
uint16_t tid;
uint16_t len;
} __attribute__ ((packed)) sdp_pdu_hdr;
-#define SDP_PDU_HDR_SIZE 5
+#define SDP_PDU_HDR_SIZE 5
/* Data element size index lookup table */
typedef struct {