r5222: made the nbtd_self_packet() code more efficient
authorAndrew Tridgell <tridge@samba.org>
Fri, 4 Feb 2005 05:13:46 +0000 (05:13 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:09:32 +0000 (13:09 -0500)
source/nbt_server/packet.c

index c5ed0b41ce406fce09499378afb803fd7760814f..bb9e2459b1ca081a4700577d9eed30eb32e92e23 100644 (file)
@@ -38,7 +38,8 @@ void nbtd_bad_packet(struct nbt_name_packet *packet,
 
 
 /*
-  see if an incoming packet is from one of our own interfaces
+  see if an incoming packet is a broadcast packet from one of our own
+  interfaces
 */
 BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock, 
                      struct nbt_name_packet *packet, 
@@ -48,20 +49,29 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
                                                      struct nbt_interface);
        struct nbt_server *nbtsrv = iface->nbtsrv;
        
+       /* if its not a broadcast then its not considered a self packet */
+       if (!(packet->operation & NBT_FLAG_BROADCAST)) {
+               return False;
+       }
+
+       /* if its not from the nbt port, then it wasn't a broadcast from us */
        if (src_port != lp_nbt_port()) {
                return False;
        }
 
+       /* this uses the fact that iface->nbtsock is our non-broadcast
+          listen address */
+       if (iface->nbtsock == nbtsock) {
+               return False;
+       }
+
+       /* we have to loop over our interface list, seeing if its from
+          one of our own interfaces */
        for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
                if (strcmp(src_address, iface->ip_address) == 0) {
                        return True;
                }
        }
 
-       if (nbtsrv->bcast_interface &&
-           strcmp(src_address, nbtsrv->bcast_interface->ip_address) == 0) {
-               return True;
-       }
-
        return False;
 }