You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.8 KiB
164 lines
4.8 KiB
8 months ago
|
/* -*- 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
|