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