Home | History | Annotate | Download | only in mDNSShared
      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