PCDBUG.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:8k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. #include <stdio.h>
  2. #include <wattcp.h>
  3. #include <fcntl.h>
  4. #include <sys/stat.h>
  5. #include <ctype.h>
  6. #include <stdlib.h>
  7. #include <stdarg.h>
  8. #include <io.h>
  9. #include <string.h>
  10. #include <mem.h>
  11. #include <icmp.h> // R. Whitby
  12. extern void (*_dbugxmit)( sock_type *s, in_Header *inp, void *phdr, unsigned line );
  13. extern void (*_dbugrecv)( sock_type *s, in_Header *inp, void *phdr, unsigned line );
  14. #define DEBUGNAME "WATTCP.DBG"
  15. char debugname[ 128 ];
  16. int debugheaders, debugdump, debugudp, debugtcp, debugicmp;   // R. Whitby
  17. static char localbuf[ 128 ];
  18. static int localhandle = 0;
  19. void db_write( char *msg )
  20. {
  21.     if (localhandle) // R. Whitby
  22.        write( localhandle, msg, strlen(msg));
  23. }
  24. void db_open( void )
  25. {
  26.     if (!localhandle) {
  27. localhandle = _creat( debugname, 0 );
  28. if (localhandle < 0 ) {
  29.     outs("ERROR:unable to open debug file!n");
  30.     exit(3);
  31. }
  32.     }
  33. }
  34. void db_close( void )
  35. {
  36.     int i;
  37.     if ( (i = dup( localhandle )) != -1 )
  38. close(i);
  39. }
  40. void dbug_printf( char *format, ... )
  41. {
  42.     va_list argptr;
  43.     static char localspace[ 256 ];
  44.     if ( localhandle ) {
  45. db_write( "n > ");
  46. va_start( argptr, format );
  47. vsprintf( localspace, format, argptr );
  48. va_end( argptr );
  49. db_write( localspace );
  50. db_write( "n" );
  51. db_close();
  52.     }
  53. }
  54. static char *tcpflag[] =
  55.     /*  7  ,   6 ,  5  ,   4 ,   3 ,   2 ,   1 ,   0 */
  56.       {"??7","??6","URG","ACK","PSH","RST","SYN","FIN" };
  57. static char *tcpmode[] = {
  58.     "LISTEN","SYNSENT","SYNREC","ESTAB","ESTCLOSE","FINWT1","FINWT2",
  59. "CLOSWT","CLOSING","LASTACK","TIMEWT","CLOSEMSL","CLOSED" };
  60. static void db_msg( char *msg, sock_type *sock, in_Header *ip, tcp_Header *tp, int line )
  61. {
  62.     int i,j,datalen, protocol;
  63.     byte ch, *data;
  64.     udp_Header *up;
  65.     icmp_pkt *icmp; // R. Whitby
  66.     switch ( protocol = ip->proto ) {
  67. case ICMP_PROTO :
  68.     if (!debugicmp) return;
  69.     icmp = (icmp_pkt*)(tp);
  70.     i = in_GetHdrlenBytes(ip);
  71.     data = (byte *)(icmp);
  72.     datalen = intel16(ip->length) - i;
  73.     break;
  74. case UDP_PROTO :
  75.     if (!debugudp) return;
  76.     up = (udp_Header*)(tp);
  77.     datalen = intel16(up->length);
  78.     data = (char *)(up) + sizeof( udp_Header );
  79.     break;
  80. case TCP_PROTO :
  81.     if (!debugtcp) return;
  82.     i = (tcp_GetDataOffset(tp) << 2); /* qwords to bytes */
  83.     j = in_GetHdrlenBytes(ip);
  84.     data = (char*)(tp) + i;
  85.     datalen = intel16(ip->length) - j - i;
  86.     break;
  87. default :
  88.     return;
  89.     }
  90.     db_open();
  91.     /* skip packet if no data and that was all we were looking for */
  92.     if (!debugheaders && !datalen) return;
  93.     db_write( msg );
  94.     if (!sock) {
  95. db_write( inet_ntoa( localbuf, intel( ip->source) ));
  96. if (protocol != ICMP_PROTO) { // R. Whitby
  97.     db_write( ":" );
  98.     db_write( itoa( intel16(tp->srcPort), localbuf, 10));
  99. }
  100. db_write( "   ");
  101. if (protocol != ICMP_PROTO) { // R. Whitby
  102.     db_write( inet_ntoa( localbuf, intel( ip->destination ) ));
  103.     db_write( ":" );
  104.     db_write( itoa( intel16(tp->dstPort),  localbuf, 10));
  105. }
  106. db_write( " (NO SOCKET)");
  107. /*
  108. return;
  109. */
  110.     } else {
  111. db_write( inet_ntoa( localbuf, sock->tcp.hisaddr ));
  112. db_write( ":" );
  113. db_write( itoa( sock->tcp.hisport, localbuf, 10));
  114. db_write( "   0.0.0.0:");
  115. db_write( itoa( sock->tcp.myport,  localbuf, 10));
  116.     }
  117.     db_write("n");
  118.     if (debugheaders) {
  119. switch (protocol) {
  120.     // R. Whitby
  121.     case ICMP_PROTO :
  122. db_write("ICMP PACKET : ");
  123. switch ( icmp->unused.type) {
  124.     case 0 : /* icmp echo reply received */
  125. db_write("ECHO REPLY");
  126. break;
  127.     case 3 : /* destination unreachable message */
  128. db_write("DESTINATION UNREACHABLE");
  129. break;
  130.     case 4  : /* source quench */
  131. db_write("SOURCE QUENCH");
  132. break;
  133.     case 5  : /* redirect */
  134. db_write("REDIRECT");
  135. break;
  136.     case 8  : /* icmp echo request */
  137. db_write("ECHO REQUEST");
  138. break;
  139.     case 11 : /* time exceeded message */
  140. db_write("TIME EXCEEDED");
  141. break;
  142.     case 12 : /* parameter problem message */
  143. db_write("PARAMETER PROBLEM");
  144. break;
  145.     case 13 : /* timestamp message */
  146. db_write("TIMESTAMP REQUEST");
  147. break;
  148.     case 14 : /* timestamp reply */
  149. db_write("TIMESTAMP REPLY");
  150. break;
  151.     case 15 : /* info request */
  152. db_write("INFORMATION REQUEST");
  153. break;
  154.     case 16 : /* info reply */
  155. db_write("INFORMATION REPLU");
  156. break;
  157.     default : /* unknown */
  158. db_write("UNKNOWN TYPE");
  159. break;
  160. }
  161. break;
  162.     case UDP_PROTO :
  163. db_write("UDP PACKET");
  164. break;
  165.     case TCP_PROTO :
  166. db_write("    TCP PACKET : ");
  167. db_write( tcpmode[ sock->tcp.state ] );
  168. db_write("  (LSEQ: 0x");
  169. db_write(ltoa(sock->tcp.seqnum,localbuf,16));
  170. db_write("  LACK: 0x");
  171. db_write(ltoa(sock->tcp.acknum,localbuf,16));
  172. db_write(") NOW: ");
  173. db_write( ltoa( set_timeout(0), localbuf,10));
  174. db_write("n    TCP FLAGS : ");
  175. for ( i = 0; i < 8 ; ++i ) {
  176.     if ( intel16(tp->flags) & ( 0x80 >> i )) {
  177. db_write( tcpflag[i] );
  178. db_write(" ");
  179.     }
  180. }
  181. db_write("  SEQ : 0x");
  182. db_write(ltoa(intel(tp->seqnum),localbuf,16));
  183. db_write("  ACK : 0x");
  184. db_write(ltoa(intel(tp->acknum),localbuf,16));
  185. db_write("  WINDOW : ");
  186. db_write(itoa(intel16(tp->window),localbuf,10));
  187. db_write("n K_C : ");
  188. db_write(itoa(sock->tcp.karn_count,localbuf,10 ));
  189. db_write("  VJ_SA : ");
  190. db_write(itoa(sock->tcp.vj_sa ,localbuf,10 ) );
  191. db_write("  VJ_SD : ");
  192. db_write(itoa(sock->tcp.vj_sd,localbuf,10 ) );
  193. db_write("  RTO : ");
  194. db_write(itoa(sock->tcp.rto ,localbuf,10 ));
  195. db_write(" RTT : ");
  196. db_write(ltoa(sock->tcp.rtt_time ,localbuf,10 ));
  197. db_write(" RTTDIFF : ");
  198. db_write(ltoa(sock->tcp.rtt_time - set_ttimeout(0),localbuf,10 ));
  199. db_write(" UNHAPPY : ");
  200. db_write(itoa(sock->tcp.unhappy,localbuf,10 ));
  201. if (line) {
  202.     db_write(" LINE : ");
  203.     db_write(itoa(line, localbuf, 10 ));
  204. }
  205. break;
  206. }
  207.     db_write("n");
  208.     }
  209.     if (debugdump) {
  210. for (i = 0; i < datalen ; i+= 16 ) {
  211.     sprintf(localbuf,"%04x : ", i );
  212.     db_write( localbuf );
  213.     for (j = 0 ; (j < 16) && (j +i < datalen) ; ++j ) {
  214.                 sprintf( localbuf, "%02x%c", (unsigned) data[j+i], (j==7)?'-':' ');
  215. db_write( localbuf );
  216.     }
  217.     for ( ; j < 16 ; ++j )
  218. db_write("   ");
  219.     memset( localbuf, 0, 17 );
  220.     for ( j = 0; (j<16) && (j+i<datalen) ; ++j ) {
  221. ch = data[j+i];
  222. if ( !isprint(ch) ) ch = '.';
  223.                 localbuf[j] = ch;
  224.             }
  225.             db_write( localbuf);
  226.             db_write("n");
  227.         }
  228.     }
  229.     db_write("n");
  230.     db_close();
  231. }
  232. static void _dbxmit( sock_type *sock, in_Header *ip, void *prot, unsigned line )
  233. {
  234.     db_msg("Tx:",sock,ip,prot,line);
  235. }
  236. static void _dbrecv( sock_type *sock, in_Header *ip, void *prot, unsigned line )
  237. {
  238.     db_msg("Rx:",sock,ip,prot, line);
  239. }
  240. static void (*otherinit)( char *name, char *value );
  241. static void ourinit( char *name, char *value )
  242. {
  243.     if (!strcmp(name,"DEBUG.FILE")) {
  244. strncpy(debugname, value, sizeof(debugname)-2);
  245. debugname[sizeof(debugname) -1] = 0;
  246. db_open();
  247.     } else if (!strcmp(name,"DEBUG.MODE")) {
  248. if (!stricmp( value, "DUMP" )) debugdump = 1;
  249. if (!stricmp( value, "HEADERS")) debugheaders =1;
  250. if (!stricmp( value, "ALL")) debugheaders = debugdump = 1;
  251.     } else if (!strcmp(name,"DEBUG.PROTO")) {
  252. if (!stricmp( value, "ICMP")) debugicmp = 1; // R. Whitby
  253. if (!stricmp( value, "TCP")) debugtcp = 1;
  254. if (!stricmp( value, "UDP")) debugudp =1;
  255. if (!stricmp( value, "ALL")) debugudp = debugtcp = 1;
  256.     } else if (otherinit)
  257. (*otherinit)(name,value);
  258. }
  259. extern void (*usr_init)( char *name, char *value );
  260. void dbug_init( void )
  261. {
  262.     strcpy(debugname,DEBUGNAME );
  263.     otherinit = usr_init;
  264.     usr_init = ourinit;
  265.     _dbugxmit = _dbxmit;
  266.     _dbugrecv = _dbrecv;
  267.     debugheaders = debugdump = debugicmp = debugudp = debugtcp = 0; // R. Whitby
  268. }