Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/planix-v0/sys/src/cmd/ip/snoopy/aoe.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <ip.h>
4
#include "dat.h"
5
#include "protos.h"
6
 
7
typedef struct{
8
	uchar	verflags;
9
	uchar	error;
10
	uchar	major[2];
11
	uchar	minor;
12
	uchar	cmd;
13
	uchar	tag[4];
14
}Hdr;
15
 
16
enum{
17
	Hsize	= 10,
18
};
19
 
20
enum{
21
	Omajor,
22
	Ominor,
23
	Ocmd,
24
};
25
 
26
static Mux p_mux[] = {
27
	{"aoeata",	0},
28
	{"aoecmd",	1},
29
	{"aoemask",	2},
30
	{"aoerr",	3},
31
	{0},
32
};
33
 
34
static Field p_fields[] =
35
{
36
	{"shelf",	Fnum,	Ominor,		"shelf", },
37
	{"slot",	Fnum,	Omajor,		"slot",	},
38
	{"cmd",		Fnum,	Ocmd,		"cmd",	},
39
	{0}
40
};
41
 
42
static void
43
p_compile(Filter *f)
44
{
45
	Mux *m;
46
 
47
	if(f->op == '='){
48
		compile_cmp(aoe.name, f, p_fields);
49
		return;
50
	}
51
	for(m = p_mux; m->name; m++)
52
		if(strcmp(f->s, m->name) == 0){
53
			f->pr = m->pr;
54
			f->ulv = m->val;
55
			f->subop = Ocmd;
56
			return;
57
		}
58
	sysfatal("unknown aoe field: %s", f->s);
59
}
60
 
61
static int
62
p_filter(Filter *f, Msg *m)
63
{
64
	Hdr *h;
65
 
66
	if(m->pe - m->ps < Hsize)
67
		return 0;
68
 
69
	h = (Hdr*)m->ps;
70
	m->ps += Hsize;
71
 
72
	switch(f->subop){
73
	case Omajor:
74
		return NetS(h->major) == f->ulv;
75
	case Ominor:
76
		return h->minor == f->ulv;
77
	case Ocmd:
78
		return h->cmd == f->ulv;
79
	}
80
	return 0;
81
}
82
 
83
static int
84
p_seprint(Msg *m)
85
{
86
	Hdr *h;
87
 
88
	if(m->pe - m->ps < Hsize)
89
		return 0;
90
 
91
	h = (Hdr*)m->ps;
92
	m->ps += Hsize;
93
 
94
	demux(p_mux, h->cmd, h->cmd, m, &dump);
95
 
96
	m->p = seprint(m->p, m->e, "ver=%d flag=%4b err=%d %d.%d cmd=%ux tag=%ux",
97
		h->verflags >> 4, h->verflags & 0xf, h->error, NetS(h->major),
98
		h->minor, h->cmd, NetL(h->tag));
99
	return 0;
100
}
101
 
102
Proto aoe =
103
{
104
	"aoe",
105
	p_compile,
106
	p_filter,
107
	p_seprint,
108
	p_mux,
109
	"%lud",
110
	p_fields,
111
	defaultframer,
112
};