47 #define PRINTF(...) printf(__VA_ARGS__)
48 #define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
49 #define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]", (lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3], (lladdr)->addr[4], (lladdr)->addr[5])
52 #define PRINT6ADDR(addr)
53 #define PRINTLLADDR(addr)
71 erbium_status_code = SERVICE_UNAVAILABLE_5_03;
72 coap_error_message =
"AlreadyInUse";
89 coap_packet_t *
const coap_req = (coap_packet_t *)request;
90 coap_transaction_t *
const t = coap_get_transaction_by_mid(coap_req->mid);
92 PRINTF(
"Separate ACCEPT: /%.*s MID %u\n", coap_req->uri_path_len,
93 coap_req->uri_path, coap_req->mid);
96 if(coap_req->type == COAP_TYPE_CON) {
100 coap_init_message(ack, COAP_TYPE_ACK, 0, coap_req->mid);
102 coap_send_message(&
UIP_IP_BUF->srcipaddr, UIP_UDP_BUF->srcport,
109 separate_store->port = t->port;
112 separate_store->type =
113 coap_req->type == COAP_TYPE_CON ? COAP_TYPE_CON : COAP_TYPE_NON;
114 separate_store->mid = coap_get_mid();
116 memcpy(separate_store->token, coap_req->token, coap_req->token_len);
117 separate_store->token_len = coap_req->token_len;
119 separate_store->block1_num = coap_req->block1_num;
120 separate_store->block1_size = coap_req->block1_size;
122 separate_store->block2_num = coap_req->block2_num;
123 separate_store->block2_size = coap_req->block2_size > 0 ? MIN(COAP_MAX_BLOCK_SIZE, coap_req->block2_size) : COAP_MAX_BLOCK_SIZE;
126 erbium_status_code = MANUAL_RESPONSE;
128 PRINTF(
"ERROR: Response transaction for separate request not found!\n");
129 erbium_status_code = INTERNAL_SERVER_ERROR_5_00;
134 coap_separate_resume(
void *response, coap_separate_t *separate_store,
137 coap_init_message(response, separate_store->type, code,
138 separate_store->mid);
139 if(separate_store->token_len) {
140 coap_set_token(response, separate_store->token,
141 separate_store->token_len);
143 if(separate_store->block1_size) {
144 coap_set_header_block1(response, separate_store->block1_num,
145 0, separate_store->block1_size);
CoAP module for separate responses.
void coap_separate_reject()
Reject a request that would require a separate response with an error message.
void coap_separate_accept(void *request, coap_separate_t *separate_store)
Initiate a separate response with an empty ACK.
CoAP module for reliable transport
#define UIP_IP_BUF
Pointer to IP header.
#define uip_ipaddr_copy(dest, src)
Copy an IP address from one place to another.
uip_appdata
Pointer to the application data in the packet buffer.