/* -*- Mode: C; tab-width: 4 -*-
*
* Copyright (c) 2006 Apple Computer, Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _dnsextd_h
#define _dnsextd_h
#include <mDNSEmbeddedAPI.h>
#include <DNSCommon.h>
#include <GenLinkedList.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define LLQ_TABLESIZE 1024 // !!!KRS make this dynamically growable
typedef enum DNSZoneSpecType
{
kDNSZonePublic,
kDNSZonePrivate
} DNSZoneSpecType;
typedef struct DNSZone
{
domainname name;
DNSZoneSpecType type;
DomainAuthInfo * updateKeys; // linked list of keys for signing deletion updates
DomainAuthInfo * queryKeys; // linked list of keys for queries
struct DNSZone * next;
} DNSZone;
typedef struct
{
struct sockaddr_in src;
size_t len;
DNSZone * zone;
mDNSBool isZonePublic;
DNSMessage msg;
// Note: extra storage for oversized (TCP) messages goes here
} PktMsg;
// lease table entry
typedef struct RRTableElem
{
struct RRTableElem *next;
struct sockaddr_in cli; // client's source address
long expire; // expiration time, in seconds since epoch
domainname zone; // from zone field of update message
domainname name; // name of the record
CacheRecord rr; // last field in struct allows for allocation of oversized RRs
} RRTableElem;
typedef enum
{
RequestReceived = 0,
ChallengeSent = 1,
Established = 2
} LLQState;
typedef struct AnswerListElem
{
struct AnswerListElem *next;
domainname name;
mDNSu16 type;
CacheRecord *KnownAnswers; // All valid answers delivered to client
CacheRecord *EventList; // New answers (adds/removes) to be sent to client
int refcount;
mDNSBool UseTCP; // Use TCP if UDP would cause truncation
pthread_t tid; // Allow parallel list updates
} AnswerListElem;
// llq table entry
typedef struct LLQEntry
{
struct LLQEntry *next;
struct sockaddr_in cli; // clien'ts source address
domainname qname;
mDNSu16 qtype;
mDNSOpaque64 id;
LLQState state;
mDNSu32 lease; // original lease, in seconds
mDNSs32 expire; // expiration, absolute, in seconds since epoch
AnswerListElem *AnswerList;
} LLQEntry;
typedef void (*EventCallback)( void * context );
typedef struct EventSource
{
EventCallback callback;
void * context;
TCPSocket * sock;
int fd;
mDNSBool markedForDeletion;
struct EventSource * next;
} EventSource;
// daemon-wide information
typedef struct
{
// server variables - read only after initialization (no locking)
struct sockaddr_in addr; // the address we will bind to
struct sockaddr_in llq_addr; // the address we will receive llq requests on.
struct sockaddr_in ns_addr; // the real ns server address
int tcpsd; // listening TCP socket for dns requests
int udpsd; // listening UDP socket for dns requests
int tlssd; // listening TCP socket for private browsing
int llq_tcpsd; // listening TCP socket for llq service
int llq_udpsd; // listening UDP socket for llq service
DNameListElem * public_names; // list of public SRV names
DNSZone * zones;
// daemon variables - read only after initialization (no locking)
mDNSIPPort private_port; // listening port for private messages
mDNSIPPort llq_port; // listening port for llq
// lease table variables (locked via mutex after initialization)
RRTableElem **table; // hashtable for records with leases
pthread_mutex_t tablelock; // mutex for lease table
mDNSs32 nbuckets; // buckets allocated
mDNSs32 nelems; // elements in table
// LLQ table variables
LLQEntry *LLQTable[LLQ_TABLESIZE]; // !!!KRS change this and RRTable to use a common data structure
AnswerListElem *AnswerTable[LLQ_TABLESIZE];
int AnswerTableCount;
int LLQEventNotifySock; // Unix domain socket pair - update handling thread writes to EventNotifySock, which wakes
int LLQEventListenSock; // the main thread listening on EventListenSock, indicating that the zone has changed
GenLinkedList eventSources; // linked list of EventSource's
} DaemonInfo;
int
ParseConfig
(
DaemonInfo * d,
const char * file
);
#endif