Update for new pcb tailq's.
While here fix ipv6 pcb printing by making tcp6_dump with tcp. XXX: Merge the inet and the inet6 code. It is silly to need to specify -p tcp6 to print a tcp6 pcb, we already know what it is.
This commit is contained in:
parent
63faa32f62
commit
30107bf0d8
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: inet.c,v 1.103 2013/06/20 10:43:18 martin Exp $ */
|
||||
/* $NetBSD: inet.c,v 1.104 2013/11/23 22:01:12 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1988, 1993
|
||||
|
@ -34,7 +34,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "from: @(#)inet.c 8.4 (Berkeley) 4/20/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: inet.c,v 1.103 2013/06/20 10:43:18 martin Exp $");
|
||||
__RCSID("$NetBSD: inet.c,v 1.104 2013/11/23 22:01:12 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
@ -265,7 +265,7 @@ getpcblist_sysctl(const char *name, size_t *len) {
|
|||
static struct kinfo_pcb *
|
||||
getpcblist_kmem(u_long off, const char *name, size_t *len) {
|
||||
struct inpcbtable table;
|
||||
struct inpcb *head, *next, *prev;
|
||||
struct inpcb_hdr *next, *prev;
|
||||
struct inpcb inpcb;
|
||||
struct tcpcb tcpcb;
|
||||
struct socket sockb;
|
||||
|
@ -273,6 +273,7 @@ getpcblist_kmem(u_long off, const char *name, size_t *len) {
|
|||
struct kinfo_pcb *pcblist;
|
||||
size_t size = 100, i;
|
||||
struct sockaddr_in sin;
|
||||
struct inpcbqueue *head;
|
||||
|
||||
if (off == 0) {
|
||||
*len = 0;
|
||||
|
@ -280,22 +281,18 @@ getpcblist_kmem(u_long off, const char *name, size_t *len) {
|
|||
}
|
||||
|
||||
kread(off, (char *)&table, sizeof table);
|
||||
prev = head =
|
||||
(struct inpcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
|
||||
next = (struct inpcb *)table.inpt_queue.cqh_first;
|
||||
head = &table.inpt_queue;
|
||||
next = TAILQ_FIRST(head);
|
||||
prev = TAILQ_END(head);
|
||||
|
||||
if ((pcblist = malloc(size)) == NULL)
|
||||
err(1, "malloc");
|
||||
|
||||
i = 0;
|
||||
while (next != head) {
|
||||
while (next != TAILQ_END(head)) {
|
||||
kread((u_long)next, (char *)&inpcb, sizeof inpcb);
|
||||
if ((struct inpcb *)inpcb.inp_queue.cqe_prev != prev) {
|
||||
warnx("bad pcb");
|
||||
break;
|
||||
}
|
||||
prev = next;
|
||||
next = (struct inpcb *)inpcb.inp_queue.cqe_next;
|
||||
next = TAILQ_NEXT(&inpcb, inp_queue);
|
||||
|
||||
if (inpcb.inp_af != AF_INET)
|
||||
continue;
|
||||
|
@ -305,7 +302,7 @@ getpcblist_kmem(u_long off, const char *name, size_t *len) {
|
|||
kread((u_long)inpcb.inp_ppcb,
|
||||
(char *)&tcpcb, sizeof (tcpcb));
|
||||
}
|
||||
pcblist[i].ki_ppcbaddr =
|
||||
pcblist[i].ki_ppcbaddr =
|
||||
istcp ? (uintptr_t) inpcb.inp_ppcb : (uintptr_t) prev;
|
||||
pcblist[i].ki_rcvq = (uint64_t)sockb.so_rcv.sb_cc;
|
||||
pcblist[i].ki_sndq = (uint64_t)sockb.so_snd.sb_cc;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: inet6.c,v 1.65 2013/10/19 15:56:06 christos Exp $ */
|
||||
/* $NetBSD: inet6.c,v 1.66 2013/11/23 22:01:12 christos Exp $ */
|
||||
/* BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp */
|
||||
|
||||
/*
|
||||
|
@ -64,10 +64,12 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)inet.c 8.4 (Berkeley) 4/20/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: inet6.c,v 1.65 2013/10/19 15:56:06 christos Exp $");
|
||||
__RCSID("$NetBSD: inet6.c,v 1.66 2013/11/23 22:01:12 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#define _CALLOUT_PRIVATE
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/socketvar.h>
|
||||
|
@ -90,22 +92,26 @@ __RCSID("$NetBSD: inet6.c,v 1.65 2013/10/19 15:56:06 christos Exp $");
|
|||
#include <netinet6/in6_pcb.h>
|
||||
#include <netinet6/in6_var.h>
|
||||
#ifdef TCP6
|
||||
#include <netinet6/tcp6.h>
|
||||
#include <netinet6/tcp6_seq.h>
|
||||
#include <netinet/tcp6.h>
|
||||
#include <netinet/tcp6_seq.h>
|
||||
#define TCP6STATES
|
||||
#include <netinet6/tcp6_fsm.h>
|
||||
#include <netinet/tcp6_fsm.h>
|
||||
#define TCP6TIMERS
|
||||
#include <netinet6/tcp6_timer.h>
|
||||
#include <netinet6/tcp6_var.h>
|
||||
#include <netinet6/tcp6_debug.h>
|
||||
#include <netinet/tcp6_timer.h>
|
||||
#include <netinet/tcp6_var.h>
|
||||
#include <netinet/tcp6_debug.h>
|
||||
#else
|
||||
#define TCP6T_NTIMERS TCPT_NTIMERS
|
||||
#define tcp6timers tcptimers
|
||||
#define tcp6states tcpstates
|
||||
#define TCP6_NSTATES TCP_NSTATES
|
||||
#define tcp6cb tcpcb
|
||||
#include <netinet/tcp.h>
|
||||
#include <netinet/tcpip.h>
|
||||
#include <netinet/tcp_seq.h>
|
||||
/*#define TCPSTATES*/
|
||||
#include <netinet/tcp_fsm.h>
|
||||
extern const char * const tcpstates[];
|
||||
/*#define TCPTIMERS*/
|
||||
extern const char * const tcptimers[];
|
||||
#include <netinet/tcp_timer.h>
|
||||
#include <netinet/tcp_var.h>
|
||||
#include <netinet/tcp_debug.h>
|
||||
|
@ -280,33 +286,30 @@ static struct kinfo_pcb *
|
|||
getpcblist_kmem(u_long off, const char *name, size_t *len) {
|
||||
|
||||
struct inpcbtable table;
|
||||
struct in6pcb *head, *prev, *next;
|
||||
struct inpcb_hdr *next, *prev;
|
||||
int istcp = strcmp(name, "tcp6") == 0;
|
||||
struct kinfo_pcb *pcblist;
|
||||
size_t size = 100, i;
|
||||
struct sockaddr_in6 sin6;
|
||||
struct inpcbqueue *head;
|
||||
|
||||
if (off == 0) {
|
||||
*len = 0;
|
||||
return NULL;
|
||||
}
|
||||
kread(off, (char *)&table, sizeof (table));
|
||||
head = prev =
|
||||
(struct in6pcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
|
||||
next = (struct in6pcb *)table.inpt_queue.cqh_first;
|
||||
head = &table.inpt_queue;
|
||||
next = TAILQ_FIRST(head);
|
||||
prev = TAILQ_END(head);
|
||||
|
||||
if ((pcblist = malloc(size)) == NULL)
|
||||
err(1, "malloc");
|
||||
|
||||
i = 0;
|
||||
while (next != head) {
|
||||
while (next != TAILQ_END(head)) {
|
||||
kread((u_long)next, (char *)&in6pcb, sizeof in6pcb);
|
||||
if ((struct in6pcb *)in6pcb.in6p_queue.cqe_prev != prev) {
|
||||
warnx("bad pcb");
|
||||
break;
|
||||
}
|
||||
next = TAILQ_NEXT(&in6pcb, in6p_queue);
|
||||
prev = next;
|
||||
next = (struct in6pcb *)in6pcb.in6p_queue.cqe_next;
|
||||
|
||||
if (in6pcb.in6p_af != AF_INET6)
|
||||
continue;
|
||||
|
@ -1430,17 +1433,20 @@ inet6name(const struct in6_addr *in6p)
|
|||
return (line);
|
||||
}
|
||||
|
||||
#ifdef TCP6
|
||||
/*
|
||||
* Dump the contents of a TCP6 PCB.
|
||||
*/
|
||||
void
|
||||
tcp6_dump(u_long pcbaddr)
|
||||
u_long pcbaddr;
|
||||
tcp6_dump(u_long off, const char *name, u_long pcbaddr)
|
||||
{
|
||||
struct tcp6cb tcp6cb;
|
||||
int i;
|
||||
callout_impl_t *ci;
|
||||
int i, hardticks;
|
||||
struct kinfo_pcb *pcblist;
|
||||
#ifdef TCP6
|
||||
#define mypcb tcp6cb
|
||||
#else
|
||||
#define mypcb tcpcb
|
||||
#endif
|
||||
size_t j, len;
|
||||
|
||||
if (use_sysctl)
|
||||
|
@ -1456,55 +1462,63 @@ tcp6_dump(u_long pcbaddr)
|
|||
if (j == len)
|
||||
errx(1, "0x%lx is not a valid pcb address", pcbaddr);
|
||||
|
||||
kread(pcbaddr, (char *)&tcp6cb, sizeof(tcp6cb));
|
||||
kread(pcbaddr, (char *)&mypcb, sizeof(mypcb));
|
||||
hardticks = get_hardticks();
|
||||
|
||||
printf("TCP Protocol Control Block at 0x%08lx:\n\n", pcbaddr);
|
||||
|
||||
printf("Timers:\n");
|
||||
for (i = 0; i < TCP6T_NTIMERS; i++)
|
||||
printf("\t%s: %u", tcp6timers[i], tcp6cb.t_timer[i]);
|
||||
for (i = 0; i < TCP6T_NTIMERS; i++) {
|
||||
ci = (callout_impl_t *)&tcpcb.t_timer[i];
|
||||
printf("\t%s: %d", tcptimers[i],
|
||||
(ci->c_flags & CALLOUT_PENDING) ?
|
||||
ci->c_time - hardticks : 0);
|
||||
}
|
||||
printf("\n\n");
|
||||
|
||||
if (tcp6cb.t_state < 0 || tcp6cb.t_state >= TCP6_NSTATES)
|
||||
printf("State: %d", tcp6cb.t_state);
|
||||
if (mypcb.t_state < 0 || mypcb.t_state >= TCP6_NSTATES)
|
||||
printf("State: %d", mypcb.t_state);
|
||||
else
|
||||
printf("State: %s", tcp6states[tcp6cb.t_state]);
|
||||
printf(", flags 0x%x, in6pcb 0x%lx\n\n", tcp6cb.t_flags,
|
||||
(u_long)tcp6cb.t_in6pcb);
|
||||
printf("State: %s", tcp6states[mypcb.t_state]);
|
||||
printf(", flags 0x%x, in6pcb 0x%lx\n\n", mypcb.t_flags,
|
||||
(u_long)mypcb.t_in6pcb);
|
||||
|
||||
printf("rxtshift %d, rxtcur %d, dupacks %d\n", tcp6cb.t_rxtshift,
|
||||
tcp6cb.t_rxtcur, tcp6cb.t_dupacks);
|
||||
printf("peermaxseg %u, maxseg %u, force %d\n\n", tcp6cb.t_peermaxseg,
|
||||
tcp6cb.t_maxseg, tcp6cb.t_force);
|
||||
|
||||
printf("snd_una %u, snd_nxt %u, snd_up %u\n",
|
||||
tcp6cb.snd_una, tcp6cb.snd_nxt, tcp6cb.snd_up);
|
||||
printf("snd_wl1 %u, snd_wl2 %u, iss %u, snd_wnd %llu\n\n",
|
||||
tcp6cb.snd_wl1, tcp6cb.snd_wl2, tcp6cb.iss,
|
||||
(unsigned long long)tcp6cb.snd_wnd);
|
||||
|
||||
printf("rcv_wnd %llu, rcv_nxt %u, rcv_up %u, irs %u\n\n",
|
||||
(unsigned long long)cp6cb.rcv_wnd, tcp6cb.rcv_nxt,
|
||||
tcp6cb.rcv_up, tcp6cb.irs);
|
||||
|
||||
printf("rcv_adv %u, snd_max %u, snd_cwnd %llu, snd_ssthresh %llu\n",
|
||||
tcp6cb.rcv_adv, tcp6cb.snd_max, (unsigned long long)tcp6cb.snd_cwnd,
|
||||
(unsigned long long)tcp6cb.snd_ssthresh);
|
||||
|
||||
printf("idle %d, rtt %d, rtseq %u, srtt %d, rttvar %d, rttmin %d, "
|
||||
"max_sndwnd %llu\n\n", tcp6cb.t_idle, tcp6cb.t_rtt, tcp6cb.t_rtseq,
|
||||
tcp6cb.t_srtt, tcp6cb.t_rttvar, tcp6cb.t_rttmin,
|
||||
(unsigned long long)tcp6cb.max_sndwnd);
|
||||
|
||||
printf("oobflags %d, iobc %d, softerror %d\n\n", tcp6cb.t_oobflags,
|
||||
tcp6cb.t_iobc, tcp6cb.t_softerror);
|
||||
|
||||
printf("snd_scale %d, rcv_scale %d, req_r_scale %d, req_s_scale %d\n",
|
||||
tcp6cb.snd_scale, tcp6cb.rcv_scale, tcp6cb.request_r_scale,
|
||||
tcp6cb.requested_s_scale);
|
||||
printf("ts_recent %u, ts_regent_age %d, last_ack_sent %u\n",
|
||||
tcp6cb.ts_recent, tcp6cb.ts_recent_age, tcp6cb.last_ack_sent);
|
||||
}
|
||||
printf("rxtshift %d, rxtcur %d, dupacks %d\n", mypcb.t_rxtshift,
|
||||
mypcb.t_rxtcur, mypcb.t_dupacks);
|
||||
#ifdef TCP6
|
||||
printf("peermaxseg %u, maxseg %u, force %d\n\n", mypcb.t_peermaxseg,
|
||||
mypcb.t_maxseg, mypcb.t_force);
|
||||
#endif
|
||||
|
||||
printf("snd_una %u, snd_nxt %u, snd_up %u\n",
|
||||
mypcb.snd_una, mypcb.snd_nxt, mypcb.snd_up);
|
||||
printf("snd_wl1 %u, snd_wl2 %u, iss %u, snd_wnd %llu\n\n",
|
||||
mypcb.snd_wl1, mypcb.snd_wl2, mypcb.iss,
|
||||
(unsigned long long)mypcb.snd_wnd);
|
||||
|
||||
printf("rcv_wnd %llu, rcv_nxt %u, rcv_up %u, irs %u\n\n",
|
||||
(unsigned long long)mypcb.rcv_wnd, mypcb.rcv_nxt,
|
||||
mypcb.rcv_up, mypcb.irs);
|
||||
|
||||
printf("rcv_adv %u, snd_max %u, snd_cwnd %llu, snd_ssthresh %llu\n",
|
||||
mypcb.rcv_adv, mypcb.snd_max, (unsigned long long)mypcb.snd_cwnd,
|
||||
(unsigned long long)mypcb.snd_ssthresh);
|
||||
|
||||
#ifdef TCP6
|
||||
printf("idle %d, rtt %d, " mypcb.t_idle, mypcb.t_rtt)
|
||||
#endif
|
||||
printf("rtseq %u, srtt %d, rttvar %d, rttmin %d, "
|
||||
"max_sndwnd %llu\n\n", mypcb.t_rtseq,
|
||||
mypcb.t_srtt, mypcb.t_rttvar, mypcb.t_rttmin,
|
||||
(unsigned long long)mypcb.max_sndwnd);
|
||||
|
||||
printf("oobflags %d, iobc %d, softerror %d\n\n", mypcb.t_oobflags,
|
||||
mypcb.t_iobc, mypcb.t_softerror);
|
||||
|
||||
printf("snd_scale %d, rcv_scale %d, req_r_scale %d, req_s_scale %d\n",
|
||||
mypcb.snd_scale, mypcb.rcv_scale, mypcb.request_r_scale,
|
||||
mypcb.requested_s_scale);
|
||||
printf("ts_recent %u, ts_regent_age %d, last_ack_sent %u\n",
|
||||
mypcb.ts_recent, mypcb.ts_recent_age, mypcb.last_ack_sent);
|
||||
}
|
||||
|
||||
#endif /*INET6*/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: main.c,v 1.87 2013/10/18 22:18:14 bad Exp $ */
|
||||
/* $NetBSD: main.c,v 1.88 2013/11/23 22:01:12 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1988, 1993
|
||||
|
@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 1988, 1993\
|
|||
#if 0
|
||||
static char sccsid[] = "from: @(#)main.c 8.4 (Berkeley) 3/1/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.87 2013/10/18 22:18:14 bad Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.88 2013/11/23 22:01:12 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
|
@ -227,7 +227,7 @@ struct protox ip6protox[] = {
|
|||
tcp6_stats, NULL, tcp6_dump, "tcp6" },
|
||||
#else
|
||||
{ N_TCBTABLE, N_TCP6STAT, 1, ip6protopr,
|
||||
tcp_stats, NULL, tcp_dump, "tcp6" },
|
||||
tcp_stats, NULL, tcp6_dump, "tcp6" },
|
||||
#endif
|
||||
{ N_UDBTABLE, N_UDP6STAT, 1, ip6protopr,
|
||||
udp6_stats, NULL, 0, "udp6" },
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: netstat.h,v 1.47 2013/06/19 21:12:03 christos Exp $ */
|
||||
/* $NetBSD: netstat.h,v 1.48 2013/11/23 22:01:12 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
|
@ -92,7 +92,7 @@ struct sockaddr_in6;
|
|||
struct in6_addr;
|
||||
void ip6protopr __P((u_long, const char *));
|
||||
void tcp6_stats __P((u_long, const char *));
|
||||
void tcp6_dump __P((u_long));
|
||||
void tcp6_dump __P((u_long, const char *, u_long));
|
||||
void udp6_stats __P((u_long, const char *));
|
||||
void ip6_stats __P((u_long, const char *));
|
||||
void ip6_ifstats __P((const char *));
|
||||
|
|
Loading…
Reference in New Issue