Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | 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 Hdr	Hdr;
8
struct Hdr
9
{
10
	uchar	sum[2];		/* Checksum including header */
11
	uchar	len[2];		/* Packet length */
12
	uchar	type;		/* Packet type */
13
	uchar	spec;		/* Special */
14
	uchar	sport[2];	/* Src port */
15
	uchar	dport[2];	/* Dst port */
16
	uchar	id[4];		/* Sequence id */
17
	uchar	ack[4];		/* Acked sequence */
18
};
19
 
20
enum
21
{
22
	ILLEN= 18,
23
};
24
 
25
enum
26
{
27
	Os,
28
	Od,
29
	Osd,
30
};
31
 
32
static Field p_fields[] = 
33
{
34
	{"s",		Fnum,	Os,	"source port",	} ,
35
	{"d",		Fnum,	Od,	"dest port",	} ,
36
	{"a",		Fnum,	Osd,	"source/dest port",	} ,
37
	{"sd",		Fnum,	Osd,	"source/dest port",	} ,
38
	{0}
39
};
40
 
41
static Mux p_mux[] =
42
{
43
	{"ninep",	17007, },	/* exportfs */
44
	{"ninep",	17008, },	/* 9fs */
45
	{"ninep",	17005, },	/* ocpu */
46
	{"ninep",	17010, },	/* ncpu */
47
	{"ninep",	17013, },	/* cpu */
48
	{0},
49
};
50
 
51
static void
52
p_compile(Filter *f)
53
{
54
	Mux *m;
55
 
56
	if(f->op == '='){
57
		compile_cmp(il.name, f, p_fields);
58
		return;
59
	}
60
	for(m = p_mux; m->name != nil; m++)
61
		if(strcmp(f->s, m->name) == 0){
62
			f->pr = m->pr;
63
			f->ulv = m->val;
64
			f->subop = Osd;
65
			return;
66
		}
67
	sysfatal("unknown il field or protocol: %s", f->s);
68
}
69
 
70
static int
71
p_filter(Filter *f, Msg *m)
72
{
73
	Hdr *h;
74
 
75
	if(m->pe - m->ps < ILLEN)
76
		return 0;
77
	h = (Hdr*)m->ps;
78
	m->ps += ILLEN;
79
 
80
	switch(f->subop){
81
	case Os:
82
		return NetS(h->sport) == f->ulv;
83
	case Od:
84
		return NetS(h->dport) == f->ulv;
85
	case Osd:
86
		return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv;
87
	}
88
	return 0;
89
}
90
 
91
char *pktnames[] = 
92
{
93
	"Sync",	
94
	"Data",
95
	"Dataquery",
96
	"Ack",
97
	"Query",
98
	"State",
99
	"Close"
100
};
101
 
102
static char*
103
pkttype(int t)
104
{
105
	static char b[10];
106
 
107
	if(t > 6){
108
		sprint(b, "%d", t);
109
		return b;
110
	}
111
	return pktnames[t];
112
}
113
 
114
static int
115
p_seprint(Msg *m)
116
{
117
	Hdr *h;
118
	int dport, sport;
119
 
120
	if(m->pe - m->ps < ILLEN)
121
		return -1;
122
	h = (Hdr*)m->ps;
123
	m->ps += ILLEN;
124
 
125
	dport = NetS(h->dport);
126
	sport = NetS(h->sport);
127
	demux(p_mux, sport, dport, m, &dump);
128
 
129
	m->p = seprint(m->p, m->e, "s=%d d=%d t=%s id=%lud ack=%lud spec=%d ck=%4.4ux ln=%d",
130
			sport, dport, pkttype(h->type),
131
			(ulong)NetL(h->id), (ulong)NetL(h->ack),
132
			h->spec,
133
			NetS(h->sum), NetS(h->len));
134
	return 0;
135
}
136
 
137
Proto il =
138
{
139
	"il",
140
	p_compile,
141
	p_filter,
142
	p_seprint,
143
	p_mux,
144
	"%lud",
145
	p_fields,
146
	defaultframer,
147
};