xref: /plan9-contrib/sys/src/cmd/ip/snoopy/ttls.c (revision ed397113cdcf7aafea372b730bbcd17b05ee3f60)
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