00001
00031
00082 #ifndef DESSERT_H
00083 #define DESSERT_H
00084
00085 #ifdef __DARWIN__
00086 #include <net/if_dl.h>
00087 #define TUN_BSD
00088 #endif
00089
00090 #ifdef __linux__
00091 #define TUN_LINUX
00092 #endif
00093
00094 #include <net/if.h>
00095 #include <net/ethernet.h>
00096 #include <pcap.h>
00097 #include <stdint.h>
00098 #include <syslog.h>
00099 #include <stdlib.h>
00100 #include <libcli.h>
00101
00102
00111
00112
00113
00114
00116 #define DESSERT_ETHPROTO 0x8042
00117
00119 #define DESSERT_MAXFRAMELEN ETHER_MAX_LEN
00120
00122 #define DESSERT_MAXEXTDATALEN 253
00123
00125 #define DESSERT_PROTO_STRLEN 4
00126
00128 #define DESSERT_LBUF_LEN 1024
00129
00131 #define DESSERT_OK 0
00132
00134 #define DESSERT_ERR 1
00135
00136
00137
00138
00140 typedef uint64_t dessert_frameid_t;
00141
00148 typedef struct __attribute__ ((__packed__)) dessert_msg {
00150 struct ether_header l2h;
00152 char proto[DESSERT_PROTO_STRLEN];
00154 uint8_t ver;
00156 uint8_t flags;
00157 union {
00159 uint32_t u32;
00160 struct __attribute__ ((__packed__)) {
00162 uint8_t ttl;
00164 uint8_t u8;
00166 uint16_t u16;
00167 };
00168 };
00170 uint16_t hlen;
00172 uint16_t plen;
00173 } dessert_msg_t;
00174
00182 typedef struct dessert_msg_proc {
00184 uint16_t lflags;
00186 uint16_t lreserved;
00188 char lbuf[DESSERT_LBUF_LEN];
00189 } dessert_msg_proc_t;
00190
00192 typedef struct __attribute__ ((__packed__)) dessert_ext {
00195 uint8_t type;
00196
00200 uint8_t len;
00201
00203 uint8_t data[DESSERT_MAXEXTDATALEN];
00204 } dessert_ext_t;
00205
00207 typedef struct dessert_meshif {
00209 struct dessert_meshif *next;
00211 char if_name[IFNAMSIZ];
00213 unsigned int if_index;
00215 uint8_t hwaddr[ETHER_ADDR_LEN];
00217 pthread_mutex_t cnt_mutex;
00219 uint64_t ipkts;
00221 uint64_t opkts;
00223 uint64_t ibytes;
00225 uint64_t obytes;
00227 pcap_t *pcap;
00229 char pcap_err[PCAP_ERRBUF_SIZE];
00231 pthread_t worker;
00232
00234 struct dessert_meshif *prev;
00235 } dessert_meshif_t;
00236
00243 typedef struct dessert_sysif {
00245 struct dessert_sysif *next;
00247 char if_name[IFNAMSIZ];
00249 unsigned int if_index;
00251 uint8_t hwaddr[ETHER_ADDR_LEN];
00253 pthread_mutex_t cnt_mutex;
00255 uint64_t ipkts;
00257 uint64_t opkts;
00259 uint64_t ibytes;
00261 uint64_t obytes;
00263 int fd;
00265 uint8_t flags;
00267 pthread_t worker;
00268 } dessert_sysif_t;
00269
00292 typedef int dessert_meshrxcb_t(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
00293
00310 typedef int dessert_sysrxcb_t(dessert_msg_t *msg, size_t len, dessert_msg_proc_t *proc, dessert_sysif_t *sysif, dessert_frameid_t id);
00311
00323 typedef int dessert_periodiccallback_t(void *data, struct timeval *scheduled, struct timeval *interval);
00324
00326 typedef struct dessert_periodic {
00328 dessert_periodiccallback_t *c;
00330 struct timeval scheduled;
00332 struct timeval interval;
00334 void *data;
00336 struct dessert_periodic *next;
00337 } dessert_periodic_t;
00338
00339
00349
00350
00351
00352
00354 #define DESSERT_FRAMEID_MAX ((uint64_t)-1)
00355
00358 #define DESSERT_OPT_DAEMONIZE 0x0100
00359
00361 #define DESSERT_OPT_NODAEMONIZE 0x0200
00362
00363
00364
00365
00366
00368 extern char dessert_proto[DESSERT_PROTO_STRLEN+1];
00369
00371 extern u_int8_t dessert_ver;
00372
00374 extern u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
00375
00376
00378 extern u_char ether_broadcast[ETHER_ADDR_LEN];
00379
00381 extern u_char ether_null[ETHER_ADDR_LEN];
00382
00384 extern pthread_rwlock_t dessert_cfglock;
00385
00386
00387
00388
00389
00390 int dessert_init(const char* proto, int version, uint16_t opts);
00391 int dessert_pid(char* pidfile);
00392 int dessert_run(void);
00393 void dessert_exit(void);
00394
00395
00405
00406
00407
00408
00409 extern struct cli_def *dessert_cli;
00410
00411 extern struct cli_command *dessert_cli_show;
00412 extern struct cli_command *dessert_cli_cfg_iface;
00413 extern struct cli_command *dessert_cli_cfg_no;
00414 extern struct cli_command *dessert_cli_cfg_no_iface;
00415 extern struct cli_command *dessert_cli_cfg_set;
00416 extern struct cli_command *dessert_cli_cfg_logging;
00417 extern struct cli_command *dessert_cli_cfg_no_logging;
00418
00419
00420
00421
00422
00423 int dessert_cli_run(void);
00424 FILE* dessert_cli_get_cfg(int argc, char** argv);
00425 int dessert_set_cli_port(uint16_t port);
00426
00427
00437
00438
00439
00440
00442 #define DESSERT_LOG_SYSLOG 0x0001
00443
00445 #define DESSERT_LOG_NOSYSLOG 0x0002
00446
00450 #define DESSERT_LOG_FILE 0x0004
00451
00453 #define DESSERT_LOG_NOFILE 0x0008
00454
00456 #define DESSERT_LOG_STDERR 0x0010
00457
00459 #define DESSERT_LOG_NOSTDERR 0x0020
00460
00462 #define DESSERT_LOG_RBUF 0x0040
00463
00465 #define DESSERT_LOG_NORBUF 0x0080
00466
00468 #define DESSERT_LOG_DEBUG 0x0100
00469
00471 #define DESSERT_LOG_NODEBUG 0x0200
00472
00473
00474
00475
00476 int dessert_logcfg(uint16_t opts);
00477 void _dessert_log(int level, const char* func, const char* file, int line, const char *fmt, ...);
00479 #define dessert_debug(...) _dessert_log(LOG_DEBUG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00480
00481 #define dessert_info(...) _dessert_log(LOG_INFO, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00482
00483 #define dessert_notice(...) _dessert_log(LOG_NOTICE, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00484
00485 #define dessert_warn(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00486
00487 #define dessert_warning(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00488
00489 #define dessert_err(...) _dessert_log(LOG_ERR, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00490
00491 #define dessert_crit(...) _dessert_log(LOG_CRIT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00492
00493 #define dessert_alert(...) _dessert_log(LOG_ALERT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00494
00495 #define dessert_emerg(...) _dessert_log(LOG_EMERG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00496
00497
00507
00508
00509
00510
00512 #define DESSERT_MSG_NEEDNOSPARSE 1
00513
00515 #define DESSERT_MSG_NEEDMSGPROC 2
00516
00518 #define DESSERT_MSG_KEEP 0
00519
00521 #define DESSERT_MSG_DROP -1
00522
00524 #define DESSERT_IF_PROMISC 0x0
00525
00527 #define DESSERT_IF_NOPROMISC 0x1
00528
00530 #define DESSERT_IF_FILTER 0x0
00531
00533 #define DESSERT_IF_NOFILTER 0x2
00534
00535
00536
00537
00538
00539
00540 int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
00541 int dessert_meshsend_allbutone(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
00542 int dessert_meshsend_hwaddr(const dessert_msg_t* msgin, const uint8_t hwaddr[ETHER_ADDR_LEN]);
00543 int dessert_meshsend_randomized(const dessert_msg_t* msgin);
00544
00545 int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface);
00546 int dessert_meshsend_fast_allbutone(dessert_msg_t* msg, const dessert_meshif_t *iface);
00547 int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg, const uint8_t hwaddr[ETHER_ADDR_LEN]);
00548 int dessert_meshsend_fast_randomized(dessert_msg_t* msgin);
00549 int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface);
00550
00551
00552 int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
00553 int dessert_meshrxcb_del(dessert_meshrxcb_t* c);
00554
00555
00556 int dessert_meshif_add(const char* dev, uint8_t flags);
00557 int dessert_meshif_del(const char* dev);
00558
00559 dessert_meshif_t * dessert_meshif_get_name(const char* dev);
00560 dessert_meshif_t * dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]);
00561 dessert_meshif_t * dessert_meshiflist_get(void);
00562
00563
00573
00574
00575
00576
00578 #define DESSERT_TUN 0x00
00579
00581 #define DESSERT_TAP 0x01
00582
00584 #define DESSERT_MAKE_DEFSRC 0x02
00585
00587 #define _DESSERT_TAP_NOMAC 0x80
00588
00589
00590
00591
00592
00593 int dessert_sysif_init(char* name, uint8_t flags);
00594
00595 int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
00596 int dessert_sysrxcb_del(dessert_sysrxcb_t* c);
00597
00598 int dessert_syssend_msg(dessert_msg_t *msg);
00599 int dessert_syssend(const void *pkt, size_t len);
00600
00601
00611
00612
00613
00614
00617 #define DESSERT_FLAG_SPARSE 0x1
00618
00619
00620
00622 #define DESSERT_LFLAG_SRC_SELF 0x0002
00623
00625 #define DESSERT_LFLAG_DST_MULTICAST 0x0004
00626
00628 #define DESSERT_LFLAG_DST_SELF 0x0008
00629
00631 #define DESSERT_LFLAG_DST_BROADCAST 0x0010
00632
00634 #define DESSERT_LFLAG_PREVHOP_SELF 0x0020
00635
00637 #define DESSERT_LFLAG_NEXTHOP_SELF 0x0040
00638
00640 #define DESSERT_LFLAG_NEXTHOP_BROADCAST 0x0080
00641
00645 #define DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100
00646
00650 #define DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200
00651
00652
00653
00655 #define DESSERT_EXTLEN (sizeof(struct dessert_ext) - DESSERT_MAXEXTDATALEN)
00656
00658 enum dessert_extensions {
00659 DESSERT_EXT_ANY = 0x00,
00660 DESSERT_EXT_ETH = 0x01,
00661 DESSERT_EXT_TRACE_REQ = 0x02,
00662 DESSERT_EXT_TRACE_RPL = 0x03,
00663 DESSERT_EXT_PING = 0x04,
00664 DESSERT_EXT_PONG = 0x05,
00665
00666 DESSERT_EXT_USER = 0x40,
00667 };
00668
00669
00670
00672 #define DESSERT_MSG_TRACE_HOST (ETHER_ADDR_LEN)
00673
00675 #define DESSERT_MSG_TRACE_IFACE (3*ETHER_ADDR_LEN)
00676
00677
00678
00680 static inline size_t dessert_ext_getdatalen(dessert_ext_t* ext) { return (ext->len - DESSERT_EXTLEN); }
00681
00682
00683
00684
00685
00686 int dessert_msg_new(dessert_msg_t **msgout);
00687 int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold, uint8_t sparse);
00688 int dessert_msg_check(const dessert_msg_t* msg, size_t len);
00689 void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf, size_t blen);
00690 void dessert_msg_destroy(dessert_msg_t* msg);
00691
00692 int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len, dessert_msg_t **msgout);
00693 int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout);
00694 struct ether_header* dessert_msg_getl25ether (const dessert_msg_t* msg);
00695 int dessert_msg_ipencap(const uint8_t* ip, size_t len, dessert_msg_t** msgout);
00696 int dessert_msg_ipdecap(const dessert_msg_t* msg, uint8_t** ip);
00697
00698 int dessert_msg_proc_clone(dessert_msg_proc_t **procnew, const dessert_msg_proc_t *procold);
00699 void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len, const dessert_msg_proc_t *proc, char *buf, size_t blen);
00700 void dessert_msg_proc_destroy(dessert_msg_proc_t* proc);
00701
00702 int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len);
00703 int dessert_msg_getpayload(dessert_msg_t *msg, void **payload);
00704 int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, size_t len);
00705 int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
00706 int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len);
00707 int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, int index);
00708 int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type);
00709
00710 int dessert_msg_dump_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
00711 int dessert_msg_check_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
00712 int dessert_msg_trace_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
00713 int dessert_msg_ifaceflags_cb(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *riface, dessert_frameid_t id);
00714
00715
00725 dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c, void *data, const struct timeval *scheduled, const struct timeval *interval);
00726 dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void *data, int delay);
00727 int dessert_periodic_del(dessert_periodic_t *p);
00728
00729
00739
00740
00741
00743 #define DESSERT_APPSTATS_VALUETYPE_BOOL 0
00744
00746 #define DESSERT_APPSTATS_VALUETYPE_INT32 1
00747
00749 #define DESSERT_APPSTATS_VALUETYPE_UINT32 2
00750
00752 #define DESSERT_APPSTATS_VALUETYPE_COUNTER64 3
00753
00755 #define DESSERT_APPSTATS_VALUETYPE_OCTETSTRING 4
00756
00757
00758
00760 #define DESSERT_APPSTATS_NODEORLINK_NONE 0
00761
00763 #define DESSERT_APPSTATS_NODEORLINK_NODE 1
00764
00766 #define DESSERT_APPSTATS_NODEORLINK_LINK 2
00767
00768
00769
00771 #define DESSERT_APPSTATS_BOOL_TRUE 1
00772
00774 #define DESSERT_APPSTATS_BOOL_FALSE 0
00775
00776
00777
00779 #define DESSERT_APPPARAMS_VALUETYPE_BOOL 0
00780
00782 #define DESSERT_APPPARAMS_VALUETYPE_INT32 1
00783
00785 #define DESSERT_APPPARAMS_VALUETYPE_UINT32 2
00786
00788 #define DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING 3
00789
00790
00791
00793 #define DESSERT_APPPARAMS_BOOL_TRUE 1
00794
00796 #define DESSERT_APPPARAMS_BOOL_FALSE 0
00797
00798
00799
00801 #define DESSERT_APPSTATS_CB_BULK 1
00802
00803 #define DESSERT_APPSTATS_CB_NOBULK 2
00804
00805
00806
00807
00808
00810 typedef struct dessert_agentx_appstats {
00811
00813 struct dessert_agentx_appstats *prev;
00815 struct dessert_agentx_appstats *next;
00816
00818 char name[256];
00820 char desc[256];
00821
00830 int value_type;
00837 int node_or_link;
00838
00840 uint8_t macaddress1 [ETHER_ADDR_LEN];
00842 uint8_t macaddress2 [ETHER_ADDR_LEN];
00843
00844 union {
00850 uint8_t bool;
00852 int32_t int32;
00854 uint32_t uint32;
00856 uint64_t counter64;
00857
00858 struct {
00860 uint8_t octetstring_len;
00862 char *octetstring;
00863 };
00864 };
00865
00866 } dessert_agentx_appstats_t;
00867
00869 typedef struct dessert_agentx_appparams {
00870
00872 struct dessert_agentx_appparams *prev;
00874 struct dessert_agentx_appparams *next;
00875
00877 uint8_t index;
00878
00880 char name[256];
00882 char desc[256];
00883
00891 int value_type;
00892
00893 union {
00899 uint8_t bool;
00901 int32_t int32;
00903 uint32_t uint32;
00904
00905 struct {
00907 uint16_t octetstring_len;
00909 char *octetstring;
00910 };
00911 };
00912
00913 } dessert_agentx_appparams_t;
00914
00924 typedef int dessert_agentx_appstatscb_get_t(struct dessert_agentx_appstats *appstats);
00925
00935 typedef int dessert_agentx_appparamscb_get_t(struct dessert_agentx_appparams *appparams);
00936
00947 typedef int dessert_agentx_appparamscb_set_t(struct dessert_agentx_appparams *appparams);
00948
00950 typedef struct dessert_agentx_appstats_cb_entry {
00951
00953 struct dessert_agentx_appstats_cb_entry *prev;
00955 struct dessert_agentx_appstats_cb_entry *next;
00956
00958 uint8_t isbulk_flag;
00959
00961 dessert_agentx_appstatscb_get_t *c;
00962
00963 } dessert_agentx_appstats_cb_entry_t;
00964
00966 typedef struct dessert_agentx_appparams_cb_entry {
00967
00969 struct dessert_agentx_appparams_cb_entry *prev;
00971 struct dessert_agentx_appparams_cb_entry *next;
00972
00974 uint8_t index;
00975
00977 dessert_agentx_appparamscb_get_t *get;
00979 dessert_agentx_appparamscb_set_t *set;
00980
00981 } dessert_agentx_appparams_cb_entry_t;
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992 dessert_agentx_appstats_t *dessert_agentx_appstats_new(void);
00993 void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat);
00994
00995 dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(dessert_agentx_appstatscb_get_t *c);
00996 dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(dessert_agentx_appstatscb_get_t *c);
00997 int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e);
00998
00999 dessert_agentx_appparams_t *dessert_agentx_appparam_new(void);
01000 void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam);
01001
01002 dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(dessert_agentx_appparamscb_get_t *get, dessert_agentx_appparamscb_set_t *set);
01003 int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e);
01004
01005
01033 #define MESHIFLIST_ITERATOR_START(__interface) \
01034 pthread_rwlock_rdlock(&dessert_cfglock); \
01035 DL_FOREACH(dessert_meshiflist_get(), __interface) {
01036
01041 #define MESHIFLIST_ITERATOR_STOP } pthread_rwlock_unlock(&dessert_cfglock)
01042
01057 #define TIMEVAL_ADD(__tv, __sec, __usec) \
01058 do { \
01059 (__tv)->tv_sec += __sec; \
01060 (__tv)->tv_usec += __usec; \
01061 if((__tv)->tv_usec >= 1000000) { \
01062 ++(__tv)->tv_sec; \
01063 (__tv)->tv_usec -= 1000000; \
01064 } \
01065 } while(0)
01066
01074 #define likely(x) (__builtin_expect((x),1))
01075
01083 #define unlikely(x) (__builtin_expect((x),0))
01084
01085 #define __dessert_assert(func, file, line, e) \
01086 ((void)_dessert_log(LOG_EMERG, func, file, line, "assertion `%s' failed!\n", e), abort)
01087
01094 #ifdef NDEBUG
01095 #define assert(e) ((void)0)
01096 #else
01097 #define assert(e) \
01098 (__builtin_expect(!(e), 0) ? __dessert_assert(__FUNCTION__, __FILE__, __LINE__, #e) : (void)0)
01099 #endif
01100
01103
01104
01105
01106
01107
01108
01118 int dessert_cli_cmd_addsysif(struct cli_def *cli, char *command, char *argv[], int argc);
01119 int dessert_cli_cmd_addsysif_tun(struct cli_def *cli, char *command, char *argv[], int argc);
01120 int dessert_cli_cmd_addmeshif(struct cli_def *cli, char *command, char *argv[], int argc);
01121
01122 int dessert_cli_cmd_ping(struct cli_def *cli, char *command, char *argv[], int argc);
01123 int dessert_rx_ping(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01124 int dessert_rx_pong(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01125
01126 int dessert_cli_cmd_traceroute(struct cli_def *cli, char *command, char *argv[], int argc);
01127 int dessert_rx_trace(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01128 int dessert_msg_trace_initiate(dessert_msg_t* msg, uint8_t type, int mode);
01129 int dessert_msg_trace_dump(const dessert_msg_t* msg, uint8_t type, char* buf, int blen);
01130
01131 int dessert_rx_ipttl(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01132
01133 int dessert_tx_drop_ipv6(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_sysif_t *iface, dessert_frameid_t id);
01134 int dessert_rx_drop_tap(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01135 int dessert_rx_drop_tun(dessert_msg_t* msg, size_t len, dessert_msg_proc_t *proc, const dessert_meshif_t *iface, dessert_frameid_t id);
01136
01139 #endif