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"
27 we received a badly formed packet - log it
29 void nbtd_bad_packet(struct nbt_name_packet *packet,
30 const struct nbt_peer_socket *src, const char *reason)
32 DEBUG(2,("nbtd: bad packet '%s' from %s:%d\n", reason, src->addr, src->port));
34 NDR_PRINT_DEBUG(nbt_name_packet, packet);
40 see if an incoming packet is a broadcast packet from one of our own
43 BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
44 struct nbt_name_packet *packet,
45 const struct nbt_peer_socket *src)
47 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
48 struct nbtd_interface);
49 struct nbtd_server *nbtsrv = iface->nbtsrv;
51 /* if its not a broadcast then its not considered a self packet */
52 if (!(packet->operation & NBT_FLAG_BROADCAST)) {
56 /* if its not from the nbt port, then it wasn't a broadcast from us */
57 if (src->port != lp_nbt_port()) {
61 /* this uses the fact that iface->nbtsock is our non-broadcast
63 if (iface->nbtsock == nbtsock &&
64 iface != iface->nbtsrv->bcast_interface) {
68 /* we have to loop over our interface list, seeing if its from
69 one of our own interfaces */
70 for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
71 if (strcmp(src->addr, iface->ip_address) == 0) {
81 send a name query reply
83 void nbtd_name_query_reply(struct nbt_name_socket *nbtsock,
84 struct nbt_name_packet *request_packet,
85 const struct nbt_peer_socket *src,
86 struct nbt_name *name, uint32_t ttl,
87 uint16_t nb_flags, const char **addresses)
89 struct nbt_name_packet *packet;
90 size_t num_addresses = str_list_length(addresses);
91 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
92 struct nbtd_interface);
93 struct nbtd_server *nbtsrv = iface->nbtsrv;
96 if (num_addresses == 0) {
97 DEBUG(3,("No addresses in name query reply - failing\n"));
101 packet = talloc_zero(nbtsock, struct nbt_name_packet);
102 if (packet == NULL) return;
104 packet->name_trn_id = request_packet->name_trn_id;
109 NBT_FLAG_AUTHORITIVE |
110 NBT_FLAG_RECURSION_DESIRED |
111 NBT_FLAG_RECURSION_AVAIL;
113 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
114 if (packet->answers == NULL) goto failed;
116 packet->answers[0].name = *name;
117 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
118 packet->answers[0].rr_class = NBT_QCLASS_IP;
119 packet->answers[0].ttl = ttl;
120 packet->answers[0].rdata.netbios.length = num_addresses*6;
121 packet->answers[0].rdata.netbios.addresses =
122 talloc_array(packet->answers, struct nbt_rdata_address, num_addresses);
123 if (packet->answers[0].rdata.netbios.addresses == NULL) goto failed;
125 for (i=0;i<num_addresses;i++) {
126 struct nbt_rdata_address *addr =
127 &packet->answers[0].rdata.netbios.addresses[i];
128 addr->nb_flags = nb_flags;
129 addr->ipaddr = talloc_strdup(packet->answers, addresses[i]);
130 if (addr->ipaddr == NULL) goto failed;
133 DEBUG(7,("Sending name query reply for %s at %s to %s:%d\n",
134 nbt_name_string(packet, name), addresses[0], src->addr, src->port));
136 nbtsrv->stats.total_sent++;
137 nbt_name_reply_send(nbtsock, src, packet);
145 send a negative name query reply
147 void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock,
148 struct nbt_name_packet *request_packet,
149 const struct nbt_peer_socket *src)
151 struct nbt_name_packet *packet;
152 struct nbt_name *name = &request_packet->questions[0].name;
153 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
154 struct nbtd_interface);
155 struct nbtd_server *nbtsrv = iface->nbtsrv;
157 packet = talloc_zero(nbtsock, struct nbt_name_packet);
158 if (packet == NULL) return;
160 packet->name_trn_id = request_packet->name_trn_id;
165 NBT_FLAG_AUTHORITIVE |
168 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
169 if (packet->answers == NULL) goto failed;
171 packet->answers[0].name = *name;
172 packet->answers[0].rr_type = NBT_QTYPE_NULL;
173 packet->answers[0].rr_class = NBT_QCLASS_IP;
174 packet->answers[0].ttl = 0;
175 ZERO_STRUCT(packet->answers[0].rdata);
177 DEBUG(7,("Sending negative name query reply for %s to %s:%d\n",
178 nbt_name_string(packet, name), src->addr, src->port));
180 nbtsrv->stats.total_sent++;
181 nbt_name_reply_send(nbtsock, src, packet);
188 send a name registration reply
190 void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock,
191 struct nbt_name_packet *request_packet,
192 const struct nbt_peer_socket *src,
195 struct nbt_name_packet *packet;
196 struct nbt_name *name = &request_packet->questions[0].name;
197 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
198 struct nbtd_interface);
199 struct nbtd_server *nbtsrv = iface->nbtsrv;
201 packet = talloc_zero(nbtsock, struct nbt_name_packet);
202 if (packet == NULL) return;
204 packet->name_trn_id = request_packet->name_trn_id;
208 NBT_OPCODE_REGISTER |
209 NBT_FLAG_AUTHORITIVE |
210 NBT_FLAG_RECURSION_DESIRED |
211 NBT_FLAG_RECURSION_AVAIL |
214 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
215 if (packet->answers == NULL) goto failed;
217 packet->answers[0].name = *name;
218 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
219 packet->answers[0].rr_class = NBT_QCLASS_IP;
220 packet->answers[0].ttl = request_packet->additional[0].ttl;
221 packet->answers[0].rdata = request_packet->additional[0].rdata;
223 DEBUG(7,("Sending %s name registration reply for %s to %s:%d\n",
224 rcode==0?"positive":"negative",
225 nbt_name_string(packet, name), src->addr, src->port));
227 nbtsrv->stats.total_sent++;
228 nbt_name_reply_send(nbtsock, src, packet);
236 send a name release reply
238 void nbtd_name_release_reply(struct nbt_name_socket *nbtsock,
239 struct nbt_name_packet *request_packet,
240 const struct nbt_peer_socket *src,
243 struct nbt_name_packet *packet;
244 struct nbt_name *name = &request_packet->questions[0].name;
245 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
246 struct nbtd_interface);
247 struct nbtd_server *nbtsrv = iface->nbtsrv;
249 packet = talloc_zero(nbtsock, struct nbt_name_packet);
250 if (packet == NULL) return;
252 packet->name_trn_id = request_packet->name_trn_id;
257 NBT_FLAG_AUTHORITIVE |
260 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
261 if (packet->answers == NULL) goto failed;
263 packet->answers[0].name = *name;
264 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
265 packet->answers[0].rr_class = NBT_QCLASS_IP;
266 packet->answers[0].ttl = request_packet->additional[0].ttl;
267 packet->answers[0].rdata = request_packet->additional[0].rdata;
269 DEBUG(7,("Sending %s name release reply for %s to %s:%d\n",
270 rcode==0?"positive":"negative",
271 nbt_name_string(packet, name), src->addr, src->port));
273 nbtsrv->stats.total_sent++;
274 nbt_name_reply_send(nbtsock, src, packet);
284 void nbtd_wack_reply(struct nbt_name_socket *nbtsock,
285 struct nbt_name_packet *request_packet,
286 const struct nbt_peer_socket *src,
289 struct nbt_name_packet *packet;
290 struct nbt_name *name = &request_packet->questions[0].name;
291 struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
292 struct nbtd_interface);
293 struct nbtd_server *nbtsrv = iface->nbtsrv;
295 packet = talloc_zero(nbtsock, struct nbt_name_packet);
296 if (packet == NULL) return;
298 packet->name_trn_id = request_packet->name_trn_id;
303 NBT_FLAG_AUTHORITIVE;
305 packet->answers = talloc_array(packet, struct nbt_res_rec, 1);
306 if (packet->answers == NULL) goto failed;
308 packet->answers[0].name = *name;
309 packet->answers[0].rr_type = NBT_QTYPE_NETBIOS;
310 packet->answers[0].rr_class = NBT_QCLASS_IP;
311 packet->answers[0].ttl = ttl;
312 packet->answers[0].rdata.data.length = 2;
313 packet->answers[0].rdata.data.data = talloc_size(packet, 2);
314 if (packet->answers[0].rdata.data.data == NULL) goto failed;
315 RSSVAL(packet->answers[0].rdata.data.data, 0, request_packet->operation);
317 DEBUG(7,("Sending WACK reply for %s to %s:%d\n",
318 nbt_name_string(packet, name), src->addr, src->port));
320 nbtsrv->stats.total_sent++;
321 nbt_name_reply_send(nbtsock, src, packet);