7 typedef struct Hdr Hdr;
21 typedef struct PseudoHdr{
42 static Field p_fields[] =
44 {"s", Fnum, Os, "source port", } ,
45 {"d", Fnum, Od, "dest port", } ,
46 {"a", Fnum, Osd, "source/dest port", } ,
47 {"sd", Fnum, Osd, "source/dest port", } ,
54 {"ninep", 17007, }, /* exportfs */
55 {"ninep", 564, }, /* 9fs */
56 {"ninep", 17005, }, /* ocpu */
57 {"ninep", 17010, }, /* ncpu */
58 {"ninep", 17013, }, /* cpu */
67 MSS_LENGTH = 4, /* Mean segment size */
69 WS_LENGTH = 3, /* Bits to scale window size by */
78 compile_cmp(tcp.name, f, p_fields);
81 for(m = p_mux; m->name != nil; m++)
82 if(strcmp(f->s, m->name) == 0){
88 sysfatal("unknown tcp field or protocol: %s", f->s);
92 p_filter(Filter *f, Msg *m)
96 if(m->pe - m->ps < TCPLEN)
100 m->ps += (NetS(h->flag)>>10) & 0x3f;
104 return NetS(h->sport) == f->ulv;
106 return NetS(h->dport) == f->ulv;
108 return NetS(h->sport) == f->ulv || NetS(h->dport) == f->ulv;
115 URG = 0x20, /* Data marked urgent */
116 ACK = 0x10, /* Aknowledge is valid */
117 PSH = 0x08, /* Whole data pipe is pushed */
118 RST = 0x04, /* Reset connection */
119 SYN = 0x02, /* Pkt. is synchronise */
120 FIN = 0x01, /* Start close down */
150 int dport, sport, len, flag, optlen;
154 if(m->pe - m->ps < TCPLEN)
158 /* get tcp header length */
159 flag = NetS(h->flag);
160 len = (flag>>10) & ~3;
165 dport = NetS(h->dport);
166 sport = NetS(h->sport);
167 demux(p_mux, sport, dport, m, &dump);
169 m->p = seprint(m->p, m->e, "s=%d d=%d seq=%lud ack=%lud fl=%s win=%d ck=%4.4ux",
170 NetS(h->sport), dport,
171 (ulong)NetL(h->seq), (ulong)NetL(h->ack),
172 flags(flag), NetS(h->win),
180 m->p = seprint(m->p, m->e, " opt=EOL");
183 if(*optr == NOOPOPT) {
184 m->p = seprint(m->p, m->e, " opt=NOOP");
190 if(optlen < 2 || optlen > len)
194 m->p = seprint(m->p, m->e, " opt%d=(mss %ud)",
195 optlen, nhgets(optr+2));
198 m->p = seprint(m->p, m->e, " opt%d=(wscale %ud)",
202 m->p = seprint(m->p, m->e, " opt%d=(%ud %.*H)",
203 optlen, *optr, optlen-2, optr+2);