unbound  0.1
Functions
msgencode.h File Reference

This file contains temporary data structures and routines to create compressed DNS messages. More...

Functions

int reply_info_answer_encode (struct query_info *qinf, struct reply_info *rep, uint16_t id, uint16_t qflags, ldns_buffer *dest, uint32_t timenow, int cached, struct regional *region, uint16_t udpsize, struct edns_data *edns, int dnssec, int secure)
 Generate answer from reply_info.
int reply_info_encode (struct query_info *qinfo, struct reply_info *rep, uint16_t id, uint16_t flags, ldns_buffer *buffer, uint32_t timenow, struct regional *region, uint16_t udpsize, int dnssec)
 Regenerate the wireformat from the stored msg reply.
void qinfo_query_encode (ldns_buffer *pkt, struct query_info *qinfo)
 Encode query packet.
uint16_t calc_edns_field_size (struct edns_data *edns)
 Estimate size of EDNS record in packet.
void attach_edns_record (ldns_buffer *pkt, struct edns_data *edns)
 Attach EDNS record to buffer.
void error_encode (ldns_buffer *pkt, int r, struct query_info *qinfo, uint16_t qid, uint16_t qflags, struct edns_data *edns)
 Encode an error.

Detailed Description

This file contains temporary data structures and routines to create compressed DNS messages.


Function Documentation

int reply_info_answer_encode ( struct query_info qinf,
struct reply_info rep,
uint16_t  id,
uint16_t  qflags,
ldns_buffer *  dest,
uint32_t  timenow,
int  cached,
struct regional region,
uint16_t  udpsize,
struct edns_data edns,
int  dnssec,
int  secure 
)

Generate answer from reply_info.

Parameters:
qinf,:query information that provides query section in packet.
rep,:reply to fill in.
id,:id word from the query.
qflags,:flags word from the query.
dest,:buffer to put message into; will truncate if it does not fit.
timenow,:time to subtract.
cached,:set true if a cached reply (so no AA bit). set false for the first reply.
region,:where to allocate temp variables (for compression).
udpsize,:size of the answer, 512, from EDNS, or 64k for TCP.
edns,:EDNS data included in the answer, NULL for none. or if edns_present = 0, it is not included.
dnssec,:if 0 DNSSEC records are omitted from the answer.
secure,:if 1, the AD bit is set in the reply.
Returns:
: 0 on error (server failure).

References attach_edns_record(), reply_info::authoritative, BIT_AA, BIT_AD, BIT_CD, BIT_QR, BIT_RD, calc_edns_field_size(), reply_info::flags, log_assert, log_err(), and reply_info_encode().

Referenced by answer_from_cache(), answer_norec_from_cache(), local_encode(), mesh_do_callback(), and mesh_send_reply().

int reply_info_encode ( struct query_info qinfo,
struct reply_info rep,
uint16_t  id,
uint16_t  flags,
ldns_buffer *  buffer,
uint32_t  timenow,
struct regional region,
uint16_t  udpsize,
int  dnssec 
)

Regenerate the wireformat from the stored msg reply.

If the buffer is too small then the message is truncated at a whole rrset and the TC bit set, or whole rrsets are left out of the additional and the TC bit is not set.

Parameters:
qinfo,:query info to store.
rep,:reply to store.
id,:id value to store, network order.
flags,:flags value to store, host order.
buffer,:buffer to store the packet into.
timenow,:time now, to adjust ttl values.
region,:to store temporary data in.
udpsize,:size of the answer, 512, from EDNS, or 64k for TCP.
dnssec,:if 0 DNSSEC records are omitted from the answer.
Returns:
: nonzero is success, or 0 on error: malloc failure (no log_err has been done).

References reply_info::an_numrrsets, reply_info::ar_numrrsets, insert_query(), insert_section(), reply_info::ns_numrrsets, reply_info::qdcount, query_info::qtype, RETVAL_OK, and RETVAL_TRUNC.

Referenced by log_dns_msg(), perf_encode(), reply_info_answer_encode(), and testpkt().

void qinfo_query_encode ( ldns_buffer *  pkt,
struct query_info qinfo 
)

Encode query packet.

Assumes the buffer is large enough.

Parameters:
pkt,:where to store the packet.
qinfo,:query info.

References log_assert, query_info::qclass, query_info::qname, query_info::qname_len, and query_info::qtype.

Referenced by qlist_parse_line(), and write_q().

uint16_t calc_edns_field_size ( struct edns_data edns)

Estimate size of EDNS record in packet.

EDNS record will be no larger.

Parameters:
edns,:edns data or NULL.
Returns:
octets to reserve for EDNS.

References edns_data::edns_present.

Referenced by error_encode(), reply_info_answer_encode(), and testpkt().

void attach_edns_record ( ldns_buffer *  pkt,
struct edns_data edns 
)

Attach EDNS record to buffer.

Buffer has complete packet. There must be enough room left for the EDNS record.

Parameters:
pkt,:packet added to.
edns,:if NULL or present=0, nothing is added to the packet.

References edns_data::bits, edns_data::edns_present, edns_data::edns_version, edns_data::ext_rcode, and edns_data::udp_size.

Referenced by chaos_replystr(), error_encode(), perf_encode(), qlist_parse_line(), reply_info_answer_encode(), serviced_encode(), testpkt(), worker_handle_request(), and write_q().

void error_encode ( ldns_buffer *  pkt,
int  r,
struct query_info qinfo,
uint16_t  qid,
uint16_t  qflags,
struct edns_data edns 
)

Encode an error.

With QR and RA set.

Parameters:
pkt,:where to store the packet.
r,:RCODE value to encode.
qinfo,:if not NULL, the query is included.
qid,:query ID to set in packet. network order.
qflags,:original query flags (to copy RD and CD bits). host order.
edns,:if not NULL, this is the query edns info, and an edns reply is attached. Only attached if EDNS record fits reply.

References attach_edns_record(), BIT_CD, BIT_QR, BIT_RA, BIT_RD, edns_data::bits, calc_edns_field_size(), EDNS_ADVERTISED_SIZE, EDNS_ADVERTISED_VERSION, EDNS_DO, edns_data::edns_version, edns_data::ext_rcode, query_info::qclass, query_info::qname, query_info::qname_len, query_info::qtype, and edns_data::udp_size.

Referenced by answer_from_cache(), answer_norec_from_cache(), libworker_bg_done_cb(), local_encode(), lz_zone_answer(), mesh_new_client(), mesh_send_reply(), and worker_handle_request().