]> The Tcpdump Group git mirrors - tcpdump/commitdiff
added hexprint of suboptions payload on three -v
authorMichael Richardson <[email protected]>
Fri, 3 Jan 2014 03:07:38 +0000 (22:07 -0500)
committerMichael Richardson <[email protected]>
Fri, 3 Jan 2014 03:07:38 +0000 (22:07 -0500)
move rpl dio print to subfunction to keep it at 80columns

print-icmp6.c
tests/19-pickdag.out
tests/19-pickdagvvv.out [new file with mode: 0644]
tests/TESTLIST

index bfde664a75065fc29f86e0cdef9119cfa11f5ae6..8d91865ef3d8e6a489e6ddae5cc367de45d4bf28 100644 (file)
@@ -730,10 +730,75 @@ static char *rpl_subopt_name(int opt, char *buf, int len) {
         }
 }
 
+static void
+rpl_dio_print(netdissect_options *ndo,
+              const struct icmp6_hdr *hdr,
+              const u_char *bp, u_int length)
+{
+        struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp;
+        char dagid[65];
+        char *d = dagid;
+        int  i;
+        ND_TCHECK(dio->rpl_dagid);
+
+        for(i=0;i<16;i++) {
+                if(isprint(dio->rpl_dagid[i])) {
+                        *d++ = dio->rpl_dagid[i];
+                } else {
+                        int cnt=snprintf(d,4,"0x%02x",
+                                         dio->rpl_dagid[i]);
+                        d += cnt;
+                }
+        }
+        *d++ = '\0';
+        ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,rank:%u,%smop:%s,prf:%u]",
+                  dagid,
+                  dio->rpl_dtsn,
+                  dio->rpl_instanceid,
+                  dio->rpl_dagrank,
+                  RPL_DIO_GROUNDED(dio->rpl_mopprf) ? "grounded,":"",
+                  rpl_mop_name[RPL_DIO_MOP(dio->rpl_mopprf)],
+                  RPL_DIO_PRF(dio->rpl_mopprf)));
+
+        if(ndo->ndo_vflag > 1) {
+                struct nd_rpl_option *opt = (struct nd_rpl_option *)&dio[1];
+                length -= sizeof(struct nd_rpl_dio);
+                char optname_buf[64];
+                ND_TCHECK(opt->rpl_dio_len);
+                while((opt->rpl_dio_type == RPL_OPT_PAD0 &&
+                       (u_char *)opt < ndo->ndo_snapend) ||
+                      ND_TTEST2(*opt,(opt->rpl_dio_len+2))) {
+                        unsigned int len = opt->rpl_dio_len+2;
+                        if(opt->rpl_dio_type == RPL_OPT_PAD0) {
+                                len = 1;
+                                ND_PRINT((ndo, " opt:pad0"));
+                        } else {
+                                ND_PRINT((ndo, " opt:%s len:%u ",
+                                          rpl_subopt_name(opt->rpl_dio_type, optname_buf, sizeof(optname_buf)),
+                                          len));
+                                if(ndo->ndo_vflag > 2) {
+                                        int len = opt->rpl_dio_len;
+                                        if(len > length) len = length;
+                                        hex_print(ndo,
+                                                  " ",
+                                                  (char *)&opt[1],  /* content of DIO option */
+                                                  len);
+                                }
+                        }
+                        opt = (struct nd_rpl_option *)(((char *)opt) + len);
+                        length -= len;
+                }
+        }
+       return;
+trunc:
+       ND_PRINT((ndo," [|truncated]"));
+       return;
+}
+
 static void
 rpl_print(netdissect_options *ndo,
           const struct icmp6_hdr *hdr,
-          const u_char *bp, u_int length _U_)
+          const u_char *bp, u_int length)
 {
         int secured = hdr->icmp6_code & 0x80;
         int basecode= hdr->icmp6_code & 0x7f;
@@ -753,46 +818,7 @@ rpl_print(netdissect_options *ndo,
         case ND_RPL_DIO:
                 ND_PRINT((ndo, "DODAG Information Object"));
                 if(ndo->ndo_vflag) {
-                        struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp;
-                        char dagid[65];
-                        char *d = dagid;
-                        int  i;
-                        ND_TCHECK(dio->rpl_dagid);
-
-                        for(i=0;i<16;i++) {
-                                if(isprint(dio->rpl_dagid[i])) {
-                                        *d++ = dio->rpl_dagid[i];
-                                } else {
-                                        int cnt=snprintf(d,4,"0x%02x",
-                                                         dio->rpl_dagid[i]);
-                                        d += cnt;
-                                }
-                        }
-                        *d++ = '\0';
-                        ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,rank:%u,%smop:%s,prf:%u]",
-                                  dagid,
-                                  dio->rpl_dtsn,
-                                  dio->rpl_instanceid,
-                                  dio->rpl_dagrank,
-                                  RPL_DIO_GROUNDED(dio->rpl_mopprf) ? "grounded,":"",
-                                  rpl_mop_name[RPL_DIO_MOP(dio->rpl_mopprf)],
-                                  RPL_DIO_PRF(dio->rpl_mopprf)));
-
-                        if(ndo->ndo_vflag > 1) {
-                                struct nd_rpl_option *opt = (struct nd_rpl_option *)&dio[1];
-                                char optname_buf[64];
-                                ND_TCHECK(opt->rpl_dio_len);
-                                while(opt->rpl_dio_type == RPL_OPT_PAD0 || ND_TTEST2(opt,(opt->rpl_dio_len+2))) {
-                                        unsigned int len = opt->rpl_dio_len+2;
-                                        if(opt->rpl_dio_type == RPL_OPT_PAD0) {
-                                                len = 1;
-                                        }
-                                        ND_PRINT((ndo, " opt:%s len:%u ",
-                                                  rpl_subopt_name(opt->rpl_dio_type, optname_buf, sizeof(optname_buf)),
-                                                  len));
-                                        opt = (struct nd_rpl_option *)((char *)opt) + len;
-                                }
-                        }
+                        rpl_dio_print(ndo, hdr, bp, length);
                 }
                 break;
         case ND_RPL_DAO:
index d93d44c807e961f3e2e3ccdddafe230fb53392ef..53f410844764959dbb3492b8eb7c784404ab4740 100644 (file)
@@ -1,2 +1,2 @@
-IP6 (hlim 64, next-header ICMPv6 (58) payload length: 48) fe80::216:3eff:fe11:3424 > ff02::1: [icmp6 sum ok] ICMP6, RPL, (CLR)DODAG Information Object [dagid:T10x0,seq:10,instance:42,rank:768,grounded,mop:nonstoring,prf:0]
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 48) fe80::216:3eff:fe11:3424 > ff02::1: [icmp6 sum ok] ICMP6, RPL, (CLR)DODAG Information Object [dagid:T10x0,seq:10,instance:42,rank:768,grounded,mop:nonstoring,prf:0] opt:destprefix len:15  opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0
 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 56) fe80::216:3eff:fe11:3424 > fe80::216:3eff:fe11:3424: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object
diff --git a/tests/19-pickdagvvv.out b/tests/19-pickdagvvv.out
new file mode 100644 (file)
index 0000000..294364e
--- /dev/null
@@ -0,0 +1,2 @@
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 48) fe80::216:3eff:fe11:3424 > ff02::1: [icmp6 sum ok] ICMP6, RPL, (CLR)DODAG Information Object [dagid:T10x0,seq:10,instance:42,rank:768,grounded,mop:nonstoring,prf:0] opt:destprefix len:15  0x0000:  3000 0000 0000 2001 0db8 0001 00 opt:pad0 opt:pad0 opt:pad0 opt:pad0 opt:pad0
+IP6 (hlim 64, next-header ICMPv6 (58) payload length: 56) fe80::216:3eff:fe11:3424 > fe80::216:3eff:fe11:3424: [icmp6 sum ok] ICMP6, RPL, (CLR)Destination Advertisement Object
index bd16d5a1b964698af62044481995d7d776a4e271..670ea8b701f6197784085a150c2223c3be0a0aa8 100644 (file)
@@ -57,6 +57,7 @@ ikev2pI2      ikev2pI2.pcap           ikev2pI2.out    -t -E "file ikev2pI2-secrets.txt" -v -v -v
 # IETF ROLL RPL packets
 dio01           dio.pcap                dio.out         -t -v
 dio02           19-pickdag.pcap         19-pickdag.out  -t -v -v
+dio03           19-pickdag.pcap         19-pickdagvvv.out  -t -v -v -v
 
 # IPNET encapsulated site
 e1000g         e1000g.pcap             e1000g.out      -t