Fixes ICMP block reuse (checksumming)
[akaros.git] / kern / src / net / icmp.c
index 61ae3c5..ffbc524 100644 (file)
@@ -141,7 +141,7 @@ extern char *icmpconnect(struct conv *c, char **argv, int argc)
 
 extern int icmpstate(struct conv *c, char *state, int n)
 {
-       return snprintf(state, n, "%s qin %d qout %d",
+       return snprintf(state, n, "%s qin %d qout %d\n",
                                        "Datagram",
                                        c->rq ? qlen(c->rq) : 0, c->wq ? qlen(c->wq) : 0);
 }
@@ -176,10 +176,9 @@ static void icmpkick(void *x, struct block *bp)
        if (bp == NULL)
                return;
 
-       if (blocklen(bp) < ICMP_IPSIZE + ICMP_HDRSIZE) {
-               freeblist(bp);
+       bp = pullupblock(bp, ICMP_IPSIZE + ICMP_HDRSIZE);
+       if (bp == 0)
                return;
-       }
        p = (Icmp *) (bp->rp);
        p->vihl = IP_VER4;
        ipriv = c->p->priv;
@@ -298,6 +297,9 @@ static struct block *mkechoreply(struct block *bp)
        Icmp *q;
        uint8_t ip[4];
 
+       /* we're repurposing bp to send it back out.  we need to remove any inbound
+        * checksum flags (which were saying the HW did the checksum) */
+       bp->flag &= ~BCKSUM_FLAGS;
        q = (Icmp *) bp->rp;
        q->vihl = IP_VER4;
        memmove(ip, q->src, sizeof(q->dst));
@@ -450,13 +452,13 @@ int icmpstats(struct Proto *icmp, char *buf, int len)
        p = buf;
        e = p + len;
        for (i = 0; i < Nstats; i++)
-               p = seprintf(p, e, "%s: %lu\n", statnames[i], priv->stats[i]);
+               p = seprintf(p, e, "%s: %u\n", statnames[i], priv->stats[i]);
        for (i = 0; i <= Maxtype; i++) {
                if (icmpnames[i])
-                       p = seprintf(p, e, "%s: %lu %lu\n", icmpnames[i], priv->in[i],
+                       p = seprintf(p, e, "%s: %u %u\n", icmpnames[i], priv->in[i],
                                                 priv->out[i]);
                else
-                       p = seprintf(p, e, "%d: %lu %lu\n", i, priv->in[i], priv->out[i]);
+                       p = seprintf(p, e, "%d: %u %u\n", i, priv->in[i], priv->out[i]);
        }
        return p - buf;
 }