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