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