Author: tridge Date: 2006-02-15 04:18:11 +0000 (Wed, 15 Feb 2006) New Revision: 13505
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=13505 Log: 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 Modified: branches/SAMBA_4_0/source/lib/netif/interface.c branches/SAMBA_4_0/source/libcli/resolve/bcast.c branches/SAMBA_4_0/source/nbt_server/interfaces.c branches/SAMBA_4_0/source/utils/nmblookup.c Changeset: Modified: branches/SAMBA_4_0/source/lib/netif/interface.c =================================================================== --- branches/SAMBA_4_0/source/lib/netif/interface.c 2006-02-15 02:56:31 UTC (rev 13504) +++ branches/SAMBA_4_0/source/lib/netif/interface.c 2006-02-15 04:18:11 UTC (rev 13505) @@ -29,7 +29,6 @@ struct interface { struct interface *next, *prev; struct ipv4_addr ip; - struct ipv4_addr bcast; struct ipv4_addr nmask; const char *ip_s; const char *bcast_s; @@ -75,16 +74,12 @@ static void add_interface(struct in_addr ip, struct in_addr nmask) { struct interface *iface; + struct ipv4_addr bcast; if (iface_find(ip, False)) { DEBUG(3,("not adding duplicate interface %s\n",inet_ntoa(ip))); return; } - if (nmask.s_addr == ~0) { - DEBUG(3,("not adding non-broadcast interface %s\n",inet_ntoa(ip))); - return; - } - iface = talloc(local_interfaces, struct interface); if (!iface) return; @@ -92,18 +87,20 @@ iface->ip = tov4(ip); iface->nmask = tov4(nmask); - iface->bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr); + bcast.addr = MKBCADDR(iface->ip.addr, iface->nmask.addr); /* keep string versions too, to avoid people tripping over the implied static in sys_inet_ntoa() */ iface->ip_s = talloc_strdup(iface, sys_inet_ntoa(iface->ip)); - iface->bcast_s = talloc_strdup(iface, sys_inet_ntoa(iface->bcast)); iface->nmask_s = talloc_strdup(iface, sys_inet_ntoa(iface->nmask)); + + if (nmask.s_addr != ~0) { + iface->bcast_s = talloc_strdup(iface, sys_inet_ntoa(bcast)); + } DLIST_ADD_END(local_interfaces, iface, struct interface *); - DEBUG(2,("added interface ip=%s bcast=%s nmask=%s\n", - iface->ip_s, iface->bcast_s, iface->nmask_s)); + DEBUG(2,("added interface ip=%s nmask=%s\n", iface->ip_s, iface->nmask_s)); } @@ -149,8 +146,7 @@ } ip.s_addr = interpret_addr2(token).addr; for (i=0;i<total_probed;i++) { - if (ip.s_addr == probed_ifaces[i].ip.s_addr && - probed_ifaces[i].netmask.s_addr != ~0) { + if (ip.s_addr == probed_ifaces[i].ip.s_addr) { add_interface(probed_ifaces[i].ip, probed_ifaces[i].netmask); return; @@ -209,15 +205,14 @@ /* probe the kernel for interfaces */ total_probed = get_interfaces(ifaces, MAX_INTERFACES); - /* if we don't have a interfaces line then use all broadcast capable - interfaces except loopback */ + /* if we don't have a interfaces line then use all interfaces + except loopback */ if (!ptr || !*ptr || !**ptr) { if (total_probed <= 0) { DEBUG(0,("ERROR: Could not determine network interfaces, you must use a interfaces config line\n")); } for (i=0;i<total_probed;i++) { - if (ifaces[i].netmask.s_addr != ~0 && - ifaces[i].ip.s_addr != loopback_ip.addr) { + if (ifaces[i].ip.s_addr != loopback_ip.addr) { add_interface(ifaces[i].ip, ifaces[i].netmask); } Modified: branches/SAMBA_4_0/source/libcli/resolve/bcast.c =================================================================== --- branches/SAMBA_4_0/source/libcli/resolve/bcast.c 2006-02-15 02:56:31 UTC (rev 13504) +++ branches/SAMBA_4_0/source/libcli/resolve/bcast.c 2006-02-15 04:18:11 UTC (rev 13505) @@ -31,19 +31,22 @@ int num_interfaces = iface_count(); const char **address_list; struct composite_context *c; - int i; + int i, count=0; address_list = talloc_array(NULL, const char *, num_interfaces+1); if (address_list == NULL) return NULL; for (i=0;i<num_interfaces;i++) { - address_list[i] = talloc_strdup(address_list, iface_n_bcast(i)); - if (address_list[i] == NULL) { + const char *bcast = iface_n_bcast(i); + if (bcast == NULL) continue; + address_list[count] = talloc_strdup(address_list, bcast); + if (address_list[count] == NULL) { talloc_free(address_list); return NULL; } + count++; } - address_list[i] = NULL; + address_list[count] = NULL; c = resolve_name_nbtlist_send(name, event_ctx, address_list, True, False); talloc_free(address_list); Modified: branches/SAMBA_4_0/source/nbt_server/interfaces.c =================================================================== --- branches/SAMBA_4_0/source/nbt_server/interfaces.c 2006-02-15 02:56:31 UTC (rev 13504) +++ branches/SAMBA_4_0/source/nbt_server/interfaces.c 2006-02-15 04:18:11 UTC (rev 13505) @@ -245,10 +245,16 @@ } for (i=0; i<num_interfaces; i++) { - const char *address = talloc_strdup(tmp_ctx, iface_n_ip(i)); - const char *bcast = talloc_strdup(tmp_ctx, iface_n_bcast(i)); - const char *netmask = talloc_strdup(tmp_ctx, iface_n_netmask(i)); + const char *bcast = iface_n_bcast(i); + const char *address, *netmask; + /* we can't assume every interface is broadcast capable */ + if (bcast == NULL) continue; + + address = talloc_strdup(tmp_ctx, iface_n_ip(i)); + bcast = talloc_strdup(tmp_ctx, bcast); + netmask = talloc_strdup(tmp_ctx, iface_n_netmask(i)); + status = nbtd_add_socket(nbtsrv, address, address, bcast, netmask); NT_STATUS_NOT_OK_RETURN(status); } Modified: branches/SAMBA_4_0/source/utils/nmblookup.c =================================================================== --- branches/SAMBA_4_0/source/utils/nmblookup.c 2006-02-15 02:56:31 UTC (rev 13504) +++ branches/SAMBA_4_0/source/utils/nmblookup.c 2006-02-15 04:18:11 UTC (rev 13505) @@ -236,6 +236,7 @@ int i, num_interfaces = iface_count(); for (i=0;i<num_interfaces;i++) { const char *bcast = iface_n_bcast(i); + if (bcast == NULL) continue; status = do_node_query(nbtsock, bcast, node_name, node_type, True); if (NT_STATUS_IS_OK(status)) break; }