xref: /plan9/sys/src/cmd/ip/snoopy/il.c (revision 0b9a5132554aff81f12a30adb0ffd48684252652)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <ip.h>
49a747e4fSDavid du Colombier #include "dat.h"
59a747e4fSDavid du Colombier #include "protos.h"
69a747e4fSDavid du Colombier 
79a747e4fSDavid du Colombier typedef struct Hdr	Hdr;
89a747e4fSDavid du Colombier struct Hdr
99a747e4fSDavid du Colombier {
109a747e4fSDavid du Colombier 	uchar	sum[2];		/* Checksum including header */
119a747e4fSDavid du Colombier 	uchar	len[2];		/* Packet length */
129a747e4fSDavid du Colombier 	uchar	type;		/* Packet type */
139a747e4fSDavid du Colombier 	uchar	spec;		/* Special */
149a747e4fSDavid du Colombier 	uchar	sport[2];	/* Src port */
159a747e4fSDavid du Colombier 	uchar	dport[2];	/* Dst port */
169a747e4fSDavid du Colombier 	uchar	id[4];		/* Sequence id */
179a747e4fSDavid du Colombier 	uchar	ack[4];		/* Acked sequence */
189a747e4fSDavid du Colombier };
199a747e4fSDavid du Colombier 
209a747e4fSDavid du Colombier enum
219a747e4fSDavid du Colombier {
229a747e4fSDavid du Colombier 	ILLEN= 18,
239a747e4fSDavid du Colombier };
249a747e4fSDavid du Colombier 
259a747e4fSDavid du Colombier enum
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier 	Os,
289a747e4fSDavid du Colombier 	Od,
299a747e4fSDavid du Colombier 	Osd,
309a747e4fSDavid du Colombier };
319a747e4fSDavid du Colombier 
329a747e4fSDavid du Colombier static Field p_fields[] =
339a747e4fSDavid du Colombier {
349a747e4fSDavid du Colombier 	{"s",		Fnum,	Os,	"source port",	} ,
359a747e4fSDavid du Colombier 	{"d",		Fnum,	Od,	"dest port",	} ,
36dc5a79c1SDavid du Colombier 	{"a",		Fnum,	Osd,	"source/dest port",	} ,
379a747e4fSDavid du Colombier 	{"sd",		Fnum,	Osd,	"source/dest port",	} ,
389a747e4fSDavid du Colombier 	{0}
399a747e4fSDavid du Colombier };
409a747e4fSDavid du Colombier 
419a747e4fSDavid du Colombier static Mux p_mux[] =
429a747e4fSDavid du Colombier {
439a747e4fSDavid du Colombier 	{"ninep",	17007, },	/* exportfs */
449a747e4fSDavid du Colombier 	{"ninep",	17008, },	/* 9fs */
459a747e4fSDavid du Colombier 	{"ninep",	17005, },	/* ocpu */
469a747e4fSDavid du Colombier 	{"ninep",	17010, },	/* ncpu */
479a747e4fSDavid du Colombier 	{"ninep",	17013, },	/* cpu */
489a747e4fSDavid du Colombier 	{0},
499a747e4fSDavid du Colombier };
509a747e4fSDavid du Colombier 
519a747e4fSDavid du Colombier static void
p_compile(Filter * f)529a747e4fSDavid du Colombier p_compile(Filter *f)
539a747e4fSDavid du Colombier {
549a747e4fSDavid du Colombier 	Mux *m;
559a747e4fSDavid du Colombier 
569a747e4fSDavid du Colombier 	if(f->op == '='){
57*0b9a5132SDavid du Colombier 		compile_cmp(il.name, f, p_fields);
589a747e4fSDavid du Colombier 		return;
599a747e4fSDavid du Colombier 	}
609a747e4fSDavid du Colombier 	for(m = p_mux; m->name != nil; m++)
619a747e4fSDavid du Colombier 		if(strcmp(f->s, m->name) == 0){
629a747e4fSDavid du Colombier 			f->pr = m->pr;
639a747e4fSDavid du Colombier 			f->ulv = m->val;
643ff48bf5SDavid du Colombier 			f->subop = Osd;
659a747e4fSDavid du Colombier 			return;
669a747e4fSDavid du Colombier 		}
679a747e4fSDavid du Colombier 	sysfatal("unknown il field or protocol: %s", f->s);
689a747e4fSDavid du Colombier }
699a747e4fSDavid du Colombier 
709a747e4fSDavid du Colombier static int
p_filter(Filter * f,Msg * m)719a747e4fSDavid du Colombier p_filter(Filter *f, Msg *m)
729a747e4fSDavid du Colombier {
739a747e4fSDavid du Colombier 	Hdr *h;
749a747e4fSDavid du Colombier 
759a747e4fSDavid du Colombier 	if(m->pe - m->ps < ILLEN)
769a747e4fSDavid du Colombier 		return 0;
779a747e4fSDavid du Colombier 	h = (Hdr*)m->ps;
789a747e4fSDavid du Colombier 	m->ps += ILLEN;
799a747e4fSDavid du Colombier 
809a747e4fSDavid du Colombier 	switch(f->subop){
819a747e4fSDavid du Colombier 	case Os:
829a747e4fSDavid du Colombier 		return NetS(h->sport) == f->ulv;
839a747e4fSDavid du Colombier 	case Od:
849a747e4fSDavid du Colombier 		return NetS(h->dport) == f->ulv;
859a747e4fSDavid du Colombier 	case Osd:
869a747e4fSDavid du Colombier 		return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv;
879a747e4fSDavid du Colombier 	}
889a747e4fSDavid du Colombier 	return 0;
899a747e4fSDavid du Colombier }
909a747e4fSDavid du Colombier 
919a747e4fSDavid du Colombier char *pktnames[] =
929a747e4fSDavid du Colombier {
939a747e4fSDavid du Colombier 	"Sync",
949a747e4fSDavid du Colombier 	"Data",
959a747e4fSDavid du Colombier 	"Dataquery",
969a747e4fSDavid du Colombier 	"Ack",
979a747e4fSDavid du Colombier 	"Query",
989a747e4fSDavid du Colombier 	"State",
999a747e4fSDavid du Colombier 	"Close"
1009a747e4fSDavid du Colombier };
1019a747e4fSDavid du Colombier 
1029a747e4fSDavid du Colombier static char*
pkttype(int t)1039a747e4fSDavid du Colombier pkttype(int t)
1049a747e4fSDavid du Colombier {
1052cca75a1SDavid du Colombier 	static char b[10];
1069a747e4fSDavid du Colombier 
1079a747e4fSDavid du Colombier 	if(t > 6){
1089a747e4fSDavid du Colombier 		sprint(b, "%d", t);
1099a747e4fSDavid du Colombier 		return b;
1109a747e4fSDavid du Colombier 	}
1119a747e4fSDavid du Colombier 	return pktnames[t];
1129a747e4fSDavid du Colombier }
1139a747e4fSDavid du Colombier 
1149a747e4fSDavid du Colombier static int
p_seprint(Msg * m)1159a747e4fSDavid du Colombier p_seprint(Msg *m)
1169a747e4fSDavid du Colombier {
1179a747e4fSDavid du Colombier 	Hdr *h;
1189a747e4fSDavid du Colombier 	int dport, sport;
1199a747e4fSDavid du Colombier 
1209a747e4fSDavid du Colombier 	if(m->pe - m->ps < ILLEN)
1219a747e4fSDavid du Colombier 		return -1;
1229a747e4fSDavid du Colombier 	h = (Hdr*)m->ps;
1239a747e4fSDavid du Colombier 	m->ps += ILLEN;
1249a747e4fSDavid du Colombier 
1259a747e4fSDavid du Colombier 	dport = NetS(h->dport);
1269a747e4fSDavid du Colombier 	sport = NetS(h->sport);
1279a747e4fSDavid du Colombier 	demux(p_mux, sport, dport, m, &dump);
1289a747e4fSDavid du Colombier 
1299a747e4fSDavid du Colombier 	m->p = seprint(m->p, m->e, "s=%d d=%d t=%s id=%lud ack=%lud spec=%d ck=%4.4ux ln=%d",
1309a747e4fSDavid du Colombier 			sport, dport, pkttype(h->type),
1319a747e4fSDavid du Colombier 			(ulong)NetL(h->id), (ulong)NetL(h->ack),
1329a747e4fSDavid du Colombier 			h->spec,
1339a747e4fSDavid du Colombier 			NetS(h->sum), NetS(h->len));
1349a747e4fSDavid du Colombier 	return 0;
1359a747e4fSDavid du Colombier }
1369a747e4fSDavid du Colombier 
1379a747e4fSDavid du Colombier Proto il =
1389a747e4fSDavid du Colombier {
1399a747e4fSDavid du Colombier 	"il",
1409a747e4fSDavid du Colombier 	p_compile,
1419a747e4fSDavid du Colombier 	p_filter,
1429a747e4fSDavid du Colombier 	p_seprint,
1439a747e4fSDavid du Colombier 	p_mux,
144ed397113SDavid du Colombier 	"%lud",
1459a747e4fSDavid du Colombier 	p_fields,
1463ff48bf5SDavid du Colombier 	defaultframer,
1479a747e4fSDavid du Colombier };
148