dnssector 0.2.14

A very fast library to parse, validate, create and mangle DNS packets
Documentation
#ifndef C_HOOK_H
#define C_HOOK_H

#include <ctype.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>

#define DNSSECTOR_ABI_VERSION 0x2
#define EDGEDNS_ABI_VERSION 0x2

#define DNS_MAX_HOSTNAME_LEN 255
#define DNS_MAX_PACKET_SIZE 8192

typedef struct ParsedPacket ParsedPacket;
typedef struct SessionState SessionState;
typedef struct CErr         CErr;

typedef struct EdgeDNSFnTable {
    const char *(*error_description)(const CErr *err);
    int (*set_service_id)(SessionState *session_state, const CErr **err,
                          const char *session_id, size_t session_id_len);
    int (*env_insert_str)(SessionState *session_state, const CErr **err,
                          const char *key, size_t key_len, const char *val,
                          size_t val_len);
    int (*env_insert_i64)(SessionState *session_state, const CErr **err,
                          const char *key, size_t key_len, int64_t i64);
    int (*env_insert_bool)(SessionState *session_state, const CErr **err,
                           const char *key, size_t key_len, bool b);
    int (*env_get_str)(const SessionState *session_state, const CErr **err,
                       const char *key, size_t key_len, char *val_p,
                       size_t *val_len_p, size_t val_max_len);
    int (*env_get_i64)(const SessionState *session_state, const CErr **err,
                       const char *key, size_t key_len, int64_t *i64);
    int (*env_get_bool)(const SessionState *session_state, const CErr **err,
                        const char *key, size_t key_len, bool *b);
    int (*register_backend)(const SessionState *session_state, const CErr **err,
                            const char *key, size_t key_len,
                            const struct sockaddr_storage *ss, size_t ss_len);
    int (*add_backend_to_director)(const SessionState *session_state, const CErr **err,
                                   const char *backend_key, size_t backend_key_len);
    uint64_t abi_version;
} EdgeDNSFnTable;

typedef struct FnTable {
    const char *(*error_description)(const CErr *err);
    uint32_t (*flags)(const ParsedPacket *parsed_packet);
    void (*set_flags)(ParsedPacket *parsed_packet, uint32_t flags);
    uint8_t (*rcode)(const ParsedPacket *parsed_packet);
    void (*set_rcode)(ParsedPacket *parsed_packet, uint8_t rcode);
    uint8_t (*opcode)(const ParsedPacket *parsed_packet);
    void (*set_opcode)(ParsedPacket *parsed_packet, uint8_t opcode);
    void (*iter_answer)(ParsedPacket *parsed_packet,
                        bool (*cb)(void *ctx, void *it), void *ctx);
    void (*iter_nameservers)(ParsedPacket *parsed_packet,
                             bool (*cb)(void *ctx, void *it), void *ctx);
    void (*iter_additional)(ParsedPacket *parsed_packet,
                            bool (*cb)(void *ctx, void *it), void *ctx);
    void (*iter_edns)(ParsedPacket *parsed_packet,
                      bool (*cb)(void *ctx, void *it), void *ctx);
    void (*name)(void *it, char name[DNS_MAX_HOSTNAME_LEN + 1]);
    uint16_t (*rr_type)(void *it);
    uint16_t (*rr_class)(void *it);
    uint32_t (*rr_ttl)(void *it);
    void (*set_rr_ttl)(void *it, uint32_t ttl);
    void (*rr_ip)(void *it, uint8_t *addr, size_t *addr_len);
    void (*set_rr_ip)(void *it, const uint8_t *addr, size_t addr_len);
    int (*raw_name_from_str)(uint8_t raw_name[DNS_MAX_HOSTNAME_LEN + 1],
                             size_t *raw_name_len, const CErr **err,
                             const char *name, size_t name_len);
    int (*set_raw_name)(void *it, const CErr **err, const uint8_t *name,
                        size_t name_len);
    int (*set_name)(void *it, const CErr **err, const char *name,
                    size_t name_len, const uint8_t *default_zone_raw,
                    size_t default_zone_raw_len);
    int (*delete_rr)(void *it, const CErr **err);
    int (*add_to_question)(ParsedPacket *parsed_packet, const CErr **err,
                           const char *rr_str);
    int (*add_to_answer)(ParsedPacket *parsed_packet, const CErr **err,
                         const char *rr_str);
    int (*add_to_nameservers)(ParsedPacket *parsed_packet, const CErr **err,
                              const char *rr_str);
    int (*add_to_additional)(ParsedPacket *parsed_packet, const CErr **err,
                             const char *rr_str);
    int (*raw_packet)(const ParsedPacket *parsed_packet,
                      uint8_t             raw_packet[DNS_MAX_PACKET_SIZE],
                      size_t *raw_packet_len, size_t max_len);
    int (*question)(ParsedPacket *parsed_packet,
                    char name[DNS_MAX_HOSTNAME_LEN + 1], uint16_t *rr_type);
    int (*rename_with_raw_names)(const ParsedPacket *parsed_packet,
                                 const CErr **       err,
                                 const uint8_t       raw_target_name,
                                 size_t              raw_target_name_len,
                                 const uint8_t       raw_source_name,
                                 const size_t        raw_source_name_len,
                                 bool                match_suffix);
    uint64_t abi_version;
} FnTable;

typedef enum Action {
        ACTION_DELIVER = 1,
        ACTION_DELIVER_STALE = 2,
        ACTION_DONE = 3,
        ACTION_ERROR = 4,
        ACTION_FETCH = 5,
        ACTION_HASH = 6,
        ACTION_HIT_FOR_PASS = 7,
        ACTION_LOOKUP = 8,
        ACTION_PASS = 9,
        ACTION_PIPE = 10,
        ACTION_RESTART = 11,
        ACTION_PURGE = 12,
        ACTION_SYNTH = 13,
        ACTION_DROP = 14,
        ACTION_FAIL = 15,
        ACTION_MISS = 16,
        ACTION_DEFAULT = 17
} Action;

Action hook_recv(const EdgeDNSFnTable *edgedns_fn_table,
                 SessionState *session_state, const FnTable *fn_table,
                 ParsedPacket *parsed_packet);
Action hook_deliver(const EdgeDNSFnTable *edgedns_fn_table,
                    SessionState *session_state, const FnTable *fn_table,
                    ParsedPacket *parsed_packet);
Action hook_hit(const EdgeDNSFnTable *edgedns_fn_table,
                SessionState *session_state, const FnTable *fn_table,
                ParsedPacket *parsed_packet);
Action hook_miss(const EdgeDNSFnTable *edgedns_fn_table,
                 SessionState *session_state, const FnTable *fn_table,
                 ParsedPacket *parsed_packet);

#endif