summaryrefslogtreecommitdiff
path: root/print-lmp.c
diff options
context:
space:
mode:
authorhannes <hannes>2004-04-27 14:03:44 +0000
committerhannes <hannes>2004-04-27 14:03:44 +0000
commit19670ba07cefc8c96211e26cfe485f489bc5ea26 (patch)
treefdc382903f4f99664d56f4576737a71c44d98d24 /print-lmp.c
parent49dabbe04336ae0155209ee39f7fa1729a50ca9b (diff)
downloadtcpdump-19670ba07cefc8c96211e26cfe485f489bc5ea26.tar.gz
from Carles Kishimoto <ckishimo@ac.upc.es>: complete DATALINKs subobject dissector
Diffstat (limited to 'print-lmp.c')
-rw-r--r--print-lmp.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/print-lmp.c b/print-lmp.c
index 10fdfff1..d0fcd188 100644
--- a/print-lmp.c
+++ b/print-lmp.c
@@ -15,7 +15,7 @@
#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.4 2004-04-26 13:40:41 hannes Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.5 2004-04-27 14:03:44 hannes Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -297,7 +297,7 @@ lmp_print(register const u_char *pptr, register u_int len) {
const u_char *tptr,*obj_tptr;
int tlen,lmp_obj_len,lmp_obj_ctype,obj_tlen;
int hexdump;
- int offset;
+ int offset,subobj_type,subobj_len,total_subobj_len;
union { /* int to float conversion buffer */
float f;
@@ -513,7 +513,48 @@ lmp_print(register const u_char *pptr, register u_int len) {
ipaddr_string(obj_tptr+8),
EXTRACT_32BITS(obj_tptr+8));
- /* FIXME: Missing Data link Subobjects decoder */
+ total_subobj_len = lmp_obj_len - 16;
+ offset = 12;
+ while (total_subobj_len > 0 && hexdump == FALSE ) {
+ subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8;
+ subobj_len = EXTRACT_16BITS(obj_tptr+offset)&0x00FF;
+ printf("\n\t Subobject, Type: %s (%u), Length: %u",
+ tok2str(lmp_data_link_subobj,
+ "Unknown",
+ subobj_type),
+ subobj_type,
+ subobj_len);
+ switch(subobj_type) {
+ case INT_SWITCHING_TYPE_SUBOBJ:
+ printf("\n\t\t Switching Type: %s (%u)",
+ tok2str(gmpls_switch_cap_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr+offset+2)>>8),
+ EXTRACT_16BITS(obj_tptr+offset+2)>>8);
+ printf("\n\t\t Encoding Type: %s (%u)",
+ tok2str(gmpls_encoding_values,
+ "Unknown",
+ EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF),
+ EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF);
+ bw.i = EXTRACT_32BITS(obj_tptr+offset+4);
+ printf("\n\t\t Min Reservable Bandwidth: %.3f Mbps",
+ bw.f);
+ bw.i = EXTRACT_32BITS(obj_tptr+offset+8);
+ printf("\n\t\t Max Reservable Bandwidth: %.3f Mbps",
+ bw.f);
+ break;
+ case WAVELENGTH_SUBOBJ:
+ printf("\n\t\t Wavelength: %u",
+ EXTRACT_32BITS(obj_tptr+offset+4));
+ break;
+ default:
+ /* Any Unknown Subobject ==> Exit loop */
+ hexdump=TRUE;
+ break;
+ }
+ total_subobj_len-=subobj_len;
+ offset+=subobj_len;
+ }
break;
#ifdef INET6