diff --git a/sys/net/application_layer/gcoap/forward_proxy.c b/sys/net/application_layer/gcoap/forward_proxy.c index 808180aeb2776..715de112a2bf4 100644 --- a/sys/net/application_layer/gcoap/forward_proxy.c +++ b/sys/net/application_layer/gcoap/forward_proxy.c @@ -76,6 +76,17 @@ gcoap_listener_t forward_proxy_listener = { _request_matcher_forward_proxy }; +static void _cep_set_timeout(client_ep_t *cep, ztimer_t *timer, uint32_t timeout_ms, + event_handler_t handler) +{ + assert(!ztimer_is_set(ZTIMER_MSEC, timer)); + timer->callback = gcoap_forward_proxy_post_event; + timer->arg = &cep->event; + cep->event.handler = handler; + ztimer_set(ZTIMER_MSEC, timer, timeout_ms); +} + + void gcoap_forward_proxy_init(void) { gcoap_register_listener(&forward_proxy_listener); @@ -88,9 +99,10 @@ static client_ep_t *_allocate_client_ep(const sock_udp_ep_t *ep) cep < (_client_eps + CONFIG_GCOAP_REQ_WAITING_MAX); cep++) { if (!_cep_in_use(cep)) { - _cep_set_in_use(cep); + DEBUG("gcoap_forward_proxy: allocating client context %p\n", (void *)cep); _cep_set_req_etag_len(cep, 0); memcpy(&cep->ep, ep, sizeof(*ep)); + _cep_set_in_use(cep); return cep; } } @@ -99,8 +111,9 @@ static client_ep_t *_allocate_client_ep(const sock_udp_ep_t *ep) static void _free_client_ep(client_ep_t *cep) { + DEBUG("gcoap_forward_proxy: freeing client context %p\n", (void *)cep); ztimer_remove(ZTIMER_MSEC, &cep->empty_ack_timer); - memset(cep, 0, sizeof(*cep)); + cep->flags = 0; /* cep->event may be queued - don't touch it */ } static int _request_matcher_forward_proxy(gcoap_listener_t *listener, @@ -406,16 +419,12 @@ static int _gcoap_forward_proxy_via_coap(coap_pkt_t *client_pkt, gcoap_forward_proxy_find_req_memo(&memo, client_pkt, &origin_server_ep); if (memo) { DEBUG("gcoap_forward_proxy: request already exists, ignore!\n"); - _free_client_ep(client_ep); return 0; } if (coap_get_type(client_pkt) == COAP_TYPE_CON) { - client_ep->empty_ack_timer.callback = gcoap_forward_proxy_post_event; - client_ep->empty_ack_timer.arg = &client_ep->event; - client_ep->event.handler = _send_empty_ack; - ztimer_set(ZTIMER_MSEC, &client_ep->empty_ack_timer, - CONFIG_GCOAP_FORWARD_PROXY_EMPTY_ACK_MS); + _cep_set_timeout(client_ep, &client_ep->empty_ack_timer, + CONFIG_GCOAP_FORWARD_PROXY_EMPTY_ACK_MS, _send_empty_ack); } unsigned token_len = coap_get_token_len(client_pkt); @@ -439,9 +448,9 @@ static int _gcoap_forward_proxy_via_coap(coap_pkt_t *client_pkt, } len = gcoap_req_send((uint8_t *)pkt.hdr, len, - &origin_server_ep, - _forward_resp_handler, (void *)client_ep, + &origin_server_ep, _forward_resp_handler, client_ep, GCOAP_SOCKET_TYPE_UNDEF); + return len; } @@ -482,7 +491,7 @@ int gcoap_forward_proxy_request_process(coap_pkt_t *pkt, /* target is using CoAP */ if (!strncmp("coap", urip.scheme, urip.scheme_len)) { int res = _gcoap_forward_proxy_via_coap(pkt, cep, &urip); - if (res < 0) { + if (res <= 0) { _free_client_ep(cep); return -EINVAL; }