1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <ip.h>
4*8ccd4a63SDavid du Colombier #include <thread.h>
5*8ccd4a63SDavid du Colombier #include "netbios.h"
6*8ccd4a63SDavid du Colombier
7*8ccd4a63SDavid du Colombier static char *
opname(int opcode)8*8ccd4a63SDavid du Colombier opname(int opcode)
9*8ccd4a63SDavid du Colombier {
10*8ccd4a63SDavid du Colombier switch (opcode) {
11*8ccd4a63SDavid du Colombier case NbnsOpQuery: return "query";
12*8ccd4a63SDavid du Colombier case NbnsOpRegistration: return "registration";
13*8ccd4a63SDavid du Colombier case NbnsOpRelease: return "release";
14*8ccd4a63SDavid du Colombier case NbnsOpWack: return "wack";
15*8ccd4a63SDavid du Colombier case NbnsOpRefresh: return "refresh";
16*8ccd4a63SDavid du Colombier default:
17*8ccd4a63SDavid du Colombier return "???";
18*8ccd4a63SDavid du Colombier }
19*8ccd4a63SDavid du Colombier }
20*8ccd4a63SDavid du Colombier
21*8ccd4a63SDavid du Colombier void
nbnsdumpname(NbName name)22*8ccd4a63SDavid du Colombier nbnsdumpname(NbName name)
23*8ccd4a63SDavid du Colombier {
24*8ccd4a63SDavid du Colombier int x;
25*8ccd4a63SDavid du Colombier for (x = 0; x < NbNameLen - 1; x++) {
26*8ccd4a63SDavid du Colombier if (name[x] == ' ')
27*8ccd4a63SDavid du Colombier break;
28*8ccd4a63SDavid du Colombier print("%c", tolower(name[x]));
29*8ccd4a63SDavid du Colombier }
30*8ccd4a63SDavid du Colombier print("\\x%.2ux", name[NbNameLen - 1]);
31*8ccd4a63SDavid du Colombier }
32*8ccd4a63SDavid du Colombier
33*8ccd4a63SDavid du Colombier void
nbnsdumpmessagequestion(NbnsMessageQuestion * q)34*8ccd4a63SDavid du Colombier nbnsdumpmessagequestion(NbnsMessageQuestion *q)
35*8ccd4a63SDavid du Colombier {
36*8ccd4a63SDavid du Colombier print("question: ");
37*8ccd4a63SDavid du Colombier nbnsdumpname(q->name);
38*8ccd4a63SDavid du Colombier switch (q->type) {
39*8ccd4a63SDavid du Colombier case NbnsQuestionTypeNb: print(" NB"); break;
40*8ccd4a63SDavid du Colombier case NbnsQuestionTypeNbStat: print(" NBSTAT"); break;
41*8ccd4a63SDavid du Colombier default: print(" ???");
42*8ccd4a63SDavid du Colombier }
43*8ccd4a63SDavid du Colombier switch (q->class) {
44*8ccd4a63SDavid du Colombier case NbnsQuestionClassIn: print(" IN"); break;
45*8ccd4a63SDavid du Colombier default: print(" ???");
46*8ccd4a63SDavid du Colombier }
47*8ccd4a63SDavid du Colombier print("\n");
48*8ccd4a63SDavid du Colombier }
49*8ccd4a63SDavid du Colombier
50*8ccd4a63SDavid du Colombier void
nbnsdumpmessageresource(NbnsMessageResource * r,char * name)51*8ccd4a63SDavid du Colombier nbnsdumpmessageresource(NbnsMessageResource *r, char *name)
52*8ccd4a63SDavid du Colombier {
53*8ccd4a63SDavid du Colombier print("%s: ", name);
54*8ccd4a63SDavid du Colombier nbnsdumpname(r->name);
55*8ccd4a63SDavid du Colombier switch (r->type) {
56*8ccd4a63SDavid du Colombier case NbnsResourceTypeA: print(" A"); break;
57*8ccd4a63SDavid du Colombier case NbnsResourceTypeNs: print(" NS"); break;
58*8ccd4a63SDavid du Colombier case NbnsResourceTypeNull: print(" NULL"); break;
59*8ccd4a63SDavid du Colombier case NbnsResourceTypeNb: print(" NB"); break;
60*8ccd4a63SDavid du Colombier case NbnsResourceTypeNbStat: print(" NBSTAT"); break;
61*8ccd4a63SDavid du Colombier default: print(" ???");
62*8ccd4a63SDavid du Colombier }
63*8ccd4a63SDavid du Colombier switch (r->class) {
64*8ccd4a63SDavid du Colombier case NbnsResourceClassIn: print(" IN"); break;
65*8ccd4a63SDavid du Colombier default: print(" ???");
66*8ccd4a63SDavid du Colombier }
67*8ccd4a63SDavid du Colombier print(" ttl: %lud", r->ttl);
68*8ccd4a63SDavid du Colombier if (r->rdlength) {
69*8ccd4a63SDavid du Colombier int i;
70*8ccd4a63SDavid du Colombier print(" rdata: ");
71*8ccd4a63SDavid du Colombier for (i = 0; i < r->rdlength; i++)
72*8ccd4a63SDavid du Colombier print("%.2ux", r->rdata[i]);
73*8ccd4a63SDavid du Colombier }
74*8ccd4a63SDavid du Colombier print("\n");
75*8ccd4a63SDavid du Colombier }
76*8ccd4a63SDavid du Colombier
77*8ccd4a63SDavid du Colombier void
nbnsdumpmessage(NbnsMessage * s)78*8ccd4a63SDavid du Colombier nbnsdumpmessage(NbnsMessage *s)
79*8ccd4a63SDavid du Colombier {
80*8ccd4a63SDavid du Colombier NbnsMessageQuestion *q;
81*8ccd4a63SDavid du Colombier NbnsMessageResource *r;
82*8ccd4a63SDavid du Colombier print("0x%.4ux %s %s (%d)",
83*8ccd4a63SDavid du Colombier s->id, opname(s->opcode), s->response ? "response" : "request", s->opcode);
84*8ccd4a63SDavid du Colombier if (s->broadcast)
85*8ccd4a63SDavid du Colombier print(" B");
86*8ccd4a63SDavid du Colombier if (s->recursionavailable)
87*8ccd4a63SDavid du Colombier print(" RA");
88*8ccd4a63SDavid du Colombier if (s->recursiondesired)
89*8ccd4a63SDavid du Colombier print(" RD");
90*8ccd4a63SDavid du Colombier if (s->truncation)
91*8ccd4a63SDavid du Colombier print(" TC");
92*8ccd4a63SDavid du Colombier if (s->authoritativeanswer)
93*8ccd4a63SDavid du Colombier print(" AA");
94*8ccd4a63SDavid du Colombier if (s->response)
95*8ccd4a63SDavid du Colombier print(" rcode %d", s->rcode);
96*8ccd4a63SDavid du Colombier print("\n");
97*8ccd4a63SDavid du Colombier for (q = s->q; q; q = q->next)
98*8ccd4a63SDavid du Colombier nbnsdumpmessagequestion(q);
99*8ccd4a63SDavid du Colombier for (r = s->an; r; r = r->next)
100*8ccd4a63SDavid du Colombier nbnsdumpmessageresource(r, "answer");
101*8ccd4a63SDavid du Colombier for (r = s->ns; r; r = r->next)
102*8ccd4a63SDavid du Colombier nbnsdumpmessageresource(r, "ns");
103*8ccd4a63SDavid du Colombier for (r = s->ar; r; r = r->next)
104*8ccd4a63SDavid du Colombier nbnsdumpmessageresource(r, "additional");
105*8ccd4a63SDavid du Colombier }
106*8ccd4a63SDavid du Colombier
107*8ccd4a63SDavid du Colombier void
nbdumpdata(void * ap,long n)108*8ccd4a63SDavid du Colombier nbdumpdata(void *ap, long n)
109*8ccd4a63SDavid du Colombier {
110*8ccd4a63SDavid du Colombier uchar *p = ap;
111*8ccd4a63SDavid du Colombier long i;
112*8ccd4a63SDavid du Colombier i = 0;
113*8ccd4a63SDavid du Colombier while (i < n) {
114*8ccd4a63SDavid du Colombier int l = n - i < 16 ? n - i : 16;
115*8ccd4a63SDavid du Colombier int b;
116*8ccd4a63SDavid du Colombier print("0x%.4lux ", i);
117*8ccd4a63SDavid du Colombier for (b = 0; b < l; b += 2) {
118*8ccd4a63SDavid du Colombier print(" %.2ux", p[i + b]);
119*8ccd4a63SDavid du Colombier if (b < l - 1)
120*8ccd4a63SDavid du Colombier print("%.2ux", p[i + b + 1]);
121*8ccd4a63SDavid du Colombier else
122*8ccd4a63SDavid du Colombier print(" ");
123*8ccd4a63SDavid du Colombier }
124*8ccd4a63SDavid du Colombier while (b < 16) {
125*8ccd4a63SDavid du Colombier print(" ");
126*8ccd4a63SDavid du Colombier b++;
127*8ccd4a63SDavid du Colombier }
128*8ccd4a63SDavid du Colombier print(" ");
129*8ccd4a63SDavid du Colombier for (b = 0; b < l; b++)
130*8ccd4a63SDavid du Colombier if (p[i + b] >= ' ' && p[i + b] <= '~')
131*8ccd4a63SDavid du Colombier print("%c", p[i + b]);
132*8ccd4a63SDavid du Colombier else
133*8ccd4a63SDavid du Colombier print(".");
134*8ccd4a63SDavid du Colombier print("\n");
135*8ccd4a63SDavid du Colombier i += l;
136*8ccd4a63SDavid du Colombier }
137*8ccd4a63SDavid du Colombier }
138