31 int logmask; /* mask of things to debug */
32 uint8_t iponly[IPaddrlen]; /* ip address to print debugging for */
39 typedef struct Netlogflag {
44 static Netlogflag flags[] =
53 { "compress", Logcompress, },
54 { "ilmsg", Logil|Logilmsg, },
56 { "tcpwin", Logtcp|Logtcpwin, },
57 { "tcprxmt", Logtcp|Logtcprxmt, },
58 { "udpmsg", Logudp|Logudpmsg, },
59 { "ipmsg", Logip|Logipmsg, },
64 char Ebadnetctl[] = "too few arguments for netlog control message";
74 struct cmdtab routecmd[] = {
76 {CMclear, "clear", 0},
81 netloginit(struct Fs *f)
83 f->alog = kzmalloc(sizeof(struct Netlog), 0);
84 spinlock_init(&f->alog->lock);
85 qlock_init(&f->alog->qlock);
86 rendez_init(&f->alog->r);
90 netlogopen(struct Fs *f)
93 spin_lock(&f->alog->lock);
95 spin_unlock(&f->alog->lock);
98 if(f->alog->opens == 0){
99 if(f->alog->buf == NULL)
100 f->alog->buf = kzmalloc(Nlog, 0);
101 f->alog->rptr = f->alog->buf;
102 f->alog->end = f->alog->buf + Nlog;
105 spin_unlock(&f->alog->lock);
110 netlogclose(struct Fs *f)
113 spin_lock(&f->alog->lock);
115 spin_unlock(&f->alog->lock);
119 if(f->alog->opens == 0){
123 spin_unlock(&f->alog->lock);
136 netlogread(struct Fs *f, void *a, uint32_t unused, long n)
142 qlock(&f->alog->qlock);
144 qunlock(&f->alog->qlock);
149 spin_lock(&f->alog->lock);
154 rptr = f->alog->rptr;
156 if(f->alog->rptr >= f->alog->end){
157 d = f->alog->rptr - f->alog->end;
158 f->alog->rptr = f->alog->buf + d;
161 spin_unlock(&f->alog->lock);
166 memmove(p+i, f->alog->buf, d);
170 spin_unlock(&f->alog->lock);
172 rendez_sleep(&f->alog->r, netlogready, f);
175 qunlock(&f->alog->qlock);
182 netlogctl(struct Fs *f, char* s, int n)
199 ct = lookupcmd(cb, routecmd, ARRAY_SIZE(routecmd));
211 parseip(f->alog->iponly, cb->f[1]);
212 if(ipcmp(f->alog->iponly, IPnoaddr) == 0)
213 f->alog->iponlyset = 0;
215 f->alog->iponlyset = 1;
221 cmderror(cb, "unknown ip control message");
224 for(i = 1; i < cb->nf; i++){
225 for(fp = flags; fp->name; fp++)
226 if(strcmp(fp->name, cb->f[i]) == 0)
231 f->alog->logmask |= fp->mask;
233 f->alog->logmask &= ~fp->mask;
241 netlog(struct Fs *f, int mask, char *fmt, ...)
243 char buf[128], *t, *fp;
247 if(!(f->alog->logmask & mask))
250 if(f->alog->opens == 0)
254 n = snprintf(buf, sizeof(buf), fmt, arg);
257 spin_lock(&f->alog->lock);
258 i = f->alog->len + n - Nlog;
262 if(f->alog->rptr >= f->alog->end)
263 f->alog->rptr = f->alog->buf + (f->alog->rptr - f->alog->end);
265 t = f->alog->rptr + f->alog->len;
269 if(t >= f->alog->end)
270 t = f->alog->buf + (t - f->alog->end);
273 spin_unlock(&f->alog->lock);
275 rendez_wakeup(&f->alog->r);