diff options
author | hannes <hannes> | 2004-04-27 14:03:44 +0000 |
---|---|---|
committer | hannes <hannes> | 2004-04-27 14:03:44 +0000 |
commit | 19670ba07cefc8c96211e26cfe485f489bc5ea26 (patch) | |
tree | fdc382903f4f99664d56f4576737a71c44d98d24 /print-lmp.c | |
parent | 49dabbe04336ae0155209ee39f7fa1729a50ca9b (diff) | |
download | tcpdump-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.c | 47 |
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 |