Diff between e75f95499d770c53c05848a74c7e2a635f2f73b9 and 0e15714faae98a3872902e15421cde39215b4178

Changed Files

File Additions Deletions Status
tools/parser/parser.h +17 -0 modified
tools/parser/sdp.c +12 -8 modified

Full Patch

diff --git a/tools/parser/parser.h b/tools/parser/parser.h
index ee8b390..6747e03 100644
--- a/tools/parser/parser.h
+++ b/tools/parser/parser.h
@@ -128,6 +128,23 @@ static inline __u32 get_u32(struct frame *frm)
 	return ntohl(get_unaligned(u32_ptr));
 }
 
+static inline __u64 get_u64(struct frame *frm)
+{
+	__u64 *u64_ptr = frm->ptr;
+	__u64 u64 = get_unaligned(u64_ptr), tmp;
+	frm->ptr += 8;
+	frm->len -= 8;
+	tmp = ntohl(u64 & 0xffffffff);
+	u64 = (tmp << 32) | ntohl(u64 >> 32);
+	return u64;
+}
+
+static inline void get_u128(struct frame *frm, __u64 *l, __u64 *h)
+{
+	*h = get_u64(frm);
+	*l = get_u64(frm);
+}
+
 char *get_uuid_name(int uuid);
 
 void raw_dump(int level, struct frame *frm);
diff --git a/tools/parser/sdp.c b/tools/parser/sdp.c
index 703895e..78ee0ce 100644
--- a/tools/parser/sdp.c
+++ b/tools/parser/sdp.c
@@ -164,6 +164,8 @@ static inline __u8 parse_de_hdr(struct frame *frm, int* n)
 			*n = get_u16(frm); break;
 		case 4:
 			*n = get_u32(frm); break;
+		case 8:
+			*n = get_u64(frm); break;
 		}
 	} else {
 		*n = sdp_siz_idx_lookup_table[siz_idx].num_bytes;
@@ -174,7 +176,7 @@ static inline __u8 parse_de_hdr(struct frame *frm, int* n)
 
 static inline void print_int(__u8 de_type, int level, int n, struct frame *frm)
 {
-	__u64 val;
+	__u64 val, val2;
 
 	switch(de_type) {
 	case SDP_DE_UINT:
@@ -199,9 +201,12 @@ static inline void print_int(__u8 de_type, int level, int n, struct frame *frm)
 		val = get_u32(frm);
 		break;
 	case 8: /* 64-bit */
-		/* Not supported yet */
-		val = 0;
+		val = get_u64(frm);
 		break;
+	case 16:/* 128-bit */
+		get_u128(frm, &val, &val2);
+		printf(" 0x%llx%llx", val, val2);
+		return;
 	default: /* syntax error */
 		printf(" err");
 		frm->ptr += n;
@@ -241,11 +246,11 @@ static inline void print_uuid(int n, struct frame *frm)
 		printf(" (%s)", s);
 }
 
-static inline void print_string(int n, struct frame *frm)
+static inline void print_string(int n, struct frame *frm, const char *name)
 {
 	char *s;
 
-	printf(" str");
+	printf(" %s", name);
 	if ((s = malloc(n + 1))) {
 	        strncpy(s, frm->ptr, n);
 		s[n] = '\0';
@@ -291,15 +296,14 @@ static inline void print_de(int level, struct frame *frm, int *split)
 		}
 		print_uuid(n, frm);
 		break;
+	case SDP_DE_URL:
 	case SDP_DE_STRING:
-		print_string(n, frm);
+		print_string(n, frm, de_type == SDP_DE_URL? "url": "str");
 		break;
 	case SDP_DE_SEQ:
 	case SDP_DE_ALT:
 		print_des(de_type, level, n, frm, split);
 		break;
-	case SDP_DE_URL:
-		break;
 	}
 }