2 Unix SMB/Netbios implementation.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1998
6 Copyright (C) Luke Kenneth Casson Leighton 1994-1998
7 Copyright (C) Jeremy Allison 1994-1998
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern char **my_netbios_names;
28 extern fstring global_myworkgroup;
30 extern uint16 samba_nb_type; /* Samba's NetBIOS type. */
32 /****************************************************************************
33 Fail funtion when registering my netbios names.
34 **************************************************************************/
36 static void my_name_register_failed(struct subnet_record *subrec,
37 struct response_record *rrec, struct nmb_name *nmbname)
39 DEBUG(0,("my_name_register_failed: Failed to register my name %s on subnet %s.\n",
40 nmb_namestr(nmbname), subrec->subnet_name));
44 /****************************************************************************
45 Add my workgroup and my given names to one subnet
46 Also add the magic Samba names.
47 **************************************************************************/
48 void register_my_workgroup_one_subnet(struct subnet_record *subrec)
52 struct work_record *work;
54 /* Create the workgroup on the subnet. */
55 if((work = create_workgroup_on_subnet(subrec, global_myworkgroup,
56 PERMANENT_TTL)) == NULL) {
57 DEBUG(0,("register_my_workgroup_and_names: Failed to create my workgroup %s on subnet %s. \
58 Exiting.\n", global_myworkgroup, subrec->subnet_name));
62 /* Each subnet entry, except for the wins_server_subnet has
63 the magic Samba names. */
64 add_samba_names_to_subnet(subrec);
66 /* Register all our names including aliases. */
67 for (i=0; my_netbios_names[i]; i++) {
68 register_name(subrec, my_netbios_names[i],0x20,samba_nb_type,
70 my_name_register_failed, NULL);
71 register_name(subrec, my_netbios_names[i],0x03,samba_nb_type,
73 my_name_register_failed, NULL);
74 register_name(subrec, my_netbios_names[i],0x00,samba_nb_type,
76 my_name_register_failed, NULL);
79 /* Initiate election processing, register the workgroup names etc. */
80 initiate_myworkgroup_startup(subrec, work);
84 /****************************************************************************
85 Add my workgroup and my given names to the subnet lists.
86 Also add the magic Samba names.
87 **************************************************************************/
89 BOOL register_my_workgroup_and_names(void)
91 struct subnet_record *subrec;
94 for(subrec = FIRST_SUBNET;
96 subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
98 register_my_workgroup_one_subnet(subrec);
101 /* We still need to add the magic Samba
102 names and the netbios names to the unicast subnet directly. This is
103 to allow unicast node status requests and queries to still work
104 in a broadcast only environment. */
106 add_samba_names_to_subnet(unicast_subnet);
108 for (i=0; my_netbios_names[i]; i++)
110 for(subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
113 * Ensure all the IP addresses are added if we are multihomed.
115 struct nmb_name nmbname;
117 make_nmb_name(&nmbname, my_netbios_names[i],0x20);
118 insert_permanent_name_into_unicast(subrec, &nmbname, samba_nb_type);
120 make_nmb_name(&nmbname, my_netbios_names[i],0x3);
121 insert_permanent_name_into_unicast(subrec, &nmbname, samba_nb_type);
123 make_nmb_name(&nmbname, my_netbios_names[i],0x0);
124 insert_permanent_name_into_unicast(subrec, &nmbname, samba_nb_type);
129 * Add the WORKGROUP<0> and WORKGROUP<1e> group names to the unicast subnet
130 * also for the same reasons.
133 for(subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
136 * Ensure all the IP addresses are added if we are multihomed.
138 struct nmb_name nmbname;
140 make_nmb_name(&nmbname, global_myworkgroup, 0x0);
141 insert_permanent_name_into_unicast(subrec, &nmbname, samba_nb_type|NB_GROUP);
143 make_nmb_name(&nmbname, global_myworkgroup, 0x1e);
144 insert_permanent_name_into_unicast(subrec, &nmbname, samba_nb_type|NB_GROUP);
148 * We need to add the Samba names to the remote broadcast subnet,
149 * as NT 4.x does directed broadcast requests to the *<0x0> name.
151 add_samba_names_to_subnet(remote_broadcast_subnet);
156 /****************************************************************************
157 Remove all the names we registered.
158 **************************************************************************/
160 void release_my_names(void)
162 #if 0 /*JRR: do WINS server only, otherwise clients ignore us when we come back up*/
163 struct subnet_record *subrec;
165 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
167 struct subnet_record *subrec = unicast_subnet;
170 struct name_record *namerec, *nextnamerec;
172 for (namerec = (struct name_record *)ubi_trFirst( subrec->namelist );
174 namerec = nextnamerec)
176 nextnamerec = (struct name_record *)ubi_trNext( namerec );
177 if( (namerec->data.source == SELF_NAME)
178 && !NAME_IS_DEREGISTERING(namerec) )
179 release_name( subrec, namerec, standard_success_release,
185 /*******************************************************************
186 Refresh our registered names.
187 ******************************************************************/
189 void refresh_my_names(time_t t)
191 struct subnet_record *subrec;
193 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec))
195 struct name_record *namerec;
197 /* B nodes don't send out name refresh requests, see RFC 1001, 15.5.1 */
198 if (subrec != unicast_subnet)
201 for( namerec = (struct name_record *)ubi_trFirst( subrec->namelist );
203 namerec = (struct name_record *)ubi_trNext( namerec ) )
205 /* Each SELF name has an individual time to be refreshed. */
206 if( (namerec->data.source == SELF_NAME)
207 && (namerec->data.refresh_time < t)
208 && ( namerec->data.death_time != PERMANENT_TTL) )
210 /* We cheat here and pretend the refresh is going to be
211 successful & update the refresh times. This stops
212 multiple refresh calls being done. We actually
213 deal with refresh failure in the fail_fn.
215 if( !is_refresh_already_queued( subrec, namerec) )
216 refresh_name( subrec, namerec, NULL, NULL, NULL );
217 namerec->data.death_time = t + lp_max_ttl();
218 namerec->data.refresh_time = t + MIN(lp_max_ttl(), MAX_REFRESH_TIME);