From b708e87a63947bc963d17592ac88022b708816c3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 10 Apr 2005 23:09:38 +0000 Subject: r6288: the nbt dgram server now responds to GETDC requests. It works with our test suite, but doesn't yet seem to satisfy a nt4 client. I'm investigating. (This used to be commit 406217262dff5adb5d0cb0028198e08f66cc85f4) --- source4/nbt_server/dgram/netlogon.c | 65 ++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'source4/nbt_server/dgram/netlogon.c') diff --git a/source4/nbt_server/dgram/netlogon.c b/source4/nbt_server/dgram/netlogon.c index 471145c4ac..e013742f0a 100644 --- a/source4/nbt_server/dgram/netlogon.c +++ b/source4/nbt_server/dgram/netlogon.c @@ -26,6 +26,44 @@ #include "smbd/service_task.h" #include "lib/socket/socket.h" +/* + reply to a GETDC request + */ +static void nbtd_netlogon_getdc(struct dgram_mailslot_handler *dgmslot, + struct nbt_dgram_packet *packet, + const char *src_address, int src_port, + struct nbt_netlogon_packet *netlogon) +{ + struct nbt_name *name = &packet->data.msg.dest_name; + struct nbt_netlogon_packet reply; + struct nbt_netlogon_response_from_pdc *pdc; + + /* only answer getdc requests on the PDC or LOGON names */ + if (name->type != NBT_NAME_PDC && name->type != NBT_NAME_LOGON) { + return; + } + + /* setup a GETDC reply */ + reply.command = NETLOGON_RESPONSE_FROM_PDC; + pdc = &reply.req.response; + + pdc->pdc_name = lp_netbios_name(); + pdc->unicode_pdc_name = pdc->pdc_name; + pdc->domain_name = lp_workgroup(); + pdc->nt_version = 1; + pdc->lmnt_token = 0xFFFF; + pdc->lm20_token = 0xFFFF; + + + packet->data.msg.dest_name.type = 0; + + dgram_mailslot_netlogon_reply(dgmslot->dgmsock, + packet, + netlogon->req.pdc.mailslot_name, + &reply); +} + + /* handle incoming netlogon mailslot requests */ @@ -34,16 +72,41 @@ void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot, const char *src_address, int src_port) { NTSTATUS status = NT_STATUS_NO_MEMORY; + struct nbtd_interface *iface = + talloc_get_type(dgmslot->private, struct nbtd_interface); struct nbt_netlogon_packet *netlogon = talloc(dgmslot, struct nbt_netlogon_packet); + struct nbtd_iface_name *iname; + struct nbt_name *name = &packet->data.msg.dest_name; + if (netlogon == NULL) goto failed; - DEBUG(2,("netlogon request from %s:%d\n", src_address, src_port)); + /* + see if the we are listening on the destination netbios name + */ + iname = nbtd_find_iname(iface, name, 0); + if (iname == NULL) { + status = NT_STATUS_BAD_NETWORK_NAME; + goto failed; + } + + DEBUG(2,("netlogon request to %s from %s:%d\n", + nbt_name_string(netlogon, name), src_address, src_port)); status = dgram_mailslot_netlogon_parse(dgmslot, netlogon, packet, netlogon); if (!NT_STATUS_IS_OK(status)) goto failed; NDR_PRINT_DEBUG(nbt_netlogon_packet, netlogon); + switch (netlogon->command) { + case NETLOGON_QUERY_FOR_PDC: + nbtd_netlogon_getdc(dgmslot, packet, src_address, src_port, netlogon); + break; + default: + DEBUG(2,("unknown netlogon op %d from %s:%d\n", + netlogon->command, src_address, src_port)); + break; + } + talloc_free(netlogon); return; -- cgit