]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netinet/tcp_debug.c
xnu-3789.70.16.tar.gz
[apple/xnu.git] / bsd / netinet / tcp_debug.c
index 8eef1d998e4cce70d2982eac7cfaf4f9d6f37b94..8ba9eb6af277b239ef38523c0d58bb9ec504b561 100644 (file)
@@ -1,23 +1,29 @@
 /*
  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1982, 1986, 1993
  * SUCH DAMAGE.
  *
  *     @(#)tcp_debug.c 8.1 (Berkeley) 6/10/93
+ * $FreeBSD: src/sys/netinet/tcp_debug.c,v 1.16.2.1 2000/07/15 07:14:31 kris Exp $
  */
 
-#if ISFB31
-#include "opt_inet.h"
-#include "opt_tcpdebug.h"
-#endif
 
 #ifndef INET
 #error The option TCPDEBUG requires option INET.
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/protosw.h>
+#include <sys/sysctl.h>
+#include <sys/socket.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
+#if INET6
 #include <netinet/ip6.h>
+#endif
 #include <netinet/ip_var.h>
 #include <netinet/tcp.h>
 #include <netinet/tcp_fsm.h>
@@ -88,7 +95,9 @@
 #include <netinet/tcp_debug.h>
 
 #if TCPDEBUG
-static int     tcpconsdebug = 0;
+__private_extern__ int tcpconsdebug = 0;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, tcpconsdebug, CTLFLAG_RW | CTLFLAG_LOCKED,
+    &tcpconsdebug, 0, "Turn tcp debugging on or off");
 #endif
 
 static struct tcp_debug tcp_debug[TCP_NDEBUG];
@@ -98,24 +107,28 @@ static int tcp_debx;
  * Tcp debug routines
  */
 void
-tcp_trace(act, ostate, tp, ip, th, req)
+tcp_trace(act, ostate, tp, ipgen, th, req)
        short act, ostate;
        struct tcpcb *tp;
-#if INET6
-       void *ip;
-#else
-       struct ip *ip;
-#endif
+       void *ipgen;
        struct tcphdr *th;
        int req;
 {
 #if INET6
-       int isipv6 = (ip != NULL && ((struct ip *)ip)->ip_v == 6) ? 1 : 0;
+       int isipv6;
 #endif /* INET6 */
        tcp_seq seq, ack;
        int len, flags;
        struct tcp_debug *td = &tcp_debug[tcp_debx++];
 
+#if INET6
+       isipv6 = (ipgen != NULL && ((struct ip *)ipgen)->ip_v == 6) ? 1 : 0;
+#endif /* INET6 */
+       td->td_family =
+#if INET6
+               (isipv6 != 0) ? AF_INET6 :
+#endif
+               AF_INET;
        if (tcp_debx == TCP_NDEBUG)
                tcp_debx = 0;
        td->td_time = iptime();
@@ -126,30 +139,60 @@ tcp_trace(act, ostate, tp, ip, th, req)
                td->td_cb = *tp;
        else
                bzero((caddr_t)&td->td_cb, sizeof (*tp));
-       if (ip) {
+       if (ipgen) {
+               switch (td->td_family) {
+               case AF_INET:
+                       bcopy((caddr_t)ipgen, (caddr_t)&td->td_ti.ti_i,
+                             sizeof(td->td_ti.ti_i));
+                       bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+                       break;
 #if INET6
-               if (isipv6)
-                       td->td_ip6 = *(struct ip6_hdr *)ip;
-               else
-                       td->td_ip = *(struct ip *)ip;
-#else /* INET6 */
-               td->td_ip = *ip;
-#endif /* INET6 */
-       } else
+               case AF_INET6:
+                       bcopy((caddr_t)ipgen, (caddr_t)td->td_ip6buf,
+                             sizeof(td->td_ip6buf));
+                       bzero((caddr_t)&td->td_ti.ti_i,
+                             sizeof(td->td_ti.ti_i));
+                       break;
+#endif
+               default:
+                       bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+                       bzero((caddr_t)&td->td_ti.ti_i,
+                             sizeof(td->td_ti.ti_i));
+                       break;
+               }
+       } else {
+               bzero((caddr_t)&td->td_ti.ti_i, sizeof(td->td_ti.ti_i));
+               bzero((caddr_t)td->td_ip6buf, sizeof(td->td_ip6buf));
+       }
+       if (th) {
+               switch (td->td_family) {
+               case AF_INET:
+                       td->td_ti.ti_t = *th;
+                       bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+                       break;
 #if INET6
-               bzero((caddr_t)&td->_td_ipx, sizeof (td->_td_ipx));
-#else /* INET6 */
-               bzero((caddr_t)&td->td_ip, sizeof (*ip));
-#endif /* INET6 */
-       if (th)
-               td->td_th = *th;
-
+               case AF_INET6:
+                       td->td_ti6.th = *th;
+                       bzero((caddr_t)&td->td_ti.ti_t,
+                             sizeof(td->td_ti.ti_t));
+                       break;
+#endif
+               default:
+                       bzero((caddr_t)&td->td_ti.ti_t,
+                             sizeof(td->td_ti.ti_t));
+                       bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+                       break;
+               }
+       } else {
+               bzero((caddr_t)&td->td_ti.ti_t, sizeof(td->td_ti.ti_t));
+               bzero((caddr_t)&td->td_ti6.th, sizeof(td->td_ti6.th));
+       }
        td->td_req = req;
 #if TCPDEBUG
        if (tcpconsdebug == 0)
                return;
        if (tp)
-               printf("%p %s:", tp, tcpstates[ostate]);
+               printf("%x %s:", tp, tcpstates[ostate]);
        else
                printf("???????? ");
        printf("%s ", tanames[act]);
@@ -158,19 +201,15 @@ tcp_trace(act, ostate, tp, ip, th, req)
        case TA_INPUT:
        case TA_OUTPUT:
        case TA_DROP:
-               if (ip == 0)
+               if (ipgen == NULL || th == NULL)
                        break;
-#if INET6
-               if (isipv6) {
-                       len = ((struct ip6_hdr *)ip)->ip6_plen;
-               } else {
-                       len = ((struct ip *)ip)->ip_len;
-               }
-#else /* INET6 */
-               len = ip->ip_len;
-#endif /* INET6 */
                seq = th->th_seq;
                ack = th->th_ack;
+               len =
+#if INET6
+                       isipv6 ? ((struct ip6_hdr *)ipgen)->ip6_plen :
+#endif
+                       ((struct ip *)ipgen)->ip_len;
                if (act == TA_OUTPUT) {
                        seq = ntohl(seq);
                        ack = ntohl(ack);
@@ -211,9 +250,9 @@ tcp_trace(act, ostate, tp, ip, th, req)
                return;
        printf(
        "\trcv_(nxt,wnd,up) (%lx,%lx,%lx) snd_(una,nxt,max) (%lx,%lx,%lx)\n",
-           (u_long)tp->rcv_nxt, tp->rcv_wnd, (u_long)tp->rcv_up,
-           (u_long)tp->snd_una, (u_long)tp->snd_nxt, (u_long)tp->snd_max);
+           (uint32_t)tp->rcv_nxt, tp->rcv_wnd, (uint32_t)tp->rcv_up,
+           (uint32_t)tp->snd_una, (uint32_t)tp->snd_nxt, (uint32_t)tp->snd_max);
        printf("\tsnd_(wl1,wl2,wnd) (%lx,%lx,%lx)\n",
-           (u_long)tp->snd_wl1, (u_long)tp->snd_wl2, tp->snd_wnd);
+           (uint32_t)tp->snd_wl1, (uint32_t)tp->snd_wl2, tp->snd_wnd);
 #endif /* TCPDEBUG */
 }