]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSShared/dnsextd.h
mDNSResponder-1310.80.1.tar.gz
[apple/mdnsresponder.git] / mDNSShared / dnsextd.h
1 /* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2006-2018 Apple 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