From c7ded5ab0accc54a28df4d43cb923e6c808ff347 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 30 Jan 2005 10:24:36 +0000 Subject: r5108: the beginnings of a nbtd server for Samba4. Currently just displays the packets it receives, but it at least shows how the server structure will work. To implement it I extended the libcli/nbt/ library to allow for an incoming packet handler to be registered. That allows the nbt client library to be used for low level processing of the nbtd server packets. Other changes: - made the socket library always set SO_REUSEADDR when binding to an interface, to ensure that restarts of a server don't have to wait for a couple of minutes. - made the nbt port configurable. Defaults to 137, but other ports will be useful for testing. (This used to be commit 2fedca6adfd4df9e85cc86896dfa79630777a917) --- source4/nbt_server/interfaces.c | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 source4/nbt_server/interfaces.c (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c new file mode 100644 index 0000000000..18893e179b --- /dev/null +++ b/source4/nbt_server/interfaces.c @@ -0,0 +1,88 @@ +/* + Unix SMB/CIFS implementation. + + NBT interface handling + + Copyright (C) Andrew Tridgell 2005 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "dlinklist.h" +#include "nbt_server/nbt_server.h" +#include "smbd/service_task.h" +#include "libcli/nbt/libnbt.h" + +/* + start listening on the given address +*/ +static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, + const char *address, const char *bcast) +{ + struct nbt_interface *iface; + NTSTATUS status; + + iface = talloc(nbtsrv, struct nbt_interface); + NT_STATUS_HAVE_NO_MEMORY(iface); + + iface->nbtsrv = nbtsrv; + iface->bcast_address = talloc_steal(iface, bcast); + iface->ip_address = talloc_steal(iface, address); + + iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); + NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); + + status = socket_listen(iface->nbtsock->sock, address, lp_nbt_port(), 0, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("Failed to bind to %s:%d - %s\n", + address, lp_nbt_port(), nt_errstr(status))); + talloc_free(iface); + return status; + } + + DLIST_ADD(nbtsrv->interfaces, iface); + + return NT_STATUS_OK; +} + + +/* + setup our listening sockets on the configured network interfaces +*/ +NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) +{ + int num_interfaces = iface_count(); + int i; + TALLOC_CTX *tmp_ctx = talloc_new(nbtsrv); + NTSTATUS status; + + status = nbt_add_socket(nbtsrv, + talloc_strdup(tmp_ctx, "0.0.0.0"), + talloc_strdup(tmp_ctx, "255.255.255.255")); + NT_STATUS_NOT_OK_RETURN(status); + + for (i=0; i Date: Mon, 31 Jan 2005 01:57:58 +0000 Subject: r5114: the nbtd task can now act as a basic B-node server. It registers its names on the network and answers name queries. Lots of details are still missing, but at least this now means you don't need a Samba3 nmbd to use Samba4. missing pieces include: - name registrations should be "shout 3 times, then demand" - no WINS server yet - no master browser code (This used to be commit d7d31fdc6670f026f96b50e51a4de19f0b920e5b) --- source4/nbt_server/interfaces.c | 97 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 9 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 18893e179b..303802e2cd 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -24,13 +24,72 @@ #include "dlinklist.h" #include "nbt_server/nbt_server.h" #include "smbd/service_task.h" -#include "libcli/nbt/libnbt.h" + +/* + find a registered name on an interface +*/ +struct nbt_iface_name *nbt_find_iname(struct nbt_interface *iface, struct nbt_name *name, + uint16_t nb_flags) +{ + struct nbt_iface_name *iname; + for (iname=iface->names;iname;iname=iname->next) { + if (iname->name.type == name->type && + StrCaseCmp(name->name, iname->name.name) == 0 && + ((iname->nb_flags & nb_flags) == nb_flags)) { + return iname; + } + } + return NULL; +} + +/* + see if a src address matches an interface +*/ +static BOOL nbt_iface_match(struct nbt_interface *iface, const char *src_address) +{ + struct ipv4_addr ip1, ip2, mask; + ip1 = interpret_addr2(iface->ip_address); + ip2 = interpret_addr2(src_address); + mask = interpret_addr2(iface->netmask); + return same_net(ip1, ip2, mask); +} + + +/* + find the appropriate interface for a incoming packet. If a local interface isn't + found then the general broadcast interface is used +*/ +struct nbt_interface *nbt_iface_find(struct nbt_name_socket *nbtsock, const char *src_address) +{ + struct nbt_interface *iface = talloc_get_type(nbtsock->incoming.private, struct nbt_interface); + struct nbt_server *nbtsrv = iface->nbtsrv; + + /* it might have been received by one of our specific bound + addresses */ + if (iface != nbtsrv->bcast_interface) { + return iface; + } + + /* it came in on our broadcast interface - try to find a match */ + for (iface=nbtsrv->interfaces;iface;iface=iface->next) { + if (nbt_iface_match(iface, src_address)) { + return iface; + } + } + + /* it didn't match any specific interface - use our general broadcast interface */ + return nbtsrv->bcast_interface; +} + /* start listening on the given address */ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, - const char *address, const char *bcast) + const char *bind_address, + const char *address, + const char *bcast, + const char *netmask) { struct nbt_interface *iface; NTSTATUS status; @@ -38,14 +97,16 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, iface = talloc(nbtsrv, struct nbt_interface); NT_STATUS_HAVE_NO_MEMORY(iface); - iface->nbtsrv = nbtsrv; + iface->nbtsrv = nbtsrv; iface->bcast_address = talloc_steal(iface, bcast); - iface->ip_address = talloc_steal(iface, address); + iface->ip_address = talloc_steal(iface, address); + iface->netmask = talloc_steal(iface, netmask); + iface->names = NULL; iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); - status = socket_listen(iface->nbtsock->sock, address, lp_nbt_port(), 0, 0); + status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", address, lp_nbt_port(), nt_errstr(status))); @@ -53,7 +114,13 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, return status; } - DLIST_ADD(nbtsrv->interfaces, iface); + socket_set_option(iface->nbtsock->sock, "SO_BROADCAST", "1"); + + if (strcmp(netmask, "0.0.0.0") == 0) { + DLIST_ADD(nbtsrv->bcast_interface, iface); + } else { + DLIST_ADD(nbtsrv->interfaces, iface); + } return NT_STATUS_OK; } @@ -68,17 +135,29 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) int i; TALLOC_CTX *tmp_ctx = talloc_new(nbtsrv); NTSTATUS status; + const char *primary_address; + + /* the primary address is the address we will return for non-WINS queries + not made on a specific interface */ + if (num_interfaces > 0) { + primary_address = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_ip(0))); + } else { + primary_address = sys_inet_ntoa(interpret_addr2(lp_netbios_name())); + } status = nbt_add_socket(nbtsrv, - talloc_strdup(tmp_ctx, "0.0.0.0"), - talloc_strdup(tmp_ctx, "255.255.255.255")); + "0.0.0.0", + primary_address, + talloc_strdup(tmp_ctx, "255.255.255.255"), + talloc_strdup(tmp_ctx, "0.0.0.0")); NT_STATUS_NOT_OK_RETURN(status); for (i=0; i Date: Wed, 2 Feb 2005 10:29:50 +0000 Subject: r5171: added support for "bind interfaces only" in nbtd. The solution was to bind twice on each interface, once using the broadcast address and once using the specific IP. We then only listen on the wildcard address if we don't have "bind interface only" set. This also happens to simplify the code that finds the right interface for an incoming request. (This used to be commit b3edf17281c5d82abb40dab817bf2de43f9f6c3f) --- source4/nbt_server/interfaces.c | 125 ++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 57 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 303802e2cd..8c5566c819 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -25,6 +25,23 @@ #include "nbt_server/nbt_server.h" #include "smbd/service_task.h" + +/* + receive an incoming request and dispatch it to the right place +*/ +static void nbt_request_handler(struct nbt_name_socket *nbtsock, + struct nbt_name_packet *packet, + const char *src_address, int src_port) +{ + switch (packet->operation & NBT_OPCODE) { + case NBT_OPCODE_QUERY: + nbt_request_query(nbtsock, packet, src_address, src_port); + break; + } +} + + + /* find a registered name on an interface */ @@ -42,57 +59,25 @@ struct nbt_iface_name *nbt_find_iname(struct nbt_interface *iface, struct nbt_na return NULL; } -/* - see if a src address matches an interface -*/ -static BOOL nbt_iface_match(struct nbt_interface *iface, const char *src_address) -{ - struct ipv4_addr ip1, ip2, mask; - ip1 = interpret_addr2(iface->ip_address); - ip2 = interpret_addr2(src_address); - mask = interpret_addr2(iface->netmask); - return same_net(ip1, ip2, mask); -} - - -/* - find the appropriate interface for a incoming packet. If a local interface isn't - found then the general broadcast interface is used -*/ -struct nbt_interface *nbt_iface_find(struct nbt_name_socket *nbtsock, const char *src_address) -{ - struct nbt_interface *iface = talloc_get_type(nbtsock->incoming.private, struct nbt_interface); - struct nbt_server *nbtsrv = iface->nbtsrv; - - /* it might have been received by one of our specific bound - addresses */ - if (iface != nbtsrv->bcast_interface) { - return iface; - } - - /* it came in on our broadcast interface - try to find a match */ - for (iface=nbtsrv->interfaces;iface;iface=iface->next) { - if (nbt_iface_match(iface, src_address)) { - return iface; - } - } - - /* it didn't match any specific interface - use our general broadcast interface */ - return nbtsrv->bcast_interface; -} - - /* start listening on the given address */ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, - const char *bind_address, const char *address, const char *bcast, const char *netmask) { struct nbt_interface *iface; NTSTATUS status; + struct nbt_name_socket *bcast_nbtsock; + + /* + we actually create two sockets. One listens on the broadcast address + for the interface, and the other listens on our specific address. This + allows us to run with "bind interfaces only" while still receiving + broadcast addresses, and also simplifies matching incoming requests + to interfaces + */ iface = talloc(nbtsrv, struct nbt_interface); NT_STATUS_HAVE_NO_MEMORY(iface); @@ -103,10 +88,25 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, iface->netmask = talloc_steal(iface, netmask); iface->names = NULL; + if (strcmp(netmask, "0.0.0.0") != 0) { + bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); + NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); + + status = socket_listen(bcast_nbtsock->sock, bcast, lp_nbt_port(), 0, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("Failed to bind to %s:%d - %s\n", + bcast, lp_nbt_port(), nt_errstr(status))); + talloc_free(iface); + return status; + } + + nbt_set_incoming_handler(bcast_nbtsock, nbt_request_handler, iface); + } + iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); - status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); + status = socket_listen(iface->nbtsock->sock, address, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", address, lp_nbt_port(), nt_errstr(status))); @@ -114,8 +114,11 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, return status; } + /* we need to be able to send broadcasts out */ socket_set_option(iface->nbtsock->sock, "SO_BROADCAST", "1"); + nbt_set_incoming_handler(iface->nbtsock, nbt_request_handler, iface); + if (strcmp(netmask, "0.0.0.0") == 0) { DLIST_ADD(nbtsrv->bcast_interface, iface); } else { @@ -135,29 +138,37 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) int i; TALLOC_CTX *tmp_ctx = talloc_new(nbtsrv); NTSTATUS status; - const char *primary_address; - /* the primary address is the address we will return for non-WINS queries - not made on a specific interface */ - if (num_interfaces > 0) { - primary_address = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_ip(0))); - } else { - primary_address = sys_inet_ntoa(interpret_addr2(lp_netbios_name())); - } + /* if we are allowing incoming packets from any address, then + we also need to bind to the wildcard address */ + if (!lp_bind_interfaces_only()) { + const char *primary_address; + + /* the primary address is the address we will return + for non-WINS queries not made on a specific + interface */ + if (num_interfaces > 0) { + primary_address = sys_inet_ntoa(*iface_n_ip(0)); + } else { + primary_address = sys_inet_ntoa(interpret_addr2( + lp_netbios_name())); + } + primary_address = talloc_strdup(tmp_ctx, primary_address); + NT_STATUS_HAVE_NO_MEMORY(primary_address); - status = nbt_add_socket(nbtsrv, - "0.0.0.0", - primary_address, - talloc_strdup(tmp_ctx, "255.255.255.255"), - talloc_strdup(tmp_ctx, "0.0.0.0")); - NT_STATUS_NOT_OK_RETURN(status); + status = nbt_add_socket(nbtsrv, + primary_address, + talloc_strdup(tmp_ctx, "255.255.255.255"), + talloc_strdup(tmp_ctx, "0.0.0.0")); + NT_STATUS_NOT_OK_RETURN(status); + } for (i=0; i Date: Wed, 2 Feb 2005 10:35:25 +0000 Subject: r5172: actually bind to the right address for the wildcard interface .... (This used to be commit 7720d247fed3343a5bf39b2eedf34604f9203a37) --- source4/nbt_server/interfaces.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 8c5566c819..be1773e91e 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -63,6 +63,7 @@ struct nbt_iface_name *nbt_find_iname(struct nbt_interface *iface, struct nbt_na start listening on the given address */ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, + const char *bind_address, const char *address, const char *bcast, const char *netmask) @@ -106,7 +107,7 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); - status = socket_listen(iface->nbtsock->sock, address, lp_nbt_port(), 0, 0); + status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", address, lp_nbt_port(), nt_errstr(status))); @@ -157,6 +158,7 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) NT_STATUS_HAVE_NO_MEMORY(primary_address); status = nbt_add_socket(nbtsrv, + "0.0.0.0", primary_address, talloc_strdup(tmp_ctx, "255.255.255.255"), talloc_strdup(tmp_ctx, "0.0.0.0")); @@ -168,7 +170,7 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) const char *bcast = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_bcast(i))); const char *netmask = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_netmask(i))); - status = nbt_add_socket(nbtsrv, address, bcast, netmask); + status = nbt_add_socket(nbtsrv, address, address, bcast, netmask); NT_STATUS_NOT_OK_RETURN(status); } -- cgit From dc35a0eb4f4be294a852073802451fe9ab284b69 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 3 Feb 2005 11:30:36 +0000 Subject: r5196: fixed sily bug (that metze found) (This used to be commit 180f29f9e05e75e8ed32d010bc0c57a55ea9d843) --- source4/nbt_server/interfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index be1773e91e..312d188d49 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -91,7 +91,7 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, if (strcmp(netmask, "0.0.0.0") != 0) { bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); + NT_STATUS_HAVE_NO_MEMORY(bcast_nbtsock); status = socket_listen(bcast_nbtsock->sock, bcast, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { -- cgit From bd22848ad80dbe10551129325a59114d9a612f91 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 4 Feb 2005 01:39:10 +0000 Subject: r5210: changed server side nbt functions to be prefixed with nbtd_ instead of nbt_, so as to more clearly separate them from the client code in libcli/nbt/ (This used to be commit b07a7e35f26204055a99abf72438b5cd7ec35d3b) --- source4/nbt_server/interfaces.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 312d188d49..a9041706c6 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -29,13 +29,13 @@ /* receive an incoming request and dispatch it to the right place */ -static void nbt_request_handler(struct nbt_name_socket *nbtsock, - struct nbt_name_packet *packet, - const char *src_address, int src_port) +static void nbtd_request_handler(struct nbt_name_socket *nbtsock, + struct nbt_name_packet *packet, + const char *src_address, int src_port) { switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: - nbt_request_query(nbtsock, packet, src_address, src_port); + nbtd_request_query(nbtsock, packet, src_address, src_port); break; } } @@ -45,8 +45,9 @@ static void nbt_request_handler(struct nbt_name_socket *nbtsock, /* find a registered name on an interface */ -struct nbt_iface_name *nbt_find_iname(struct nbt_interface *iface, struct nbt_name *name, - uint16_t nb_flags) +struct nbt_iface_name *nbtd_find_iname(struct nbt_interface *iface, + struct nbt_name *name, + uint16_t nb_flags) { struct nbt_iface_name *iname; for (iname=iface->names;iname;iname=iname->next) { @@ -62,11 +63,11 @@ struct nbt_iface_name *nbt_find_iname(struct nbt_interface *iface, struct nbt_na /* start listening on the given address */ -static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, - const char *bind_address, - const char *address, - const char *bcast, - const char *netmask) +static NTSTATUS nbtd_add_socket(struct nbt_server *nbtsrv, + const char *bind_address, + const char *address, + const char *bcast, + const char *netmask) { struct nbt_interface *iface; NTSTATUS status; @@ -101,7 +102,7 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, return status; } - nbt_set_incoming_handler(bcast_nbtsock, nbt_request_handler, iface); + nbt_set_incoming_handler(bcast_nbtsock, nbtd_request_handler, iface); } iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); @@ -118,7 +119,7 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, /* we need to be able to send broadcasts out */ socket_set_option(iface->nbtsock->sock, "SO_BROADCAST", "1"); - nbt_set_incoming_handler(iface->nbtsock, nbt_request_handler, iface); + nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface); if (strcmp(netmask, "0.0.0.0") == 0) { DLIST_ADD(nbtsrv->bcast_interface, iface); @@ -133,7 +134,7 @@ static NTSTATUS nbt_add_socket(struct nbt_server *nbtsrv, /* setup our listening sockets on the configured network interfaces */ -NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) +NTSTATUS nbtd_startup_interfaces(struct nbt_server *nbtsrv) { int num_interfaces = iface_count(); int i; @@ -157,11 +158,11 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) primary_address = talloc_strdup(tmp_ctx, primary_address); NT_STATUS_HAVE_NO_MEMORY(primary_address); - status = nbt_add_socket(nbtsrv, - "0.0.0.0", - primary_address, - talloc_strdup(tmp_ctx, "255.255.255.255"), - talloc_strdup(tmp_ctx, "0.0.0.0")); + status = nbtd_add_socket(nbtsrv, + "0.0.0.0", + primary_address, + talloc_strdup(tmp_ctx, "255.255.255.255"), + talloc_strdup(tmp_ctx, "0.0.0.0")); NT_STATUS_NOT_OK_RETURN(status); } @@ -170,7 +171,7 @@ NTSTATUS nbt_startup_interfaces(struct nbt_server *nbtsrv) const char *bcast = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_bcast(i))); const char *netmask = talloc_strdup(tmp_ctx, sys_inet_ntoa(*iface_n_netmask(i))); - status = nbt_add_socket(nbtsrv, address, address, bcast, netmask); + status = nbtd_add_socket(nbtsrv, address, address, bcast, netmask); NT_STATUS_NOT_OK_RETURN(status); } -- cgit From 9eb33fc21236942c4b518557be920d4208e6b168 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 4 Feb 2005 01:55:50 +0000 Subject: r5211: added broadcast name defense against both registration and refresh requests (This used to be commit 9eafe2cacaef64384febe6bb0938294f7c1ee6bf) --- source4/nbt_server/interfaces.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index a9041706c6..9c26925b32 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -33,10 +33,23 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, const char *src_address, int src_port) { + /* if its a WINS query then direct to our WINS server */ + if ((packet->operation & NBT_FLAG_RECURSION_DESIRED) && + !(packet->operation & NBT_FLAG_BROADCAST)) { + nbtd_query_wins(nbtsock, packet, src_address, src_port); + return; + } + + /* the request is to us in our role as a B node */ switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: nbtd_request_query(nbtsock, packet, src_address, src_port); break; + + case NBT_OPCODE_REGISTER: + case NBT_OPCODE_REFRESH: + nbtd_request_defense(nbtsock, packet, src_address, src_port); + break; } } -- cgit From 1b27d0ce12c12a6ee4fd208789572442f2edd4fc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 4 Feb 2005 02:05:27 +0000 Subject: r5212: added checking for receiving our own packets as broadcasts (This used to be commit 290dbd8cdcfa6a897647768dcbbd03f22fc7cf36) --- source4/nbt_server/interfaces.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 9c26925b32..bb599b4fcd 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -40,6 +40,12 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, return; } + /* see if its from one of our own interfaces - if so, then ignore it */ + if (nbtd_self_packet(nbtsock, packet, src_address, src_port)) { + DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port)); + return; + } + /* the request is to us in our role as a B node */ switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: -- cgit From a75e9a3ee91b83af9c0fa25e407bf63cd67cd343 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 6 Feb 2005 08:25:53 +0000 Subject: r5251: - renamed the nbtd server side structures to have a nbtd_ prefix, to be consistent with the function names - added WINS client support to the NBT server. It will do initial WINS registration, and WINS refresh, automatically failing over to secondary WINS servers and handling multi-homed servers where we need to register multiple IPs. - added support for multi-homed name query replies, which are essential for multi-homed registration as the WINS server will query us to ensure we have the names when doing the secondary IPs in multi-homed registration (This used to be commit a1553fa8054dc7d33f5d77f8f95d3ffd90392b2a) --- source4/nbt_server/interfaces.c | 78 +++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 10 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index bb599b4fcd..b99c17089c 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -33,9 +33,11 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, const char *src_address, int src_port) { - /* if its a WINS query then direct to our WINS server */ + /* if its a WINS query then direct to our WINS server if we + are running one */ if ((packet->operation & NBT_FLAG_RECURSION_DESIRED) && - !(packet->operation & NBT_FLAG_BROADCAST)) { + !(packet->operation & NBT_FLAG_BROADCAST) && + lp_wins_support()) { nbtd_query_wins(nbtsock, packet, src_address, src_port); return; } @@ -56,6 +58,10 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, case NBT_OPCODE_REFRESH: nbtd_request_defense(nbtsock, packet, src_address, src_port); break; + + default: + nbtd_bad_packet(packet, src_address, "Unexpected opcode"); + break; } } @@ -64,11 +70,11 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, /* find a registered name on an interface */ -struct nbt_iface_name *nbtd_find_iname(struct nbt_interface *iface, - struct nbt_name *name, - uint16_t nb_flags) +struct nbtd_iface_name *nbtd_find_iname(struct nbtd_interface *iface, + struct nbt_name *name, + uint16_t nb_flags) { - struct nbt_iface_name *iname; + struct nbtd_iface_name *iname; for (iname=iface->names;iname;iname=iname->next) { if (iname->name.type == name->type && StrCaseCmp(name->name, iname->name.name) == 0 && @@ -82,13 +88,13 @@ struct nbt_iface_name *nbtd_find_iname(struct nbt_interface *iface, /* start listening on the given address */ -static NTSTATUS nbtd_add_socket(struct nbt_server *nbtsrv, +static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, const char *bind_address, const char *address, const char *bcast, const char *netmask) { - struct nbt_interface *iface; + struct nbtd_interface *iface; NTSTATUS status; struct nbt_name_socket *bcast_nbtsock; @@ -100,7 +106,7 @@ static NTSTATUS nbtd_add_socket(struct nbt_server *nbtsrv, to interfaces */ - iface = talloc(nbtsrv, struct nbt_interface); + iface = talloc(nbtsrv, struct nbtd_interface); NT_STATUS_HAVE_NO_MEMORY(iface); iface->nbtsrv = nbtsrv; @@ -150,10 +156,31 @@ static NTSTATUS nbtd_add_socket(struct nbt_server *nbtsrv, } +/* + setup a socket for talking to our WINS servers +*/ +static NTSTATUS nbtd_add_wins_socket(struct nbtd_server *nbtsrv) +{ + struct nbtd_interface *iface; + + iface = talloc_zero(nbtsrv, struct nbtd_interface); + NT_STATUS_HAVE_NO_MEMORY(iface); + + iface->nbtsrv = nbtsrv; + + iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); + NT_STATUS_HAVE_NO_MEMORY(iface->nbtsock); + + DLIST_ADD(nbtsrv->wins_interface, iface); + + return NT_STATUS_OK; +} + + /* setup our listening sockets on the configured network interfaces */ -NTSTATUS nbtd_startup_interfaces(struct nbt_server *nbtsrv) +NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) { int num_interfaces = iface_count(); int i; @@ -194,7 +221,38 @@ NTSTATUS nbtd_startup_interfaces(struct nbt_server *nbtsrv) NT_STATUS_NOT_OK_RETURN(status); } + if (lp_wins_server_list()) { + status = nbtd_add_wins_socket(nbtsrv); + NT_STATUS_NOT_OK_RETURN(status); + } + talloc_free(tmp_ctx); return NT_STATUS_OK; } + + +/* + form a list of addresses that we should use in name query replies +*/ +const char **nbtd_address_list(struct nbtd_server *nbtsrv, TALLOC_CTX *mem_ctx) +{ + const char **ret = NULL; + struct nbtd_interface *iface; + int count = 0; + + for (iface=nbtsrv->interfaces;iface;iface=iface->next) { + const char **ret2 = talloc_realloc(mem_ctx, ret, const char *, count+2); + if (ret2 == NULL) goto failed; + ret = ret2; + ret[count] = talloc_strdup(ret, iface->ip_address); + if (ret[count] == NULL) goto failed; + count++; + } + ret[count] = NULL; + return ret; + +failed: + talloc_free(ret); + return NULL; +} -- cgit From d09311baa72c0ffa6768a379053dc0bfd38ecbdb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 7 Feb 2005 11:49:55 +0000 Subject: r5259: make sure we give the ip of the interface that a name query comes in on as the first IP in a multi-homed reply (This used to be commit a9128f6544d56a637e28430cbd2907acbb978281) --- source4/nbt_server/interfaces.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index b99c17089c..a75275dec7 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -234,18 +234,35 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) /* form a list of addresses that we should use in name query replies + we always place the IP in the given interface first */ -const char **nbtd_address_list(struct nbtd_server *nbtsrv, TALLOC_CTX *mem_ctx) +const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx) { + struct nbtd_server *nbtsrv = iface->nbtsrv; const char **ret = NULL; - struct nbtd_interface *iface; - int count = 0; + struct nbtd_interface *iface2; + int count; + + ret = talloc_array(mem_ctx, const char *, 2); + if (ret == NULL) goto failed; + + ret[0] = talloc_strdup(ret, iface->ip_address); + if (ret[0] == NULL) goto failed; + ret[1] = NULL; + + count = 1; + + for (iface2=nbtsrv->interfaces;iface2;iface2=iface2->next) { + const char **ret2; + + if (strcmp(iface2->ip_address, iface->ip_address) == 0) { + continue; + } - for (iface=nbtsrv->interfaces;iface;iface=iface->next) { - const char **ret2 = talloc_realloc(mem_ctx, ret, const char *, count+2); + ret2 = talloc_realloc(mem_ctx, ret, const char *, count+2); if (ret2 == NULL) goto failed; ret = ret2; - ret[count] = talloc_strdup(ret, iface->ip_address); + ret[count] = talloc_strdup(ret, iface2->ip_address); if (ret[count] == NULL) goto failed; count++; } -- cgit From fcb78064bf760ab72d213b604cef9688edf42b92 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 7 Feb 2005 11:56:34 +0000 Subject: r5260: - show an error message on nmblookup failure - always try to enable broadcast on nbt name sockets (this matches samba3 behaviour better) (This used to be commit 919bc14e7bbc04479cf11f7a7fd4c5e46616ef46) --- source4/nbt_server/interfaces.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index a75275dec7..7572e4e336 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -141,9 +141,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, return status; } - /* we need to be able to send broadcasts out */ - socket_set_option(iface->nbtsock->sock, "SO_BROADCAST", "1"); - nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface); if (strcmp(netmask, "0.0.0.0") == 0) { -- cgit From 998c856d9005cd8e1111a939db6fa7b25196b766 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 8 Feb 2005 01:09:21 +0000 Subject: r5276: - added support for NBT_OPCODE_REFRESH2 (type 0x9) - when registering with a WINS server, initially use multi-homed registration, then switch to name refresh requests. Send refresh requests only to the WINS server that responded to our registration. If that server goes away, then start the registration from scratch. This makes registration more robust to WINS server failure. - send WINS registration requests out on our first interface rather than an unbound interface, to avoid the problem of WACK replies being sent to the wrong port (w2k3 WINS server does this) (This used to be commit f7712ac7468184c07b3e3c10cb7b847ad1791dd2) --- source4/nbt_server/interfaces.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 7572e4e336..3cb690b85d 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -49,13 +49,14 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, } /* the request is to us in our role as a B node */ - switch (packet->operation & NBT_OPCODE) { + switch ((enum nbt_opcode)(packet->operation & NBT_OPCODE)) { case NBT_OPCODE_QUERY: nbtd_request_query(nbtsock, packet, src_address, src_port); break; case NBT_OPCODE_REGISTER: case NBT_OPCODE_REFRESH: + case NBT_OPCODE_REFRESH2: nbtd_request_defense(nbtsock, packet, src_address, src_port); break; @@ -165,9 +166,6 @@ static NTSTATUS nbtd_add_wins_socket(struct nbtd_server *nbtsrv) iface->nbtsrv = nbtsrv; - iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(iface->nbtsock); - DLIST_ADD(nbtsrv->wins_interface, iface); return NT_STATUS_OK; @@ -238,21 +236,24 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx struct nbtd_server *nbtsrv = iface->nbtsrv; const char **ret = NULL; struct nbtd_interface *iface2; - int count; + int count = 0; - ret = talloc_array(mem_ctx, const char *, 2); - if (ret == NULL) goto failed; + if (iface->ip_address) { + ret = talloc_array(mem_ctx, const char *, 2); + if (ret == NULL) goto failed; - ret[0] = talloc_strdup(ret, iface->ip_address); - if (ret[0] == NULL) goto failed; - ret[1] = NULL; + ret[0] = talloc_strdup(ret, iface->ip_address); + if (ret[0] == NULL) goto failed; + ret[1] = NULL; - count = 1; + count = 1; + } for (iface2=nbtsrv->interfaces;iface2;iface2=iface2->next) { const char **ret2; - if (strcmp(iface2->ip_address, iface->ip_address) == 0) { + if (iface->ip_address && + strcmp(iface2->ip_address, iface->ip_address) == 0) { continue; } -- cgit From b9bb7f596de51496c18580863efbb8ac17c78970 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 10 Feb 2005 03:22:47 +0000 Subject: r5294: - added a separate NBT-WINS test for WINS operations (register, refresh, release and query) - change the iface_n_*() functions to return a "const char *" instead of a "struct ipv4_addr" I think that in general we should move towards "const char *" for all IP addresses, as this makes IPv6 much easier, and is also easier to debug. Andrew, when you get a chance, could you fix some of the auth code to use strings for IPs ? - return a NTSTATUS error on bad name queries and node status instead of using rcode. This makes the calling code simpler. - added low level name release code in libcli/nbt/ - use a real IP in the register and wins nbt torture tests, as w2k3 WINS server silently rejects some operations that don't come from the IP being used (eg. it says "yes" to a release, but does not in fact release the name) (This used to be commit bb1ab11d8e0ea0bd9ae34aebeb565d36fe4b495f) --- source4/nbt_server/interfaces.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 3cb690b85d..c84f630400 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -191,7 +191,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) for non-WINS queries not made on a specific interface */ if (num_interfaces > 0) { - primary_address = sys_inet_ntoa(*iface_n_ip(0)); + primary_address = iface_n_ip(0); } else { primary_address = sys_inet_ntoa(interpret_addr2( lp_netbios_name())); @@ -208,9 +208,9 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) } for (i=0; i Date: Thu, 10 Feb 2005 06:59:29 +0000 Subject: r5304: removed lib/socket/socket.h from includes.h (This used to be commit b902ea546d2d1327b23f40ddaeeaa8e7e3662454) --- source4/nbt_server/interfaces.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index c84f630400..b2fc0ad6be 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -24,6 +24,7 @@ #include "dlinklist.h" #include "nbt_server/nbt_server.h" #include "smbd/service_task.h" +#include "lib/socket/socket.h" /* -- cgit From 30ce2c49c53da9feaf336aed63a687cbe416dfbb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 11 Feb 2005 08:18:55 +0000 Subject: r5329: made the nbt server case sensitive (This used to be commit 895071881920a5d6726f377f4367b588deabfb03) --- source4/nbt_server/interfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index b2fc0ad6be..42572614f2 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -79,7 +79,7 @@ struct nbtd_iface_name *nbtd_find_iname(struct nbtd_interface *iface, struct nbtd_iface_name *iname; for (iname=iface->names;iname;iname=iname->next) { if (iname->name.type == name->type && - StrCaseCmp(name->name, iname->name.name) == 0 && + strcmp(name->name, iname->name.name) == 0 && ((iname->nb_flags & nb_flags) == nb_flags)) { return iname; } -- cgit From 0487eee93a06c8d4d1925660d6d14374c4039d86 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 11 Feb 2005 23:54:37 +0000 Subject: r5346: - a bit more preparation for the WINS server going in - more NBT packet asserts, to ensure that incoming requests have all the elements we depend on - open the WINS database at startup if we are configured as a WINS server - split out the nbtd server reply packet generation code so it can be shared by the WINS server - re-did the logic of what is answered by the WINS server and what by the B node server. It now always tries to answer by the B node, and only "recurses" to the WINS server for names that are not found. (This used to be commit 5613e6b8ad9b32639caf5055f793dbc4d0a2fc19) --- source4/nbt_server/interfaces.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 42572614f2..bc01ac6d99 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -34,23 +34,13 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, const char *src_address, int src_port) { - /* if its a WINS query then direct to our WINS server if we - are running one */ - if ((packet->operation & NBT_FLAG_RECURSION_DESIRED) && - !(packet->operation & NBT_FLAG_BROADCAST) && - lp_wins_support()) { - nbtd_query_wins(nbtsock, packet, src_address, src_port); - return; - } - /* see if its from one of our own interfaces - if so, then ignore it */ if (nbtd_self_packet(nbtsock, packet, src_address, src_port)) { DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port)); return; } - /* the request is to us in our role as a B node */ - switch ((enum nbt_opcode)(packet->operation & NBT_OPCODE)) { + switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: nbtd_request_query(nbtsock, packet, src_address, src_port); break; @@ -61,6 +51,11 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, nbtd_request_defense(nbtsock, packet, src_address, src_port); break; + case NBT_OPCODE_RELEASE: + case NBT_OPCODE_MULTI_HOME_REG: + nbtd_winsserver_request(nbtsock, packet, src_address, src_port); + break; + default: nbtd_bad_packet(packet, src_address, "Unexpected opcode"); break; -- cgit From a47cb58c2f6d34dd98e3dc2dd023a259ff501643 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 3 Apr 2005 04:32:37 +0000 Subject: r6184: the beginnings of the libcli/dgram/ library, and the dgram server. Currently just listens on port 138 and parses the packets (using IDL like the rest of NBT). This allows me to develop the structures and test with real packets (This used to be commit 10d64a525349ff96695ad961a3cfeb5bc7c8844f) --- source4/nbt_server/interfaces.c | 48 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index bc01ac6d99..dfd4538321 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -63,6 +63,16 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, } +/* + receive an incoming dgram request +*/ +static void dgram_request_handler(struct nbt_dgram_socket *dgmsock, + struct nbt_dgram_packet *packet, + const char *src_address, int src_port) +{ +} + + /* find a registered name on an interface @@ -93,7 +103,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, { struct nbtd_interface *iface; NTSTATUS status; - struct nbt_name_socket *bcast_nbtsock; /* we actually create two sockets. One listens on the broadcast address @@ -113,6 +122,10 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, iface->names = NULL; if (strcmp(netmask, "0.0.0.0") != 0) { + struct nbt_name_socket *bcast_nbtsock; + struct nbt_dgram_socket *bcast_dgmsock; + + /* listen for broadcasts on port 137 */ bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); NT_STATUS_HAVE_NO_MEMORY(bcast_nbtsock); @@ -125,10 +138,26 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, } nbt_set_incoming_handler(bcast_nbtsock, nbtd_request_handler, iface); + + + /* listen for broadcasts on port 138 */ + bcast_dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx); + NT_STATUS_HAVE_NO_MEMORY(bcast_dgmsock); + + status = socket_listen(bcast_dgmsock->sock, bcast, lp_dgram_port(), 0, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("Failed to bind to %s:%d - %s\n", + bcast, lp_dgram_port(), nt_errstr(status))); + talloc_free(iface); + return status; + } + + dgram_set_incoming_handler(bcast_dgmsock, dgram_request_handler, iface); } + /* listen for unicasts on port 137 */ iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(iface->ip_address); + NT_STATUS_HAVE_NO_MEMORY(iface->nbtsock); status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { @@ -137,9 +166,22 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, talloc_free(iface); return status; } - nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface); + + /* listen for unicasts on port 138 */ + iface->dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx); + NT_STATUS_HAVE_NO_MEMORY(iface->dgmsock); + + status = socket_listen(iface->dgmsock->sock, bind_address, lp_dgram_port(), 0, 0); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("Failed to bind to %s:%d - %s\n", + address, lp_dgram_port(), nt_errstr(status))); + talloc_free(iface); + return status; + } + dgram_set_incoming_handler(iface->dgmsock, dgram_request_handler, iface); + if (strcmp(netmask, "0.0.0.0") == 0) { DLIST_ADD(nbtsrv->bcast_interface, iface); } else { -- cgit From b0ca8ed4559efae38933f49a638e7b51ae8bf0c8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 8 Apr 2005 08:57:09 +0000 Subject: r6247: added the server side code for receiving mailslot requests, and parsing incoming netlogon requests. No replies are sent yet. (This used to be commit 3b34df6a674cd2aeddc354cdadae3f0e1c000d45) --- source4/nbt_server/interfaces.c | 44 ++++++----------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index dfd4538321..b77e692e10 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -63,17 +63,6 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, } -/* - receive an incoming dgram request -*/ -static void dgram_request_handler(struct nbt_dgram_socket *dgmsock, - struct nbt_dgram_packet *packet, - const char *src_address, int src_port) -{ -} - - - /* find a registered name on an interface */ @@ -123,7 +112,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, if (strcmp(netmask, "0.0.0.0") != 0) { struct nbt_name_socket *bcast_nbtsock; - struct nbt_dgram_socket *bcast_dgmsock; /* listen for broadcasts on port 137 */ bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); @@ -138,21 +126,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, } nbt_set_incoming_handler(bcast_nbtsock, nbtd_request_handler, iface); - - - /* listen for broadcasts on port 138 */ - bcast_dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(bcast_dgmsock); - - status = socket_listen(bcast_dgmsock->sock, bcast, lp_dgram_port(), 0, 0); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0,("Failed to bind to %s:%d - %s\n", - bcast, lp_dgram_port(), nt_errstr(status))); - talloc_free(iface); - return status; - } - - dgram_set_incoming_handler(bcast_dgmsock, dgram_request_handler, iface); } /* listen for unicasts on port 137 */ @@ -162,26 +135,21 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", - address, lp_nbt_port(), nt_errstr(status))); + bind_address, lp_nbt_port(), nt_errstr(status))); talloc_free(iface); return status; } nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface); - - /* listen for unicasts on port 138 */ - iface->dgmsock = nbt_dgram_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(iface->dgmsock); - - status = socket_listen(iface->dgmsock->sock, bind_address, lp_dgram_port(), 0, 0); + /* also setup the datagram listeners */ + status = nbtd_dgram_setup(iface, bind_address); if (!NT_STATUS_IS_OK(status)) { - DEBUG(0,("Failed to bind to %s:%d - %s\n", - address, lp_dgram_port(), nt_errstr(status))); + DEBUG(0,("Failed to setup dgram listen on %s - %s\n", + bind_address, nt_errstr(status))); talloc_free(iface); return status; } - dgram_set_incoming_handler(iface->dgmsock, dgram_request_handler, iface); - + if (strcmp(netmask, "0.0.0.0") == 0) { DLIST_ADD(nbtsrv->bcast_interface, iface); } else { -- cgit From c7304b3ab8396ffd1eb54a09cc730ea975ad488c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 10 Jul 2005 08:41:02 +0000 Subject: r8285: generate some real stats in the nbt server for the irpc client code to look at (This used to be commit 73643884a3c76de5a738a28054a168fdb008a9f8) --- source4/nbt_server/interfaces.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index b77e692e10..aa22e5d4ad 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -34,6 +34,12 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, const char *src_address, int src_port) { + struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, + struct nbtd_interface); + struct nbtd_server *nbtsrv = iface->nbtsrv; + + 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_address, src_port)) { DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port)); @@ -42,17 +48,20 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: + nbtsrv->stats.query_count++; nbtd_request_query(nbtsock, packet, src_address, src_port); break; case NBT_OPCODE_REGISTER: case NBT_OPCODE_REFRESH: case NBT_OPCODE_REFRESH2: + nbtsrv->stats.register_count++; nbtd_request_defense(nbtsock, packet, src_address, src_port); break; case NBT_OPCODE_RELEASE: case NBT_OPCODE_MULTI_HOME_REG: + nbtsrv->stats.release_count++; nbtd_winsserver_request(nbtsock, packet, src_address, src_port); break; -- cgit From fccbbf354634b31c9c3cb2bca15843f13e3b77f9 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 14 Oct 2005 12:22:15 +0000 Subject: r10997: r11980@SERNOX (orig r10037): metze | 2005-09-05 14:21:40 +0200 add struct nbt_peer_socket and use it instead of passing const char *addr, uint16 port everyhwere (tridge: can you review this please, (make test works) metze (This used to be commit a599d7a4ae881c94be2c2d908a398838549942bb) --- source4/nbt_server/interfaces.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index aa22e5d4ad..23276123d5 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -32,7 +32,7 @@ */ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, - const char *src_address, int src_port) + const struct nbt_peer_socket *src) { struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, struct nbtd_interface); @@ -41,32 +41,32 @@ 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_address, src_port)) { - DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port)); + if (nbtd_self_packet(nbtsock, packet, src)) { + DEBUG(10,("Ignoring self packet from %s:%d\n", src->addr, src->port)); return; } switch (packet->operation & NBT_OPCODE) { case NBT_OPCODE_QUERY: nbtsrv->stats.query_count++; - nbtd_request_query(nbtsock, packet, src_address, src_port); + nbtd_request_query(nbtsock, packet, src); break; case NBT_OPCODE_REGISTER: case NBT_OPCODE_REFRESH: case NBT_OPCODE_REFRESH2: nbtsrv->stats.register_count++; - nbtd_request_defense(nbtsock, packet, src_address, src_port); + nbtd_request_defense(nbtsock, packet, src); break; case NBT_OPCODE_RELEASE: case NBT_OPCODE_MULTI_HOME_REG: nbtsrv->stats.release_count++; - nbtd_winsserver_request(nbtsock, packet, src_address, src_port); + nbtd_winsserver_request(nbtsock, packet, src); break; default: - nbtd_bad_packet(packet, src_address, "Unexpected opcode"); + nbtd_bad_packet(packet, src, "Unexpected opcode"); break; } } -- cgit From cbb7a47cf269dd741ae43be22cc27bf9035ac59e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 14 Nov 2005 01:50:55 +0000 Subject: r11711: fixed the nbt server to use the right interface for outgoing requests (This used to be commit d87df5fe8e37d3daa3d9cb575450d756dc3d3c8f) --- source4/nbt_server/interfaces.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 23276123d5..4ef2afb8ee 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -286,3 +286,27 @@ failed: talloc_free(ret); return NULL; } + + +/* + find the interface to use for sending a outgoing request +*/ +struct nbtd_interface *nbtd_find_interface(struct nbtd_server *nbtd_server, + const char *address) +{ + struct nbtd_interface *iface; + /* try to find a exact match */ + for (iface=nbtd_server->interfaces;iface;iface=iface->next) { + if (iface_same_net(address, iface->ip_address, iface->netmask)) { + return iface; + } + } + + /* no exact match, if we have the broadcast interface, use that */ + if (nbtd_server->bcast_interface) { + return nbtd_server->bcast_interface; + } + + /* fallback to first interface */ + return nbtd_server->interfaces; +} -- cgit From ac4ee3e20b3823bb7b6cb35ce8855b8313f0fa8d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 22 Dec 2005 22:03:25 +0000 Subject: r12440: fix crash bugs metze (This used to be commit c7049f8bb60d075921e1ac4d04bf1a216cd0a5f2) --- source4/nbt_server/interfaces.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 4ef2afb8ee..f2ccc1c424 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -279,6 +279,9 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx if (ret[count] == NULL) goto failed; count++; } + + if (ret == NULL) goto failed; + ret[count] = NULL; return ret; -- cgit From 1984ba6ee98d1f0d1a9c497ecdb9c361a062f769 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 28 Dec 2005 04:55:53 +0000 Subject: r12535: - simplify string list handling in a couple of places using str_list_add() - don't reply with 127.0.0.1 in NBT or WINS name queries unless the query came in on the loopback interface. Otherwise clients can end up talking to themselves, which is not very productive :-) (This used to be commit df00f8b3428c6d1254e66275c90ae4025cb52c47) --- source4/nbt_server/interfaces.c | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index f2ccc1c424..f607c070d8 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -251,43 +251,32 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx struct nbtd_server *nbtsrv = iface->nbtsrv; const char **ret = NULL; struct nbtd_interface *iface2; - int count = 0; if (iface->ip_address) { - ret = talloc_array(mem_ctx, const char *, 2); - if (ret == NULL) goto failed; - - ret[0] = talloc_strdup(ret, iface->ip_address); - if (ret[0] == NULL) goto failed; - ret[1] = NULL; - - count = 1; + ret = str_list_add(ret, iface->ip_address); } for (iface2=nbtsrv->interfaces;iface2;iface2=iface2->next) { - const char **ret2; - if (iface->ip_address && strcmp(iface2->ip_address, iface->ip_address) == 0) { continue; } - ret2 = talloc_realloc(mem_ctx, ret, const char *, count+2); - if (ret2 == NULL) goto failed; - ret = ret2; - ret[count] = talloc_strdup(ret, iface2->ip_address); - if (ret[count] == NULL) goto failed; - count++; + ret = str_list_add(ret, iface2->ip_address); } - if (ret == NULL) goto failed; + talloc_steal(mem_ctx, ret); - ret[count] = NULL; - return ret; + /* if the query didn't come from loopback, then never give out + loopback in the reply, as loopback means something + different for the recipient than for us */ + if (ret != NULL && + iface->ip_address != NULL && + strcmp(iface->ip_address, "127.0.0.1") != 0) { + str_list_remove(ret, "127.0.0.1"); + } -failed: - talloc_free(ret); - return NULL; + return ret; } -- cgit From 8faa1f4f9af114985b0c6b7383f0f1c935e83f9f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 29 Dec 2005 16:58:35 +0000 Subject: r12577: filter the loopback addresses like this 127.*.*.* and not only 127.0.0.1 metze (This used to be commit 3b32d8b6b6565d8c5b3f7e653fdc385cc8cb96ef) --- source4/nbt_server/interfaces.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index f607c070d8..344d1b57d3 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -251,15 +251,22 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx struct nbtd_server *nbtsrv = iface->nbtsrv; const char **ret = NULL; struct nbtd_interface *iface2; + BOOL is_loopback = False; if (iface->ip_address) { + is_loopback = iface_same_net(iface->ip_address, "127.0.0.1", "255.0.0.0"); ret = str_list_add(ret, iface->ip_address); } for (iface2=nbtsrv->interfaces;iface2;iface2=iface2->next) { - if (iface->ip_address && - strcmp(iface2->ip_address, iface->ip_address) == 0) { - continue; + if (iface2 == iface) continue; + + if (!iface2->ip_address) continue; + + if (!is_loopback) { + if (iface_same_net(iface2->ip_address, "127.0.0.1", "255.0.0.0")) { + continue; + } } ret = str_list_add(ret, iface2->ip_address); @@ -267,15 +274,6 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx talloc_steal(mem_ctx, ret); - /* if the query didn't come from loopback, then never give out - loopback in the reply, as loopback means something - different for the recipient than for us */ - if (ret != NULL && - iface->ip_address != NULL && - strcmp(iface->ip_address, "127.0.0.1") != 0) { - str_list_remove(ret, "127.0.0.1"); - } - return ret; } -- cgit From ab8cd4470c392e04e458eed378b857db00e97f13 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 30 Dec 2005 12:43:11 +0000 Subject: r12607: fix the build metze (This used to be commit 5cc955bf5400a415e462853cff47a69ef206a548) --- source4/nbt_server/interfaces.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 344d1b57d3..41a27fdeb0 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -25,6 +25,7 @@ #include "nbt_server/nbt_server.h" #include "smbd/service_task.h" #include "lib/socket/socket.h" +#include "nbt_server/wins/winsserver.h" /* -- cgit From f55ea8bb3dca868e21663cd90eaea7a35cd7886c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 9 Jan 2006 22:12:53 +0000 Subject: r12804: This patch reworks the Samba4 sockets layer to use a socket_address structure that is more generic than just 'IP/port'. It now passes make test, and has been reviewed and updated by metze. (Thankyou *very* much). This passes 'make test' as well as kerberos use (not currently in the testsuite). The original purpose of this patch was to have Samba able to pass a socket address stucture from the BSD layer into the kerberos routines and back again. It also removes nbt_peer_addr, which was being used for a similar purpose. It is a large change, but worthwhile I feel. Andrew Bartlett (This used to be commit 88198c4881d8620a37086f80e4da5a5b71c5bbb2) --- source4/nbt_server/interfaces.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 41a27fdeb0..10bdc0bb14 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -33,7 +33,7 @@ */ static void nbtd_request_handler(struct nbt_name_socket *nbtsock, struct nbt_name_packet *packet, - const struct nbt_peer_socket *src) + struct socket_address *src) { struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, struct nbtd_interface); @@ -102,6 +102,8 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, { struct nbtd_interface *iface; NTSTATUS status; + struct socket_address *bcast_address; + struct socket_address *unicast_address; /* we actually create two sockets. One listens on the broadcast address @@ -125,30 +127,49 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, /* listen for broadcasts on port 137 */ bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(bcast_nbtsock); + if (!bcast_nbtsock) { + talloc_free(iface); + return NT_STATUS_NO_MEMORY; + } + + bcast_address = socket_address_from_strings(bcast_nbtsock, bcast_nbtsock->sock->backend_name, + bcast, lp_nbt_port()); + if (!bcast_address) { + talloc_free(iface); + return NT_STATUS_NO_MEMORY; + } - status = socket_listen(bcast_nbtsock->sock, bcast, lp_nbt_port(), 0, 0); + status = socket_listen(bcast_nbtsock->sock, bcast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", bcast, lp_nbt_port(), nt_errstr(status))); talloc_free(iface); return status; } + talloc_free(bcast_address); nbt_set_incoming_handler(bcast_nbtsock, nbtd_request_handler, iface); } /* listen for unicasts on port 137 */ iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); - NT_STATUS_HAVE_NO_MEMORY(iface->nbtsock); + if (!iface->nbtsock) { + talloc_free(iface); + return NT_STATUS_NO_MEMORY; + } - status = socket_listen(iface->nbtsock->sock, bind_address, lp_nbt_port(), 0, 0); + unicast_address = socket_address_from_strings(iface->nbtsock, iface->nbtsock->sock->backend_name, + bind_address, lp_nbt_port()); + + status = socket_listen(iface->nbtsock->sock, unicast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", bind_address, lp_nbt_port(), nt_errstr(status))); talloc_free(iface); return status; } + talloc_free(unicast_address); + nbt_set_incoming_handler(iface->nbtsock, nbtd_request_handler, iface); /* also setup the datagram listeners */ -- cgit From eead6d310b2f10a8933077f5b12131f0bb1aae02 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Jan 2006 16:36:53 +0000 Subject: 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 (This used to be commit 31ce24d7b1d2945c45c4f5d6376d5041df8b6982) --- source4/nbt_server/interfaces.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 10bdc0bb14..9fdad96b55 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/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; } -- cgit From 048704a7e54573086e7913519d2b72577a34b135 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 15 Feb 2006 04:18:11 +0000 Subject: r13505: allow servers to bind to non-broadcast interfaces. Servers now specifically ask for iface_n_bcast() and have to check if it returns NULL, in which case it is a non-broadcast interface (This used to be commit d004e250b6710251ea089ac242775481f13b5c2b) --- source4/nbt_server/interfaces.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 9fdad96b55..36a65b1859 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -245,9 +245,15 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) } for (i=0; i Date: Tue, 7 Mar 2006 11:07:23 +0000 Subject: r13924: Split more prototypes out of include/proto.h + initial work on header file dependencies (This used to be commit 122835876748a3eaf5e8d31ad1abddab9acb8781) --- source4/nbt_server/interfaces.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 36a65b1859..e51cd5c6f3 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -26,6 +26,9 @@ #include "smbd/service_task.h" #include "lib/socket/socket.h" #include "nbt_server/wins/winsserver.h" +#include "nbt_server/dgram/proto.h" +#include "system/network.h" +#include "netif/netif.h" /* -- cgit From 767685e9fd836d9ea3082855e7d9204ca66f047f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 25 Mar 2006 09:24:53 +0000 Subject: r14709: allways use the unicast socket of the interface, when reply to DGRAM requests... this fixes a bug where I thought windows would try KRB5 via broadcast... metze (This used to be commit 0e7b224294ce6a3b5bbdc284181ab496a5a0c058) --- source4/nbt_server/interfaces.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index e51cd5c6f3..1cfe79bb9f 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -193,7 +193,6 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, return NT_STATUS_OK; } - /* setup a socket for talking to our WINS servers */ @@ -312,22 +311,39 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx /* find the interface to use for sending a outgoing request */ -struct nbtd_interface *nbtd_find_interface(struct nbtd_server *nbtd_server, - const char *address) +struct nbtd_interface *nbtd_find_request_iface(struct nbtd_server *nbtd_server, + const char *address, BOOL allow_bcast_iface) { - struct nbtd_interface *iface; + struct nbtd_interface *cur; + /* try to find a exact match */ - for (iface=nbtd_server->interfaces;iface;iface=iface->next) { - if (iface_same_net(address, iface->ip_address, iface->netmask)) { - return iface; + for (cur=nbtd_server->interfaces;cur;cur=cur->next) { + if (iface_same_net(address, cur->ip_address, cur->netmask)) { + return cur; } } /* no exact match, if we have the broadcast interface, use that */ - if (nbtd_server->bcast_interface) { + if (allow_bcast_iface && nbtd_server->bcast_interface) { return nbtd_server->bcast_interface; } /* fallback to first interface */ return nbtd_server->interfaces; } + +/* + * find the interface to use for sending a outgoing reply + */ +struct nbtd_interface *nbtd_find_reply_iface(struct nbtd_interface *iface, + const char *address, BOOL allow_bcast_iface) +{ + struct nbtd_server *nbtd_server = iface->nbtsrv; + + /* first try to use the given interfacel when it's not the broadcast one */ + if (iface != nbtd_server->bcast_interface) { + return iface; + } + + return nbtd_find_request_iface(nbtd_server, address, allow_bcast_iface); +} -- cgit From a2eca9174c7803732658a1e6f7e8ed873c4fb6fd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 17 Aug 2006 13:37:04 +0000 Subject: r17586: merge lib/netif into lib/socket and use -lnsl -lsocket on the configure check for the interfaces. should fix the build on some old sun boxes metze (This used to be commit f20e251bfd9f1eb7ce5c00739631b1625a2aa467) --- source4/nbt_server/interfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 1cfe79bb9f..2ce9688e4d 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -28,7 +28,7 @@ #include "nbt_server/wins/winsserver.h" #include "nbt_server/dgram/proto.h" #include "system/network.h" -#include "netif/netif.h" +#include "lib/socket/netif.h" /* -- cgit From 0329d755a7611ba3897fc1ee9bdce410cc33d7f8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 30 Aug 2006 11:29:34 +0000 Subject: r17930: Merge noinclude branch: * Move dlinklist.h, smb.h to subsystem-specific directories * Clean up ads.h and move what is left of it to dsdb/ (only place where it's used) (This used to be commit f7afa1cb77f3cfa7020b57de12e6003db7cfcc42) --- source4/nbt_server/interfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 2ce9688e4d..09473f43c9 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -21,7 +21,7 @@ */ #include "includes.h" -#include "dlinklist.h" +#include "lib/util/dlinklist.h" #include "nbt_server/nbt_server.h" #include "smbd/service_task.h" #include "lib/socket/socket.h" -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/nbt_server/interfaces.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 09473f43c9..b0bc55c05b 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -7,7 +7,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,8 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From ffeee68e4b72dd94fee57366bd8d38b8c284c3d4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 12:42:09 +0000 Subject: r25026: Move param/param.h out of includes.h (This used to be commit abe8349f9b4387961ff3665d8c589d61cd2edf31) --- source4/nbt_server/interfaces.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index b0bc55c05b..40fa605e11 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -28,6 +28,7 @@ #include "nbt_server/dgram/proto.h" #include "system/network.h" #include "lib/socket/netif.h" +#include "param/param.h" /* -- cgit From 37d53832a4623653f706e77985a79d84bd7c6694 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 28 Sep 2007 01:17:46 +0000 Subject: r25398: Parse loadparm context to all lp_*() functions. (This used to be commit 3fcc960839c6e5ca4de2c3c042f12f369ac5f238) --- source4/nbt_server/interfaces.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 40fa605e11..27d733aeff 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -136,7 +136,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, } bcast_address = socket_address_from_strings(bcast_nbtsock, bcast_nbtsock->sock->backend_name, - bcast, lp_nbt_port()); + bcast, lp_nbt_port(global_loadparm)); if (!bcast_address) { talloc_free(iface); return NT_STATUS_NO_MEMORY; @@ -145,7 +145,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, status = socket_listen(bcast_nbtsock->sock, bcast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", - bcast, lp_nbt_port(), nt_errstr(status))); + bcast, lp_nbt_port(global_loadparm), nt_errstr(status))); talloc_free(iface); return status; } @@ -161,13 +161,14 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, return NT_STATUS_NO_MEMORY; } - unicast_address = socket_address_from_strings(iface->nbtsock, iface->nbtsock->sock->backend_name, - bind_address, lp_nbt_port()); + unicast_address = socket_address_from_strings(iface->nbtsock, + iface->nbtsock->sock->backend_name, + bind_address, lp_nbt_port(global_loadparm)); status = socket_listen(iface->nbtsock->sock, unicast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", - bind_address, lp_nbt_port(), nt_errstr(status))); + bind_address, lp_nbt_port(global_loadparm), nt_errstr(status))); talloc_free(iface); return status; } @@ -223,7 +224,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) /* if we are allowing incoming packets from any address, then we also need to bind to the wildcard address */ - if (!lp_bind_interfaces_only()) { + if (!lp_bind_interfaces_only(global_loadparm)) { const char *primary_address; /* the primary address is the address we will return @@ -233,7 +234,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) primary_address = iface_n_ip(0); } else { primary_address = sys_inet_ntoa(interpret_addr2( - lp_netbios_name())); + lp_netbios_name(global_loadparm))); } primary_address = talloc_strdup(tmp_ctx, primary_address); NT_STATUS_HAVE_NO_MEMORY(primary_address); @@ -261,7 +262,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) NT_STATUS_NOT_OK_RETURN(status); } - if (lp_wins_server_list()) { + if (lp_wins_server_list(global_loadparm)) { status = nbtd_add_wins_socket(nbtsrv); NT_STATUS_NOT_OK_RETURN(status); } -- cgit From cac2379a2fc570308f24142959fabe5ae4462aff Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 21:33:16 +0000 Subject: r25546: Convert to standard bool type. (This used to be commit ac83dbf199fd442fc994d43a6e5e9fda8d4c88b6) --- source4/nbt_server/interfaces.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 27d733aeff..f2a875142a 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -282,7 +282,7 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx struct nbtd_server *nbtsrv = iface->nbtsrv; const char **ret = NULL; struct nbtd_interface *iface2; - BOOL is_loopback = False; + bool is_loopback = false; if (iface->ip_address) { is_loopback = iface_same_net(iface->ip_address, "127.0.0.1", "255.0.0.0"); @@ -313,7 +313,7 @@ const char **nbtd_address_list(struct nbtd_interface *iface, TALLOC_CTX *mem_ctx find the interface to use for sending a outgoing request */ struct nbtd_interface *nbtd_find_request_iface(struct nbtd_server *nbtd_server, - const char *address, BOOL allow_bcast_iface) + const char *address, bool allow_bcast_iface) { struct nbtd_interface *cur; @@ -337,7 +337,7 @@ struct nbtd_interface *nbtd_find_request_iface(struct nbtd_server *nbtd_server, * find the interface to use for sending a outgoing reply */ struct nbtd_interface *nbtd_find_reply_iface(struct nbtd_interface *iface, - const char *address, BOOL allow_bcast_iface) + const char *address, bool allow_bcast_iface) { struct nbtd_server *nbtd_server = iface->nbtsrv; -- cgit From b09047b78e981af8ade6a72d426bfcb0e742995b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 13 Oct 2007 20:24:37 +0200 Subject: r25624: Remove ipv4_addr hack. Only causes 4 extra includes of system/network.h because we stripped down includes. (This used to be commit 262c1c23a61f1f4fae13e0a61179fe98b682cecf) --- source4/nbt_server/interfaces.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index f2a875142a..2f51cc3dec 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -233,7 +233,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) if (num_interfaces > 0) { primary_address = iface_n_ip(0); } else { - primary_address = sys_inet_ntoa(interpret_addr2( + primary_address = inet_ntoa(interpret_addr2( lp_netbios_name(global_loadparm))); } primary_address = talloc_strdup(tmp_ctx, primary_address); -- cgit From c9f0011bc57e6536f4ec130784d15609e71aa694 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 3 Dec 2007 18:47:42 +0100 Subject: r26265: Use task-provided loadparm context in nbt and rpc servers. (This used to be commit 75cb7676fd97767ff0f78c7a17acc8574e297e6f) --- source4/nbt_server/interfaces.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 2f51cc3dec..c40cd6322c 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -98,6 +98,7 @@ struct nbtd_iface_name *nbtd_find_iname(struct nbtd_interface *iface, start listening on the given address */ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, + struct loadparm_context *lp_ctx, const char *bind_address, const char *address, const char *bcast, @@ -136,7 +137,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, } bcast_address = socket_address_from_strings(bcast_nbtsock, bcast_nbtsock->sock->backend_name, - bcast, lp_nbt_port(global_loadparm)); + bcast, lp_nbt_port(lp_ctx)); if (!bcast_address) { talloc_free(iface); return NT_STATUS_NO_MEMORY; @@ -145,7 +146,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, status = socket_listen(bcast_nbtsock->sock, bcast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", - bcast, lp_nbt_port(global_loadparm), nt_errstr(status))); + bcast, lp_nbt_port(lp_ctx), nt_errstr(status))); talloc_free(iface); return status; } @@ -163,12 +164,12 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, unicast_address = socket_address_from_strings(iface->nbtsock, iface->nbtsock->sock->backend_name, - bind_address, lp_nbt_port(global_loadparm)); + bind_address, lp_nbt_port(lp_ctx)); status = socket_listen(iface->nbtsock->sock, unicast_address, 0, 0); if (!NT_STATUS_IS_OK(status)) { DEBUG(0,("Failed to bind to %s:%d - %s\n", - bind_address, lp_nbt_port(global_loadparm), nt_errstr(status))); + bind_address, lp_nbt_port(lp_ctx), nt_errstr(status))); talloc_free(iface); return status; } @@ -215,7 +216,7 @@ static NTSTATUS nbtd_add_wins_socket(struct nbtd_server *nbtsrv) /* setup our listening sockets on the configured network interfaces */ -NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) +NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_context *lp_ctx) { int num_interfaces = iface_count(); int i; @@ -224,7 +225,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) /* if we are allowing incoming packets from any address, then we also need to bind to the wildcard address */ - if (!lp_bind_interfaces_only(global_loadparm)) { + if (!lp_bind_interfaces_only(lp_ctx)) { const char *primary_address; /* the primary address is the address we will return @@ -234,12 +235,13 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) primary_address = iface_n_ip(0); } else { primary_address = inet_ntoa(interpret_addr2( - lp_netbios_name(global_loadparm))); + lp_netbios_name(lp_ctx))); } primary_address = talloc_strdup(tmp_ctx, primary_address); NT_STATUS_HAVE_NO_MEMORY(primary_address); status = nbtd_add_socket(nbtsrv, + lp_ctx, "0.0.0.0", primary_address, talloc_strdup(tmp_ctx, "255.255.255.255"), @@ -258,11 +260,12 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv) bcast = talloc_strdup(tmp_ctx, bcast); netmask = talloc_strdup(tmp_ctx, iface_n_netmask(i)); - status = nbtd_add_socket(nbtsrv, address, address, bcast, netmask); + status = nbtd_add_socket(nbtsrv, lp_ctx, + address, address, bcast, netmask); NT_STATUS_NOT_OK_RETURN(status); } - if (lp_wins_server_list(global_loadparm)) { + if (lp_wins_server_list(lp_ctx)) { status = nbtd_add_wins_socket(nbtsrv); NT_STATUS_NOT_OK_RETURN(status); } -- cgit From c5bf20c5fe7eaa04cd11a7ce4f365aa6ffd7b124 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 6 Dec 2007 23:57:22 +0100 Subject: r26325: Remove use of global_loadparm in netif. (This used to be commit e452cb28594f23add7c00247ed39e8323aea78a6) --- source4/nbt_server/interfaces.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index c40cd6322c..21ebada3c8 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -218,7 +218,7 @@ static NTSTATUS nbtd_add_wins_socket(struct nbtd_server *nbtsrv) */ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_context *lp_ctx) { - int num_interfaces = iface_count(); + int num_interfaces = iface_count(lp_ctx); int i; TALLOC_CTX *tmp_ctx = talloc_new(nbtsrv); NTSTATUS status; @@ -232,7 +232,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_con for non-WINS queries not made on a specific interface */ if (num_interfaces > 0) { - primary_address = iface_n_ip(0); + primary_address = iface_n_ip(lp_ctx, 0); } else { primary_address = inet_ntoa(interpret_addr2( lp_netbios_name(lp_ctx))); @@ -250,15 +250,15 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_con } for (i=0; i Date: Tue, 11 Dec 2007 22:23:14 +0100 Subject: r26401: Don't cache interfaces context in libnetif. (This used to be commit 9f975417cc66bfd4589da38bfd23731dbe0e6153) --- source4/nbt_server/interfaces.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 21ebada3c8..486acfbad5 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -216,9 +216,10 @@ static NTSTATUS nbtd_add_wins_socket(struct nbtd_server *nbtsrv) /* setup our listening sockets on the configured network interfaces */ -NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_context *lp_ctx) +NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_context *lp_ctx, + struct interface *ifaces) { - int num_interfaces = iface_count(lp_ctx); + int num_interfaces = iface_count(ifaces); int i; TALLOC_CTX *tmp_ctx = talloc_new(nbtsrv); NTSTATUS status; @@ -232,7 +233,7 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_con for non-WINS queries not made on a specific interface */ if (num_interfaces > 0) { - primary_address = iface_n_ip(lp_ctx, 0); + primary_address = iface_n_ip(ifaces, 0); } else { primary_address = inet_ntoa(interpret_addr2( lp_netbios_name(lp_ctx))); @@ -250,15 +251,15 @@ NTSTATUS nbtd_startup_interfaces(struct nbtd_server *nbtsrv, struct loadparm_con } for (i=0; i Date: Thu, 21 Feb 2008 17:17:37 +0100 Subject: Remove yet more uses of global_loadparm. (This used to be commit e01c1e87c0fe9709df7eb5b863f7ce85564174cd) --- source4/nbt_server/interfaces.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/nbt_server/interfaces.c') diff --git a/source4/nbt_server/interfaces.c b/source4/nbt_server/interfaces.c index 486acfbad5..e59475051b 100644 --- a/source4/nbt_server/interfaces.c +++ b/source4/nbt_server/interfaces.c @@ -130,7 +130,7 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, struct nbt_name_socket *bcast_nbtsock; /* listen for broadcasts on port 137 */ - bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); + bcast_nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx, lp_iconv_convenience(nbtsrv->task->lp_ctx)); if (!bcast_nbtsock) { talloc_free(iface); return NT_STATUS_NO_MEMORY; @@ -156,7 +156,8 @@ static NTSTATUS nbtd_add_socket(struct nbtd_server *nbtsrv, } /* listen for unicasts on port 137 */ - iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx); + iface->nbtsock = nbt_name_socket_init(iface, nbtsrv->task->event_ctx, + lp_iconv_convenience(nbtsrv->task->lp_ctx)); if (!iface->nbtsock) { talloc_free(iface); return NT_STATUS_NO_MEMORY; -- cgit