]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-lmp.c
When checking for pcap_if_t, add $V_INCLS to CFLAGS, so we look at the
[tcpdump] / print-lmp.c
index 88ff52b89a4a063c77fbfdab132351b3408f1a83..d0fcd188ecf8768526b47334077c9d7744629610 100644 (file)
@@ -15,7 +15,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-lmp.c,v 1.3 2004-04-26 13:22:50 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,8 +297,13 @@ 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; 
+        u_int32_t i;
+    } bw;
+
     tptr=pptr;
     lmp_com_header = (const struct lmp_common_header *)pptr;
     TCHECK(*lmp_com_header);
@@ -508,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   
@@ -536,8 +582,8 @@ lmp_print(register const u_char *pptr, register u_int len) {
                        EXTRACT_16BITS(obj_tptr+10),
                        EXTRACT_16BITS(obj_tptr+10),
                        EXTRACT_16BITS(obj_tptr+10)&8000 ? "(Payload test messages capable)" : "");
-               printf("\n\t    Transmission Rate: (0x%x)",
-                       EXTRACT_32BITS(obj_tptr+12));
+                bw.i = EXTRACT_32BITS(obj_tptr+12);
+               printf("\n\t    Transmission Rate: %.3f Mbps",bw.f);
                printf("\n\t    Wavelength: %u",
                        EXTRACT_32BITS(obj_tptr+16));
                break;