net: Add a function to dump TCP's hash table
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 26 May 2017 19:22:00 +0000 (15:22 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 26 May 2017 19:22:32 +0000 (15:22 -0400)
Kfunc this from the monitor.  This was useful debugging failed TCP
connections.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ip.h
kern/src/net/ipaux.c
kern/src/net/tcp.c

index e0563aa..81d4340 100644 (file)
@@ -288,6 +288,7 @@ void iphtadd(struct Ipht *, struct conv *);
 void iphtrem(struct Ipht *, struct conv *);
 struct conv *iphtlook(struct Ipht *ht, uint8_t * sa, uint16_t sp, uint8_t * da,
                                          uint16_t dp);
+void dump_ipht(struct Ipht *ht);
 
 /*
  *  one per multiplexed Protocol
index c466a84..ab0c8d0 100644 (file)
@@ -730,3 +730,19 @@ struct conv *iphtlook(struct Ipht *ht, uint8_t * sa, uint16_t sp, uint8_t * da,
        spin_unlock(&ht->lock);
        return NULL;
 }
+
+void dump_ipht(struct Ipht *ht)
+{
+       struct Iphash *h;
+       struct conv *c;
+
+       spin_lock(&ht->lock);
+       for (int i = 0; i < Nipht; i++) {
+               for (h = ht->tab[i]; h != NULL; h = h->next) {
+                       c = h->c;
+                       printk("Conv proto %s, idx %d: local %I:%d, remote %I:%d\n",
+                              c->p->name, c->x, c->laddr, c->lport, c->raddr, c->rport);
+               }
+       }
+       spin_unlock(&ht->lock);
+}
index dfda129..33d1a09 100644 (file)
@@ -3209,6 +3209,17 @@ void tcpsettimer(Tcpctl * tcb)
        tcb->timer.start = x;
 }
 
+static struct tcppriv *debug_priv;
+
+/* Kfunc this */
+int dump_tcp_ht(void)
+{
+       if (!debug_priv)
+               return -1;
+       dump_ipht(&debug_priv->ht);
+       return 0;
+}
+
 void tcpinit(struct Fs *fs)
 {
        struct Proto *tcp;
@@ -3216,6 +3227,7 @@ void tcpinit(struct Fs *fs)
 
        tcp = kzmalloc(sizeof(struct Proto), 0);
        tpriv = tcp->priv = kzmalloc(sizeof(struct tcppriv), 0);
+       debug_priv = tpriv;
        qlock_init(&tpriv->tl);
        qlock_init(&tpriv->apl);
        tcp->name = "tcp";