00001
00030
00327 #ifndef DESSERT_H
00328 #define DESSERT_H
00329
00330 #ifdef TARGET_DARWIN
00331 #include <net/if_dl.h>
00332 #define TUN_BSD
00333 #endif
00334
00335 #ifdef TARGET_LINUX
00336 #define TUN_LINUX
00337 #endif
00338
00339 #include <net/if.h>
00340 #include <net/ethernet.h>
00341 #include <pcap.h>
00342 #include <stdint.h>
00343 #include <syslog.h>
00344 #include <stdlib.h>
00345 #include <libcli.h>
00346
00347
00356
00357
00358
00359
00361 #define DESSERT_ETHPROTO 0x8042
00362
00364 #define DESSERT_MAXFRAMELEN ETHER_MAX_LEN
00365
00367 #define DESSERT_MAXEXTDATALEN 253
00368
00370 #define DESSERT_PROTO_STRLEN 4
00371
00373 #define DESSERT_LBUF_LEN 1024
00374
00376 #define DESSERT_OK 0
00377
00379 #define DESSERT_ERR 1
00380
00381
00382
00383
00385 typedef uint64_t dessert_frameid_t;
00386
00388 typedef struct __attribute__ ((__packed__)) dessert_msg {
00390 struct ether_header l2h;
00392 char proto[DESSERT_PROTO_STRLEN];
00394 uint8_t ver;
00396 uint8_t flags;
00397 union {
00399 uint32_t u32;
00400 struct __attribute__ ((__packed__)) {
00402 uint8_t ttl;
00404 uint8_t u8;
00406 uint16_t u16;
00407 };
00408 };
00410 uint16_t hlen;
00412 uint16_t plen;
00413 } dessert_msg_t;
00414
00416 typedef struct dessert_msg_proc {
00418 uint16_t lflags;
00420 uint16_t lreserved;
00422 char lbuf[DESSERT_LBUF_LEN];
00423 } dessert_msg_proc_t;
00424
00426 typedef struct __attribute__ ((__packed__)) dessert_ext {
00429 uint8_t type;
00430
00434 uint8_t len;
00435
00437 uint8_t data[DESSERT_MAXEXTDATALEN];
00438 } dessert_ext_t;
00439
00441 typedef struct dessert_meshif {
00443 struct dessert_meshif *next;
00445 struct dessert_meshif *prev;
00447 char if_name[IFNAMSIZ];
00449 unsigned int if_index;
00451 uint8_t hwaddr[ETHER_ADDR_LEN];
00453 pthread_mutex_t cnt_mutex;
00455 uint64_t ipkts;
00457 uint64_t opkts;
00459 uint64_t ibytes;
00461 uint64_t obytes;
00463 pcap_t *pcap;
00465 char pcap_err[PCAP_ERRBUF_SIZE];
00467 pthread_t worker;
00468 } dessert_meshif_t;
00469
00476 typedef struct dessert_sysif {
00478 struct dessert_sysif *next;
00480 char if_name[IFNAMSIZ];
00482 unsigned int if_index;
00484 uint8_t hwaddr[ETHER_ADDR_LEN];
00486 pthread_mutex_t cnt_mutex;
00488 uint64_t ipkts;
00490 uint64_t opkts;
00492 uint64_t ibytes;
00494 uint64_t obytes;
00496 int fd;
00498 uint8_t flags;
00500 pthread_t worker;
00501 } dessert_sysif_t;
00502
00525 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);
00526
00543 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);
00544
00556 typedef int dessert_periodiccallback_t(void *data, struct timeval *scheduled, struct timeval *interval);
00557
00559 typedef struct dessert_periodic {
00561 dessert_periodiccallback_t *c;
00563 struct timeval scheduled;
00565 struct timeval interval;
00567 void *data;
00569 struct dessert_periodic *next;
00570 } dessert_periodic_t;
00571
00572
00582
00583
00584
00585
00587 #define DESSERT_FRAMEID_MAX ((uint64_t)-1)
00588
00591 #define DESSERT_OPT_DAEMONIZE 0x0100
00592
00594 #define DESSERT_OPT_NODAEMONIZE 0x0200
00595
00597 #define DESSERT_OPT_PID 0x0400
00598
00600 #define DESSERT_OPT_NOPID 0x0800
00601
00602
00603
00604
00605
00607 extern char dessert_proto[DESSERT_PROTO_STRLEN+1];
00608
00610 extern u_int8_t dessert_ver;
00611
00613 extern u_int8_t dessert_l25_defsrc[ETHER_ADDR_LEN];
00614
00615
00617 extern u_char ether_broadcast[ETHER_ADDR_LEN];
00618
00620 extern u_char ether_null[ETHER_ADDR_LEN];
00621
00623 extern pthread_rwlock_t dessert_cfglock;
00624
00625
00626
00627
00628
00629 int dessert_init(const char* proto, int version, uint16_t opts, char* pidfile);
00630
00631 int dessert_run(void);
00632 void dessert_exit(void);
00633
00634
00644
00645
00646
00647
00648 extern struct cli_def *dessert_cli;
00649
00650 extern struct cli_command *dessert_cli_show;
00651 extern struct cli_command *dessert_cli_cfg_iface;
00652 extern struct cli_command *dessert_cli_cfg_no;
00653 extern struct cli_command *dessert_cli_cfg_no_iface;
00654 extern struct cli_command *dessert_cli_cfg_set;
00655 extern struct cli_command *dessert_cli_cfg_logging;
00656 extern struct cli_command *dessert_cli_cfg_no_logging;
00657
00658
00659
00660
00661
00662 int dessert_cli_run(void);
00663 FILE* dessert_cli_get_cfg(int argc, char** argv);
00664 int dessert_set_cli_port(uint16_t port);
00665
00666 int dessert_cli_cmd_addsysif(struct cli_def *cli, char *command, char *argv[], int argc);
00667 int dessert_cli_cmd_addmeshif(struct cli_def *cli, char *command, char *argv[], int argc);
00668
00669
00679
00680
00681
00682
00684 #define DESSERT_LOG_SYSLOG 0x0001
00685
00687 #define DESSERT_LOG_NOSYSLOG 0x0002
00688
00691 #define DESSERT_LOG_FILE 0x0004
00692
00694 #define DESSERT_LOG_NOFILE 0x0008
00695
00697 #define DESSERT_LOG_STDERR 0x0010
00698
00700 #define DESSERT_LOG_NOSTDERR 0x0020
00701
00703 #define DESSERT_LOG_RBUF 0x0040
00704
00706 #define DESSERT_LOG_NORBUF 0x0080
00707
00709 #define DESSERT_LOG_DEBUG 0x0100
00710
00712 #define DESSERT_LOG_NODEBUG 0x0200
00713
00714
00715
00716
00717 int dessert_logcfg(uint16_t opts);
00718 void _dessert_log(int level, const char* func, const char* file, int line, const char *fmt, ...);
00720 #define dessert_debug(...) _dessert_log(LOG_DEBUG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00721
00722 #define dessert_info(...) _dessert_log(LOG_INFO, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00723
00724 #define dessert_notice(...) _dessert_log(LOG_NOTICE, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00725
00726 #define dessert_warn(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00727
00728 #define dessert_warning(...) _dessert_log(LOG_WARNING, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00729
00730 #define dessert_err(...) _dessert_log(LOG_ERR, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00731
00732 #define dessert_crit(...) _dessert_log(LOG_CRIT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00733
00734 #define dessert_alert(...) _dessert_log(LOG_ALERT, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00735
00736 #define dessert_emerg(...) _dessert_log(LOG_EMERG, __FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)
00737
00738
00748
00749
00750
00751
00753 #define DESSERT_MSG_NEEDNOSPARSE 1
00754
00756 #define DESSERT_MSG_NEEDMSGPROC 2
00757
00759 #define DESSERT_MSG_KEEP 0
00760
00762 #define DESSERT_MSG_DROP -1
00763
00765 #define DESSERT_IF_PROMISC 0x0
00766
00768 #define DESSERT_IF_NOPROMISC 0x1
00769
00771 #define DESSERT_IF_FILTER 0x0
00772
00774 #define DESSERT_IF_NOFILTER 0x2
00775
00776
00777
00778
00779
00780
00781 int dessert_meshsend(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
00782 int dessert_meshsend_allbutone(const dessert_msg_t* msgin, const dessert_meshif_t *iface);
00783 int dessert_meshsend_hwaddr(const dessert_msg_t* msgin, const uint8_t hwaddr[ETHER_ADDR_LEN]);
00784 int dessert_meshsend_randomized(const dessert_msg_t* msgin);
00785
00786 int dessert_meshsend_fast(dessert_msg_t* msg, const dessert_meshif_t *iface);
00787 int dessert_meshsend_fast_allbutone(dessert_msg_t* msg, const dessert_meshif_t *iface);
00788 int dessert_meshsend_fast_hwaddr(dessert_msg_t* msg, const uint8_t hwaddr[ETHER_ADDR_LEN]);
00789 int dessert_meshsend_fast_randomized(dessert_msg_t* msgin);
00790 int dessert_meshsend_raw(dessert_msg_t* msg, const dessert_meshif_t *iface);
00791
00792
00793 int dessert_meshrxcb_add(dessert_meshrxcb_t* c, int prio);
00794 int dessert_meshrxcb_del(dessert_meshrxcb_t* c);
00795
00796
00797 int dessert_meshif_add(const char* dev, uint8_t flags);
00798 int dessert_meshif_del(const char* dev);
00799
00800 dessert_meshif_t * dessert_meshif_get_name(const char* dev);
00801 dessert_meshif_t * dessert_meshif_get_hwaddr(const uint8_t hwaddr[ETHER_ADDR_LEN]);
00802 dessert_meshif_t * dessert_meshiflist_get(void);
00803
00804
00814
00815
00816
00817
00819 #define DESSERT_TUN 0x00
00820
00822 #define DESSERT_TAP 0x01
00823
00825 #define DESSERT_MAKE_DEFSRC 0x02
00826
00828 #define _DESSERT_TAP_NOMAC 0x80
00829
00830
00831
00832
00833
00834 int dessert_sysif_init(char* name, uint8_t flags);
00835
00836 int dessert_sysrxcb_add(dessert_sysrxcb_t* c, int prio);
00837 int dessert_sysrxcb_del(dessert_sysrxcb_t* c);
00838
00839 int dessert_syssend_msg(dessert_msg_t *msg);
00840 int dessert_syssend(const struct ether_header *eth, size_t len);
00841
00842
00852
00853
00854
00855
00858 #define DESSERT_FLAG_SPARSE 0x1
00859
00860
00861
00863 #define DESSERT_LFLAG_SRC_SELF 0x0002
00864
00866 #define DESSERT_LFLAG_DST_MULTICAST 0x0004
00867
00869 #define DESSERT_LFLAG_DST_SELF 0x0008
00870
00872 #define DESSERT_LFLAG_DST_BROADCAST 0x0010
00873
00875 #define DESSERT_LFLAG_PREVHOP_SELF 0x0020
00876
00878 #define DESSERT_LFLAG_NEXTHOP_SELF 0x0040
00879
00881 #define DESSERT_LFLAG_NEXTHOP_BROADCAST 0x0080
00882
00886 #define DESSERT_LFLAG_DST_SELF_OVERHEARD 0x0100
00887
00891 #define DESSERT_LFLAG_NEXTHOP_SELF_OVERHEARD 0x0200
00892
00893
00894
00896 #define DESSERT_EXTLEN (sizeof(struct dessert_ext) - DESSERT_MAXEXTDATALEN)
00897
00899 #define DESSERT_EXT_ANY 0x00
00900
00902 #define DESSERT_EXT_ETH 0x01
00903
00905 #define DESSERT_EXT_TRACE 0x02
00906
00908 #define DESSERT_EXT_USER 0x40
00909
00910
00911
00913 #define DESSERT_MSG_TRACE_HOST (ETHER_ADDR_LEN)
00914
00916 #define DESSERT_MSG_TRACE_IFACE (3*ETHER_ADDR_LEN)
00917
00918
00919
00921 #define dessert_ext_getdatalen(ext) (ext->len - DESSERT_EXTLEN)
00922
00923
00924
00925
00926
00927 int dessert_msg_new(dessert_msg_t **msgout);
00928 int dessert_msg_clone(dessert_msg_t **msgnew, const dessert_msg_t *msgold, uint8_t sparse);
00929 int dessert_msg_check(const dessert_msg_t* msg, size_t len);
00930 void dessert_msg_dump(const dessert_msg_t* msg, size_t len, char *buf, size_t blen);
00931 void dessert_msg_destroy(dessert_msg_t* msg);
00932
00933 int dessert_msg_ethencap(const struct ether_header* eth, size_t eth_len, dessert_msg_t **msgout);
00934 int dessert_msg_ethdecap(const dessert_msg_t* msg, struct ether_header** ethout);
00935 struct ether_header* dessert_msg_getl25ether (const dessert_msg_t* msg);
00936
00937 int dessert_msg_proc_clone(dessert_msg_proc_t **procnew, const dessert_msg_proc_t *procold);
00938 void dessert_msg_proc_dump(const dessert_msg_t* msg, size_t len, const dessert_msg_proc_t *proc, char *buf, size_t blen);
00939 void dessert_msg_proc_destroy(dessert_msg_proc_t* proc);
00940
00941 int dessert_msg_addpayload(dessert_msg_t* msg, void** payload, int len);
00942 int dessert_msg_getpayload(dessert_msg_t *msg, void **payload);
00943 int dessert_msg_addext(dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, size_t len);
00944 int dessert_msg_delext(dessert_msg_t *msg, dessert_ext_t *ext);
00945 int dessert_msg_resizeext(dessert_msg_t *msg, dessert_ext_t *ext, size_t new_len);
00946 int dessert_msg_getext(const dessert_msg_t* msg, dessert_ext_t** ext, uint8_t type, int index);
00947 int dessert_msg_get_ext_count(const dessert_msg_t* msg, uint8_t type);
00948
00949 int dessert_msg_trace_initiate(dessert_msg_t* msg, int mode);
00950 int dessert_msg_trace_dump(const dessert_msg_t* msg, char* buf, int blen);
00951
00952 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);
00953 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);
00954 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);
00955 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);
00956
00957
00967 dessert_periodic_t *dessert_periodic_add(dessert_periodiccallback_t* c, void *data, const struct timeval *scheduled, const struct timeval *interval);
00968 dessert_periodic_t *dessert_periodic_add_delayed(dessert_periodiccallback_t* c, void *data, int delay);
00969 int dessert_periodic_del(dessert_periodic_t *p);
00970
00971
00981
00982
00983
00985 #define DESSERT_APPSTATS_VALUETYPE_BOOL 0
00986
00988 #define DESSERT_APPSTATS_VALUETYPE_INT32 1
00989
00991 #define DESSERT_APPSTATS_VALUETYPE_UINT32 2
00992
00994 #define DESSERT_APPSTATS_VALUETYPE_COUNTER64 3
00995
00997 #define DESSERT_APPSTATS_VALUETYPE_OCTETSTRING 4
00998
00999
01000
01002 #define DESSERT_APPSTATS_NODEORLINK_NONE 0
01003
01005 #define DESSERT_APPSTATS_NODEORLINK_NODE 1
01006
01008 #define DESSERT_APPSTATS_NODEORLINK_LINK 2
01009
01010
01011
01013 #define DESSERT_APPSTATS_BOOL_TRUE 1
01014
01016 #define DESSERT_APPSTATS_BOOL_FALSE 0
01017
01018
01019
01021 #define DESSERT_APPPARAMS_VALUETYPE_BOOL 0
01022
01024 #define DESSERT_APPPARAMS_VALUETYPE_INT32 1
01025
01027 #define DESSERT_APPPARAMS_VALUETYPE_UINT32 2
01028
01030 #define DESSERT_APPPARAMS_VALUETYPE_OCTETSTRING 3
01031
01032
01033
01035 #define DESSERT_APPPARAMS_BOOL_TRUE 1
01036
01038 #define DESSERT_APPPARAMS_BOOL_FALSE 0
01039
01040
01041
01043 #define DESSERT_APPSTATS_CB_BULK 1
01044
01045 #define DESSERT_APPSTATS_CB_NOBULK 2
01046
01047
01048
01049
01050
01052 typedef struct dessert_agentx_appstats {
01053
01055 struct dessert_agentx_appstats *prev;
01057 struct dessert_agentx_appstats *next;
01058
01060 char name[256];
01062 char desc[256];
01063
01072 int value_type;
01079 int node_or_link;
01080
01082 uint8_t macaddress1 [ETHER_ADDR_LEN];
01084 uint8_t macaddress2 [ETHER_ADDR_LEN];
01085
01086 union {
01092 uint8_t bool;
01094 int32_t int32;
01096 uint32_t uint32;
01098 uint64_t counter64;
01099
01100 struct {
01102 uint8_t octetstring_len;
01104 char *octetstring;
01105 };
01106 };
01107
01108 } dessert_agentx_appstats_t;
01109
01111 typedef struct dessert_agentx_appparams {
01112
01114 struct dessert_agentx_appparams *prev;
01116 struct dessert_agentx_appparams *next;
01117
01119 uint8_t index;
01120
01122 char name[256];
01124 char desc[256];
01125
01133 int value_type;
01134
01135 union {
01141 uint8_t bool;
01143 int32_t int32;
01145 uint32_t uint32;
01146
01147 struct {
01149 uint16_t octetstring_len;
01151 char *octetstring;
01152 };
01153 };
01154
01155 } dessert_agentx_appparams_t;
01156
01166 typedef int dessert_agentx_appstatscb_get_t(struct dessert_agentx_appstats *appstats);
01167
01177 typedef int dessert_agentx_appparamscb_get_t(struct dessert_agentx_appparams *appparams);
01178
01189 typedef int dessert_agentx_appparamscb_set_t(struct dessert_agentx_appparams *appparams);
01190
01192 typedef struct dessert_agentx_appstats_cb_entry {
01193
01195 struct dessert_agentx_appstats_cb_entry *prev;
01197 struct dessert_agentx_appstats_cb_entry *next;
01198
01200 uint8_t isbulk_flag;
01201
01203 dessert_agentx_appstatscb_get_t *c;
01204
01205 } dessert_agentx_appstats_cb_entry_t;
01206
01208 typedef struct dessert_agentx_appparams_cb_entry {
01209
01211 struct dessert_agentx_appparams_cb_entry *prev;
01213 struct dessert_agentx_appparams_cb_entry *next;
01214
01216 uint8_t index;
01217
01219 dessert_agentx_appparamscb_get_t *get;
01221 dessert_agentx_appparamscb_set_t *set;
01222
01223 } dessert_agentx_appparams_cb_entry_t;
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234 dessert_agentx_appstats_t *dessert_agentx_appstats_new(void);
01235 void dessert_agentx_appstats_destroy(dessert_agentx_appstats_t *appstat);
01236
01237 dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add(dessert_agentx_appstatscb_get_t *c);
01238 dessert_agentx_appstats_cb_entry_t *dessert_agentx_appstats_add_bulk(dessert_agentx_appstatscb_get_t *c);
01239 int dessert_agentx_appstats_del(dessert_agentx_appstats_cb_entry_t *e);
01240
01241 dessert_agentx_appparams_t *dessert_agentx_appparam_new(void);
01242 void dessert_agentx_appparam_destroy(dessert_agentx_appparams_t *appparam);
01243
01244 dessert_agentx_appparams_cb_entry_t *dessert_agentx_appparams_add(dessert_agentx_appparamscb_get_t *get, dessert_agentx_appparamscb_set_t *set);
01245 int dessert_agentx_appparams_del(dessert_agentx_appparams_cb_entry_t *e);
01246
01247
01275 #define MESHIFLIST_ITERATOR_START(__interface) \
01276 pthread_rwlock_rdlock(&dessert_cfglock); \
01277 DL_FOREACH(dessert_meshiflist_get(), __interface) {
01278
01283 #define MESHIFLIST_ITERATOR_STOP } pthread_rwlock_unlock(&dessert_cfglock)
01284
01299 #define TIMEVAL_ADD(__tv, __sec, __usec) \
01300 do { \
01301 (__tv)->tv_sec += __sec; \
01302 (__tv)->tv_usec += __usec; \
01303 if((__tv)->tv_usec >= 1000000) { \
01304 ++(__tv)->tv_sec; \
01305 (__tv)->tv_usec -= 1000000; \
01306 } \
01307 } while(0)
01308
01309 #define likely(x) (__builtin_expect((x),1))
01310 #define unlikely(x) (__builtin_expect((x),0))
01311
01312 #define __dessert_assert(func, file, line, e) \
01313 ((void)_dessert_log(LOG_EMERG, func, file, line, "assertion `%s' failed!\n", e), abort)
01314
01315 #ifdef NDEBUG
01316 #define assert(e) ((void)0)
01317 #else
01318 #define assert(e) \
01319 (__builtin_expect(!(e), 0) ? __dessert_assert(__FUNCTION__, __FILE__, __LINE__, #e) : (void)0)
01320 #endif
01321
01324
01325
01326
01327
01328
01329
01331
01332
01334
01335
01336
01337
01338
01339 #endif