1#ifndef _NAMESERV_H_ 2#define _NAMESERV_H_ 3/* 4 Unix SMB/CIFS implementation. 5 NBT netbios header - version 2 6 Copyright (C) Andrew Tridgell 1994-1998 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 22*/ 23 24#define INFO_VERSION "INFO/version" 25#define INFO_COUNT "INFO/num_entries" 26#define INFO_ID_HIGH "INFO/id_high" 27#define INFO_ID_LOW "INFO/id_low" 28#define ENTRY_PREFIX "ENTRY/" 29 30#define PERMANENT_TTL 0 31 32/* NTAS uses 2, NT uses 1, WfWg uses 0 */ 33#define MAINTAIN_LIST 2 34#define ELECTION_VERSION 1 35 36#define MAX_DGRAM_SIZE (576) /* tcp/ip datagram limit is 576 bytes */ 37#define MIN_DGRAM_SIZE 12 38 39/********************************************************* 40 Types of reply packet. 41**********************************************************/ 42 43enum netbios_reply_type_code { NMB_QUERY, NMB_STATUS, NMB_REG, NMB_REG_REFRESH, 44 NMB_REL, NMB_WAIT_ACK, NMB_MULTIHOMED_REG, 45 WINS_REG, WINS_QUERY }; 46 47/* From rfc1002, 4.2.1.2 */ 48/* Question types. */ 49#define QUESTION_TYPE_NB_QUERY 0x20 50#define QUESTION_TYPE_NB_STATUS 0x21 51 52/* Question class */ 53#define QUESTION_CLASS_IN 0x1 54 55/* Opcode definitions */ 56#define NMB_NAME_QUERY_OPCODE 0x0 57#define NMB_NAME_REG_OPCODE 0x05 /* see rfc1002.txt 4.2.2,3,5,6,7,8 */ 58#define NMB_NAME_RELEASE_OPCODE 0x06 /* see rfc1002.txt 4.2.9,10,11 */ 59#define NMB_WACK_OPCODE 0x07 /* see rfc1002.txt 4.2.16 */ 60/* Ambiguity in rfc1002 about which of these is correct. */ 61/* WinNT uses 8 by default but can be made to use 9. */ 62#define NMB_NAME_REFRESH_OPCODE_8 0x08 /* see rfc1002.txt 4.2.4 */ 63#define NMB_NAME_REFRESH_OPCODE_9 0x09 /* see rfc1002.txt 4.2.4 */ 64#define NMB_NAME_MULTIHOMED_REG_OPCODE 0x0F /* Invented by Microsoft. */ 65 66/* XXXX what about all the other types?? 0x1, 0x2, 0x3, 0x4, 0x8? */ 67 68/* Resource record types. rfc1002 4.2.1.3 */ 69#define RR_TYPE_A 0x1 70#define RR_TYPE_NS 0x2 71#define RR_TYPE_NULL 0xA 72#define RR_TYPE_NB 0x20 73#define RR_TYPE_NBSTAT 0x21 74 75/* Resource record class. */ 76#define RR_CLASS_IN 0x1 77 78/* NetBIOS flags */ 79#define NB_GROUP 0x80 80#define NB_PERM 0x02 81#define NB_ACTIVE 0x04 82#define NB_CONFL 0x08 83#define NB_DEREG 0x10 84#define NB_BFLAG 0x00 /* Broadcast node type. */ 85#define NB_PFLAG 0x20 /* Point-to-point node type. */ 86#define NB_MFLAG 0x40 /* Mixed bcast & p-p node type. */ 87#define NB_HFLAG 0x60 /* Microsoft 'hybrid' node type. */ 88#define NB_NODETYPEMASK 0x60 89/* Mask applied to outgoing NetBIOS flags. */ 90#define NB_FLGMSK 0xE0 91 92/* The wins flags. Looks like the nbflags ! */ 93#define WINS_UNIQUE 0x00 /* Unique record */ 94#define WINS_NGROUP 0x01 /* Normal Group eg: 1B */ 95#define WINS_SGROUP 0x02 /* Special Group eg: 1C */ 96#define WINS_MHOMED 0x03 /* MultiHomed */ 97 98#define WINS_ACTIVE 0x00 /* active record */ 99#define WINS_RELEASED 0x04 /* released record */ 100#define WINS_TOMBSTONED 0x08 /* tombstoned record */ 101#define WINS_DELETED 0x0C /* deleted record */ 102 103#define WINS_STATE_MASK 0x0C 104 105#define WINS_LOCAL 0x00 /* local record */ 106#define WINS_REMOTE 0x10 /* remote record */ 107 108#define WINS_BNODE 0x00 /* Broadcast node */ 109#define WINS_PNODE 0x20 /* PtP node */ 110#define WINS_MNODE 0x40 /* Mixed node */ 111#define WINS_HNODE 0x60 /* Hybrid node */ 112 113#define WINS_NONSTATIC 0x00 /* dynamic record */ 114#define WINS_STATIC 0x80 /* static record */ 115 116#define WINS_STATE_ACTIVE(p) (((p)->data.wins_flags & WINS_STATE_MASK) == WINS_ACTIVE) 117 118 119/* NetBIOS flag identifier. */ 120#define NAME_GROUP(p) ((p)->data.nb_flags & NB_GROUP) 121#define NAME_BFLAG(p) (((p)->data.nb_flags & NB_NODETYPEMASK) == NB_BFLAG) 122#define NAME_PFLAG(p) (((p)->data.nb_flags & NB_NODETYPEMASK) == NB_PFLAG) 123#define NAME_MFLAG(p) (((p)->data.nb_flags & NB_NODETYPEMASK) == NB_MFLAG) 124#define NAME_HFLAG(p) (((p)->data.nb_flags & NB_NODETYPEMASK) == NB_HFLAG) 125 126/* Samba name state for a name in a namelist. */ 127#define NAME_IS_ACTIVE(p) ((p)->data.nb_flags & NB_ACTIVE) 128#define NAME_IN_CONFLICT(p) ((p)->data.nb_flags & NB_CONFL) 129#define NAME_IS_DEREGISTERING(p) ((p)->data.nb_flags & NB_DEREG) 130 131/* Error codes for NetBIOS requests. */ 132#define FMT_ERR 0x1 /* Packet format error. */ 133#define SRV_ERR 0x2 /* Internal server error. */ 134#define NAM_ERR 0x3 /* Name does not exist. */ 135#define IMP_ERR 0x4 /* Request not implemented. */ 136#define RFS_ERR 0x5 /* Request refused. */ 137#define ACT_ERR 0x6 /* Active error - name owned by another host. */ 138#define CFT_ERR 0x7 /* Name in conflict error. */ 139 140#define REFRESH_TIME (15*60) 141#define NAME_POLL_REFRESH_TIME (5*60) 142#define NAME_POLL_INTERVAL 15 143 144/* Workgroup state identifiers. */ 145#define AM_POTENTIAL_MASTER_BROWSER(work) ((work)->mst_state == MST_POTENTIAL) 146#define AM_LOCAL_MASTER_BROWSER(work) ((work)->mst_state == MST_BROWSER) 147#define AM_DOMAIN_MASTER_BROWSER(work) ((work)->dom_state == DOMAIN_MST) 148#define AM_DOMAIN_MEMBER(work) ((work)->log_state == LOGON_SRV) 149 150/* Microsoft browser NetBIOS name. */ 151#define MSBROWSE "\001\002__MSBROWSE__\002" 152 153/* Mail slots. */ 154#define BROWSE_MAILSLOT "\\MAILSLOT\\BROWSE" 155#define NET_LOGON_MAILSLOT "\\MAILSLOT\\NET\\NETLOGON" 156#define NT_LOGON_MAILSLOT "\\MAILSLOT\\NET\\NTLOGON" 157#define LANMAN_MAILSLOT "\\MAILSLOT\\LANMAN" 158 159/* Samba definitions for find_name_on_subnet(). */ 160#define FIND_ANY_NAME 0 161#define FIND_SELF_NAME 1 162 163/* 164 * The different name types that can be in namelists. 165 * 166 * SELF_NAME should only be on the broadcast and unicast subnets. 167 * LMHOSTS_NAME should only be in the remote_broadcast_subnet. 168 * REGISTER_NAME, DNS_NAME, DNSFAIL_NAME should only be in the wins_server_subnet. 169 * WINS_PROXY_NAME should only be on the broadcast subnets. 170 * PERMANENT_NAME can be on all subnets except remote_broadcast_subnet. 171 * 172 */ 173 174enum name_source {LMHOSTS_NAME, REGISTER_NAME, SELF_NAME, DNS_NAME, 175 DNSFAIL_NAME, PERMANENT_NAME, WINS_PROXY_NAME}; 176enum node_type {B_NODE=0, P_NODE=1, M_NODE=2, NBDD_NODE=3}; 177enum packet_type {NMB_PACKET, DGRAM_PACKET}; 178 179enum master_state { 180 MST_NONE, 181 MST_POTENTIAL, 182 MST_BACKUP, 183 MST_MSB, 184 MST_BROWSER, 185 MST_UNBECOMING_MASTER 186}; 187 188enum domain_state { 189 DOMAIN_NONE, 190 DOMAIN_WAIT, 191 DOMAIN_MST 192}; 193 194enum logon_state { 195 LOGON_NONE, 196 LOGON_WAIT, 197 LOGON_SRV 198}; 199 200struct subnet_record; 201 202struct nmb_data { 203 uint16 nb_flags; /* Netbios flags. */ 204 int num_ips; /* Number of ip entries. */ 205 struct in_addr *ip; /* The ip list for this name. */ 206 207 enum name_source source; /* Where the name came from. */ 208 209 time_t death_time; /* The time the record must be removed (do not remove if 0). */ 210 time_t refresh_time; /* The time the record should be refreshed. */ 211 212 SMB_BIG_UINT id; /* unique id */ 213 struct in_addr wins_ip; /* the adress of the wins server this record comes from */ 214 215 int wins_flags; /* similar to the netbios flags but different ! */ 216}; 217 218/* This structure represents an entry in a local netbios name list. */ 219struct name_record { 220 ubi_trNode node[1]; 221 struct subnet_record *subnet; 222 struct nmb_name name; /* The netbios name. */ 223 struct nmb_data data; /* The netbios data. */ 224}; 225 226/* Browser cache for synchronising browse lists. */ 227struct browse_cache_record { 228 ubi_dlNode node[1]; 229 unstring lmb_name; 230 unstring work_group; 231 struct in_addr ip; 232 time_t sync_time; 233 time_t death_time; /* The time the record must be removed. */ 234}; 235 236/* This is used to hold the list of servers in my domain, and is 237 contained within lists of domains. */ 238 239struct server_record { 240 struct server_record *next; 241 struct server_record *prev; 242 243 struct subnet_record *subnet; 244 245 struct server_info_struct serv; 246 time_t death_time; 247}; 248 249/* A workgroup structure. It contains a list of servers. */ 250struct work_record { 251 struct work_record *next; 252 struct work_record *prev; 253 254 struct subnet_record *subnet; 255 256 struct server_record *serverlist; 257 258 /* Stage of development from non-local-master up to local-master browser. */ 259 enum master_state mst_state; 260 261 /* Stage of development from non-domain-master to domain-master browser. */ 262 enum domain_state dom_state; 263 264 /* Stage of development from non-logon-server to logon server. */ 265 enum logon_state log_state; 266 267 /* Work group info. */ 268 unstring work_group; 269 int token; /* Used when communicating with backup browsers. */ 270 unstring local_master_browser_name; /* Current local master browser. */ 271 272 /* Announce info. */ 273 time_t lastannounce_time; 274 int announce_interval; 275 BOOL needannounce; 276 277 /* Timeout time for this workgroup. 0 means permanent. */ 278 time_t death_time; 279 280 /* Election info */ 281 BOOL RunningElection; 282 BOOL needelection; 283 int ElectionCount; 284 uint32 ElectionCriterion; 285 286 /* Domain master browser info. Used for efficient syncs. */ 287 struct nmb_name dmb_name; 288 struct in_addr dmb_addr; 289}; 290 291/* typedefs needed to define copy & free functions for userdata. */ 292struct userdata_struct; 293 294typedef struct userdata_struct * (*userdata_copy_fn)(struct userdata_struct *); 295typedef void (*userdata_free_fn)(struct userdata_struct *); 296 297/* Structure to define any userdata passed around. */ 298 299struct userdata_struct { 300 userdata_copy_fn copy_fn; 301 userdata_free_fn free_fn; 302 unsigned int userdata_len; 303 char data[16]; /* 16 is to ensure alignment/padding on all systems */ 304}; 305 306struct response_record; 307struct packet_struct; 308struct res_rec; 309 310/* typedef to define the function called when this response packet comes in. */ 311typedef void (*response_function)(struct subnet_record *, struct response_record *, 312 struct packet_struct *); 313 314/* typedef to define the function called when this response record times out. */ 315typedef void (*timeout_response_function)(struct subnet_record *, 316 struct response_record *); 317 318/* typedef to define the function called when the request that caused this 319 response record to be created is successful. */ 320typedef void (*success_function)(struct subnet_record *, struct userdata_struct *, ...); 321 322/* typedef to define the function called when the request that caused this 323 response record to be created is unsuccessful. */ 324typedef void (*fail_function)(struct subnet_record *, struct response_record *, ...); 325 326/* List of typedefs for success and fail functions of the different query 327 types. Used to catch any compile time prototype errors. */ 328 329typedef void (*register_name_success_function)( struct subnet_record *, 330 struct userdata_struct *, 331 struct nmb_name *, 332 uint16, 333 int, 334 struct in_addr); 335typedef void (*register_name_fail_function)( struct subnet_record *, 336 struct response_record *, 337 struct nmb_name *); 338 339typedef void (*release_name_success_function)( struct subnet_record *, 340 struct userdata_struct *, 341 struct nmb_name *, 342 struct in_addr); 343typedef void (*release_name_fail_function)( struct subnet_record *, 344 struct response_record *, 345 struct nmb_name *); 346 347typedef void (*refresh_name_success_function)( struct subnet_record *, 348 struct userdata_struct *, 349 struct nmb_name *, 350 uint16, 351 int, 352 struct in_addr); 353typedef void (*refresh_name_fail_function)( struct subnet_record *, 354 struct response_record *, 355 struct nmb_name *); 356 357typedef void (*query_name_success_function)( struct subnet_record *, 358 struct userdata_struct *, 359 struct nmb_name *, 360 struct in_addr, 361 struct res_rec *answers); 362 363typedef void (*query_name_fail_function)( struct subnet_record *, 364 struct response_record *, 365 struct nmb_name *, 366 int); 367 368typedef void (*node_status_success_function)( struct subnet_record *, 369 struct userdata_struct *, 370 struct res_rec *, 371 struct in_addr); 372typedef void (*node_status_fail_function)( struct subnet_record *, 373 struct response_record *); 374 375/* Initiated name queries are recorded in this list to track any responses. */ 376 377struct response_record { 378 struct response_record *next; 379 struct response_record *prev; 380 381 uint16 response_id; 382 383 /* Callbacks for packets received or not. */ 384 response_function resp_fn; 385 timeout_response_function timeout_fn; 386 387 /* Callbacks for the request succeeding or not. */ 388 success_function success_fn; 389 fail_function fail_fn; 390 391 struct packet_struct *packet; 392 393 struct userdata_struct *userdata; 394 395 int num_msgs; 396 397 time_t repeat_time; 398 time_t repeat_interval; 399 int repeat_count; 400 401 /* Recursion protection. */ 402 BOOL in_expiration_processing; 403}; 404 405/* A subnet structure. It contains a list of workgroups and netbios names. */ 406 407/* 408 B nodes will have their own, totally separate subnet record, with their 409 own netbios name set. These do NOT interact with other subnet records' 410 netbios names. 411*/ 412 413enum subnet_type { 414 NORMAL_SUBNET = 0, /* Subnet listed in interfaces list. */ 415 UNICAST_SUBNET = 1, /* Subnet for unicast packets. */ 416 REMOTE_BROADCAST_SUBNET = 2, /* Subnet for remote broadcasts. */ 417 WINS_SERVER_SUBNET = 3 /* Only created if we are a WINS server. */ 418}; 419 420struct subnet_record { 421 struct subnet_record *next; 422 struct subnet_record *prev; 423 424 char *subnet_name; /* For Debug identification. */ 425 enum subnet_type type; /* To catagorize the subnet. */ 426 427 struct work_record *workgrouplist; /* List of workgroups. */ 428 ubi_trRoot namelist[1]; /* List of netbios names. */ 429 struct response_record *responselist; /* List of responses expected. */ 430 431 BOOL namelist_changed; 432 BOOL work_changed; 433 434 struct in_addr bcast_ip; 435 struct in_addr mask_ip; 436 struct in_addr myip; 437 int nmb_sock; /* socket to listen for unicast 137. */ 438 int dgram_sock; /* socket to listen for unicast 138. */ 439}; 440 441/* A resource record. */ 442struct res_rec { 443 struct nmb_name rr_name; 444 int rr_type; 445 int rr_class; 446 int ttl; 447 int rdlength; 448 char rdata[MAX_DGRAM_SIZE]; 449}; 450 451/* Define these so we can pass info back to caller of name_query */ 452#define NM_FLAGS_RS 0x80 /* Response. Cheat */ 453#define NM_FLAGS_AA 0x40 /* Authoritative */ 454#define NM_FLAGS_TC 0x20 /* Truncated */ 455#define NM_FLAGS_RD 0x10 /* Recursion Desired */ 456#define NM_FLAGS_RA 0x08 /* Recursion Available */ 457#define NM_FLAGS_B 0x01 /* Broadcast */ 458 459/* An nmb packet. */ 460struct nmb_packet { 461 struct { 462 int name_trn_id; 463 int opcode; 464 BOOL response; 465 struct { 466 BOOL bcast; 467 BOOL recursion_available; 468 BOOL recursion_desired; 469 BOOL trunc; 470 BOOL authoritative; 471 } nm_flags; 472 int rcode; 473 int qdcount; 474 int ancount; 475 int nscount; 476 int arcount; 477 } header; 478 479 struct { 480 struct nmb_name question_name; 481 int question_type; 482 int question_class; 483 } question; 484 485 struct res_rec *answers; 486 struct res_rec *nsrecs; 487 struct res_rec *additional; 488}; 489 490/* msg_type field options - from rfc1002. */ 491 492#define DGRAM_UNIQUE 0x10 493#define DGRAM_GROUP 0x11 494#define DGRAM_BROADCAST 0x12 495#define DGRAM_ERROR 0x13 496#define DGRAM_QUERY_REQUEST 0x14 497#define DGRAM_POSITIVE_QUERY_RESPONSE 0x15 498#define DGRAM_NEGATIVE_QUERT_RESPONSE 0x16 499 500/* A datagram - this normally contains SMB data in the data[] array. */ 501 502struct dgram_packet { 503 struct { 504 int msg_type; 505 struct { 506 enum node_type node_type; 507 BOOL first; 508 BOOL more; 509 } flags; 510 int dgm_id; 511 struct in_addr source_ip; 512 int source_port; 513 int dgm_length; 514 int packet_offset; 515 } header; 516 struct nmb_name source_name; 517 struct nmb_name dest_name; 518 int datasize; 519 char data[MAX_DGRAM_SIZE]; 520}; 521 522/* Define a structure used to queue packets. This will be a linked 523 list of nmb packets. */ 524 525struct packet_struct 526{ 527 struct packet_struct *next; 528 struct packet_struct *prev; 529 BOOL locked; 530 struct in_addr ip; 531 int port; 532 int fd; 533 time_t timestamp; 534 enum packet_type packet_type; 535 union { 536 struct nmb_packet nmb; 537 struct dgram_packet dgram; 538 } packet; 539}; 540 541/* NETLOGON opcodes */ 542 543#define QUERYFORPDC 7 /* Query for PDC. */ 544#define SAM_UAS_CHANGE 10 /* Announce change to UAS or SAM. */ 545#define QUERYFORPDC_R 12 /* Response to Query for PDC. */ 546#define SAMLOGON 18 547#define SAMLOGON_R 19 548#define SAMLOGON_UNK_R 21 549#define SAMLOGON_AD_UNK_R 23 550#define SAMLOGON_AD_R 25 551 552/* Ids for netbios packet types. */ 553 554#define ANN_HostAnnouncement 1 555#define ANN_AnnouncementRequest 2 556#define ANN_Election 8 557#define ANN_GetBackupListReq 9 558#define ANN_GetBackupListResp 10 559#define ANN_BecomeBackup 11 560#define ANN_DomainAnnouncement 12 561#define ANN_MasterAnnouncement 13 562#define ANN_ResetBrowserState 14 563#define ANN_LocalMasterAnnouncement 15 564 565 566/* Broadcast packet announcement intervals, in minutes. */ 567 568/* Attempt to add domain logon and domain master names. */ 569#define CHECK_TIME_ADD_DOM_NAMES 5 570 571/* Search for master browsers of workgroups samba knows about, 572 except default. */ 573#define CHECK_TIME_MST_BROWSE 5 574 575/* Request backup browser announcements from other servers. */ 576#define CHECK_TIME_ANNOUNCE_BACKUP 15 577 578/* Request host announcements from other servers: min and max of interval. */ 579#define CHECK_TIME_MIN_HOST_ANNCE 3 580#define CHECK_TIME_MAX_HOST_ANNCE 12 581 582/* Announce as master to WINS server and any Primary Domain Controllers. */ 583#define CHECK_TIME_MST_ANNOUNCE 15 584 585/* Time between syncs from domain master browser to local master browsers. */ 586#define CHECK_TIME_DMB_TO_LMB_SYNC 15 587 588/* Do all remote announcements this often. */ 589#define REMOTE_ANNOUNCE_INTERVAL 180 590 591/* what is the maximum period between name refreshes. Note that this only 592 affects non-permanent self names (in seconds) */ 593#define MAX_REFRESH_TIME (60*20) 594 595/* The Extinction interval: 4 days, time a node will stay in released state */ 596#define EXTINCTION_INTERVAL (4*24*60*60) 597 598/* The Extinction time-out: 1 day, time a node will stay in deleted state */ 599#define EXTINCTION_TIMEOUT (24*60*60) 600 601/* Macro's to enumerate subnets either with or without 602 the UNICAST subnet. */ 603 604extern struct subnet_record *subnetlist; 605extern struct subnet_record *unicast_subnet; 606extern struct subnet_record *wins_server_subnet; 607extern struct subnet_record *remote_broadcast_subnet; 608 609#define FIRST_SUBNET subnetlist 610#define NEXT_SUBNET_EXCLUDING_UNICAST(x) ((x)->next) 611#define NEXT_SUBNET_INCLUDING_UNICAST(x) (get_next_subnet_maybe_unicast((x))) 612 613/* wins replication record used between nmbd and wrepld */ 614typedef struct _WINS_RECORD { 615 char name[17]; 616 char type; 617 int nb_flags; 618 int wins_flags; 619 SMB_BIG_UINT id; 620 int num_ips; 621 struct in_addr ip[25]; 622 struct in_addr wins_ip; 623} WINS_RECORD; 624 625/* To be removed. */ 626enum state_type { TEST }; 627#endif /* _NAMESERV_H_ */ 628