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