Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <ip.h>
4
#include <thread.h>
5
#include "netbios.h"
6
 
7
static char *
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
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
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
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
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
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
}