Blame view

RIOT/pkg/ccn-lite/ccn-lite-riot.h 7.6 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
  /*
   * Copyright (C) 2015, 2016 INRIA
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  #ifndef CCN_LITE_RIOT_H
  #define CCN_LITE_RIOT_H
  
  /**
   * @defgroup    pkg_ccnlite CCN-Lite stack
   * @ingroup     pkg
   * @ingroup     net
   * @brief       Provides a NDN implementation
   *
   * This package provides the CCN-Lite stack as a port of NDN for RIOT.
   *
   * @{
   */
  
  #include <unistd.h>
  #include "kernel_types.h"
  #include "arpa/inet.h"
  #include "net/packet.h"
  #include "net/ethernet/hdr.h"
  #include "sys/socket.h"
  #include "ccnl-defs.h"
  #include "ccnl-core.h"
  #include "ccnl-headers.h"
  #include "net/gnrc/netreg.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * Define the log level of the CCN-Lite stack
   */
  #define LOG_LEVEL LOG_DEBUG
  #include "log.h"
  
  /**
   * @name Dynamic memory allocation used in CCN-Lite
   *
   * @{
   */
  #define ccnl_malloc(s)                  malloc(s)
  #define ccnl_calloc(n,s)                calloc(n,s)
  #define ccnl_realloc(p,s)               realloc(p,s)
  #define ccnl_free(p)                    free(p)
  /**
   * @}
   */
  
  /**
   * Closing an interface or socket from CCN-Lite
   */
  #define ccnl_close_socket(s)            close(s)
  
  /**
   * @name Log levels used by CCN-Lite debugging
   *
   * @{
   */
  #define FATAL   LOG_ERROR
  #define ERROR   LOG_ERROR
  #define WARNING LOG_WARNING
  #define INFO    LOG_INFO
  #define DEBUG   LOG_DEBUG
  #define TRACE   LOG_DEBUG
  #define VERBOSE LOG_ALL
  /**
   * @}
   */
  
  /**
   * @name CCN-Lite's debugging macros
   *
   * @{
   */
  #define DEBUGMSG(LVL, ...) do {       \
          if ((LVL)>debug_level) break;   \
          LOG(LVL, __VA_ARGS__);   \
      } while (0)
  
  #define DEBUGMSG_CORE(...) DEBUGMSG(__VA_ARGS__)
  #define DEBUGMSG_CFWD(...) DEBUGMSG(__VA_ARGS__)
  #define DEBUGMSG_CUTL(...) DEBUGMSG(__VA_ARGS__)
  #define DEBUGMSG_PIOT(...) DEBUGMSG(__VA_ARGS__)
  
  #define DEBUGSTMT(LVL, ...) do { \
          if ((LVL)>debug_level) break; \
          __VA_ARGS__; \
       } while (0)
  
  #define TRACEIN(...)                    do {} while(0)
  #define TRACEOUT(...)                   do {} while(0)
  /**
   * @}
   */
  
  /**
   * @brief Some macro definitions
   * @{
   */
  #define free_2ptr_list(a,b)     ccnl_free(a), ccnl_free(b)
  #define free_3ptr_list(a,b,c)   ccnl_free(a), ccnl_free(b), ccnl_free(c)
  #define free_4ptr_list(a,b,c,d) ccnl_free(a), ccnl_free(b), ccnl_free(c), ccnl_free(d);
  #define free_5ptr_list(a,b,c,d,e) ccnl_free(a), ccnl_free(b), ccnl_free(c), ccnl_free(d), ccnl_free(e);
  /**
   * @}
   */
  
  /**
   * Frees all memory directly and indirectly allocated for prefix information
   */
  #define free_prefix(p)  do{ if(p) \
                  free_5ptr_list(p->bytes,p->comp,p->complen,p->chunknum,p); } while(0)
  
  
  /**
   * Constant string
   */
  #define CONSTSTR(s)                     s
  
  /**
   * Stack size for CCN-Lite event loop
   */
  #define CCNL_STACK_SIZE (THREAD_STACKSIZE_MAIN)
  
  /**
   * Size of the message queue of CCN-Lite's event loop
   */
  #define CCNL_QUEUE_SIZE     (8)
  
  /**
   * @brief Data structure for interest packet
   */
  typedef struct {
      struct ccnl_prefix_s *prefix;   /**< requested prefix */
      unsigned char *buf;             /**< buffer to store the interest packet */
      size_t buflen;                  /**< size of the buffer */
  } ccnl_interest_t;
  
  
  /**
   * Maximum string length for prefix representation
   */
  #define CCNL_PREFIX_BUFSIZE     (50)
  
  /**
   * Message type for signalling a timeout while waiting for a content chunk
   */
  #define CCNL_MSG_TIMEOUT        (0x1701)
  
  /**
   * Message type for advancing the ageing timer
   */
  #define CCNL_MSG_AGEING         (0x1702)
  
  /**
   * Maximum number of elements that can be cached
   */
  #ifndef CCNL_CACHE_SIZE
  #define CCNL_CACHE_SIZE     (5)
  #endif
  #ifdef DOXYGEN
  #define CCNL_CACHE_SIZE
  #endif
  
  /**
   * Struct holding CCN-Lite's central relay information
   */
  extern struct ccnl_relay_s ccnl_relay;
  
  /**
   * @brief Function pointer type for local producer function
   */
  typedef int (*ccnl_producer_func)(struct ccnl_relay_s *relay,
                                    struct ccnl_face_s *from,
                                    struct ccnl_pkt_s *pkt);
  
  /**
   * @brief Function pointer type for caching strategy function
   */
  typedef int (*ccnl_cache_strategy_func)(struct ccnl_relay_s *relay,
                                          struct ccnl_content_s *c);
  
  /**
   * @brief   Start the main CCN-Lite event-loop
   *
   * @return  The PID of the event-loop's thread
   */
  kernel_pid_t ccnl_start(void);
  
  /**
   * @brief Opens a @ref net_gnrc_netif device for use with CCN-Lite
   *
   * @param[in] if_pid        The pid of the @ref net_gnrc_netif device driver
   * @param[in] netreg_type   The @ref net_gnrc_nettype @p if_pid should be
   *                          configured to use
   *
   * @return 0 on success,
   * @return -EINVAL if eventloop could not be registered for @p netreg_type
   */
  int ccnl_open_netif(kernel_pid_t if_pid, gnrc_nettype_t netreg_type);
  
  /**
   * @brief Sends out an Interest
   *
   * @param[in] prefix    The name that is requested
   * @param[out] buf      Buffer to write the content chunk to
   * @param[in] buf_len   Size of @p buf
   *
   * @return 0 on success
   * @return -1 on failure
   */
  int ccnl_send_interest(struct ccnl_prefix_s *prefix,
                         unsigned char *buf, size_t buf_len);
  
  /**
   * @brief Wait for incoming content chunk
   *
   * @pre The thread has to register for CCNL_CONT_CHUNK in @ref net_gnrc_netreg
   *      first
   *
   * @post The thread should unregister from @ref net_gnrc_netreg after this
   *       function returns
   *
   * @param[out] buf      Buffer to stores the received content
   * @param[in]  buf_len  Size of @p buf
   * @param[in]  timeout  Maximum to wait for the chunk, set to a default value if 0
   *
   * @return 0 if a content was received
   * @return -ETIMEDOUT if no chunk was received until timeout
   */
  int ccnl_wait_for_chunk(void *buf, size_t buf_len, uint64_t timeout);
  
  /**
   * @brief Add entry to the CCN-Lite FIB
   *
   * @par[in] relay   Local relay struct
   * @par[in] pfx     Prefix of the FIB entry
   * @par[in] face    Face for the FIB entry
   *
   * @return 0    on success
   * @return -1   on error
   */
  int ccnl_fib_add_entry(struct ccnl_relay_s *relay, struct ccnl_prefix_s *pfx,
                         struct ccnl_face_s *face);
  
  /**
   * @brief Remove entry from the CCN-Lite FIB
   *
   * @par[in] relay   Local relay struct
   * @par[in] pfx     Prefix of the FIB entry, may be NULL
   * @par[in] face    Face for the FIB entry, may be NULL
   *
   * @return 0    on success
   * @return -1   on error
   */
  int ccnl_fib_rem_entry(struct ccnl_relay_s *relay, struct ccnl_prefix_s *pfx, struct ccnl_face_s *face);
  
  /**
   * @brief Prints the current CCN-Lite FIB
   *
   * @par[in] relay   Local relay struct
   */
  void ccnl_fib_show(struct ccnl_relay_s *relay);
  
  /**
   * @brief Set a local producer function
   *
   * Setting a local producer function allows to generate content on the fly or
   * react otherwise on any kind of incoming interest.
   *
   * @param[in] func  The function to be called first for any incoming interest
   */
  void ccnl_set_local_producer(ccnl_producer_func func);
  
  /**
   * @brief Set a function to control the caching strategy
   *
   * The given function will be called if the cache is full and a new content
   * chunk arrives. It shall remove (at least) one entry from the cache.
   *
   * If the return value of @p func is 0, the default caching strategy will be
   * applied by the CCN-lite stack. If the return value is 1, it is assumed that
   * (at least) one entry has been removed from the cache.
   *
   * @param[in] func  The function to be called for an incoming content chunk if
   *                  the cache is full.
   */
  void ccnl_set_cache_strategy_remove(ccnl_cache_strategy_func func);
  
  #ifdef __cplusplus
  }
  #endif
  #endif /* CCN_LITE_RIOT_H */
  /** @} */