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(), outnet_serviced_query(), perf_encode(), qlist_parse_line(), reply_info_answer_encode(), serviced_encode(), testpkt(), and worker_handle_request().

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().


Generated on Mon Nov 16 11:49:45 2009 for unbound by  doxygen 1.5.9