Use a helper for tracing an interface
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Sep 2016 19:40:06 +0000 (15:40 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Sep 2016 21:27:55 +0000 (17:27 -0400)
I'll use this shortly for loopback.  This also keeps track of dropped
traces, which will help when wondering if snoopy isn't reporting
everything.

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

index dd1edcc..25346f6 100644 (file)
@@ -241,6 +241,7 @@ struct Ipifc {
 
        uint32_t in, out;                       /* message statistics */
        uint32_t inerr, outerr;         /* ... */
+       uint32_t tracedrop;
 
        uint8_t sendra6;                        /* == 1 => send router advs on this ifc */
        uint8_t recvra6;                        /* == 1 => recv router advs on this ifc */
@@ -638,6 +639,7 @@ extern void ipifcremroute(struct Fs *, int unused_int, uint8_t * u8pt,
                                                  uint8_t * u8pt2);
 extern void ipifcremmulti(struct conv *c, uint8_t * ma, uint8_t * ia);
 extern void ipifcaddmulti(struct conv *c, uint8_t * ma, uint8_t * ia);
+extern void ipifc_trace_block(struct Ipifc *ifc, struct block *bp);
 extern long ipselftabread(struct Fs *, char *a, uint32_t offset, int n);
 extern void ipsendra6(struct Fs *f, int on);
 
index f8267eb..5447bf4 100644 (file)
@@ -237,7 +237,7 @@ static void ipifcunbind(struct Ipifc *ifc)
 }
 
 char sfixedformat[] =
-       "device %s maxtu %d sendra %d recvra %d mflag %d oflag %d maxraint %d minraint %d linkmtu %d reachtime %d rxmitra %d ttl %d routerlt %d pktin %lu pktout %lu errin %lu errout %lu\n";
+       "device %s maxtu %d sendra %d recvra %d mflag %d oflag %d maxraint %d minraint %d linkmtu %d reachtime %d rxmitra %d ttl %d routerlt %d pktin %lu pktout %lu errin %lu errout %lu tracedrop %lu\n";
 
 char slineformat[] = " %-40I %-10M %-40I %-12lu %-12lu\n";
 
@@ -254,7 +254,7 @@ static int ipifcstate(struct conv *c, char *state, int n)
                                 ifc->rp.mflag, ifc->rp.oflag, ifc->rp.maxraint,
                                 ifc->rp.minraint, ifc->rp.linkmtu, ifc->rp.reachtime,
                                 ifc->rp.rxmitra, ifc->rp.ttl, ifc->rp.routerlt,
-                                ifc->in, ifc->out, ifc->inerr, ifc->outerr);
+                                ifc->in, ifc->out, ifc->inerr, ifc->outerr, ifc->tracedrop);
 
        rlock(&ifc->rwlock);
        for (lifc = ifc->lifc; lifc && n > m; lifc = lifc->next)
@@ -1512,6 +1512,24 @@ void ipifcaddmulti(struct conv *c, uint8_t * ma, uint8_t * ia)
        }
 }
 
+/* Trace a block @b that crosses the interface @ifc. */
+void ipifc_trace_block(struct Ipifc *ifc, struct block *bp)
+{
+       struct block *newb;
+
+       if (!atomic_read(&ifc->conv->snoopers))
+               return;
+       newb = copyblock(bp, MEM_ATOMIC);
+       if (!newb) {
+               ifc->tracedrop++;
+               return;
+       }
+       if (qpass(ifc->conv->sq, newb) < 0) {
+               ifc->tracedrop++;
+               freeb(newb);
+       }
+}
+
 /*
  *  remove a multicast address from an interface, called with c locked
  */
index 30713d5..1e01a58 100644 (file)
@@ -84,8 +84,7 @@ pktbwrite(struct Ipifc *ifc, struct block *bp, int unused_int,
        /* enqueue onto the conversation's rq */
        bp = concatblock(bp);
        ptclcsum_finalize(bp, 0);
-       if (atomic_read(&ifc->conv->snoopers) > 0)
-               qpass(ifc->conv->sq, copyblock(bp, MEM_WAIT));
+       ipifc_trace_block(ifc, bp);
        qpass(ifc->conv->rq, bp);
 }
 
@@ -94,11 +93,10 @@ pktbwrite(struct Ipifc *ifc, struct block *bp, int unused_int,
  */
 static void pktin(struct Fs *f, struct Ipifc *ifc, struct block *bp)
 {
-       if (ifc->lifc == NULL)
+       if (ifc->lifc == NULL) {
                freeb(bp);
-       else {
-               if (atomic_read(&ifc->conv->snoopers) > 0)
-                       qpass(ifc->conv->sq, copyblock(bp, MEM_WAIT));
+       } else {
+               ipifc_trace_block(ifc, bp);
                ipiput4(f, ifc, bp);
        }
 }