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