Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
enum {
2
	NbNameLen = 16,	
3
	NbnsTimeoutBroadcast = 1000,
4
	NbnsRetryBroadcast = 3,
5
	NbnsPort = 137,
6
	NbDgramMaxLen = 576,
7
};
8
 
9
typedef struct NbnsHdr {
10
	uchar name_trn_id[2];
11
	uchar ctrl[2];
12
	uchar qdcount[2];
13
	uchar ancount[2];
14
	uchar nscount[2];
15
	uchar arcount[2];
16
} NbnsHdr;
17
 
18
enum {
19
	NbnsResponse = 1 << 15
20
};
21
 
22
enum {
23
	NbnsOpShift = 11,
24
	NbnsOpMask = 0xf,
25
	NbnsOpQuery = 0,
26
	NbnsOpRegistration = 5,
27
	NbnsOpRelease = 6,
28
	NbnsOpWack = 7,
29
	NbnsOpRefresh = 8
30
};
31
 
32
enum {
33
	NbnsFlagBroadcast = (1 << 4),
34
	NbnsFlagRecursionAvailable = (1 << 7),
35
	NbnsFlagRecursionDesired = (1 << 8),
36
	NbnsFlagTruncation = (1 << 9),
37
	NbnsFlagAuthoritativeAnswer = (1 << 10),
38
};
39
 
40
enum {
41
	NbnsRcodeShift = 0,
42
	NbnsRcodeMask = 0xf,
43
};
44
 
45
enum {
46
	NbnsQuestionTypeNb = 0x0020,
47
	NbnsQuestionTypeNbStat = 0x0021,
48
	NbnsQuestionClassIn = 0x0001,
49
};
50
 
51
enum {
52
	NbnsResourceTypeA = 0x0001,
53
	NbnsResourceTypeNs = 0x0002,
54
	NbnsResourceTypeNull = 0x000a,
55
	NbnsResourceTypeNb = 0x0020,
56
	NbnsResourceTypeNbStat = 0x0021,
57
	NbnsResourceClassIn = 0x0001,
58
};
59
 
60
typedef struct NbnsMessageQuestion NbnsMessageQuestion;
61
typedef struct NbnsMessageResource NbnsMessageResource;
62
 
63
typedef uchar NbName[NbNameLen];
64
int nbnamedecode(uchar *base, uchar *p, uchar *ep, NbName name);
65
int nbnameencode(uchar *p, uchar *ep, NbName name);
66
int nbnameequal(NbName name1, NbName name2);
67
void nbnamecpy(NbName n1, NbName n2);
68
void nbmknamefromstring(NbName nbname, char *string);
69
void nbmknamefromstringandtype(NbName nbname, char *string, uchar type);
70
void nbmkstringfromname(char *buf, int buflen, NbName name);
71
#pragma varargck type "B" uchar *
72
 
73
int nbnamefmt(Fmt *);
74
 
75
struct NbnsMessageQuestion {
76
	NbName name;
77
	ushort type;
78
	ushort class;
79
	NbnsMessageQuestion *next;
80
};
81
 
82
NbnsMessageQuestion *nbnsmessagequestionnew(NbName name, ushort type, ushort class);
83
 
84
struct NbnsMessageResource {
85
	NbName name;
86
	ushort type;
87
	ushort class;
88
	ulong ttl;
89
	ushort rdlength;
90
	uchar *rdata;
91
	NbnsMessageResource *next;
92
};
93
NbnsMessageResource *nbnsmessageresourcenew(NbName name, ushort type, ushort class, ulong ttl, int rdcount, uchar *rdata);
94
 
95
typedef struct NbnsMessage {
96
	ushort id;
97
	int response;
98
	int opcode;
99
	int broadcast;
100
	int recursionavailable;
101
	int recursiondesired;
102
	int truncation;
103
	int authoritativeanswer;
104
	int rcode;
105
	NbnsMessageQuestion *q;
106
	NbnsMessageResource *an;
107
	NbnsMessageResource *ns;
108
	NbnsMessageResource *ar;
109
} NbnsMessage;
110
 
111
NbnsMessage *nbnsmessagenew(void);
112
void nbnsmessageaddquestion(NbnsMessage *s, NbnsMessageQuestion *q);
113
void nbnsmessageaddresource(NbnsMessageResource **rp, NbnsMessageResource *r);
114
NbnsMessage *nbnsconvM2S(uchar *ap, int nap);
115
void nbnsmessagefree(NbnsMessage **sp);
116
void nbnsdumpmessage(NbnsMessage *s);
117
int nbnsconvS2M(NbnsMessage *s, uchar *ap, int nap);
118
 
119
 
120
NbnsMessage *nbnsmessagenamequeryrequestnew(ushort id, int broadcast, NbName name);
121
NbnsMessage *nbnsmessagenameregistrationrequestnew(ushort id, int broadcast, NbName name, ulong ttl, uchar *ipaddr);
122
 
123
typedef struct NbnsTransaction NbnsTransaction;
124
 
125
struct NbnsTransaction {
126
	ushort id;
127
	Channel *c;
128
	NbnsTransaction *next;
129
};
130
ushort nbnsnextid(void);
131
 
132
int nbnsfindname(uchar *serveripaddr, NbName name, uchar *ipaddr, ulong *ttlp);
133
int nbnsaddname(uchar *serveripaddr, NbName name, ulong ttl, uchar *ipaddr);
134
 
135
NbnsTransaction *nbnstransactionnew(NbnsMessage *request, uchar *ipaddr);
136
void nbnstransactionfree(NbnsTransaction **tp);
137
 
138
typedef struct NbnsAlarm NbnsAlarm;
139
 
140
struct NbnsAlarm {
141
	Channel *c;
142
	vlong expirems;
143
	NbnsAlarm *next;
144
};
145
 
146
void nbnsalarmset(NbnsAlarm *a, ulong millisec);
147
void nbnsalarmcancel(NbnsAlarm *a);
148
void nbnsalarmfree(NbnsAlarm **ap);
149
NbnsAlarm *nbnsalarmnew(void);
150
void nbnsalarmend(void);
151
 
152
typedef struct NbSession NbSession;
153
typedef int NBSSWRITEFN(NbSession *s, void *buf, long n);
154
 
155
struct NbSession {
156
	int fd;
157
	void *magic;
158
	NbName from;
159
	NbName to;
160
};
161
 
162
int nbsslisten(NbName to, NbName from, int (*accept)(void *magic, NbSession *s, NBSSWRITEFN **write), void *magic);
163
NbSession *nbssconnect(NbName to, NbName from);
164
void nbssfree(NbSession *s);
165
 
166
typedef struct NbScatterGather NbScatterGather;
167
 
168
struct NbScatterGather {
169
	void *p;
170
	long l;
171
};
172
 
173
int nbssgatherwrite(NbSession *s, NbScatterGather *a);
174
long nbssscatterread(NbSession *, NbScatterGather *a);
175
int nbsswrite(NbSession *s, void *buf, long n);
176
long nbssread(NbSession *s, void *buf, long n);
177
void *nbemalloc(ulong);
178
 
179
int nbnameresolve(NbName name, uchar *ipaddr);
180
 
181
void nbdumpdata(void *data, long datalen);
182
 
183
typedef struct NbDgram {
184
	uchar type;
185
	uchar flags;
186
	ushort id;
187
	uchar srcip[IPaddrlen];
188
	ushort srcport;
189
	union {
190
		struct {
191
			ushort length;
192
			ushort offset;
193
			NbName srcname;
194
			NbName dstname;
195
			uchar *data;
196
		} datagram;
197
		struct {
198
			uchar code;
199
		} error;
200
		struct {
201
			NbName dstname;
202
		} query;
203
	};
204
} NbDgram;
205
 
206
enum {
207
	NbDgramDirectUnique = 0x10,
208
	NbDgramDirectGroup,
209
	NbDgramBroadcast,
210
	NbDgramError,
211
	NbDgramQueryRequest,
212
	NbDgramPositiveQueryResponse,
213
	NbDgramNegativeQueryResponse,
214
	NbDgramMore = 1,
215
	NbDgramFirst = 2,
216
	NbDgramPort = 138,
217
	NbDgramErrorDestinationNameNotPresent = 0x82,
218
	NbDgramMaxPacket = 576,
219
};
220
 
221
typedef struct NbDgramSendParameters {
222
	NbName to;
223
	uchar type;
224
} NbDgramSendParameters;
225
 
226
int nbdgramconvM2S(NbDgram *s, uchar *p, uchar *ep);
227
int nbdgramconvS2M(uchar *p, uchar *ep, NbDgram *s);
228
void nbdgramdump(NbDgram *s);
229
int nbdgramsendto(uchar *ipaddr, ushort port, NbDgram *s);
230
int nbdgramsend(NbDgramSendParameters *p, unsigned char *data, long datalen);
231
char *nbdgramlisten(NbName to, int (*deliver)(void *magic, NbDgram *s), void *magic);
232
 
233
int nbnametablefind(NbName name, int add);
234
int nbnameisany(NbName name);
235
 
236
int nbremotenametablefind(NbName name, uchar *ipaddr);
237
int nbremotenametableadd(NbName name, uchar *ipaddr, ulong ttl);
238
 
239
typedef struct NbGlobals {
240
	uchar myipaddr[IPaddrlen];
241
	uchar bcastaddr[IPaddrlen];
242
	NbName myname;
243
} NbGlobals;
244
 
245
extern NbGlobals nbglobals;
246
extern NbName nbnameany;
247
 
248
int nbinit(void);
249
char *nbudpannounce(ushort port, int *fdp);
250
 
251
extern int nbudphdrsize;