Skip to content

Commit

Permalink
minimrsimple state machine base
Browse files Browse the repository at this point in the history
  • Loading branch information
tschiemer committed Jul 6, 2020
1 parent d3c0592 commit 7d04f64
Show file tree
Hide file tree
Showing 4 changed files with 1,019 additions and 56 deletions.
69 changes: 52 additions & 17 deletions minimr.c
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,7 @@ int32_t minimr_make_msg(

MINIMR_DEBUGF("added %d queries rr\n", nqueries);

uint16_t final_nanswers = 0; // needed because there might be NULL entries

// add all normal answers RRs
for(uint16_t i = 0; i < nanswers; i++){
Expand All @@ -669,17 +670,19 @@ int32_t minimr_make_msg(

uint16_t nrr = 0;

uint8_t res = answerrr[i]->handler(minimr_rr_fun_query_get_rr, answerrr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimr_rr_fun_get_rr, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = answerrr[i]->MINIMR_RR_FUN_GET_RR(answerrr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
}

// don't use nrr
final_nanswers += nrr;
}

MINIMR_DEBUGF("added %d known answer rr\n", nanswers);

uint16_t final_nauthrr = 0;

// add all normal answers RRs
for(uint16_t i = 0; i < nauthrr; i++){
Expand All @@ -690,17 +693,18 @@ int32_t minimr_make_msg(

uint16_t nrr = 0;

uint8_t res = authrr[i]->handler(minimr_rr_fun_query_get_rr, authrr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
uint8_t res = authrr[i]->MINIMR_RR_FUN_GET_RR(authrr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
}

// don't use nrr
final_nauthrr += nrr;
}

MINIMR_DEBUGF("added %d extra rr\n", nauthrr);

uint16_t final_nextrarr = 0;

// add all normal answers RRs
for(uint16_t i = 0; i < nextrarr; i++){
Expand All @@ -711,13 +715,13 @@ int32_t minimr_make_msg(

uint16_t nrr = 0;

uint8_t res = extrarr[i]->handler(minimr_rr_fun_query_get_extra_rrs, extrarr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
uint8_t res = extrarr[i]->MINIMR_RR_FUN_GET_RR(extrarr[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
}

// don't use nrr
final_nextrarr += nrr;
}

MINIMR_DEBUGF("added %d extra rr\n", nextrarr);
Expand All @@ -737,9 +741,9 @@ int32_t minimr_make_msg(
outhdr.flags[1] = flag2;

outhdr.nqueries = nqueries;
outhdr.nanswers = nanswers;
outhdr.nauthrr = nauthrr;
outhdr.nextrarr = nextrarr;
outhdr.nanswers = final_nanswers;
outhdr.nauthrr = final_nauthrr;
outhdr.nextrarr = final_nextrarr;

// add header
minimr_dns_hdr_write(outmsg, &outhdr);
Expand Down Expand Up @@ -851,7 +855,8 @@ int32_t minimr_announce_msg(

uint16_t nrr = 0;

uint8_t res = records[i]->handler(minimr_rr_fun_announce_get_rr, records[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimr_rr_fun_announce_get_*, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = records[i]->MINIMR_RR_FUN_ANNOUNCE_GET_RR( records[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
Expand All @@ -873,7 +878,8 @@ int32_t minimr_announce_msg(

uint16_t nrr = 0;

uint8_t res = records[i]->handler(minimr_rr_fun_announce_get_extra_rrs, records[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimr_rr_fun_announce_get_*, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = records[i]->MINIMR_RR_FUN_ANNOUNCE_GET_EXTRA_RRS( records[i], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
Expand Down Expand Up @@ -1089,7 +1095,8 @@ int32_t minimr_query_response_msg(
// so it's a match and we have to check wether it's up to date
struct minimr_rr * rr = records[qstats[iq].match_i];

if (rr->handler(minimr_rr_fun_query_respond_to, rr, &rstat, msg, user_data) == MINIMR_DO_NOT_RESPOND){
//minimr_rr_fun_handler(minimr_rr_fun_query_respond_to, struct minimr_rr * rr, void * user_data)
if (rr->MINIMR_RR_FUN_QUERY_RESPOND_TO(rr, user_data) == MINIMR_DO_NOT_RESPOND){
qstats[iq].relevant = 0;
remaining_nq--;
} else if ((qstats[iq].unicast_class & MINIMR_DNS_QUNICAST) == MINIMR_DNS_QUNICAST) {
Expand Down Expand Up @@ -1144,7 +1151,8 @@ int32_t minimr_query_response_msg(

uint16_t nrr = 0;

uint8_t res = rr->handler(minimr_rr_fun_query_get_rr, rr, outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimquery_get_*, struct minimr_rr * rr, struct minimr_query_stat * qstat, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = rr->MINIMR_RR_FUN_QUERY_GET_RR(rr, &qstats[iq], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
Expand All @@ -1168,7 +1176,8 @@ int32_t minimr_query_response_msg(

uint16_t nrr = 0;

uint8_t res = rr->handler(minimr_rr_fun_query_get_authority_rrs, rr, outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimquery_get_*, struct minimr_rr * rr, struct minimr_query_stat * qstat, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = rr->MINIMR_RR_FUN_QUERY_GET_AUTHRR(rr, &qstats[iq], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
Expand All @@ -1192,7 +1201,8 @@ int32_t minimr_query_response_msg(

uint16_t nrr = 0;

uint8_t res = rr->handler(minimr_rr_fun_query_get_extra_rrs, rr, outmsg, &outlen, outmsgmaxlen, &nrr, user_data);
//minimr_rr_fun_handler( minimquery_get_*, struct minimr_rr * rr, struct minimr_query_stat * qstat, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
uint8_t res = rr->MINIMR_RR_FUN_QUERY_GET_EXTRARR(rr, &qstats[iq], outmsg, &outlen, outmsgmaxlen, &nrr, user_data);

if (res != MINIMR_OK){
return MINIMR_DNS_HDR2_RCODE_SERVAIL;
Expand Down Expand Up @@ -1223,5 +1233,30 @@ int32_t minimr_query_response_msg(

*outmsglen = outlen;

return MINIMR_DNS_HDR2_RCODE_NOERROR;
}
return MINIMR_OK;
}


#if MINIMR_RR_COUNT > 0 && MINIMR_SIMPLE_INTERFACE_ENABLED == 0

int32_t minimr_default_query_response_msg(
uint8_t *msg, uint16_t msglen,
struct minimr_rr **records, uint16_t nrecords,
uint8_t *outmsg, uint16_t *outmsglen, uint16_t outmsgmaxlen,
uint8_t *unicast_requested,
void * user_data
)
{
struct minimr_query_stat qstats[MINIMR_RR_COUNT];

return minimr_query_response_msg(
msg, msglen,
qstats, MINIMR_RR_COUNT,
records, nrecords,
outmsg, outmsglen, outmsgmaxlen,
unicast_requested,
user_data
);
}

#endif
128 changes: 89 additions & 39 deletions minimr.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ extern "C" {
#define MINIMR_COMPRESSION_MAX_JUMPS 8
#endif

#ifndef MINIMR_DEFAULT_TTL
#define MINIMR_DEFAULT_TTL 120
#endif

/*************** minimr function return values **************/

#define MINIMR_IGNORE 0xff
Expand Down Expand Up @@ -486,29 +490,39 @@ typedef enum {
minimr_rr_fun_query_get_rr,
minimr_rr_fun_query_get_authority_rrs,
minimr_rr_fun_query_get_extra_rrs,
minimr_rr_fun_get_rr,
minimr_rr_fun_announce_get_rr,
minimr_rr_fun_announce_get_extra_rrs
} minimr_rr_fun;

#define MINIMR_RR_FUN_TYPE_IS_VALID( type ) \
((type) == minimr_rr_fun_response_respond_to || \
#define MINIMR_RR_FUN_IS_VALID( type ) \
((type) == minimr_rr_fun_query_respond_to || \
(type) == minimr_rr_fun_query_get_rr || \
(type) == minimr_rr_fun_query_get_authority_rrs || \
(type) == minimr_rr_fun_query_get_extra_rrs)
(type) == minimr_rr_fun_query_get_extra_rrs || \
(type) == minimr_rr_fun_get_rr || \
(type) == minimr_rr_fun_announce_get_rr || \
(type) == minimr_rr_fun_announce_get_extra_rrs)

// used internally to get the extra compiler argc check
#define MINIMR_RR_FUN_QUERY_RESPOND_TO( rr, user_data ) handler(minimr_rr_fun_query_respond_to, rr, user_data)
#define MINIMR_RR_FUN_QUERY_GET_RR( rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_query_get_rr, rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data)
#define MINIMR_RR_FUN_QUERY_GET_AUTHRR( rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_query_get_authority_rrs, rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data)
#define MINIMR_RR_FUN_QUERY_GET_EXTRARR( rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_query_get_extra_rrs, rr, qstat, outmsg, outlen, outmsgmaxlen, nrr, user_data)
#define MINIMR_RR_FUN_GET_RR( rr, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_get_rr, rr, outmsg, outlen, outmsgmaxlen, nrr, user_data)
#define MINIMR_RR_FUN_ANNOUNCE_GET_RR( rr, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_announce_get_rr, rr, outmsg, outlen, outmsgmaxlen, nrr, user_data)
#define MINIMR_RR_FUN_ANNOUNCE_GET_EXTRA_RRS( rr, outmsg, outlen, outmsgmaxlen, nrr, user_data ) handler(minimr_rr_fun_announce_get_extra_rrs, rr, outmsg, outlen, outmsgmaxlen, nrr, user_data)


/**
* minimr_rr_fun( minimr_rr_fun_query_respond_to, struct minimr_rr * rr, struct minimr_ struct minimr_rr_stat * rstat, uint8_t * msg , void * user_data);
* minimr_rr_fun( minimr_rr_fun_query_get_rr, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
* minimr_rr_fun( minimr_rr_fun_query_get_authority_rrs, .. ) // same as above
* minimr_rr_fun( minimr_rr_fun_query_get_extra_rrs, .. ) // same as above
* minimr_rr_fun( minimr_rr_fun_announce_get_rr, .. ) // same as above
* minimr_rr_fun( minimr_rr_fun_announce_get_extra_rrs, .. ) // same as above
* minimr_rr_fun_handler( minimr_rr_fun_query_respond_to, struct minimr_rr * rr, void * user_data);
* minimr_rr_fun_handler( minimr_rr_fun_query_get_*, struct minimr_rr * rr, struct minimr_query_stat * qstat, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
* minimr_rr_fun_handler( minimr_rr_fun_get_rr, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
* minimr_rr_fun_handler( minimr_rr_fun_announce_get_*, struct minimr_rr * rr, uint8_t * outmsg, uint16_t * outlen, uint16_t outmsgmaxlen, uint16_t * nrr, void * user_data)
*/
typedef int (*minimr_rr_fun_handler)(minimr_rr_fun type, struct minimr_rr *rr, ...);




// Start of named RR struct definer
#define MINIMR_RR_TYPE_BEGIN_STNAME(__namelen__, __stname__) \
struct __stname__ { \
Expand Down Expand Up @@ -596,32 +610,6 @@ MINIMR_RR_TYPE_BEGIN_STNAME(,minimr_rr) MINIMR_RR_TYPE_END();
MINIMR_RR_TYPE_END()


// if > 0 will typedef minimr_dns_rr_a with given (max) namelen
#if MINIMR_RR_TYPE_A_DEFAULT_NAMELEN > 0
typedef MINIMR_RR_TYPE_A(MINIMR_RR_TYPE_A_DEFAULT_NAMELEN) minimr_dns_rr_a;
#endif

// if > 0 will typedef minimr_dns_rr_aaaa with given (max) namelen
#if MINIMR_DNS_RR_TYPE_AAAA_DEFAULT_NAMELEN > 0
typedef MINIMR_DNS_RR_TYPE_AAAA(MINIMR_DNS_RR_TYPE_A_DEFAULT_NAMELEN) minimr_dns_rr_aaaa;
#endif

// if > 0 will typedef minimr_dns_rr_ptr with given (max) namelen and domainlen
#if MINIMR_DNS_RR_TYPE_PTR_DEFAULT_NAMELEN > 0 && MINIMR_DNS_RR_TYPE_PTR_DEFAULT_DOMAINLEN > 0
typedef MINIMR_DNS_RR_TYPE_PTR(MINIMR_DNS_RR_TYPE_A_DEFAULT_NAMELEN, MINIMR_DNS_RR_TYPE_PTR_DEFAULT_DOMAINLEN) minimr_dns_rr_ptr;
#endif

// if > 0 will typedef minimr_dns_rr_srv with given (max) namelen and targetlen
#if MINIMR_DNS_RR_TYPE_SRV_DEFAULT_NAMELEN > 0 && MINIMR_DNS_RR_TYPE_SRV_DEFAULT_TARGETLEN > 0
typedef MINIMR_DNS_RR_TYPE_SRV(MINIMR_DNS_RR_TYPE_A_DEFAULT_NAMELEN, MINIMR_DNS_RR_TYPE_SRV_DEFAULT_TARGETLEN) minimr_dns_rr_;
#endif

// if > 0 will typedef minimr_dns_rr_srv with given (max) namelen and txtlen
#if MINIMR_DNS_RR_TYPE_TXT_DEFAULT_NAMELEN > 0 && MINIMR_DNS_RR_TYPE_TXT_DEFAULT_TXTLEN > 0
typedef MINIMR_DNS_RR_TYPE_TXT(MINIMR_DNS_RR_TYPE_A_DEFAULT_NAMELEN, MINIMR_DNS_RR_TYPE_TXT_DEFAULT_TXTLEN) minimr_dns_rr_aaa;
#endif



/*************** NAME and general field utilities **************/

Expand Down Expand Up @@ -691,7 +679,7 @@ struct minimr_filter {
};

typedef uint8_t (*minimr_query_handler)(struct minimr_dns_hdr * hdr, struct minimr_query_stat * qstat, uint8_t * msg, uint16_t msglen, void * user_data);
typedef uint8_t (*minimr_rr_handler)(struct minimr_dns_hdr * hdr, minimr_rr_section, struct minimr_rr_stat * rstat, uint8_t * msg, uint16_t msglen, void * user_data);
typedef uint8_t (*minimr_rr_handler)(struct minimr_dns_hdr * hdr, minimr_rr_section section, struct minimr_rr_stat * rstat, uint8_t * msg, uint16_t msglen, void * user_data);

/**
* Tries to parse given mDNS message calling the (optional) handlers for each encountered query or RR
Expand Down Expand Up @@ -812,10 +800,72 @@ int32_t minimr_query_response_msg(
);


/*************** Optional default types and functions **************/

// if > 0 will typedef minimr_dns_rr_a with given (max) namelen
#if MINIMR_RR_TYPE_A_DEFAULT_NAMELEN > 0
typedef MINIMR_RR_TYPE_A(MINIMR_RR_TYPE_A_DEFAULT_NAMELEN) minimr_rr_a;
#define MINIMR_RR_TYPE_A_DEFAULT 1
#else
#define MINIMR_RR_TYPE_A_DEFAULT 0
#endif

// if > 0 will typedef minimr_dns_rr_aaaa with given (max) namelen
#if MINIMR_RR_TYPE_AAAA_DEFAULT_NAMELEN > 0
typedef MINIMR_RR_TYPE_AAAA(MINIMR_RR_TYPE_A_DEFAULT_NAMELEN) minimr_rr_aaaa;
#define MINIMR_RR_TYPE_AAAA_DEFAULT 1
#else
#define MINIMR_RR_TYPE_AAAA_DEFAULT 0
#endif

// if > 0 will typedef minimr_dns_rr_ptr with given (max) namelen and domainlen
#if MINIMR_RR_TYPE_PTR_DEFAULT_NAMELEN > 0 && MINIMR_RR_TYPE_PTR_DEFAULT_DOMAINLEN > 0
typedef MINIMR_RR_TYPE_PTR(MINIMR_RR_TYPE_PTR_DEFAULT_NAMELEN, MINIMR_RR_TYPE_PTR_DEFAULT_DOMAINLEN) minimr_rr_ptr;
#define MINIMR_RR_TYPE_PTR_DEFAULT 1
#else
#define MINIMR_RR_TYPE_PTR_DEFAULT 0
#endif

// if > 0 will typedef minimr_dns_rr_srv with given (max) namelen and targetlen
#if MINIMR_RR_TYPE_SRV_DEFAULT_NAMELEN > 0 && MINIMR_RR_TYPE_SRV_DEFAULT_TARGETLEN > 0
typedef MINIMR_RR_TYPE_SRV(MINIMR_RR_TYPE_SRV_DEFAULT_NAMELEN, MINIMR_RR_TYPE_SRV_DEFAULT_TARGETLEN) minimr_rr_srv;
#define MINIMR_RR_TYPE_SRV_DEFAULT 1
#else
#define MINIMR_RR_TYPE_SRV_DEFAULT 0
#endif

// if > 0 will typedef minimr_dns_rr_srv with given (max) namelen and txtlen
#if MINIMR_RR_TYPE_TXT_DEFAULT_NAMELEN > 0 && MINIMR_RR_TYPE_TXT_DEFAULT_TXTLEN > 0
typedef MINIMR_RR_TYPE_TXT(MINIMR_RR_TYPE_TXT_DEFAULT_NAMELEN, MINIMR_RR_TYPE_TXT_DEFAULT_TXTLEN) minimr_rr_txt;
#define MINIMR_RR_TYPE_TXT_DEFAULT 1
#else
#define MINIMR_RR_TYPE_TXT_DEFAULT 0
#endif

// how many default types are actually defined?
#define MINIMR_RR_TYPE_DEFAULT_COUNT (MINIMR_RR_TYPE_A_DEFAULT + MINIMR_RR_TYPE_AAAA_DEFAULT + MINIMR_RR_TYPE_PTR_DEFAULT + MINIMR_RR_TYPE_SRV_DEFAULT + MINIMR_RR_TYPE_TXT_DEFAULT)



//#if MINIMR_RR_COUNT > 0 && MINIMR_SIMPLE_INTERFACE_ENABLED == 0
//
//int32_t minimr_query_response_msg_wrap(
// uint8_t *msg, uint16_t msglen,
// struct minimr_rr **records, uint16_t nrecords,
// uint8_t *outmsg, uint16_t *outmsglen, uint16_t outmsgmaxlen,
// uint8_t *unicast_requested,
// void * user_data
//);
//
//#endif //MINIMR_RR_COUNT > 0





#ifdef __cplusplus
}
#endif



#endif //MINIMR_MINIMR_H
Loading

0 comments on commit 7d04f64

Please sign in to comment.