• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* -*- Mode: C; tab-width: 4 -*-
2   *
3   * Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
4   *
5   * Licensed under the Apache License, Version 2.0 (the "License");
6   * you may not use this file except in compliance with the License.
7   * You may obtain a copy of the License at
8   *
9   *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  
19  #ifndef _dnsextd_h
20  #define _dnsextd_h
21  
22  
23  #include <mDNSEmbeddedAPI.h>
24  #include <DNSCommon.h>
25  #include <GenLinkedList.h>
26  #include <sys/types.h>
27  #include <sys/socket.h>
28  #include <netinet/in.h>
29  
30  
31  #define LLQ_TABLESIZE	1024	// !!!KRS make this dynamically growable
32  
33  
34  typedef enum DNSZoneSpecType
35  {
36  	kDNSZonePublic,
37  	kDNSZonePrivate
38  } DNSZoneSpecType;
39  
40  
41  typedef struct DNSZone
42  {
43  	domainname				name;
44  	DNSZoneSpecType			type;
45  	DomainAuthInfo		*	updateKeys;	// linked list of keys for signing deletion updates
46  	DomainAuthInfo		*	queryKeys;	// linked list of keys for queries
47  	struct DNSZone		*	next;
48  } DNSZone;
49  
50  
51  typedef struct
52  	{
53      struct sockaddr_in src;
54      size_t len;
55  	DNSZone * zone;
56  	mDNSBool   isZonePublic;
57      DNSMessage msg;
58      // Note: extra storage for oversized (TCP) messages goes here
59  	} PktMsg;
60  
61  // lease table entry
62  typedef struct RRTableElem
63  	{
64      struct RRTableElem *next;
65      struct sockaddr_in cli;   // client's source address
66      long expire;              // expiration time, in seconds since epoch
67      domainname zone;          // from zone field of update message
68      domainname name;          // name of the record
69      CacheRecord rr;           // last field in struct allows for allocation of oversized RRs
70  	} RRTableElem;
71  
72  typedef enum
73  	{
74  	RequestReceived = 0,
75  	ChallengeSent   = 1,
76  	Established     = 2
77  	} LLQState;
78  
79  typedef struct AnswerListElem
80  	{
81      struct AnswerListElem *next;
82      domainname name;
83      mDNSu16 type;
84      CacheRecord *KnownAnswers;  // All valid answers delivered to client
85      CacheRecord *EventList;     // New answers (adds/removes) to be sent to client
86      int refcount;
87      mDNSBool UseTCP;            // Use TCP if UDP would cause truncation
88      pthread_t tid;              // Allow parallel list updates
89  	} AnswerListElem;
90  
91  // llq table entry
92  typedef struct LLQEntry
93  	{
94      struct LLQEntry *next;
95      struct sockaddr_in cli;   // clien'ts source address
96      domainname qname;
97      mDNSu16 qtype;
98      mDNSOpaque64 id;
99      LLQState state;
100      mDNSu32 lease;            // original lease, in seconds
101      mDNSs32 expire;           // expiration, absolute, in seconds since epoch
102      AnswerListElem *AnswerList;
103  	} LLQEntry;
104  
105  
106  typedef	void (*EventCallback)( void * context );
107  
108  typedef struct EventSource
109  	{
110  	EventCallback			callback;
111  	void				*	context;
112  	TCPSocket *			sock;
113  	int						fd;
114  	mDNSBool				markedForDeletion;
115  	struct  EventSource	*	next;
116  	} EventSource;
117  
118  
119  // daemon-wide information
120  typedef struct
121  	{
122      // server variables - read only after initialization (no locking)
123  	struct sockaddr_in	addr;			// the address we will bind to
124  	struct sockaddr_in	llq_addr;		// the address we will receive llq requests on.
125      struct sockaddr_in	ns_addr;		// the real ns server address
126  	int					tcpsd;			// listening TCP socket for dns requests
127  	int					udpsd;			// listening UDP socket for dns requests
128  	int					tlssd;			// listening TCP socket for private browsing
129      int					llq_tcpsd;		// listening TCP socket for llq service
130      int					llq_udpsd;		// listening UDP socket for llq service
131  	DNameListElem	*	public_names;	// list of public SRV names
132  	DNSZone			*	zones;
133  
134      // daemon variables - read only after initialization (no locking)
135      mDNSIPPort private_port;           // listening port for private messages
136      mDNSIPPort llq_port;           // listening port for llq
137  
138      // lease table variables (locked via mutex after initialization)
139      RRTableElem **table;       // hashtable for records with leases
140      pthread_mutex_t tablelock; // mutex for lease table
141      mDNSs32 nbuckets;          // buckets allocated
142      mDNSs32 nelems;            // elements in table
143  
144      // LLQ table variables
145      LLQEntry *LLQTable[LLQ_TABLESIZE];  // !!!KRS change this and RRTable to use a common data structure
146      AnswerListElem *AnswerTable[LLQ_TABLESIZE];
147      int AnswerTableCount;
148      int LLQEventNotifySock;          // Unix domain socket pair - update handling thread writes to EventNotifySock, which wakes
149      int LLQEventListenSock;          // the main thread listening on EventListenSock, indicating that the zone has changed
150  
151  	GenLinkedList	eventSources;	// linked list of EventSource's
152  	} DaemonInfo;
153  
154  
155  int
156  ParseConfig
157  	(
158  	DaemonInfo	*	d,
159  	const char	*	file
160  	);
161  
162  
163  #endif
164