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