Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <ip.h>
4 #include "dat.h"
5 #include "protos.h"
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 };
20 enum
21 {
22 ILLEN= 18,
23 };
25 enum
26 {
27 Os,
28 Od,
29 Osd,
30 };
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 };
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 };
51 static void
52 p_compile(Filter *f)
53 {
54 Mux *m;
56 if(f->op == '='){
57 compile_cmp(udp.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 }
70 static int
71 p_filter(Filter *f, Msg *m)
72 {
73 Hdr *h;
75 if(m->pe - m->ps < ILLEN)
76 return 0;
77 h = (Hdr*)m->ps;
78 m->ps += ILLEN;
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 }
91 char *pktnames[] =
92 {
93 "Sync",
94 "Data",
95 "Dataquery",
96 "Ack",
97 "Query",
98 "State",
99 "Close"
100 };
102 static char*
103 pkttype(int t)
105 static char b[10];
107 if(t > 6){
108 sprint(b, "%d", t);
109 return b;
111 return pktnames[t];
114 static int
115 p_seprint(Msg *m)
117 Hdr *h;
118 int dport, sport;
120 if(m->pe - m->ps < ILLEN)
121 return -1;
122 h = (Hdr*)m->ps;
123 m->ps += ILLEN;
125 dport = NetS(h->dport);
126 sport = NetS(h->sport);
127 demux(p_mux, sport, dport, m, &dump);
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;
137 Proto il =
139 "il",
140 p_compile,
141 p_filter,
142 p_seprint,
143 p_mux,
144 "%lud",
145 p_fields,
146 defaultframer,
147 };