Fixes arp sends
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Sep 2014 22:20:47 +0000 (15:20 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Sep 2014 22:20:47 +0000 (15:20 -0700)
The first time we'd send an arp, the arp would wait til it was a second
old (and maybe with other sendarps pushing it), instead of sending
immediately.  "ctime" ~= last sent time, though it's not always like
that (o/w I'd change the name).  Maybe it is "change time".

kern/src/net/arp.c
kern/src/net/ethermedium.c

index d06413f..f21d3cf 100644 (file)
@@ -127,7 +127,7 @@ static struct arpent *newarp6(struct arp *arp, uint8_t * ip, struct Ipifc *ifc,
 
        memmove(a->ip, ip, sizeof(a->ip));
        a->utime = NOW;
-       a->ctime = a->utime;
+       a->ctime = 0;   /* somewhat of a "last sent time".  0, to trigger a send. */
        a->type = m;
 
        a->rtime = NOW + ReTransTimer;
index c7d0c80..5e2ac1f 100644 (file)
@@ -529,7 +529,10 @@ static void sendarp(struct Ipifc *ifc, struct arpent *a)
        Etherarp *e;
        Etherrock *er = ifc->arg;
 
-       /* don't do anything if it's been less than a second since the last */
+       /* don't do anything if it's been less than a second since the last.  ctime
+        * is set to 0 for the first time through.  we hold the f->arp qlock, so
+        * there shouldn't be a problem with another arp request for this same
+        * arpent coming down til we update ctime again. */
        if (NOW - a->ctime < 1000) {
                arprelease(er->f->arp, a);
                return;
@@ -544,7 +547,7 @@ static void sendarp(struct Ipifc *ifc, struct arpent *a)
                freeblist(bp);
        }
 
-       /* try to keep it around for a second more */
+       /* update last sent time */
        a->ctime = NOW;
        arprelease(er->f->arp, a);