home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / samba-1.9.18p7.tar.gz / samba-1.9.18p7.tar / samba-1.9.18p7 / source / nameserv.h < prev    next >
C/C++ Source or Header  |  1998-01-26  |  18KB  |  569 lines

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