2 Unix SMB/CIFS implementation.
4 packet utility functions
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "nbt_server/nbt_server.h"
25 #include "lib/socket/socket.h"
28 we received a badly formed packet - log it
30 void nbtd_bad_packet(struct nbt_name_packet *packet,
31 const struct socket_address *src, const char *reason)
33 DEBUG(2,("nbtd: bad packet '%s' from %s:%d\n", reason, src->addr, src->port));
35 NDR_PRINT_DEBUG(nbt_name_packet, packet);
41 see if an incoming packet is a broadcast packet from one of our own
44 BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
45 struct nbt_name_packet *packet,
46 const struct socket_address *src)
48 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
49 struct nbtd_interface);
50 struct nbtd_server *nbtsrv = iface->nbtsrv;
52 /* if its not a broadcast then its not considered a self packet */
53 if (!(packet->operation & NBT_FLAG_BROADCAST)) {
57 /* if its not from the nbt port, then it wasn't a broadcast from us */
58 if (src->port != lp_nbt_port()) {
62 /* this uses the fact that iface->nbtsock is our non-broadcast
64 if (iface->nbtsock == nbtsock &&
65 iface != iface->nbtsrv->bcast_interface) {
69 /* we have to loop over our interface list, seeing if its from
70 one of our own interfaces */
71 for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
72 if (strcmp(src->addr, iface->ip_address) == 0) {
82 send a name query reply
84 void nbtd_name_query_reply(struct nbt_name_socket *nbtsock,
85 struct nbt_name_packet *request_packet,
86 struct socket_address *src,
87 struct nbt_name *name, uint32_t ttl,
88 uint16_t nb_flags, const char **addresses)
90 struct nbt_name_packet *packet;
91 size_t num_addresses = str_list_length(addresses);
92 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
93 struct nbtd_interface);
94 struct nbtd_server *nbtsrv = iface->nbtsrv;
97 if (num_addresses == 0) {
98 DEBUG(3,("No addresses in name query reply - failing\n"));
102 packet = talloc_zero(nbtsock, struct nbt_name_packet);
103 if (packet == NULL) return;
105 packet->name_trn_id = request_packet->name_trn_id;
110 NBT_FLAG_AUTHORITIVE |
111 NBT_FLAG_RECURSION_DESIRED |
112 NBT_FLAG_RECURSION_AVAIL;
114 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
115 if (packet->answers == NULL) goto failed;
117 packet->answers[0].name = *name;
118 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
119 packet->answers[0].rr_class = NBT_QCLASS_IP;
120 packet->answers[0].ttl = ttl;
121 packet->answers[0].rdata.netbios.length = num_addresses*6;
122 packet->answers[0].rdata.netbios.addresses =
123 talloc_array(packet->answers, struct nbt_rdata_address, num_addresses);
124 if (packet->answers[0].rdata.netbios.addresses == NULL) goto failed;
126 for (i=0;i<num_addresses;i++) {
127 struct nbt_rdata_address *addr =
128 &packet->answers[0].rdata.netbios.addresses[i];
129 addr->nb_flags = nb_flags;
130 addr->ipaddr = talloc_strdup(packet->answers, addresses[i]);
131 if (addr->ipaddr == NULL) goto failed;
134 DEBUG(7,("Sending name query reply for %s at %s to %s:%d\n",
135 nbt_name_string(packet, name), addresses[0], src->addr, src->port));
137 nbtsrv->stats.total_sent++;
138 nbt_name_reply_send(nbtsock, src, packet);
146 send a negative name query reply
148 void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock,
149 struct nbt_name_packet *request_packet,
150 struct socket_address *src)
152 struct nbt_name_packet *packet;
153 struct nbt_name *name = &request_packet->questions[0].name;
154 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
155 struct nbtd_interface);
156 struct nbtd_server *nbtsrv = iface->nbtsrv;
158 packet = talloc_zero(nbtsock, struct nbt_name_packet);
159 if (packet == NULL) return;
161 packet->name_trn_id = request_packet->name_trn_id;
166 NBT_FLAG_AUTHORITIVE |
169 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
170 if (packet->answers == NULL) goto failed;
172 packet->answers[0].name = *name;
173 packet->answers[0].rr_type = NBT_QTYPE_NULL;
174 packet->answers[0].rr_class = NBT_QCLASS_IP;
175 packet->answers[0].ttl = 0;
176 ZERO_STRUCT(packet->answers[0].rdata);
178 DEBUG(7,("Sending negative name query reply for %s to %s:%d\n",
179 nbt_name_string(packet, name), src->addr, src->port));
181 nbtsrv->stats.total_sent++;
182 nbt_name_reply_send(nbtsock, src, packet);
189 send a name registration reply
191 void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock,
192 struct nbt_name_packet *request_packet,
193 struct socket_address *src,
196 struct nbt_name_packet *packet;
197 struct nbt_name *name = &request_packet->questions[0].name;
198 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
199 struct nbtd_interface);
200 struct nbtd_server *nbtsrv = iface->nbtsrv;
202 packet = talloc_zero(nbtsock, struct nbt_name_packet);
203 if (packet == NULL) return;
205 packet->name_trn_id = request_packet->name_trn_id;
209 NBT_OPCODE_REGISTER |
210 NBT_FLAG_AUTHORITIVE |
211 NBT_FLAG_RECURSION_DESIRED |
212 NBT_FLAG_RECURSION_AVAIL |
215 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
216 if (packet->answers == NULL) goto failed;
218 packet->answers[0].name = *name;
219 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
220 packet->answers[0].rr_class = NBT_QCLASS_IP;
221 packet->answers[0].ttl = request_packet->additional[0].ttl;
222 packet->answers[0].rdata = request_packet->additional[0].rdata;
224 DEBUG(7,("Sending %s name registration reply for %s to %s:%d\n",
225 rcode==0?"positive":"negative",
226 nbt_name_string(packet, name), src->addr, src->port));
228 nbtsrv->stats.total_sent++;
229 nbt_name_reply_send(nbtsock, src, packet);
237 send a name release reply
239 void nbtd_name_release_reply(struct nbt_name_socket *nbtsock,
240 struct nbt_name_packet *request_packet,
241 struct socket_address *src,
244 struct nbt_name_packet *packet;
245 struct nbt_name *name = &request_packet->questions[0].name;
246 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
247 struct nbtd_interface);
248 struct nbtd_server *nbtsrv = iface->nbtsrv;
250 packet = talloc_zero(nbtsock, struct nbt_name_packet);
251 if (packet == NULL) return;
253 packet->name_trn_id = request_packet->name_trn_id;
258 NBT_FLAG_AUTHORITIVE |
261 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
262 if (packet->answers == NULL) goto failed;
264 packet->answers[0].name = *name;
265 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
266 packet->answers[0].rr_class = NBT_QCLASS_IP;
267 packet->answers[0].ttl = request_packet->additional[0].ttl;
268 packet->answers[0].rdata = request_packet->additional[0].rdata;
270 DEBUG(7,("Sending %s name release reply for %s to %s:%d\n",
271 rcode==0?"positive":"negative",
272 nbt_name_string(packet, name), src->addr, src->port));
274 nbtsrv->stats.total_sent++;
275 nbt_name_reply_send(nbtsock, src, packet);
285 void nbtd_wack_reply(struct nbt_name_socket *nbtsock,
286 struct nbt_name_packet *request_packet,
287 struct socket_address *src,
290 struct nbt_name_packet *packet;
291 struct nbt_name *name = &request_packet->questions[0].name;
292 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
293 struct nbtd_interface);
294 struct nbtd_server *nbtsrv = iface->nbtsrv;
296 packet = talloc_zero(nbtsock, struct nbt_name_packet);
297 if (packet == NULL) return;
299 packet->name_trn_id = request_packet->name_trn_id;
304 NBT_FLAG_AUTHORITIVE;
306 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
307 if (packet->answers == NULL) goto failed;
309 packet->answers[0].name = *name;
310 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
311 packet->answers[0].rr_class = NBT_QCLASS_IP;
312 packet->answers[0].ttl = ttl;
313 packet->answers[0].rdata.data.length = 2;
314 packet->answers[0].rdata.data.data = talloc_size(packet, 2);
315 if (packet->answers[0].rdata.data.data == NULL) goto failed;
316 RSSVAL(packet->answers[0].rdata.data.data, 0, request_packet->operation);
318 DEBUG(7,("Sending WACK reply for %s to %s:%d\n",
319 nbt_name_string(packet, name), src->addr, src->port));
321 nbtsrv->stats.total_sent++;
322 nbt_name_reply_send(nbtsock, src, packet);