r14709: allways use the unicast socket of the interface, when reply to DGRAM
[sfrench/samba-autobuild/.git] / source4 / nbt_server / dgram / netlogon.c
index 059aad8c665013b7e296648d635151f18cf24f5d..c50c0ba1c0bb2c2c4610ed66d422d067471fe70e 100644 (file)
 */
 
 #include "includes.h"
-#include "dlinklist.h"
 #include "nbt_server/nbt_server.h"
-#include "smbd/service_task.h"
 #include "lib/socket/socket.h"
 #include "lib/ldb/include/ldb.h"
+#include "dsdb/samdb/samdb.h"
+#include "auth/auth.h"
+#include "db_wrap.h"
+#include "librpc/gen_ndr/ndr_nbt.h"
 
 /*
   reply to a GETDC request
  */
 static void nbtd_netlogon_getdc(struct dgram_mailslot_handler *dgmslot, 
+                               struct nbtd_interface *iface,
                                struct nbt_dgram_packet *packet, 
-                               const struct nbt_peer_socket *src,
+                               const struct socket_address *src,
                                struct nbt_netlogon_packet *netlogon)
 {
        struct nbt_name *name = &packet->data.msg.dest_name;
+       struct nbtd_interface *reply_iface = nbtd_find_reply_iface(iface, src->addr, False);
        struct nbt_netlogon_packet reply;
        struct nbt_netlogon_response_from_pdc *pdc;
        const char *ref_attrs[] = {"nETBIOSName", NULL};
@@ -78,7 +82,7 @@ static void nbtd_netlogon_getdc(struct dgram_mailslot_handler *dgmslot,
 
        packet->data.msg.dest_name.type = 0;
 
-       dgram_mailslot_netlogon_reply(dgmslot->dgmsock, 
+       dgram_mailslot_netlogon_reply(reply_iface->dgmsock, 
                                      packet, 
                                      netlogon->req.pdc.mailslot_name,
                                      &reply);
@@ -88,12 +92,14 @@ static void nbtd_netlogon_getdc(struct dgram_mailslot_handler *dgmslot,
 /*
   reply to a ADS style GETDC request
  */
-static void nbtd_netlogon_getdc2(struct dgram_mailslot_handler *dgmslot, 
+static void nbtd_netlogon_getdc2(struct dgram_mailslot_handler *dgmslot,
+                                struct nbtd_interface *iface,
                                 struct nbt_dgram_packet *packet, 
-                                const struct nbt_peer_socket *src,
+                                const struct socket_address *src,
                                 struct nbt_netlogon_packet *netlogon)
 {
        struct nbt_name *name = &packet->data.msg.dest_name;
+       struct nbtd_interface *reply_iface = nbtd_find_reply_iface(iface, src->addr, False);
        struct nbt_netlogon_packet reply;
        struct nbt_netlogon_response_from_pdc2 *pdc;
        struct ldb_context *samctx;
@@ -102,6 +108,11 @@ static void nbtd_netlogon_getdc2(struct dgram_mailslot_handler *dgmslot,
        struct ldb_message **ref_res, **dom_res;
        int ret;
        const char **services = lp_server_services();
+       const char *my_ip = reply_iface->ip_address; 
+       if (!my_ip) {
+               DEBUG(0, ("Could not obtain own IP address for datagram socket\n"));
+               return;
+       }
 
        /* only answer getdc requests on the PDC or LOGON names */
        if (name->type != NBT_NAME_PDC && name->type != NBT_NAME_LOGON) {
@@ -181,14 +192,14 @@ static void nbtd_netlogon_getdc2(struct dgram_mailslot_handler *dgmslot,
        pdc->site_name2       = "Default-First-Site-Name";
        pdc->unknown          = 0x10; /* what is this? */
        pdc->unknown2         = 2; /* and this ... */
-       pdc->pdc_ip           = socket_get_my_addr(dgmslot->dgmsock->sock, packet);
+       pdc->pdc_ip           = my_ip;
        pdc->nt_version       = 13;
        pdc->lmnt_token       = 0xFFFF;
        pdc->lm20_token       = 0xFFFF;
 
        packet->data.msg.dest_name.type = 0;
 
-       dgram_mailslot_netlogon_reply(dgmslot->dgmsock, 
+       dgram_mailslot_netlogon_reply(reply_iface->dgmsock, 
                                      packet, 
                                      netlogon->req.pdc2.mailslot_name,
                                      &reply);
@@ -200,7 +211,7 @@ static void nbtd_netlogon_getdc2(struct dgram_mailslot_handler *dgmslot,
 */
 void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot, 
                                    struct nbt_dgram_packet *packet, 
-                                   const struct nbt_peer_socket *src)
+                                   struct socket_address *src)
 {
        NTSTATUS status = NT_STATUS_NO_MEMORY;
        struct nbtd_interface *iface = 
@@ -228,10 +239,10 @@ void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot,
 
        switch (netlogon->command) {
        case NETLOGON_QUERY_FOR_PDC:
-               nbtd_netlogon_getdc(dgmslot, packet, src, netlogon);
+               nbtd_netlogon_getdc(dgmslot, iface, packet, src, netlogon);
                break;
        case NETLOGON_QUERY_FOR_PDC2:
-               nbtd_netlogon_getdc2(dgmslot, packet, src, netlogon);
+               nbtd_netlogon_getdc2(dgmslot, iface, packet, src, netlogon);
                break;
        default:
                DEBUG(2,("unknown netlogon op %d from %s:%d\n", 
@@ -244,7 +255,8 @@ void nbtd_mailslot_netlogon_handler(struct dgram_mailslot_handler *dgmslot,
        return;
 
 failed:
-       DEBUG(2,("nbtd netlogon handler failed from %s:%d - %s\n",
-                src->addr, src->port, nt_errstr(status)));
+       DEBUG(2,("nbtd netlogon handler failed from %s:%d to %s - %s\n",
+                src->addr, src->port, nbt_name_string(netlogon, name),
+                nt_errstr(status)));
        talloc_free(netlogon);
 }