| /* -*- 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 |