dessert.h

Go to the documentation of this file.
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  * #defines
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  * typedefs
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]; /* uthash key*/
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  *  #defines
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  * globals
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  * functions
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  * globals
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  * functions
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  * #defines
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  * functions
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  * #defines
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  * functions
00537  ******************************************************************************/
00538 
00539 /* sending messages */
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 /* meshrx-callback handling */
00552 int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
00553 int dessert_meshrxcb_del(dessert_meshrxcb_t* c);
00554 
00555 /* mesh interface handling */
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  * #defines
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  * functions
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  * #defines
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   /* leave some space for future extensions */
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  * functions
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  * #defines
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  * typedefs
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  * globals
00986  ******************************************************************************/
00987 
00988 
00989 /******************************************************************************
00990  * functions
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  * ! ! ! ! MOVED TO CALLBACKS DIR ! ! !
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 /* DESSERT_H*/