summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-01-18 16:36:53 +0000
committerStefan Metzmacher <metze@samba.org>2006-01-18 16:36:53 +0000
commitb5adf17cb3d0f6f89eb448d3c01d37c850c491a1 (patch)
tree23c9f3093e8db5e055491b2b5acab8f81b7bd89d
parent84e3f896bb3f67a934e5938f4c22e3cb407818d3 (diff)
downloadsamba-b5adf17cb3d0f6f89eb448d3c01d37c850c491a1.tar.gz
samba-b5adf17cb3d0f6f89eb448d3c01d37c850c491a1.tar.xz
samba-b5adf17cb3d0f6f89eb448d3c01d37c850c491a1.zip
r13007: let our winsclient code register multihomed records with
our winsserver and don't defend our local name against our own register packets... this won gave quite confusing logmessages... metze
-rw-r--r--source/nbt_server/defense.c9
-rw-r--r--source/nbt_server/interfaces.c4
-rw-r--r--source/nbt_server/packet.c37
3 files changed, 37 insertions, 13 deletions
diff --git a/source/nbt_server/defense.c b/source/nbt_server/defense.c
index 86b3eb968b8..72ebf0c301b 100644
--- a/source/nbt_server/defense.c
+++ b/source/nbt_server/defense.c
@@ -41,6 +41,15 @@ void nbtd_request_defense(struct nbt_name_socket *nbtsock,
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
struct nbtd_interface);
+ /*
+ * if the packet comes from one of our interfaces
+ * it must be our winsclient trying to reach the winsserver
+ */
+ if (nbtd_self_packet(nbtsock, packet, src)) {
+ nbtd_winsserver_request(nbtsock, packet, src);
+ return;
+ }
+
NBTD_ASSERT_PACKET(packet, src, packet->qdcount == 1);
NBTD_ASSERT_PACKET(packet, src, packet->arcount == 1);
NBTD_ASSERT_PACKET(packet, src,
diff --git a/source/nbt_server/interfaces.c b/source/nbt_server/interfaces.c
index 10bdc0bb14e..9fdad96b557 100644
--- a/source/nbt_server/interfaces.c
+++ b/source/nbt_server/interfaces.c
@@ -42,8 +42,8 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock,
nbtsrv->stats.total_received++;
/* see if its from one of our own interfaces - if so, then ignore it */
- if (nbtd_self_packet(nbtsock, packet, src)) {
- DEBUG(10,("Ignoring self packet from %s:%d\n", src->addr, src->port));
+ if (nbtd_self_packet_and_bcast(nbtsock, packet, src)) {
+ DEBUG(10,("Ignoring bcast self packet from %s:%d\n", src->addr, src->port));
return;
}
diff --git a/source/nbt_server/packet.c b/source/nbt_server/packet.c
index 8909d7bbc44..d73a3b027af 100644
--- a/source/nbt_server/packet.c
+++ b/source/nbt_server/packet.c
@@ -41,28 +41,43 @@ void nbtd_bad_packet(struct nbt_name_packet *packet,
see if an incoming packet is a broadcast packet from one of our own
interfaces
*/
-BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
- struct nbt_name_packet *packet,
- const struct socket_address *src)
+BOOL nbtd_self_packet_and_bcast(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const struct socket_address *src)
{
struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
struct nbtd_interface);
- struct nbtd_server *nbtsrv = iface->nbtsrv;
-
+
/* if its not a broadcast then its not considered a self packet */
if (!(packet->operation & NBT_FLAG_BROADCAST)) {
return False;
}
- /* if its not from the nbt port, then it wasn't a broadcast from us */
- if (src->port != lp_nbt_port()) {
+ /*
+ * this uses the fact that iface->nbtsock is the unicast listen address
+ * if the interface isn't the global bcast interface
+ *
+ * so if the request was directed to the unicast address it isn't a broadcast
+ * message
+ */
+ if (iface->nbtsock == nbtsock &&
+ iface != iface->nbtsrv->bcast_interface) {
return False;
}
- /* this uses the fact that iface->nbtsock is our non-broadcast
- listen address */
- if (iface->nbtsock == nbtsock &&
- iface != iface->nbtsrv->bcast_interface) {
+ return nbtd_self_packet(nbtsock, packet, src);
+}
+
+BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
+ struct nbt_name_packet *packet,
+ const struct socket_address *src)
+{
+ struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private,
+ struct nbtd_interface);
+ struct nbtd_server *nbtsrv = iface->nbtsrv;
+
+ /* if its not from the nbt port, then it wasn't a broadcast from us */
+ if (src->port != lp_nbt_port()) {
return False;
}