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