1/*
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * This file is part of the CoAP library libcoap. Please see README for terms
5 * of use.
6 */
7
8/* Memory pool definitions for the libcoap when used with lwIP (which has its
9 * own mechanism for quickly allocating chunks of data with known sizes). Has
10 * to be findable by lwIP (ie. an #include <lwippools.h> must either directly
11 * include this or include something more generic which includes this), and
12 * MEMP_USE_CUSTOM_POOLS has to be set in lwipopts.h. */
13
14#include "coap3/coap_internal.h"
15#include "coap3/coap_net.h"
16#include "coap3/coap_resource.h"
17#include "coap3/coap_subscribe.h"
18#ifdef COAP_WITH_LIBTINYDTLS
19#ifndef LWIP_TINYDTLS_LOCAL_FIX
20#define LWIP_TINYDTLS_LOCAL_FIX
21#include <lwip/ip_addr.h>
22/* Local copies of struct to simplify #include nightmare */
23typedef struct {
24  unsigned char size;     /**< size of session_t::addr */
25  unsigned short port;    /**< transport layer port */
26  ip_addr_t addr;         /**< session IP address */
27  int ifindex;            /**< network interface index */
28} l_session_t;
29
30typedef struct l_coap_tiny_context_t {
31  struct dtls_context_t *dtls_context;
32  coap_context_t *coap_context;
33  coap_dtls_pki_t setup_data;
34  coap_binary_t *priv_key;
35  coap_binary_t *pub_key;
36} l_coap_tiny_context_t;
37
38#endif /* LWIP_TINYDTLS_LOCAL_FIX */
39#endif /* COAP_WITH_LIBTINYDTLS */
40
41#ifndef MEMP_NUM_COAPCONTEXT
42#define MEMP_NUM_COAPCONTEXT 1
43#endif
44
45#ifndef MEMP_NUM_COAPENDPOINT
46#ifdef COAP_WITH_LIBTINYDTLS
47#define MEMP_NUM_COAPENDPOINT 2
48#else /* ! COAP_WITH_LIBTINYDTLS */
49#define MEMP_NUM_COAPENDPOINT 1
50#endif /* ! COAP_WITH_LIBTINYDTLS */
51#endif
52
53/* 1 is sufficient as this is very short-lived */
54#ifndef MEMP_NUM_COAPPACKET
55#define MEMP_NUM_COAPPACKET 1
56#endif
57
58#ifndef MEMP_NUM_COAPNODE
59#define MEMP_NUM_COAPNODE 5
60#endif
61
62#ifndef MEMP_NUM_COAPPDU
63#define MEMP_NUM_COAPPDU MEMP_NUM_COAPNODE
64#endif
65
66#ifndef MEMP_NUM_COAPSESSION
67#define MEMP_NUM_COAPSESSION 2
68#endif
69
70#ifndef MEMP_NUM_COAP_SUBSCRIPTION
71#define MEMP_NUM_COAP_SUBSCRIPTION 4
72#endif
73
74#ifndef MEMP_NUM_COAPRESOURCE
75#define MEMP_NUM_COAPRESOURCE 10
76#endif
77
78#ifndef MEMP_NUM_COAPRESOURCEATTR
79#define MEMP_NUM_COAPRESOURCEATTR 20
80#endif
81
82#ifndef MEMP_NUM_COAPOPTLIST
83#define MEMP_NUM_COAPOPTLIST 5
84#endif
85
86#ifndef MEMP_LEN_COAPOPTLIST
87#define MEMP_LEN_COAPOPTLIST 12
88#endif
89
90#ifndef MEMP_NUM_COAPSTRING
91#define MEMP_NUM_COAPSTRING 10
92#endif
93
94#ifndef MEMP_LEN_COAPSTRING
95#define MEMP_LEN_COAPSTRING 40
96#endif
97
98#ifndef MEMP_NUM_COAPCACHE_KEYS
99#define MEMP_NUM_COAPCACHE_KEYS        (2U)
100#endif /* MEMP_NUM_COAPCACHE_KEYS */
101
102#ifndef MEMP_NUM_COAPCACHE_ENTRIES
103#define MEMP_NUM_COAPCACHE_ENTRIES        (2U)
104#endif /* MEMP_NUM_COAPCACHE_ENTRIES */
105
106#ifndef MEMP_NUM_COAPPDUBUF
107#define MEMP_NUM_COAPPDUBUF 2
108#endif
109
110#ifndef MEMP_LEN_COAPPDUBUF
111#define MEMP_LEN_COAPPDUBUF 400
112#endif
113
114#ifndef MEMP_NUM_COAPLGXMIT
115#define MEMP_NUM_COAPLGXMIT 2
116#endif
117
118#ifndef MEMP_NUM_COAPLGCRCV
119#define MEMP_NUM_COAPLGCRCV 2
120#endif
121
122#ifndef MEMP_NUM_COAPLGSRCV
123#define MEMP_NUM_COAPLGSRCV 2
124#endif
125
126#ifndef MEMP_NUM_COAPDIGESTCTX
127#define MEMP_NUM_COAPDIGESTCTX 4
128#endif
129
130#ifndef MEMP_NUM_COAPDTLS_SESSION
131#define MEMP_NUM_COAPDTLS_SESSION 1
132#endif
133
134#ifndef MEMP_NUM_COAPDTLS_CONTEXT
135#define MEMP_NUM_COAPDTLS_CONTEXT 1
136#endif
137
138LWIP_MEMPOOL(COAP_CONTEXT, MEMP_NUM_COAPCONTEXT, sizeof(coap_context_t), "COAP_CONTEXT")
139#ifdef COAP_SERVER_SUPPORT
140LWIP_MEMPOOL(COAP_ENDPOINT, MEMP_NUM_COAPENDPOINT, sizeof(coap_endpoint_t), "COAP_ENDPOINT")
141#endif /* COAP_SERVER_SUPPORT */
142LWIP_MEMPOOL(COAP_PACKET, MEMP_NUM_COAPPACKET, sizeof(coap_packet_t), "COAP_PACKET")
143LWIP_MEMPOOL(COAP_NODE, MEMP_NUM_COAPNODE, sizeof(coap_queue_t), "COAP_NODE")
144LWIP_MEMPOOL(COAP_PDU, MEMP_NUM_COAPPDU, sizeof(coap_pdu_t), "COAP_PDU")
145LWIP_MEMPOOL(COAP_SESSION, MEMP_NUM_COAPSESSION, sizeof(coap_session_t), "COAP_SESSION")
146#ifdef COAP_SERVER_SUPPORT
147LWIP_MEMPOOL(COAP_SUBSCRIPTION, MEMP_NUM_COAP_SUBSCRIPTION, sizeof(coap_subscription_t),
148             "COAP_SUBSCRIPTION")
149LWIP_MEMPOOL(COAP_RESOURCE, MEMP_NUM_COAPRESOURCE, sizeof(coap_resource_t), "COAP_RESOURCE")
150LWIP_MEMPOOL(COAP_RESOURCEATTR, MEMP_NUM_COAPRESOURCEATTR, sizeof(coap_attr_t), "COAP_RESOURCEATTR")
151#endif /* COAP_SERVER_SUPPORT */
152LWIP_MEMPOOL(COAP_OPTLIST, MEMP_NUM_COAPOPTLIST, sizeof(coap_optlist_t)+MEMP_LEN_COAPOPTLIST,
153             "COAP_OPTLIST")
154LWIP_MEMPOOL(COAP_STRING, MEMP_NUM_COAPSTRING, sizeof(coap_string_t)+MEMP_LEN_COAPSTRING,
155             "COAP_STRING")
156#ifdef COAP_SERVER_SUPPORT
157LWIP_MEMPOOL(COAP_CACHE_KEY, MEMP_NUM_COAPCACHE_KEYS, sizeof(coap_cache_key_t), "COAP_CACHE_KEY")
158LWIP_MEMPOOL(COAP_CACHE_ENTRY, MEMP_NUM_COAPCACHE_ENTRIES, sizeof(coap_cache_entry_t),
159             "COAP_CACHE_ENTRY")
160#endif /* COAP_SERVER_SUPPORT */
161LWIP_MEMPOOL(COAP_PDU_BUF, MEMP_NUM_COAPPDUBUF, MEMP_LEN_COAPPDUBUF, "COAP_PDU_BUF")
162LWIP_MEMPOOL(COAP_LG_XMIT, MEMP_NUM_COAPLGXMIT, sizeof(coap_lg_xmit_t), "COAP_LG_XMIT")
163#ifdef COAP_CLIENT_SUPPORT
164LWIP_MEMPOOL(COAP_LG_CRCV, MEMP_NUM_COAPLGCRCV, sizeof(coap_lg_crcv_t), "COAP_LG_CRCV")
165#endif /* COAP_CLIENT_SUPPORT */
166#ifdef COAP_SERVER_SUPPORT
167LWIP_MEMPOOL(COAP_LG_SRCV, MEMP_NUM_COAPLGSRCV, sizeof(coap_lg_srcv_t), "COAP_LG_SRCV")
168LWIP_MEMPOOL(COAP_DIGEST_CTX, MEMP_NUM_COAPDIGESTCTX, sizeof(coap_digest_t) + sizeof(size_t),
169             "COAP_DIGEST_CTX")
170#endif /* COAP_SERVER_SUPPORT */
171#ifdef COAP_WITH_LIBTINYDTLS
172LWIP_MEMPOOL(COAP_DTLS_SESSION, MEMP_NUM_COAPDTLS_SESSION, sizeof(l_session_t), "COAP_DTLS_SESSION")
173LWIP_MEMPOOL(COAP_DTLS_CONTEXT, MEMP_NUM_COAPDTLS_CONTEXT, sizeof(l_coap_tiny_context_t),
174             "COAP_DTLS_CONTEXT")
175#endif /* COAP_WITH_LIBTINYDTLS */
176