xref: /plan9/sys/src/cmd/aquarela/netbios.h (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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;
252