Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/tcpdump improve icmp6 printing on jumbogram case.



details:   https://anonhg.NetBSD.org/src/rev/1a6922deb4e6
branches:  trunk
changeset: 474919:1a6922deb4e6
user:      itojun <itojun%NetBSD.org@localhost>
date:      Mon Jul 26 06:26:58 1999 +0000

description:
improve icmp6 printing on jumbogram case.
sync print-null.c with recent KAME code.

diffstat:

 usr.sbin/tcpdump/print-icmp6.c |  60 +++++++++++++++++++++++++++++------------
 usr.sbin/tcpdump/print-null.c  |  12 ++++----
 2 files changed, 48 insertions(+), 24 deletions(-)

diffs (225 lines):

diff -r 382b09d65b56 -r 1a6922deb4e6 usr.sbin/tcpdump/print-icmp6.c
--- a/usr.sbin/tcpdump/print-icmp6.c    Mon Jul 26 06:19:01 1999 +0000
+++ b/usr.sbin/tcpdump/print-icmp6.c    Mon Jul 26 06:26:58 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: print-icmp6.c,v 1.3 1999/07/06 13:05:14 itojun Exp $   */
+/*     $NetBSD: print-icmp6.c,v 1.4 1999/07/26 06:26:58 itojun Exp $   */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
@@ -57,7 +57,7 @@
 #include "interface.h"
 #include "addrtoname.h"
 
-void icmp6_opt_print(const u_char *);
+void icmp6_opt_print(const u_char *, int);
 void mld6_print(const u_char *);
 
 void
@@ -71,6 +71,7 @@
        register int hlen, dport;
        register const u_char *ep;
        char buf[256];
+       int icmp6len;
 
 #if 0
 #define TCHECK(var) if ((u_char *)&(var) > ep - sizeof(var)) goto trunc
@@ -82,6 +83,11 @@
        str = buf;
        /* 'ep' points to the end of avaible data. */
        ep = snapend;
+       if (ip->ip6_plen)
+               icmp6len = (ntohs(ip->ip6_plen) + sizeof(struct ip6_hdr) -
+                           (bp - bp2));
+       else                    /* XXX: jumbo payload case... */
+               icmp6len = snapend - bp;
 
 #if 0
         (void)printf("%s > %s: ",
@@ -102,9 +108,14 @@
                        printf("icmp6: %s unreachable prohibited",
                               ip6addr_string(&oip->ip6_dst));
                        break;
+#ifdef ICMP6_DST_UNREACH_BEYONDSCOPE
+               case ICMP6_DST_UNREACH_BEYONDSCOPE:
+#else
                case ICMP6_DST_UNREACH_NOTNEIGHBOR:
-                       printf("icmp6: %s unreachable not a neighbor",
-                               ip6addr_string(&oip->ip6_dst));
+#endif
+                       printf("icmp6: %s beyond scope of source address %s",
+                              ip6addr_string(&oip->ip6_dst),
+                              ip6addr_string(&oip->ip6_src));
                        break;
                case ICMP6_DST_UNREACH_ADDR:
                        printf("icmp6: %s unreachable address",
@@ -200,10 +211,11 @@
                mld6_print((const u_char *)dp);
                break;
        case ND_ROUTER_SOLICIT:
-               printf("icmp6: router solicitation");
+               printf("icmp6: router solicitation ");
                if (vflag) {
 #define RTSOLLEN 8
-                       icmp6_opt_print((const u_char *)dp + RTSOLLEN);
+                       icmp6_opt_print((const u_char *)dp + RTSOLLEN,
+                                       icmp6len - RTSOLLEN);
                }
                break;
        case ND_ROUTER_ADVERT:
@@ -225,7 +237,8 @@
                        printf("retrans_time=%u)",
                                (u_int32_t)ntohl(p->nd_ra_retransmit));
 #define RTADVLEN 16
-                       icmp6_opt_print((const u_char *)dp + RTADVLEN);
+                       icmp6_opt_print((const u_char *)dp + RTADVLEN,
+                                       icmp6len - RTADVLEN);
                }
                break;
        case ND_NEIGHBOR_SOLICIT:
@@ -237,7 +250,8 @@
                        ip6addr_string(&p->nd_ns_target));
                if (vflag) {
 #define NDSOLLEN 24
-                       icmp6_opt_print((const u_char *)dp + NDSOLLEN);
+                       icmp6_opt_print((const u_char *)dp + NDSOLLEN,
+                                       icmp6len - NDSOLLEN);
                }
            }
                break;
@@ -268,7 +282,8 @@
                                printf(")");
                        }
 #define NDADVLEN 24
-                       icmp6_opt_print((const u_char *)dp + NDADVLEN);
+                       icmp6_opt_print((const u_char *)dp + NDADVLEN,
+                                       icmp6len - NDADVLEN);
                }
            }
                break;
@@ -285,7 +300,8 @@
                printf("icmp6: redirect %s to %s", dstbuf, tgtbuf);
 #define REDIRECTLEN 40
                if (vflag) {
-                       icmp6_opt_print((const u_char *)dp + REDIRECTLEN);
+                       icmp6_opt_print((const u_char *)dp + REDIRECTLEN,
+                                       icmp6len - REDIRECTLEN);
                }
                break;
        }
@@ -397,7 +413,7 @@
 }
 
 void
-icmp6_opt_print(register const u_char *bp)
+icmp6_opt_print(register const u_char *bp, int resid)
 {
        register const struct nd_opt_hdr *op;
        register const struct nd_opt_hdr *opl;  /* why there's no struct? */
@@ -430,6 +446,8 @@
        ep = snapend;
 
        ECHECK(op->nd_opt_len);
+       if (resid <= 0)
+               return;
        switch(op->nd_opt_type) {
        case ND_OPT_SOURCE_LINKADDR:
                opl = (struct nd_opt_hdr *)op;
@@ -444,7 +462,8 @@
                if (opl->nd_opt_len != 1)
                        printf("!");
                printf(")");
-               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3));
+               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
+                               resid - (op->nd_opt_len << 3));
                break;
        case ND_OPT_TARGET_LINKADDR:
                opl = (struct nd_opt_hdr *)op;
@@ -459,7 +478,8 @@
                if (opl->nd_opt_len != 1)
                        printf("!");
                printf(")");
-               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3));
+               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
+                               resid - (op->nd_opt_len << 3));
                break;
        case ND_OPT_PREFIX_INFORMATION:
                opp = (struct nd_opt_prefix_info *)op;
@@ -489,13 +509,15 @@
                if (opp->nd_opt_pi_len != 4)
                        printf("!");
                printf(")");
-               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3));
+               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
+                               resid - (op->nd_opt_len << 3));
                break;
        case ND_OPT_REDIRECTED_HEADER:
                opr = (struct icmp6_opts_redirect *)op;
                printf("(redirect)");
                /* xxx */
-               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3));
+               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
+                               resid - (op->nd_opt_len << 3));
                break;
        case ND_OPT_MTU:
                opm = (struct nd_opt_mtu *)op;
@@ -505,15 +527,17 @@
                if (opm->nd_opt_mtu_len != 1)
                        printf("!");
                printf(")");
-               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3));
+               icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
+                               resid - (op->nd_opt_len << 3));
                break;
        default:
                opts_len = op->nd_opt_len;
                printf("(unknwon opt_type=%d, opt_len=%d)",
                       op->nd_opt_type, opts_len);
                if (opts_len == 0)
-                       opts_len = 1;
-               icmp6_opt_print((const u_char *)op + (opts_len << 3));
+                       opts_len = 1; /* XXX */
+               icmp6_opt_print((const u_char *)op + (opts_len << 3),
+                               resid - (opts_len << 3));
                break;
        }
        return;
diff -r 382b09d65b56 -r 1a6922deb4e6 usr.sbin/tcpdump/print-null.c
--- a/usr.sbin/tcpdump/print-null.c     Mon Jul 26 06:19:01 1999 +0000
+++ b/usr.sbin/tcpdump/print-null.c     Mon Jul 26 06:26:58 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: print-null.c,v 1.7 1999/07/25 00:13:07 itojun Exp $    */
+/*     $NetBSD: print-null.c,v 1.8 1999/07/26 06:26:58 itojun Exp $    */
 
 /*
  * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
@@ -27,7 +27,7 @@
 static const char rcsid[] =
     "@(#) Header: print-null.c,v 1.24 97/05/28 12:52:47 leres Exp  (LBL)";
 #else
-__RCSID("$NetBSD: print-null.c,v 1.7 1999/07/25 00:13:07 itojun Exp $");
+__RCSID("$NetBSD: print-null.c,v 1.8 1999/07/26 06:26:58 itojun Exp $");
 #endif
 #endif
 
@@ -91,16 +91,16 @@
                printf("ip: ");
                break;
 
-       case AF_NS:
-               printf("ns: ");
-               break;
-
 #ifdef INET6
        case AF_INET6:
                printf("ip6: ");
                break;
 #endif
 
+       case AF_NS:
+               printf("ns: ");
+               break;
+
        default:
                printf("AF %d: ", family);
                break;



Home | Main Index | Thread Index | Old Index