[prev in list] [next in list] [prev in thread] [next in thread] 

List:       tcpdump-patches
Subject:    print-ascii.c
From:       "Jens-S. Voeckler" <voeckler () rvs ! uni-hannover ! de>
Date:       2000-09-22 9:37:00
[Download RAW message or body]

Hi,

I do prefer to read single hex bytes instead of glued shorts.
I appended the patch I did to my tcpdump.

--

Also, I would like to vote for a longer snaplen for the
following reason:

20 (ip) + 20 (tcp) + 4 (mss) + 
4 (winscale+nop) + 12 (timestamp+2*nop) + x (sackok) 

  > 60 byte, and with ether > 78 Byte

Some TCP implementations assemble the TCP options in a
very unfortunate way, thus wasting space on NOPs unecessarily.

A generic default of 96 bytes seems applicable.

-- 
Le deagh dhùrachd,
Dipl.-Ing. Jens-S. Vöckler (voeckler@rvs.uni-hannover.de)
Institute for Computer Networks and Distributed Systems
University of Hanover, Germany; +49 511 762 4726
["hex.diff" (text/plain)]

*** print-ascii.c	Fri Sep 22 10:51:25 2000
--- print-ascii.org.c	Fri Sep 22 10:19:42 2000
***************
*** 51,90 ****
  #include "interface.h"
  
  #define HEXDUMP_BYTES_PER_LINE 16
! #define HEXDUMP_HEXSTUFF_PER_BYTE 3 /* 2 hex digits and a space */
       
  void
  ascii_print_with_offset(register const u_char *cp, register u_int length,
  			register u_int oset)
  {
!   static const char* hexdigit = "0123456789ABCDEF";
!   char hexstuff[HEXDUMP_BYTES_PER_LINE*HEXDUMP_HEXSTUFF_PER_BYTE+2], *hsp;
!   char asciistuff[HEXDUMP_BYTES_PER_LINE+2], *asp;
  
!   register u_int i, j;
!   for ( i=oset; i<length; i+=16 ) {
!     hsp = hexstuff;
!     asp = asciistuff;
!     for ( j=0; j<16 && j+i<length; ++j ) {
!       register u_char ch = cp[i+j];
!       *(hsp++) = hexdigit[ ch >> 4 ];
!       *(hsp++) = hexdigit[ ch & 15 ];
!       *(hsp++) = ((j==7) ? '-' : ' ');
!       /* hack: assume ISO-8859-X, so we see German umlaut etc. */
!       *(asp++) = (isgraph( ch & 127 ) ? (char) ch : '.');
!     }
! 
!     /* fill hex digits line, if not a complete line */
!     for ( ; j<16; ++j ) {
!       *(hsp++) = ' ';
!       *(hsp++) = ' ';
!       *(hsp++) = ' ';
!     }
! 
!     /* terminate strings */
!     *hsp = *asp = '\0';
!     (void) printf( "\n0x%04X: %s %s", i, hexstuff, asciistuff );
!   }
  }
  
  void
--- 51,103 ----
  #include "interface.h"
  
  #define HEXDUMP_BYTES_PER_LINE 16
! #define HEXDUMP_SHORTS_PER_LINE (HEXDUMP_BYTES_PER_LINE / 2)
! #define HEXDUMP_HEXSTUFF_PER_SHORT 5 /* 4 hex digits and a space */
! #define HEXDUMP_HEXSTUFF_PER_LINE \
! 		(HEXDUMP_HEXSTUFF_PER_SHORT * HEXDUMP_SHORTS_PER_LINE)
       
  void
  ascii_print_with_offset(register const u_char *cp, register u_int length,
  			register u_int oset)
  {
! 	register u_int i;
! 	register int s1, s2;
! 	register int nshorts;
! 	char hexstuff[HEXDUMP_SHORTS_PER_LINE*HEXDUMP_HEXSTUFF_PER_SHORT+1], *hsp;
! 	char asciistuff[HEXDUMP_BYTES_PER_LINE+1], *asp;
  
! 	nshorts = length / sizeof(u_short);
! 	i = 0;
! 	hsp = hexstuff; asp = asciistuff;
! 	while (--nshorts >= 0) {
! 		s1 = *cp++;
! 		s2 = *cp++;
! 		(void)sprintf(hsp, " %02x%02x", s1, s2);
! 		hsp += HEXDUMP_HEXSTUFF_PER_SHORT;
! 		*(asp++) = (isgraph(s1) ? s1 : '.');
! 		*(asp++) = (isgraph(s2) ? s2 : '.');
! 		if (++i >= HEXDUMP_SHORTS_PER_LINE) {
! 		    *hsp = *asp = '\0';
! 		    (void)printf("\n0x%04x\t%-*s\t%s",
! 				 oset, HEXDUMP_HEXSTUFF_PER_LINE,
! 				 hexstuff, asciistuff);
! 		    i = 0; hsp = hexstuff; asp = asciistuff;
! 		    oset += HEXDUMP_BYTES_PER_LINE;
! 		}
! 	}
! 	if (length & 1) {
! 		s1 = *cp++;
! 		(void)sprintf(hsp, " %02x", s1);
! 		hsp += 3;
! 		*(asp++) = (isgraph(s1) ? s1 : '.');
! 		++i;
! 	}
! 	if (i > 0) {
! 		*hsp = *asp = '\0';
! 		(void)printf("\n0x%04x\t%-*s\t%s",
! 			     oset, HEXDUMP_HEXSTUFF_PER_LINE,
! 			     hexstuff, asciistuff);
! 	}
  }
  
  void


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic