1*ed397113SDavid du Colombier #include <u.h>
2*ed397113SDavid du Colombier #include <libc.h>
3*ed397113SDavid du Colombier #include <ip.h>
4*ed397113SDavid du Colombier #include "dat.h"
5*ed397113SDavid du Colombier #include "protos.h"
6*ed397113SDavid du Colombier
7*ed397113SDavid du Colombier typedef struct Hdr Hdr;
8*ed397113SDavid du Colombier struct Hdr
9*ed397113SDavid du Colombier {
10*ed397113SDavid du Colombier uchar flags;
11*ed397113SDavid du Colombier uchar ln[4]; /* optional, present if L flag set*/
12*ed397113SDavid du Colombier };
13*ed397113SDavid du Colombier
14*ed397113SDavid du Colombier enum
15*ed397113SDavid du Colombier {
16*ed397113SDavid du Colombier FLHDR= 1, /* sizeof(flags) */
17*ed397113SDavid du Colombier LNHDR= 4, /* sizeof(ln) */
18*ed397113SDavid du Colombier };
19*ed397113SDavid du Colombier
20*ed397113SDavid du Colombier enum
21*ed397113SDavid du Colombier {
22*ed397113SDavid du Colombier FlagL = 1<<7,
23*ed397113SDavid du Colombier FlagM = 1<<6,
24*ed397113SDavid du Colombier FlagS = 1<<5,
25*ed397113SDavid du Colombier Version = (1<<2)|(1<<1)|(1<<0),
26*ed397113SDavid du Colombier };
27*ed397113SDavid du Colombier
28*ed397113SDavid du Colombier static Mux p_mux[] =
29*ed397113SDavid du Colombier {
30*ed397113SDavid du Colombier { "dump", 0, },
31*ed397113SDavid du Colombier { 0 }
32*ed397113SDavid du Colombier };
33*ed397113SDavid du Colombier
34*ed397113SDavid du Colombier static char*
flags(int f)35*ed397113SDavid du Colombier flags(int f)
36*ed397113SDavid du Colombier {
37*ed397113SDavid du Colombier static char fl[20];
38*ed397113SDavid du Colombier char *p;
39*ed397113SDavid du Colombier
40*ed397113SDavid du Colombier p = fl;
41*ed397113SDavid du Colombier if(f & FlagS)
42*ed397113SDavid du Colombier *p++ = 'S';
43*ed397113SDavid du Colombier if(f & FlagM)
44*ed397113SDavid du Colombier *p++ = 'M';
45*ed397113SDavid du Colombier if(f & FlagL)
46*ed397113SDavid du Colombier *p++ = 'L';
47*ed397113SDavid du Colombier *p = 0;
48*ed397113SDavid du Colombier return fl;
49*ed397113SDavid du Colombier }
50*ed397113SDavid du Colombier
51*ed397113SDavid du Colombier static int
p_seprint(Msg * m)52*ed397113SDavid du Colombier p_seprint(Msg *m)
53*ed397113SDavid du Colombier {
54*ed397113SDavid du Colombier Hdr *h;
55*ed397113SDavid du Colombier
56*ed397113SDavid du Colombier if(m->pe - m->ps < FLHDR)
57*ed397113SDavid du Colombier return -1;
58*ed397113SDavid du Colombier
59*ed397113SDavid du Colombier h = (Hdr*)m->ps;
60*ed397113SDavid du Colombier m->ps += FLHDR;
61*ed397113SDavid du Colombier
62*ed397113SDavid du Colombier if (h->flags & FlagL) {
63*ed397113SDavid du Colombier if(m->pe - m->ps < LNHDR)
64*ed397113SDavid du Colombier return -1;
65*ed397113SDavid du Colombier else
66*ed397113SDavid du Colombier m->ps += LNHDR;
67*ed397113SDavid du Colombier }
68*ed397113SDavid du Colombier
69*ed397113SDavid du Colombier /* next protocol depending on type*/
70*ed397113SDavid du Colombier demux(p_mux, 0, 0, m, &dump);
71*ed397113SDavid du Colombier
72*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, "ver=%1d", h->flags & Version);
73*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, " fl=%s", flags(h->flags));
74*ed397113SDavid du Colombier
75*ed397113SDavid du Colombier if (h->flags & FlagL)
76*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, " totallen=%1d", NetL(h->ln));
77*ed397113SDavid du Colombier
78*ed397113SDavid du Colombier /* these are not in the header, just print them for our convenience */
79*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, " dataln=%1ld", m->pe - m->ps);
80*ed397113SDavid du Colombier if ((h->flags & (FlagL|FlagS|FlagM)) == 0 && m->ps == m->pe)
81*ed397113SDavid du Colombier m->p = seprint(m->p, m->e, " ack");
82*ed397113SDavid du Colombier
83*ed397113SDavid du Colombier return 0;
84*ed397113SDavid du Colombier }
85*ed397113SDavid du Colombier
86*ed397113SDavid du Colombier Proto ttls =
87*ed397113SDavid du Colombier {
88*ed397113SDavid du Colombier "ttls",
89*ed397113SDavid du Colombier nil,
90*ed397113SDavid du Colombier nil,
91*ed397113SDavid du Colombier p_seprint,
92*ed397113SDavid du Colombier p_mux, /* we need this to get the dump printed */
93*ed397113SDavid du Colombier "%lud",
94*ed397113SDavid du Colombier nil,
95*ed397113SDavid du Colombier defaultframer,
96*ed397113SDavid du Colombier };
97