I’m stuck on Stage (#BF2), where trying to send the DNS response.
Below the output of the packet, which fails the “Type” field check in the “Question” section:
[tester::#BF2] Querying `A` record for codecrafters.io.
[your_program] ======================================
[your_program] DNS REQUEST/RESPONSE DUMP
[your_program] ======================================
[your_program]
[your_program] [ HEADER FLAGS ]
[your_program] ID: 1234
[your_program] QR (Query/Response): 1 (Response)
[your_program] OPCODE: 0 (Query)
[your_program] RCODE: 0 (No Error (Success))
[your_program] AA (Authoritative): 0
[your_program] TC (Truncated): 0
[your_program] RD (Recursion Des.): 0
[your_program] RA (Recursion Av.): 1
[your_program] Z (Reserved): 0
[your_program] AD (Auth. Data): 0
[your_program] CD (Check Disabled): 0
[your_program] Questions (QDCOUNT): 1
[your_program] Answers (ANCOUNT): 0
[your_program] Authority (NSCOUNT): 0
[your_program] Additional (ARCOUNT): 0
[your_program]
[your_program] [ QUESTION ]
[your_program] QNAME
codecraftersio
[your_program] QTYPE A
[your_program] QCLASS INTERNET ADDRESS
[your_program] ---------------------------------
[tester::#BF2] Expected question type to be 1 got 0
[tester::#BF2] Test failed
here the code responsible to format a valid response:
void format_response(Tube *client) {
dns_h_flags flags = {0};
client->response.header.id = htons(1234);
flags.qr = DNS_RESPONSE;
flags.rd = 0;
flags.ra = 1;
flags.rcode = DNS_RCODE_NO_ERROR;
client->response.header.flags = htons(dns_pack_flags(flags));
client->response.header.qdcount = htons(1);
client->response.header.ancount = htons(0);
client->response.header.nscount = htons(0);
client->response.header.arcount = htons(0);
char formatted_qname[MAX_DOMAIN_SIZE];
size_t qname_len = dns_encode_qname("codecrafters.io", formatted_qname);
memcpy(client->response.question.qname, formatted_qname, qname_len);
client->response.question.qtype = htons(DNS_QTYPE_A);
client->response.question.qclass = htons(DNS_IN);
}
For the sake of completeness, below is the full format of the package definition:
#pragma pack(push, 1)
typedef struct dns_header_t {
uint16_t id;
uint16_t flags;
uint16_t qdcount;
uint16_t ancount;
uint16_t nscount;
uint16_t arcount;
} dns_header;
#pragma pack(pop)
#define MAX_DOMAIN_SIZE 255
typedef struct dns_question_t {
char qname[MAX_DOMAIN_SIZE];
uint16_t qtype;
uint16_t qclass;
} dns_question;
typedef struct dns_query_t {
dns_header header;
dns_question question;
} dns_query;
Thanks in advance for your help.

