diff --git a/app/teogw.c b/app/teogw.c index 74335d8ca..dfa937a1b 100644 --- a/app/teogw.c +++ b/app/teogw.c @@ -46,7 +46,7 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // Set default namespace case EV_K_STARTED: - ksn_printf(ke, NULL, DEBUG, "Host '%s' started at network '%s'...\n", + ksn_printf(ke, "", DEBUG, "Host '%s' started at network '%s'...\n", ksnetEvMgrGetHostName(ke), ke->ksn_cfg.network); // Set application type @@ -56,7 +56,7 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // start new network if(!strcmp(ke->ksn_cfg.network,"local")) { const char* net = "NEW_NET"; - ksn_printf(ke, NULL, DEBUG, "Dynamically add new network %s\n", net); + ksn_printf(ke, "", DEBUG, "Dynamically add new network %s\n", net); teoMultiAddNet(ke->km, event_cb, "NEW_HOST", 0, net, NULL); } @@ -65,14 +65,14 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // Show connected peers case EV_K_CONNECTED: { // const ksnCorePacketData *rd = (ksnCorePacketData *) data; - ksn_printf(ke, NULL, DEBUG, "Peer '%s' connected at network '%s'...\n", + ksn_printf(ke, "", DEBUG, "Peer '%s' connected at network '%s'...\n", rd->from, ke->ksn_cfg.network); } break; // Show disconnected peers case EV_K_DISCONNECTED: { // const ksnCorePacketData *rd = (ksnCorePacketData *) data; - ksn_printf(ke, NULL, DEBUG, "Peer '%s' disconnected at network '%s'...\n", + ksn_printf(ke, "", DEBUG, "Peer '%s' disconnected at network '%s'...\n", rd->from, ke->ksn_cfg.network); } break; diff --git a/examples/teoackm.c b/examples/teoackm.c index 8569de33c..e85d1e644 100644 --- a/examples/teoackm.c +++ b/examples/teoackm.c @@ -142,38 +142,18 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, { ksnet_arp_data *arp = (ksnet_arp_data *)ksnetArpGet(ke->kc->ka, peer_to); if(arp != NULL) { - // Make address from string struct sockaddr_in remaddr; // remote address socklen_t addrlen = sizeof(remaddr); // length of addresses -// memset((char *) &remaddr, 0, addrlen); -// remaddr.sin_family = AF_INET; -// remaddr.sin_port = htons(arp->port); -// #ifndef HAVE_MINGW -// if(inet_aton(arp->addr, &remaddr.sin_addr) == 0) { -// //return(-2); -// } -// #else -// remaddr.sin_addr.s_addr = inet_addr(addr); -// #endif - if(!make_addr(arp->addr, arp->port, - (__SOCKADDR_ARG) &remaddr, &addrlen)) { - - #if TRUDP_VERSION == 1 - ksnTRUDPresetSend(ke->kc->ku, ke->kc->fd, - (__CONST_SOCKADDR_ARG) &remaddr); - ksnTRUDPreset(ke->kc->ku, - (__CONST_SOCKADDR_ARG) &remaddr, 0); - ksnTRUDPstatReset(ke->kc->ku); - #else - trudpChannelData *tcd; - if((tcd = trudpGetChannel( - ke->kc->ku, (__CONST_SOCKADDR_ARG)&remaddr, 0)) != (void*)-1) - trudp_ChannelSendReset(tcd); - #endif + + if(!make_addr(arp->addr, arp->port, (__SOCKADDR_ARG) &remaddr, &addrlen)) { + trudpChannelData *tcd = trudpGetChannel(ke->kc->ku, (__CONST_SOCKADDR_ARG)&remaddr, 0); + if((tcd != (void*)-1) || (tcd != NULL)) { + trudp_ChannelSendReset(tcd); + } } } - + // Show menu ke->event_cb(ke, EV_K_USER , NULL, 0, NULL); } diff --git a/src/Makefile.am b/src/Makefile.am index 10cfe4423..0b15aa339 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -108,7 +108,6 @@ nobase_teonetinclude_HEADERS = \ net_recon.h \ net_split.h \ tr-udp.h \ - tr-udp_.h \ tr-udp_stat.h \ pidfile.h \ teonet.hpp \ diff --git a/src/ev_mgr.c b/src/ev_mgr.c index 529ac06aa..454902d33 100644 --- a/src/ev_mgr.c +++ b/src/ev_mgr.c @@ -24,7 +24,7 @@ #include "utils/rlutil.h" #include "modules/metric.h" -#define MODULE _ANSI_CYAN "event_manager" _ANSI_NONE +#define MODULE "event_manager" // Global module variables static int teoRestartApp_f = 0; // Restart teonet application before exit @@ -915,51 +915,44 @@ int check_connected_cb(ksnetArpClass *ka, char *peer_name, * @param revents */ void idle_cb (EV_P_ ev_idle *w, int revents) { - - #define kev ((ksnetEvMgrClass *)((ksnCoreClass *)w->data)->ke) + ksnetEvMgrClass *ke = ((ksnCoreClass *)w->data)->ke; #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, "idle callback %d\n", kev->idle_count); + ksn_printf(ke, MODULE, DEBUG_VV, "idle callback %d\n", ke->idle_count); #endif // Stop this watcher ev_idle_stop(EV_A_ w); // Idle count startup (first time run) - if(!kev->idle_count) { + if(!ke->idle_count) { //! \todo: open_local_port(kev); - #if TRUDP_VERSION == 1 - // Set statistic start time - if(!kev->kc->ku->started) kev->kc->ku->started = ksnetEvMgrGetTime(kev); - #endif // Connect to R-Host - connect_r_host_cb(kev); + connect_r_host_cb(ke); // Send event to application - if(kev->ta) kev->ta->t_id = pthread_self(); - if(kev->event_cb != NULL) kev->event_cb(kev, EV_K_STARTED, NULL, 0, NULL); + if(ke->ta) ke->ta->t_id = pthread_self(); + if(ke->event_cb != NULL) ke->event_cb(ke, EV_K_STARTED, NULL, 0, NULL); // Start host socket in the event manager - if(!kev->ksn_cfg.r_tcp_f) { - ev_io_start(kev->ev_loop, &kev->kc->host_w); + if(!ke->ksn_cfg.r_tcp_f) { + ev_io_start(ke->ev_loop, &ke->kc->host_w); } } // Idle count max value - else if(kev->idle_count == UINT32_MAX) kev->idle_count = 0; + else if(ke->idle_count == UINT32_MAX) ke->idle_count = 0; // Increment count - kev->idle_count++; + ke->idle_count++; // Check host events to send him service information //! \todo: host_cb(EV_A_ (ev_io*)w, revents); // Send idle Event - if(kev->event_cb != NULL) { - kev->event_cb(kev, EV_K_IDLE , NULL, 0, NULL); + if(ke->event_cb != NULL) { + ke->event_cb(ke, EV_K_IDLE , NULL, 0, NULL); } // Set last host event time - ksnCoreSetEventTime(kev->kc); - - #undef kev + ksnCoreSetEventTime(ke->kc); } /** diff --git a/src/modules/l0-server.c b/src/modules/l0-server.c index eda8e08dc..390bc8c12 100644 --- a/src/modules/l0-server.c +++ b/src/modules/l0-server.c @@ -42,7 +42,6 @@ static bool processKeyExchange(ksnLNullClass *kl, ksnLNullData *kld, int fd, // Other modules not declared functions void *ksnCoreCreatePacket(ksnCoreClass *kc, uint8_t cmd, const void *data, size_t data_len, size_t *packet_len); -#include "tr-udp_.h" // ksnTRUDPmakeAddr // External constants extern const char *localhost; diff --git a/src/modules/tcp_proxy.c b/src/modules/tcp_proxy.c index 0a2ad92f4..16894cb1e 100644 --- a/src/modules/tcp_proxy.c +++ b/src/modules/tcp_proxy.c @@ -21,7 +21,6 @@ #include "ev_mgr.h" #include "net_core.h" -#include "tr-udp_.h" #include "utils/rlutil.h" #define MODULE _ANSI_YELLOW "tcp_proxy" _ANSI_NONE diff --git a/src/net_arp.c b/src/net_arp.c index 9c02772ae..943d4af8e 100644 --- a/src/net_arp.c +++ b/src/net_arp.c @@ -12,7 +12,6 @@ #include #include "ev_mgr.h" -#include "tr-udp_.h" #include "utils/rlutil.h" #include "utils/utils.h" #include "utils/teo_memory.h" @@ -150,10 +149,9 @@ void *ksnetArpSetHostPort(ksnetArpClass *ka, char* name, int port) { * * @param ka Pointer to ksnetArpClass * @param name Peer name to remove - * @return True if successfully removed + * @return 1 if successfully removed */ int ksnetArpRemove(ksnetArpClass *ka, char* name) { - size_t var_len = 0; char* peer_name = strdup(name); @@ -162,17 +160,11 @@ int ksnetArpRemove(ksnetArpClass *ka, char* name) { // If removed successfully if(arp != (void*)-1) { - // Remove peer from TR-UDP module // \TODO The 'if(arp)' was added because we drop here. Check why arp may be NULL. if(arp) { - #if TRUDP_VERSION == 1 - ksnTRUDPresetAddr(((ksnetEvMgrClass*) ka->ke)->kc->ku, arp->addr, - arp->port, 1); - #elif TRUDP_VERSION == 2 trudpChannelDestroyAddr(((ksnetEvMgrClass*) ka->ke)->kc->ku, arp->data.addr, arp->data.port, 0); - #endif } // Remove from Stream module @@ -187,6 +179,7 @@ int ksnetArpRemove(ksnetArpClass *ka, char* name) { if(arp->type) free(arp->type); free(arp); } + free(peer_name); return arp ? 1 : 0; @@ -200,18 +193,17 @@ int ksnetArpRemove(ksnetArpClass *ka, char* name) { * @param ka */ void ksnetArpRemoveAll(ksnetArpClass *ka) { - ksnetEvMgrClass *ke = ka->ke; PblIterator *it = pblMapIteratorNew(ka->map); - if(it != NULL) { + if(it != NULL) { while(pblIteratorHasNext(it)) { - void *entry = pblIteratorNext(it); char *name = pblMapEntryKey(entry); ksnet_arp_data_ext *arp = pblMapEntryValue(entry); if(arp->type) free(arp->type); } + pblIteratorFree(it); } @@ -219,11 +211,7 @@ void ksnetArpRemoveAll(ksnetArpClass *ka) { ke->ksn_cfg.r_host_name[0] = '\0'; ka->map = pblMapNewHashMap(); ksnetArpAddHost(ka); - #if TRUDP_VERSION == 1 - ksnTRUDPremoveAll(ke->kc->ku); - #elif TRUDP_VERSION == 2 trudpChannelDestroyAll(ke->kc->ku); - #endif } /** @@ -533,7 +521,6 @@ char *ksnetArpShowLine(int num, char *name, ksnet_arp_data* data) { * @return String with formated ARP table. Should be free after use */ char *ksnetArpShowStr(ksnetArpClass *ka) { - char *str; const char *div = "-------------------------------------------------------" "----------------------------\n"; @@ -548,99 +535,66 @@ char *ksnetArpShowStr(ksnetArpClass *ka) { PblIterator *it = pblMapIteratorNew(ka->map); int num = 0; - if(it != NULL) { + if(it != NULL) { while(pblIteratorHasNext(it)) { - void *entry = pblIteratorNext(it); char *name = pblMapEntryKey(entry); ksnet_arp_data *data = pblMapEntryValue(entry); - char *last_triptime = ksnet_formatMessage("%7.3f", - data->last_triptime); - - // Get TR-UDP ip map data by key - #if TRUDP_VERSION == 1 - size_t val_len; - size_t key_len = KSN_BUFFER_SM_SIZE; - char key[key_len]; - key_len = snprintf(key, key_len, "%s:%d", data->addr, data->port); - ip_map_data *ip_map_d = pblMapGet( - ((ksnetEvMgrClass*)ka->ke)->kc->ku->ip_map, key, key_len, - &val_len); - - // Last trip time - char *tcp_last_triptime = ip_map_d != NULL ? - ksnet_formatMessage("%7.3f / ", - ip_map_d->stat.triptime_last/1000.0) : strdup(null_str); - - // Last 10 max trip time - char *tcp_triptime_last10_max = ip_map_d != NULL ? - ksnet_formatMessage("%.3f ms", - ip_map_d->stat.triptime_last_max/1000.0) : strdup(null_str); - - #elif TRUDP_VERSION == 2 + char *last_triptime = ksnet_formatMessage("%7.3f", data->last_triptime); + // Get TR-UDP by address and port trudpChannelData *tcd = trudpGetChannelAddr( ((ksnetEvMgrClass*)ka->ke)->kc->ku, data->addr, data->port, 0 ); + // Set Last and Middle trip time char *tcp_last_triptime, *tcp_triptime_last10_max; if(tcd != (void*)-1) { - tcp_last_triptime = ksnet_formatMessage("%7.3f / ", - tcd->triptime/1000.0); - tcp_triptime_last10_max = ksnet_formatMessage("%.3f ms", - tcd->triptimeMiddle/1000.0); - } - else { + tcp_last_triptime = ksnet_formatMessage("%7.3f / ", tcd->triptime/1000.0); + tcp_triptime_last10_max = ksnet_formatMessage("%.3f ms", tcd->triptimeMiddle/1000.0); + } else { tcp_last_triptime = strdup(null_str); tcp_triptime_last10_max = strdup(null_str); } - #endif str = ksnet_sformatMessage(str, "%s" "%3d %s%-15s%s %3d %-15s %5d %7s %s %s%s%s\n", str, - // Number ++num, - // Peer name getANSIColor(LIGHTGREEN), name, getANSIColor(NONE), - // Index data->mode, - // IP data->addr, - // Port data->port, - // Trip time data->mode < 0 ? "" : last_triptime, - // ARP Trip time type (ms) data->mode < 0 ? "" : "ms", - // TCP Proxy last trip time type (ms) "", tcp_last_triptime, tcp_triptime_last10_max - // Rx/Tx //"", //(data->idx >= 0 && data->direct_con ? itoa( (&kn->host->peers[data->idx])->incomingDataTotal) : ""), //"", // (data->idx >= 0 && data->direct_con ? "/" : ""), //"" //(data->idx >= 0 && data->direct_con ? itoa( (&kn->host->peers[data->idx])->outgoingDataTotal) : "") ); + free(last_triptime); free(tcp_last_triptime); free(tcp_triptime_last10_max); } + pblIteratorFree(it); } - str = ksnet_sformatMessage(str, "%s%s", str, div); + str = ksnet_sformatMessage(str, "%s%s", str, div); return str; } diff --git a/src/net_com.c b/src/net_com.c index 29a17ebd2..cc5fe9789 100644 --- a/src/net_com.c +++ b/src/net_com.c @@ -16,9 +16,8 @@ #include "utils/rlutil.h" #include "utils/teo_memory.h" #include "modules/subscribe.h" -#if TRUDP_VERSION == 2 #include "trudp_stat.h" -#endif + // Local functions static int cmd_echo_cb(ksnCommandClass *kco, ksnCorePacketData *rd); @@ -841,7 +840,6 @@ static int cmd_host_info_cb(ksnCommandClass *kco, ksnCorePacketData *rd) { * @return */ static int cmd_trudp_info_cb(ksnCommandClass *kco, ksnCorePacketData *rd) { - ksnetEvMgrClass *ke = EVENT_MANAGER_CLASS(kco); #ifdef DEBUG_KSNET @@ -854,11 +852,7 @@ static int cmd_trudp_info_cb(ksnCommandClass *kco, ksnCorePacketData *rd) { // Get TR-UDP info size_t data_out_len; - #if TRUDP_VERSION == 1 - void *data_out = ksnTRUDPstatGet(ke->kc->ku, data_type, &data_out_len); - #elif TRUDP_VERSION == 2 void *data_out = trudpStatGet(ke->kc->ku, data_type, &data_out_len); - #endif if(rd->l0_f) {// Send TRUDP_INFO_ANSWER to L0 user ksnLNullSendToL0(ke, rd->addr, rd->port, rd->from, rd->from_len, CMD_TRUDP_INFO_ANSWER, diff --git a/src/net_core.c b/src/net_core.c index 15f2e2ab7..7c258725e 100644 --- a/src/net_core.c +++ b/src/net_core.c @@ -28,7 +28,6 @@ typedef int socklen_t; #include "utils/rlutil.h" #include "utils/teo_memory.h" #include "tr-udp.h" -#include "tr-udp_.h" // Constants const char *localhost = "127.0.0.1"; @@ -105,7 +104,6 @@ int send_cmd_connected_cb(ksnetArpClass *ka, char *name, ksnet_arp_data *arp_dat * @return Pointer to ksnCoreClass or NULL if error */ ksnCoreClass *ksnCoreInit(void* ke, char *name, int port, char* addr) { - ksnCoreClass *kc = teo_malloc(sizeof(ksnCoreClass)); kc->ke = ke; @@ -130,11 +128,7 @@ ksnCoreClass *ksnCoreInit(void* ke, char *name, int port, char* addr) { } // TR-UDP initialize - #if TRUDP_VERSION == 1 - kc->ku = ksnTRUDPinit(kc); - #elif TRUDP_VERSION == 2 kc->ku = trudpInit(kc->fd, kc->port, trudp_event_cb, ke); - #endif // Change this host port number to port changed in ksnCoreBind function ksnetArpSetHostPort(kc->ka, ((ksnetEvMgrClass*)ke)->ksn_cfg.host_name, kc->port); @@ -160,9 +154,7 @@ ksnCoreClass *ksnCoreInit(void* ke, char *name, int port, char* addr) { * @param kc Pointer to ksnCore class object */ void ksnCoreDestroy(ksnCoreClass *kc) { - if(kc != NULL) { - ksnetEvMgrClass *ke = kc->ke; // Send disconnect from peer connected to TCP Proxy command to all @@ -179,12 +171,8 @@ void ksnCoreDestroy(ksnCoreClass *kc) { if(kc->addr != NULL) free(kc->addr); ksnetArpDestroy(kc->ka); ksnCommandDestroy(kc->kco); - #if TRUDP_VERSION == 1 - ksnTRUDPDestroy(kc->ku); - #elif TRUDP_VERSION == 2 trudpChannelDestroyAll(kc->ku); trudpDestroy(kc->ku); - #endif #if KSNET_CRYPT ksnCryptDestroy(kc->kcr); #endif diff --git a/src/net_core.h b/src/net_core.h index 0e22fcb14..33f1b1b7d 100644 --- a/src/net_core.h +++ b/src/net_core.h @@ -32,9 +32,7 @@ #include "crypt.h" #endif -#if TRUDP_VERSION == 2 #include "trudp.h" -#endif // External constants extern const char *localhost; @@ -54,11 +52,7 @@ typedef struct ksnCoreClass { double last_check_event; ///< Last time of check host event ksnetArpClass *ka; ///< Arp table class object ksnCommandClass *kco; ///< Command class object - #if TRUDP_VERSION == 1 - ksnTRUDPClass *ku; ///< TR-UDP class object - #elif TRUDP_VERSION == 2 trudpData *ku; ///< TR-UDP class object - #endif #if KSNET_CRYPT ksnCryptClass *kcr; ///< Crypt class object #endif diff --git a/src/teonet.hpp b/src/teonet.hpp index 66e512a82..dd8248ed5 100644 --- a/src/teonet.hpp +++ b/src/teonet.hpp @@ -545,7 +545,7 @@ class Teonet { type != DISPLAY_M ? _ksn_printf_format_(format) \ : _ksn_printf_format_display_m(format), \ type != DISPLAY_M ? _ksn_printf_type_(type) : "", \ - type != DISPLAY_M ? (module == NULL ? (getKe())->ksn_cfg.app_name : module) : "", \ + type != DISPLAY_M ? (module[0] == '\0' ? (getKe())->ksn_cfg.app_name : module) : "", \ type != DISPLAY_M ? __func__ : "", type != DISPLAY_M ? __FILE__ : "", \ type != DISPLAY_M ? __LINE__ : 0, __VA_ARGS__) @@ -554,7 +554,7 @@ class Teonet { type != DISPLAY_M ? _ksn_printf_format_(format) "\n" \ : _ksn_printf_format_display_m(format) "\n", \ type != DISPLAY_M ? _ksn_printf_type_(type) : "", \ - type != DISPLAY_M ? (module == NULL ? (getKe())->ksn_cfg.app_name : module) : "", \ + type != DISPLAY_M ? (module[0] == '\0' ? (getKe())->ksn_cfg.app_name : module) : "", \ type != DISPLAY_M ? __func__ : "", type != DISPLAY_M ? __FILE__ : "", \ type != DISPLAY_M ? __LINE__ : 0) @@ -850,7 +850,7 @@ class Teonet { delete(ud); }, timeout, ud); - teo_printf(NULL, DEBUG, "Register callback id %u\n", cq->id); + teo_printf("", DEBUG, "Register callback id %u\n", cq->id); return sendTDD(cmd, key, key_len, NULL, 0, cq->id); } @@ -867,7 +867,7 @@ class Teonet { // Add callback to queue and wait timeout after 5 sec ... std::cout << "!!! cqueCallback !!!\n"; auto cq = cque.add(cb, timeout, user_data); - teo_printf(NULL, DEBUG, "Register simple callback id %u\n", cq->id); + teo_printf("", DEBUG, "Register simple callback id %u\n", cq->id); return sendTDD(cmd, key, key_len, NULL, 0, cq->id); } @@ -1138,8 +1138,8 @@ class StringArray { foo.str(); \ }) -#define showMessage(mtype, msg) teo_printf(NULL, mtype, "%s", msg_to_string(msg).c_str()) -#define showMessageLn(mtype, msg) teo_printf(NULL, mtype, "%s\n", msg_to_string(msg).c_str()) +#define showMessage(mtype, msg) teo_printf("", mtype, "%s", msg_to_string(msg).c_str()) +#define showMessageLn(mtype, msg) teo_printf("", mtype, "%s\n", msg_to_string(msg).c_str()) #define watch(x) std::cout << (#x) << " = " << (x) << std::endl diff --git a/src/tr-udp.c b/src/tr-udp.c index 32ca80c06..244cdee11 100644 --- a/src/tr-udp.c +++ b/src/tr-udp.c @@ -12,1980 +12,20 @@ #include "ev_mgr.h" #include "tr-udp.h" - -#define MODULE _ANSI_LIGHTGREEN "tr_udp" _ANSI_NONE - -// Teonet TCP proxy functions -ssize_t teo_recvfrom (ksnetEvMgrClass* ke, - int fd, void *buffer, size_t buffer_len, int flags, - __SOCKADDR_ARG addr, socklen_t *__restrict addr_len); -ssize_t teo_sendto (ksnetEvMgrClass* ke, - int fd, const void *buffer, size_t buffer_len, int flags, - __CONST_SOCKADDR_ARG addr, socklen_t addr_len); - -#if TRUDP_VERSION == 1 - -#include "tr-udp_stat.h" -#include "config/conf.h" -#include "utils/utils.h" -#include "utils/rlutil.h" - -//#define VERSION_MAJOR 0 -//#define VERSION_MINOR 0 -#define DEFAULT_PRIORITY 10 - -#define kev ((ksnetEvMgrClass*)(((ksnCoreClass*)tu->kc)->ke)) - -#include "tr-udp_.h" - -/***************************************************************************** - * - * Main functions - * - *****************************************************************************/ - -/** - * Initialize TR-UDP class - * - * @param kc Pointer to ksnCoreClass object - * @return Pointer to created ksnTRUDPClass object - */ -ksnTRUDPClass *ksnTRUDPinit(void *kc) { - - ksnTRUDPClass *tu = malloc(sizeof (ksnTRUDPClass)); - tu->kc = kc; - tu->started = 0; - tu->ip_map = pblMapNewHashMap(); - ksnTRUDPregisterProcessPacket(tu, ksnCoreProcessPacket); - ksnTRUDPstatInit(tu); - write_cb_init(tu); - - return tu; -} - -/** - * Destroy TR-UDP class - * - * @param tu Pointer to ksnTRUDPClass object - */ -void ksnTRUDPDestroy(ksnTRUDPClass *tu) { - - if (tu != NULL) { - - write_cb_stop(tu); - ksnTRUDPsendListDestroyAll(tu); // Destroy all send lists - ksnTRUDPwriteQueueDestroyAll(tu); // Destroy all write queue - ksnTRUDPreceiveHeapDestroyAll(tu); // Destroy all receive heap - pblMapFree(tu->ip_map); // Free IP map - - free(tu); // Free class data - } -} - -/** - * Remove all records in IP map (include all send lists and receive heaps) - * - * @param tu Pointer to ksnTRUDPClass object - */ -void ksnTRUDPremoveAll(ksnTRUDPClass *tu) { - - if (tu != NULL) { - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - - ksnTRUDPsendListRemoveAll(tu, ip_map_d->send_list); // Remove all send lists - ksnTRUDPwriteQueueRemoveAll(tu, ip_map_d->write_queue); // Remove all write queue - ksnTRUDPreceiveHeapRemoveAll(tu, ip_map_d->receive_heap); // Remove all receive heap - } - pblIteratorFree(it); - } - pblMapClear(tu->ip_map); // Clear IP map - } -} - -// Make TR-UDP Header -#define MakeHeader(tru_header, packet_id, type, buf_len) \ - tru_header.version = TR_UDP_PROTOCOL_VERSION; \ - tru_header.payload_length = buf_len; \ - tru_header.message_type = type; \ - tru_header.id = packet_id; \ - tru_header.timestamp = ksnTRUDPtimestamp(); \ - SetHeaderChecksum(tru_header) - -// Calculate and set checksum in TR-UDP Header -#define SetHeaderChecksum(tru_header) \ - ksnTRUDPchecksumSet(&tru_header, ksnTRUDPchecksumCalculate(&tru_header)) - -/** - * Send to peer through TR-UDP transport - * - * @param tu Pointer to ksnTRUDPClass object - * @param resend_flg New message or resend sent before (0 - new, 1 -resend) - * @param id ID of resend message - * @param cmd Command to allow TR-UDP - * @param attempt Number of attempt of this message - * @param fd File descriptor of UDP connection - * @param buf Buffer with data - * @param buf_len Data length - * @param flags Flags (always 0, reserved) - * @param addr Peer address - * @param addr_len Peer address length - * - * @return Number of bytes sent to UDP - */ -ssize_t ksnTRUDPsendto(ksnTRUDPClass *tu, int resend_flg, uint32_t id, - int attempt, int cmd, int fd, const void *buf, size_t buf_len, - int flags, __CONST_SOCKADDR_ARG addr, socklen_t addr_len) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "got %d bytes data to send, cmd %d\n", buf_len, cmd - ); - #endif - - // TR-UDP: Check commands array - if(CMD_TRUDP_CHECK(cmd)) { - - // TR-UDP packet buffer - const size_t tru_ptr = sizeof (ksnTRUDP_header); // Header size - char tru_buf[KSN_BUFFER_DB_SIZE]; // Packet buffer - ksnTRUDP_header tru_header; // Header buffer - - //! \todo: If payload_length more than buffer crop data or drop this packet - if (buf_len + tru_ptr > KSN_BUFFER_DB_SIZE) { - buf_len = KSN_BUFFER_DB_SIZE - tru_ptr; - } - - // Make TR-UDP Header - MakeHeader(tru_header, - resend_flg ? id : ksnTRUDPsendListNewID(tu, addr), - TRU_DATA, - buf_len); - - // Copy TR-UDP header - memcpy(tru_buf, &tru_header, tru_ptr); - - // Copy TR-UDP message - memcpy(tru_buf + tru_ptr, buf, buf_len); - - // Add (or update) record to send list - if(ksnTRUDPsendListAdd(tu, tru_header.id, fd, cmd, buf, buf_len, flags, - attempt, addr, addr_len, tru_buf)) { - - // New buffer length - buf_len += tru_ptr; - buf = tru_buf; - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - "send %d bytes message of type: %d " - "with %d bytes data payload to %s:%d\n", - buf_len, tru_header.message_type, - tru_header.payload_length, - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port) - ); - #endif - - // Set packets time statistics - ksnTRUDPsetDATAsendTime(tu, addr); - - // Set statistic send list size - if(!resend_flg) ksnTRUDPstatSendListAdd(tu); - - // Add value to Write Queue and start write queue watcher - ksnTRUDPwriteQueueAdd(tu, fd, buf, buf_len, flags, addr, addr_len, - tru_header.id); - } - buf_len = 0; - } - - // Not TR-UDP - else { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - ">> skip this packet, " - "send %d bytes direct by UDP to: %s:%d\n", - buf_len, - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port) - ); - #endif - } - - return buf_len > 0 ? teo_sendto(kev, fd, buf, buf_len, flags, addr, addr_len) : - buf_len; -} - -/** - * Get data from peer through TR-UDP transport - * - * @param tu - * @param fd - * @param buffer - * @param buffer_len - * @param flags - * @param addr - * @param addr_len - * - * @return If return 0 than the packet is processed by tu->process_packet - * function. In other case there is value returned by UDP recvfrom - * function and the buffer contain received data - */ -ssize_t ksnTRUDPrecvfrom(ksnTRUDPClass *tu, int fd, void *buffer, - size_t buffer_len, int flags, __SOCKADDR_ARG addr, - socklen_t *addr_len) { - - /* - * Send ACK to sender subroutine - * - */ - #define ksnTRUDPSendACK() { \ - \ - ksnTRUDP_header tru_send_header; \ - memcpy(&tru_send_header, tru_header, tru_ptr); \ - tru_send_header.payload_length = 0; \ - tru_send_header.message_type = TRU_ACK; \ - tru_send_header.checksum = ksnTRUDPchecksumCalculate(&tru_send_header); \ - const socklen_t addr_len = sizeof(struct sockaddr_in); \ - teo_sendto(kev, fd, &tru_send_header, tru_ptr, 0, addr, addr_len); \ - } - - const size_t tru_ptr = sizeof (ksnTRUDP_header); // Header size - - // Get data - ssize_t recvlen = teo_recvfrom(kev, fd, buffer, buffer_len, flags, addr, - addr_len); - - // Data received - if(recvlen > 0) { - - ksnTRUDP_header *tru_header = buffer; - - // Check for TR-UDP header and its checksum - if(recvlen - tru_ptr == tru_header->payload_length && - ksnTRUDPchecksumCheck(tru_header)) { - - // Check if this sender peer is new one - ip_map_data *ipm; - int new_sender = 0; - ksnet_arp_data *arp = NULL; - if((ipm = ksnTRUDPipMapDataTry(tu, addr, NULL, 0)) != NULL) { - if((arp = ipm->arp) == NULL) { - arp = ksnetArpFindByAddr(kev->kc->ka, addr); - new_sender = 1; - } - } - else { - arp = ksnetArpFindByAddr(kev->kc->ka, addr); - new_sender = 1; - } - - // Ignore TR-UDP request if application is not in test mode and - // peer has not connected yet - if(!KSN_GET_TEST_MODE() && arp == NULL) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG, /* DEBUG_VV, */ - "ignore message: %s:%d has not registered in " - "this host yet\n", - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port) - ); - #endif - - // This event may be sent forever and stopped all the event loop - // so send disconnect to peer sent it - ksnCoreSendto(kev->kc, - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port), - CMD_DISCONNECTED, - NULL, 0 - ); - - recvlen = 0; // \todo: The received message is not processed - } - - // Process TR-UDP request - else { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "process %d bytes message of type %d, id %d, " - "with %d bytes data payload\n", - (int)recvlen, tru_header->message_type, tru_header->id, - tru_header->payload_length - ); - #endif - - // Set last activity time - ksnTRUDPsetActivity(tu, addr); - - switch (tru_header->message_type) { - - // The DATA messages are carrying payload. (has payload) - // Process this message. - // Return message with payload if there is expected message - // or zero len message if this message was push to queue. - case TRU_DATA: - { - { // Check received id = 0 from existing connection to fix RESET error - // Show new connection - if(new_sender) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - "new sender %s:%d, received packet id = %u\n", - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port), - tru_header->id - ); - #endif - } - // Check existing connection with id 0 - else if(!new_sender && !tru_header->id) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG, - "existing sender %s:%d, received packet id = %u, " - "expected id = %u, this peer send id = %u", - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port), - tru_header->id, - ipm ? ipm->expected_id : -1, - ipm ? ipm->id : -1 - ); - #endif - - // If expected connection not 0 - if(ipm && ipm->expected_id) { - - // Check received heap for record with id 0 - int num, idx = 0; - int find_in_receive_heap = 0; - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - while ((num = pblHeapSize(ip_map_d->receive_heap))) { - - if(!(idx < num)) break; - - rh_data *rh_d = ksnTRUDPreceiveHeapGet( - ip_map_d->receive_heap, idx); - - if (rh_d->id == 0) { - find_in_receive_heap = 1; - break; - } - - idx++; - } - - // Reset this host TR-UDP if received id = 0, - // expected id != 0 and received heap does not - // contain record with id = 0 - if(!find_in_receive_heap) { - // Process RESET command - ksnTRUDPreset(tu, addr, 0); - ksnTRUDPstatReset(tu); //! \todo: Do we need reset it here? - - #ifdef DEBUG_KSNET - printf(" - Reset TR-UDP ..."); - #endif - } - } - #ifdef DEBUG_KSNET - printf("\n"); - #endif - } - } - - // Send ACK to sender - ksnTRUDPSendACK(); - - // If Message ID Equals to Expected ID send message to core - // or save to message Heap sorted by ID - // ksnTRUDPReceiveHeapAdd(); - - // Read IP Map & Calculate times statistic - ip_map_data *ip_map_d = ksnTRUDPsetDATAreceiveTime(tu, addr, tru_header); - - // Read IP Map - //ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - - // Send to core if ID Equals to Expected ID - if (tru_header->id == ip_map_d->expected_id) { - - // Change Expected ID - ip_map_d->expected_id++; - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "recvfrom: Processed id %d from %s:%d\n", - tru_header->id, - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port) - ); - #endif - - // Process packet - tu->process_packet(kev->kc, buffer + tru_ptr, - tru_header->payload_length, addr); - - // Check Received message Heap and send saved - // messages to core if first records ID Equals to - // Expected ID - int num, idx = 0; - while ((num = pblHeapSize(ip_map_d->receive_heap))) { - - if(!(idx < num)) break; - - rh_data *rh_d = ksnTRUDPreceiveHeapGet( - ip_map_d->receive_heap, idx); - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "recvfrom: Check Receive Heap," - " len = %d, id = %d ... ", - num, rh_d->id - ); - #endif - - // Process this message - if (rh_d->id == ip_map_d->expected_id) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VVV, "processed"); - #endif - - // Process packet - tu->process_packet(kev->kc, rh_d->data, - rh_d->data_len, &rh_d->addr); - - // Remove this record - ksnTRUDPreceiveHeapRemove(tu, - ip_map_d->receive_heap, idx); - - // Change Expected ID - ip_map_d->expected_id++; - - // Continue check from beginning of head - idx = 0; - } - - // Remove already processed... in real world we - // never will be here - else if (rh_d->id < ip_map_d->expected_id) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VVV, "removed"); - #endif - - // Remove this record - ksnTRUDPreceiveHeapRemove(tu, - ip_map_d->receive_heap, idx); - } - - // Skip other messages and switch to next in this heap - else { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VVV, "skipped"); - #endif - - idx++; - } - } - } - - // Drop old (repeated) message - else if (tru_header->id < ip_map_d->expected_id) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "recvfrom: Drop old (repeated) message " - "with id %d\n", - tru_header->id); - #endif - - ksnTRUDPsetDATAreceiveDropped(tu, addr); - } - - // Save to Received message Heap - else { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "recvfrom: Add to receive heap, " - "id = %d, len = %d, expected id = %d\n", - tru_header->id, tru_header->payload_length, - ip_map_d->expected_id); - #endif - - ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, - tru_header->id, buffer + tru_ptr, - tru_header->payload_length, addr, *addr_len); - } - } - - recvlen = 0; // The received message is processed - break; - - // The ACK messages are used to acknowledge the arrival of the - // DATA and RESET messages. (has not payload) - // Return zero length of this message. - case TRU_ACK: - { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - "+++ got ACK to message ID %d\n", tru_header->id); - #endif - - // Calculate times statistic - ksnTRUDPsetACKtime(tu, addr, tru_header); - - // Send event to application - if(kev->event_cb != NULL) { - - sl_data *sl_d = ksnTRUDPsendListGetData(tu, - tru_header->id, addr); - if(sl_d != NULL) { - - char *data = sl_d->data_buf; - size_t data_len = sl_d->data_len; - #if KSNET_CRYPT - if(kev->ksn_cfg.crypt_f && ksnCheckEncrypted( - data, data_len)) { - - data = ksnDecryptPackage(kev->kc->kcr, data, - data_len, &data_len); - } - #endif - ksnCorePacketData rd; - memset(&rd, 0, sizeof(rd)); - - // Remote peer address and port - rd.addr = strdup(inet_ntoa( - ((struct sockaddr_in*)addr)->sin_addr)); // IP to string - rd.port = ntohs( - ((struct sockaddr_in*)addr)->sin_port); // Port to integer - - // Parse packet and check if it valid - if(ksnCoreParsePacket(data, data_len, &rd)) { - - // Send event for CMD for Application level TR-UDP mode: 128...191 - if(rd.cmd >= 128 && rd.cmd < 192) { - - kev->event_cb(kev, EV_K_RECEIVED_ACK, - (void*)&rd, // Pointer to ksnCorePacketData - sizeof(rd), // Length of ksnCorePacketData - &tru_header->id); // Pointer to packet ID - } - } - free(rd.addr); - } - } - - // Remove message from SendList and stop timer watcher - ksnTRUDPsendListRemove(tu, tru_header->id, addr); - } - recvlen = 0; // The received message is processed - break; - - // The RESET messages reset messages counter. (has not payload) - // Return zero length of this message. - case TRU_RESET: - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "+++ got RESET command"); - #endif - - // Process RESET command - ksnTRUDPreset(tu, addr, 0); - ksnTRUDPstatReset(tu); //! \todo: Do we need reset it here? - //ksnTRUDPSendACK(); //! \todo:Send ACK - - recvlen = 0; // The received message is processed - break; - - // Some error or undefined message. Don't process this message. - // Return this message without any changes. - default: - break; - } - } - } - - else { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "skip received packet"); - #endif - } - } - - return recvlen; -} - -/** - * Register process packet function for the TR-UDP recvfrom function - * - * @param tu - * @param pc - */ -inline void* ksnTRUDPregisterProcessPacket(ksnTRUDPClass *tu, - ksnTRUDPprocessPacketCb pc) { - - ksnTRUDPprocessPacketCb process_packet = tu->process_packet; - tu->process_packet = pc; - return process_packet; -} - -/***************************************************************************** - * - * Header checksum functions - * - *****************************************************************************/ - -/** - * Calculate TR-UDP header checksum - * - * @param th - * @return - */ -uint8_t ksnTRUDPchecksumCalculate(ksnTRUDP_header *th) { - - int i; - uint8_t checksum = 0; - for(i = 1; i < sizeof(ksnTRUDP_header); i++) { - checksum += *((uint8_t*) th + i); - } - - return checksum; -} - -/** - * Set TR-UDP header checksum - * - * @param th - * @param chk - * @return - */ -inline void ksnTRUDPchecksumSet(ksnTRUDP_header *th, uint8_t chk) { - - th->checksum = chk; -} - -/** - * Check TR-UDP header checksum - * - * @param th - * @return - */ -inline int ksnTRUDPchecksumCheck(ksnTRUDP_header *th) { - - return th->checksum == ksnTRUDPchecksumCalculate(th); -} - -/***************************************************************************** - * - * Utility functions - * - *****************************************************************************/ - -/** - * Get IP map record by address or create new record if not exist - * - * @param tu Pointer ksnTRUDPClass - * @param addr Peer address (created in sockaddr_in structure) - * @param key_out [out] Buffer to copy created from addr key. Don't copy if NULL - * @param key_out_len Length of buffer to copy created key - * - * @return Pointer to ip_map_data or NULL if not found - */ -ip_map_data *ksnTRUDPipMapData(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr, char *key_out, size_t key_out_len) { - - // Get ip map data by key - size_t val_len; - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(tu, addr, key, KSN_BUFFER_SM_SIZE); - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - - // Create new ip map record if it is absent - if (ip_map_d == NULL) { - - ip_map_data ip_map_d_new; - - memset(&ip_map_d_new, 0, sizeof(ip_map_data)); - ip_map_d_new.send_list = pblMapNewHashMap(); - ip_map_d_new.receive_heap = pblHeapNew(); - ip_map_d_new.write_queue = pblPriorityQueueNew(); - ip_map_d_new.arp = ksnetArpFindByAddr(kev->kc->ka, addr); - pblHeapSetCompareFunction(ip_map_d_new.receive_heap, - ksnTRUDPreceiveHeapCompare); - pblMapAdd(tu->ip_map, key, key_len, &ip_map_d_new, sizeof (ip_map_d_new)); - ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - ksnTRUDPstatAddrInit(tu, addr); - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - "create new ip_map record with key %s (num records: %d)\n", - key, pblMapSize(tu->ip_map) - ); - #endif - } - - // Copy key to output parameter - if (key_out != NULL) strncpy(key_out, key, key_out_len); - - return ip_map_d; -} - -/** - * Get IP map record by address - * - * @param tu Pointer ksnTRUDPClass - * @param addr Peer address (created in sockaddr_in structure) - * @param key_out [out] Buffer to copy created from addr key. Don't copy if NULL - * @param key_out_len Length of buffer to copy created key - * - * @return Pointer to ip_map_data or NULL if not found - */ -ip_map_data *ksnTRUDPipMapDataTry(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr, char *key_out, size_t key_out_len) { - - // Get ip map data by key - size_t val_len; - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - - // Copy key to output parameter - if (key_out != NULL) strncpy(key_out, key, key_out_len); - - return ip_map_d; -} - -/** - * Create key from address - * - * @param tu Pointer ksnTRUDPClass - * @param addr Peer address (created in sockaddr_in structure) - * @param key [out] Buffer to copy created from addr key. Don't copy if NULL - * @param key_len Length of buffer to copy created key - * - * @return Created key length - */ -size_t ksnTRUDPkeyCreate(ksnTRUDPClass* tu, __CONST_SOCKADDR_ARG addr, - char* key, size_t key_len) { - - return snprintf(key, key_len, "%s:%d", - inet_ntoa(((struct sockaddr_in *) addr)->sin_addr), - ntohs(((struct sockaddr_in *) addr)->sin_port)); -} - -/** - * Create key from address and port - * - * @param tu Pointer ksnTRUDPClass - * @param addr String with address (ip) - * @param port Port number - * @param key [out] Buffer to copy created from addr key. Don't copy if NULL - * @param key_len Length of buffer to copy created key - * - * @return Created key length - */ -inline size_t ksnTRUDPkeyCreateAddr(ksnTRUDPClass* tu, const char *addr, - int port, char* key, size_t key_len) { - - return snprintf(key, key_len, "%s:%d", addr, port); -} - -#ifdef MINGW -#define WIN32_LEAN_AND_MEAN -#include -#include // portable: uint64_t MSVC: __int64 - -// MSVC defines this in winsock2.h!? -typedef struct timeval { - long tv_sec; - long tv_usec; -} timeval; - -int gettimeofday(struct timeval * tp, struct timezone * tzp) -{ - // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's - static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); - - SYSTEMTIME system_time; - FILETIME file_time; - uint64_t time; - - GetSystemTime( &system_time ); - SystemTimeToFileTime( &system_time, &file_time ); - time = ((uint64_t)file_time.dwLowDateTime ) ; - time += ((uint64_t)file_time.dwHighDateTime) << 32; - - tp->tv_sec = (long) ((time - EPOCH) / 10000000L); - tp->tv_usec = (long) (system_time.wMilliseconds * 1000); - return 0; -} -#endif - -#include - -/** - * Get current 32 bit timestamp in thousands of milliseconds - * - * @return - */ -uint32_t ksnTRUDPtimestamp() { - - struct timeval te; - gettimeofday(&te, NULL); // get current time - long long tmilliseconds = te.tv_sec*1000000LL + te.tv_usec; // calculate thousands of milliseconds - return (uint32_t) (tmilliseconds & 0xFFFFFFFF); -} - -/** - * Make address from the IPv4 numbers-and-dots notation and integer port number - * into binary form - * - * @param addr - * @param port - * @param remaddr - * @param addr_len - * @return - */ -int make_addr(const char *addr, int port, __SOCKADDR_ARG remaddr, - socklen_t *addr_len) { - - if(*addr_len < sizeof(struct sockaddr_in)) return -3; - *addr_len = sizeof(struct sockaddr_in); // length of addresses - memset((char *) remaddr, 0, *addr_len); - ((struct sockaddr_in*)remaddr)->sin_family = AF_INET; - ((struct sockaddr_in*)remaddr)->sin_port = htons(port); - #ifndef HAVE_MINGW - if(inet_aton(addr, &((struct sockaddr_in*)remaddr)->sin_addr) == 0) { - return(-2); - } - #else - ((struct sockaddr_in*)remaddr)->sin_addr.s_addr = inet_addr(addr); - #endif - - return 0; -} - -/** - * Set last activity time - * - * @param tu - * @param addr - * @return - */ -void ksnTRUDPsetActivity(ksnTRUDPClass* tu, __CONST_SOCKADDR_ARG addr) { - - ip_map_data *ip_map_d = ksnTRUDPipMapDataTry(tu, addr, NULL, 0); - - if(ip_map_d != NULL) { - if(ip_map_d->arp != NULL) - ip_map_d->arp->last_activity = ksnetEvMgrGetTime(kev); - } -} - -/***************************************************************************** - * - * Reset functions - * - *****************************************************************************/ - -/** - * Remove send list and receive heap by input address - * - * @param tu Pointer to ksnTRUDPClass - * @param addr Peer address - * @param options Reset options: - * 0 - reset mode: clear send list and receive heap - * 1 - remove mode: clear send list and receive heap, - * and remove record from IP Map - */ -void ksnTRUDPreset(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, int options) { - - // Create key from address - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - - // Reset by key - ksnTRUDPresetKey(tu, key, key_len, options); -} - -/** - * Remove send list and receive heap by address and port - * - * @param tu Pointer to ksnTRUDPClass - * @param addr String with IP address - * @param port IP port number - * @param options Reset options: - * 0 - reset mode: clear send list and receive heap - * 1 - remove mode: clear send list and receive heap, - * and remove record from IP Map - */ -void ksnTRUDPresetAddr(ksnTRUDPClass *tu, const char *addr, int port, - int options) { - - // Create key from address - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreateAddr(0, addr, port, key, KSN_BUFFER_SM_SIZE); - - // Reset by key - ksnTRUDPresetKey(tu, key, key_len, options); -} - -/** - * TR-UDP Reset by key - * - * Remove send list and receive heap by key. - * - * @param tu Pointer to ksnTRUDPClass - * @param key Key string in format %s:%d - ip:port - * @param key_len Length of key string - * @param options Reset options: - * 0 - reset mode: clear send list and receive heap - * 1 - remove mode: clear send list and receive heap, - * and remove record from IP Map - */ -void ksnTRUDPresetKey(ksnTRUDPClass *tu, char *key, size_t key_len, int options) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, "reset %s, options: %d\n", key, options); - #endif - - // Get ip_map - size_t val_len; - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - - // Remove send list and receive heap - if (ip_map_d != NULL) { - - // Reset or remove Send List - ksnTRUDPsendListRemoveAll(tu, ip_map_d->send_list); // Remove all elements from Send List - if (options) { - pblMapFree(ip_map_d->send_list); // Free Send List - ip_map_d->send_list = NULL; // Clear Send List pointer - } - ip_map_d->id = 0; // Reset send message ID - - // Reset or remove Write queue - ksnTRUDPwriteQueueRemoveAll(tu, ip_map_d->write_queue); // Remove all elements from Write Queue - if (options) { - pblPriorityQueueFree(ip_map_d->write_queue); // Free Write Queue - ip_map_d->write_queue = NULL; // Clear Write Queue pointer - } - - // Reset or remove Receive Heap - ksnTRUDPreceiveHeapRemoveAll(tu, ip_map_d->receive_heap); // Remove all elements from Receive Heap - if (options) { - pblHeapFree(ip_map_d->receive_heap); // Free Receive Heap - ip_map_d->receive_heap = NULL; // Clear Receive Heap pointer - } - ip_map_d->expected_id = 0; // Reset receive heap expected ID - - // Reset statistic - _ksnTRUDPstatAddrInit(ip_map_d); - - // Remove IP map record (in remove mode)) - if (options) { - pblMapRemoveFree(tu->ip_map, key, key_len, &val_len); - } - } -} - -/** - * Send reset command to peer and add it to send list - * - * @param tu - * @param fd - * @param addr - */ -void ksnTRUDPresetSend(ksnTRUDPClass *tu, int fd, __CONST_SOCKADDR_ARG addr) { - - // Send reset command to peer - ksnTRUDP_header tru_header; // Header buffer - MakeHeader(tru_header, ksnTRUDPsendListNewID(tu, addr), TRU_RESET, 0); // Make TR-UDP Header - const socklen_t addr_len = sizeof(struct sockaddr_in); // Length of addresses - teo_sendto(kev, fd, &tru_header, sizeof(tru_header), 0, addr, addr_len); // Send - - //! \todo: May be Add sent reset to send list, and add Reset -} - - -/***************************************************************************** - * - * Send list functions - * - *****************************************************************************/ - -/** - * Remove message from Send message List (Acknowledge Pending Messages) - * - * @param tu - * @param id - * @param addr - * @return 1 - removed; 0 - record does not exist - * - */ -int ksnTRUDPsendListRemove(ksnTRUDPClass *tu, uint32_t id, - __CONST_SOCKADDR_ARG addr) { - - int retval = 0; - - size_t val_len; - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - if (ip_map_d != NULL) { - - // Stop send list timer and remove from map - sl_data *sl_d = pblMapGet(ip_map_d->send_list, &id, sizeof (id), &val_len); - if(sl_d != NULL) { - - // Stop send list timer - sl_timer_stop(kev->ev_loop, &sl_d->w); - - // Remove record from send list - pblMapRemoveFree(ip_map_d->send_list, &id, sizeof (id), &val_len); - - // Statistic - ksnTRUDPstatSendListRemove(tu); - - retval = 1; - } - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "message with id %d was removed from %s Send List (len %d)\n", - id, key, pblMapSize(ip_map_d->send_list) - ); - #endif - } - - return retval; -} - -/** - * Get send list data - * - * @param tu - * @param id - * @param addr - * @return - */ -sl_data *ksnTRUDPsendListGetData(ksnTRUDPClass *tu, uint32_t id, - __CONST_SOCKADDR_ARG addr) { - - sl_data *sl_d = NULL; - - size_t val_len; - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - if (ip_map_d != NULL) { - - sl_d = pblMapGet(ip_map_d->send_list, &id, sizeof (id), &val_len); - } - - return sl_d; -} - -/** - * Get Send list by address or create new record if not exist - * - * @param tu - * @param addr - * @param key_out - * @param key_out_len - * - * @return - */ -inline PblMap *ksnTRUDPsendListGet(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, - char *key_out, size_t key_out_len) { - - return ksnTRUDPipMapData(tu, addr, key_out, key_out_len)->send_list; -} - -/** - * Add packet to Sent message list - * - * Add packet to Sent message list (Acknowledge Pending Messages) and start - * timer to wait ACK - * - * @param tu - * @param id - * @param fd - * @param cmd - * @param data - * @param data_len Length of data, should be less or equal than KSN_BUFFER_SIZE - * @param flags - * @param attempt - * @param addr - * @param addr_len - * @param header - * - * @return - */ -int ksnTRUDPsendListAdd(ksnTRUDPClass *tu, uint32_t id, int fd, int cmd, - const void *data, size_t data_len, int flags, int attempt, - __CONST_SOCKADDR_ARG addr, socklen_t addr_len, void *header) { - - int rc = 0; - - // Get Send List by address from ip_map (or create new) - char key[KSN_BUFFER_SM_SIZE]; - PblMap *sl = ksnTRUDPsendListGet(tu, addr, key, KSN_BUFFER_SM_SIZE); - - // Add message to Send List - const size_t sl_d_len = sizeof(sl_data) + data_len; - char sl_d_buf[sl_d_len]; - sl_data *sl_d = (void*) sl_d_buf; - sl_d->attempt = attempt; - sl_d->data_len = data_len; // < KSN_BUFFER_SIZE ? data_len : KSN_BUFFER_SIZE; - memcpy(sl_d->data_buf, data, sl_d->data_len); - if(header != NULL) memcpy(sl_d->header, header, sizeof(sl_d->header)); - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - - // Start ACK timer watcher - double ack_wait; - size_t valueLength; - sl_data *sl_d_get = pblMapGet(sl, &id, sizeof (id), &valueLength); - if(sl_timer_init(&sl_d_get->w, &sl_d_get->w_data, tu, id, fd, cmd, flags, - addr, addr_len, attempt, &ack_wait) != NULL) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "message with id %d, command %d was added " - "to %s Send List (len %d)\n", - id, cmd, key, pblMapSize(sl) - ); - #endif - - rc = 1; - } - - // Reset this TR-UDP channel - else { - - // Remove record from send list - pblMapRemoveFree(sl, &id, sizeof (id), &valueLength); - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VV, - "reset TR-UDP if attempt = %d and wait = %f\n", - attempt, ack_wait - ); - #endif - - // Send reset and reset this TR-UDPbuffers - ksnTRUDPresetSend(tu, fd, addr); - ksnTRUDPreset(tu, addr, 0); - ksnTRUDPstatReset(tu); - } - - return rc; -} - -/** - * Get new send message ID - * - * @param tu - * @param addr - * @return - */ -inline uint32_t ksnTRUDPsendListNewID(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr) { - - return ksnTRUDPipMapData(tu, addr, NULL, 0)->id++; -} - -/** - * Remove all elements from Send List - * - * @param tu - * @param send_list - */ -void ksnTRUDPsendListRemoveAll(ksnTRUDPClass *tu, PblMap *send_list) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "sent message lists remove all"); - #endif - - if(send_list != NULL) { - PblIterator *it = pblMapIteratorReverseNew(send_list); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - void *entry = pblIteratorPrevious(it); - sl_data *sl_d = pblMapEntryValue(entry); - sl_timer_stop(kev->ev_loop, &sl_d->w); - ksnTRUDPstatSendListRemove(tu); - } - pblIteratorFree(it); - } - pblMapClear(send_list); - } -} - -/** - * Free all elements and free all Sent message lists - * - * @param tu - * @return - */ -void ksnTRUDPsendListDestroyAll(ksnTRUDPClass *tu) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "sent message lists destroy all"); - #endif - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - if(ip_map_d->send_list != NULL) { - ksnTRUDPsendListRemoveAll(tu, ip_map_d->send_list); - pblMapFree(ip_map_d->send_list); - ip_map_d->send_list = NULL; - } - } - pblIteratorFree(it); - } -} - - -/******************************************************************************* - * - * Send list timer functions - * - ******************************************************************************/ - -/** - * Calculate ACK wait time - * - * @param tu - * @param ack_wait_save - * @param addr - * @return - */ -double sl_timer_ack_time(ksnTRUDPClass *tu, double *ack_wait_save, - __CONST_SOCKADDR_ARG addr) { - - double ack_wait = MAX_ACK_WAIT*1000; - - // Calculate timer value (in milliseconds) - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - if(ip_map_d != NULL) { - ack_wait = ip_map_d->stat.triptime_last_max / 1000.0; // max last 10 triptime - if(ack_wait > 0.00) { - - // Set timer value based on max last 10 triptime - ack_wait += 1 * ack_wait * (ip_map_d->stat.packets_attempt < 10 ? 0.5 : 0.75); - - // Check minimum and maximum timer value - if(ack_wait < MIN_ACK_WAIT*1000.0) ack_wait = MIN_ACK_WAIT*1000.0; - else if(ack_wait > MAX_MAX_ACK_WAIT*1000.0) ack_wait = MAX_MAX_ACK_WAIT*1000.0; - } - // Set default start timer value - else ack_wait = MAX_ACK_WAIT*1000; - - // Save send repeat timer wait time value to statistic - ip_map_d->stat.wait = ack_wait; - } - - // Save calculated timer value to output function parameter - if(ack_wait_save != NULL) *ack_wait_save = ack_wait; - - return ack_wait; -} - -/** - * Start list timer watcher - * - * @param w - * @param w_data - * @param tu - * @param id - * @param fd - * @param cmd - * @param flags - * @param addr - * @param addr_len - * @param attempt - * @param ack_wait_save - * - * @return - */ -ev_timer *sl_timer_init(ev_timer *w, void *w_data, ksnTRUDPClass *tu, - uint32_t id, int fd, int cmd, int flags, __CONST_SOCKADDR_ARG addr, - socklen_t addr_len, int attempt, double *ack_wait_save) { - - // Calculate ACK wait time - double ack_wait = sl_timer_ack_time(tu, ack_wait_save, addr); - - // Check for "reset TR-UDP if max_count = max_value and attempt > max_attempt" - if(/*attempt > MAX_ATTEMPT * 10 ||*/ - (attempt > MAX_ATTEMPT && ack_wait == MAX_MAX_ACK_WAIT*1000)) - return NULL; - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "send list timer start, message id %d, " _ANSI_BROWN "timer value: %f" - _ANSI_NONE "\n", id, ack_wait - ); - #endif - // \todo Add this test operator if you want to stop debug_vv output - // kev->ksn_cfg.show_debug_vv_f = 0; - - // Initialize, set user data and start the timer - ev_timer_init(w, sl_timer_cb, ack_wait / 1000.00, 0.0); - sl_timer_cb_data *sl_t_data = w_data; - sl_t_data->tu = tu; - sl_t_data->id = id; - sl_t_data->fd = fd; - sl_t_data->cmd = cmd; - sl_t_data->flags = flags; - memcpy(&sl_t_data->addr, addr, addr_len); - sl_t_data->addr_len = addr_len; - w->data = sl_t_data; - //ev_timer_start(kev->ev_loop, w); - - return w; -} - -/** - * Stop list timer watcher - * - * param loop - * @param w - * @return - */ -inline void sl_timer_stop(EV_P_ ev_timer *w) { - - if(w->data != NULL) { - - #ifdef DEBUG_KSNET - ksnTRUDPClass *tu = ((sl_timer_cb_data *) w->data)->tu; - ksn_printf(kev, MODULE, DEBUG_VVV, - "send list timer stop, message id %d\n", - ((sl_timer_cb_data *) w->data)->id - ); - #endif - - // Stop timer - ev_timer_stop(EV_A_ w); - w->data = NULL; - } -} - -/** - * Send list timer callback - * - * The timer event appears if timer was not stopped during timeout. It means - * that packet was not received by peer and we need resend this packet. - * - * param loop Event loop - * @param w Watcher - * @param revents Events (not used, reserved) - */ -void sl_timer_cb(EV_P_ ev_timer *w, int revents) { - - sl_timer_cb_data sl_t_data; - memcpy(&sl_t_data, w->data, sizeof(sl_timer_cb_data)); - ksnTRUDPClass *tu = sl_t_data.tu; - - // Stop this timer - sl_timer_stop(EV_A_ w); - - // Get message from list - sl_data *sl_d = ksnTRUDPsendListGetData(tu, sl_t_data.id, &sl_t_data.addr); - - // Resend message - if (sl_d != NULL) { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - _ANSI_BROWN - "timeout at %.6f for message with id %d was happened" - _ANSI_NONE ", " - "resend %d bytes data to %s:%d\n", - w->at, - sl_t_data.id, - (int) sl_d->data_len, - inet_ntoa(((struct sockaddr_in *) &sl_t_data.addr)->sin_addr), - ntohs(((struct sockaddr_in *) &sl_t_data.addr)->sin_port) - ); - #endif - - // Resend message - ksnTRUDPsendto(tu, 1, sl_t_data.id, sl_d->attempt+1, sl_t_data.cmd, - sl_t_data.fd, sl_d->data_buf, sl_d->data_len, - sl_t_data.flags, &sl_t_data.addr, sl_t_data.addr_len); - - // Statistic - ksnTRUDPstatSendListAttempt(tu, &sl_t_data.addr); - } - - // Timer for removed message happened (a warning) - else { - - #ifdef DEBUG_KSNET - ksn_printf(kev, MODULE, DEBUG_VVV, - "timer for removed message with id %d was happened\n", - sl_t_data.id - ); - - #endif - } -} - - -/***************************************************************************** - * - * Write Queue functions - * - *****************************************************************************/ - -/** - * Free write_queue_data structure data - * - * @param wq - * @return - */ -int ksnTRUDPwriteQueueFree(write_queue_data *wq) { - - int rc = 0; - - if(wq != (void*)-1 && wq != NULL) { - - // Free sent queue data - free(wq); - - rc = 1; - } - - return rc; -} - -/** - * Remove all elements from Write Queue - * - * @param tu - * @param write_queue - */ -void ksnTRUDPwriteQueueRemoveAll(ksnTRUDPClass *tu, - PblPriorityQueue *write_queue) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "write queue remove all"); - #endif - - if(write_queue != NULL) { - - for(;;) { - - int priority; - write_queue_data *wq = pblPriorityQueueRemoveFirst( - write_queue, &priority); - - if(!ksnTRUDPwriteQueueFree(wq)) break; - } - pblPriorityQueueClear(write_queue); - } -} - -/** - * Free all elements and free all Write Queues - * - * @param tu - * @return - */ -void ksnTRUDPwriteQueueDestroyAll(ksnTRUDPClass *tu) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "write queue destroy all"); - #endif - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - if(ip_map_d->write_queue != NULL) { - ksnTRUDPwriteQueueRemoveAll(tu, ip_map_d->write_queue); - pblPriorityQueueFree(ip_map_d->write_queue); - ip_map_d->write_queue = NULL; - } - } - pblIteratorFree(it); - } -} - -/** - * Add element to Write Queue - * - * @param tu - * @param fd - * @param data - * @param data_len - * @param flags - * @param addr - * @param addr_len - * @param id - * - * @return int rc >= 0: The size of the queue. - * @return int rc < 0: An error, see pbl_errno: - */ -int ksnTRUDPwriteQueueAdd(ksnTRUDPClass *tu, int fd, const void *data, - size_t data_len, int flags, __CONST_SOCKADDR_ARG addr, - socklen_t addr_len, uint32_t id) { - - int rc = -1; - - size_t val_len; - char key[KSN_BUFFER_SM_SIZE]; - size_t key_len = ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - ip_map_data *ip_map_d = pblMapGet(tu->ip_map, key, key_len, &val_len); - if (ip_map_d != NULL) { - write_queue_data *wq = malloc(sizeof(write_queue_data)); - wq->id = id; - rc = pblPriorityQueueAddLast(ip_map_d->write_queue, DEFAULT_PRIORITY, wq); - } - - // Start write queue - write_cb_start(tu); - - return rc; -} - -/** - * Send first element from all Write Queue - * - * @param tu - * @return - */ -int ksnTRUDPwriteQueueSendAll(ksnTRUDPClass *tu) { - - int rc = 0; - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - - int priority = DEFAULT_PRIORITY; - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - if(ip_map_d->write_queue != NULL) { - - write_queue_data *wq = pblPriorityQueueRemoveFirst( - ip_map_d->write_queue, &priority); - - if(wq != (void*)-1 && wq != NULL) { - - // Get related record from Send List - size_t valueLength; - sl_data *sl_d_get = pblMapGet(ip_map_d->send_list, &wq->id, - sizeof (wq->id), &valueLength); - - // Calculate ACK wait time, start Send List timer and send message - if(sl_d_get != NULL) { - - // Calculate ACK wait time & start Send List timer - double ack_wait = sl_timer_ack_time(tu, NULL, &sl_d_get->w_data.addr); - sl_d_get->w.at = ack_wait / 1000.00; - ev_timer_start(kev->ev_loop, &sl_d_get->w); - - // Send message - teo_sendto( - kev, - sl_d_get->w_data.fd, - sl_d_get->header, - sl_d_get->data_len + sizeof(sl_d_get->header), - sl_d_get->w_data.flags, - &sl_d_get->w_data.addr, - sl_d_get->w_data.addr_len - ); - } - // Free sent queue data - ksnTRUDPwriteQueueFree(wq); - - rc++; - } - } - } - pblIteratorFree(it); - } - - return rc; -} - -/******************************************************************************* - * - * Write Queue watcher functions - * - ******************************************************************************/ - - -/** - * Start write watcher - * - * @param tu - * @return - */ -ev_io *write_cb_init(ksnTRUDPClass *tu) { - - ev_io_init(&tu->write_w, write_cb, kev->kc->fd, EV_WRITE); - tu->write_w_init_f = 1; - tu->write_w.data = tu; - write_cb_start(tu); - - return &tu->write_w; -} - -/** - * Start write watcher - * - * @param tu - * @return - */ -ev_io *write_cb_start(ksnTRUDPClass *tu) { - - ev_io_start(kev->ev_loop, &tu->write_w); - - return &tu->write_w; -} - -/** - * Stop write watcher - * - * @param tu - */ -void write_cb_stop(ksnTRUDPClass *tu) { - - // Stop watcher - ev_io_stop(kev->ev_loop, &tu->write_w); - //tu->write_w.data = NULL; -} - -/** - * Send list write callback - * - * param loop Event loop - * @param w Watcher - * @param revents Events (not used, reserved) - */ -void write_cb(EV_P_ ev_io *w, int revents) { - - ksnTRUDPClass *tu = w->data; - const int write_delay = 0; // skip all tick except this (every 5-th) - static int write_idx = 0; - - if(!write_delay || !(write_idx % write_delay)) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, (!tu->write_w_init_f ? DEBUG_VVV : DEBUG) , - _ANSI_LIGHTMAGENTA"ready to write"_ANSI_NONE - ); - #endif - if(tu->write_w_init_f) tu->write_w_init_f = 0; - - // Send one element of write queue and Stop this watcher if all is sent - if(!ksnTRUDPwriteQueueSendAll(tu)) write_cb_stop(tu); - } - write_idx++; -} - - -/******************************************************************************* - * - * Receive Heap functions - * - ******************************************************************************/ - -/** - * Receive Heap compare function. Set lower ID first - * - * @param prev - * @param next - * @return - */ -int ksnTRUDPreceiveHeapCompare(const void* prev, const void* next) { - - int rv = 0; - - if ((*((rh_data**) prev))->id > (*((rh_data**) next))->id) rv = -1; - else - if ((*((rh_data**) prev))->id < (*((rh_data**) next))->id) rv = 1; - - return rv; -} - -/** - * Add record to the Receive Heap - * - * @param tu - * @param receive_heap - * @param id - * @param data - * @param data_len - * @param addr - * @param addr_len - * - * @return - */ -int ksnTRUDPreceiveHeapAdd(ksnTRUDPClass *tu, PblHeap *receive_heap, - uint32_t id, void *data, size_t data_len, __CONST_SOCKADDR_ARG addr, - socklen_t addr_len) { - - #ifdef DEBUG_KSNET - if (tu != NULL) { - char key[KSN_BUFFER_SM_SIZE]; - ksnTRUDPkeyCreate(0, addr, key, KSN_BUFFER_SM_SIZE); - ksn_printf(kev, MODULE, DEBUG_VV, - "receive heap %s add %d bytes\n", - key, data_len - ); - } - #endif - - // Create receive heap data - rh_data *rh_d = malloc(sizeof(rh_data) + data_len); - rh_d->id = id; - rh_d->data_len = data_len; - memcpy(rh_d->data, data, data_len); - memcpy(&rh_d->addr, addr, addr_len); - - // Statistic - ksnTRUDPstatReceiveHeapAdd(tu); - - return pblHeapInsert(receive_heap, rh_d); -} - -/** - * Get first element of Receive Heap (with lowest ID) - * - * @param receive_heap - * @return Pointer to rh_data or (void*)-1 at error - The heap is empty - */ -inline rh_data *ksnTRUDPreceiveHeapGetFirst(PblHeap *receive_heap) { - - return pblHeapGetFirst(receive_heap); -} - -/** - * Get element of Receive Heap (with lowest ID) - * - * @param receive_heap - * @param index Index of the element to return - * @return Pointer to rh_data or (void*)-1 at error - The heap is empty - */ -inline rh_data *ksnTRUDPreceiveHeapGet(PblHeap *receive_heap, int index) { - - return pblHeapGet(receive_heap, index); -} - -/** - * Free Receive Heap data - * - * @param rh_d - * - * @return 1 if removed or 0 if element is absent - */ -int ksnTRUDPreceiveHeapElementFree(rh_data *rh_d) { - - int rv = 0; - if(rh_d != (void*) - 1) { - free(rh_d); - rv = 1; - } - - return rv; -} - -/** - * Remove first element from Receive Heap (with lowest ID) - * - * @param tu - * @param receive_heap - * - * @return 1 if element removed or 0 heap was empty - */ -inline int ksnTRUDPreceiveHeapRemoveFirst(ksnTRUDPClass *tu, - PblHeap *receive_heap) { - - // Statistic - ksnTRUDPstatReceiveHeapRemove(tu); - - return ksnTRUDPreceiveHeapElementFree(pblHeapRemoveFirst(receive_heap)); -} - -/** - * Remove element from Receive Heap (with lowest ID) - * - * @param tu - * @param receive_heap - * @param index Index of the element to remove - * - * @return 1 if element removed or 0 heap was empty - */ -inline int ksnTRUDPreceiveHeapRemove(ksnTRUDPClass *tu, PblHeap *receive_heap, - int index) { - - // Statistic - ksnTRUDPstatReceiveHeapRemove(tu); - - return ksnTRUDPreceiveHeapElementFree(pblHeapRemoveAt(receive_heap, index)); -} - -/** - * Remove all elements from Receive Heap - * - * @param tu - * @param receive_heap - */ -void ksnTRUDPreceiveHeapRemoveAll(ksnTRUDPClass *tu, PblHeap *receive_heap) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "receive heap remove all"); - #endif - - if(receive_heap != NULL) { - int i, num = pblHeapSize(receive_heap); - for (i = num - 1; i >= 0; i--) { - ksnTRUDPreceiveHeapElementFree(pblHeapRemoveAt(receive_heap, i)); - ksnTRUDPstatReceiveHeapRemove(tu); - } - pblHeapClear(receive_heap); - } -} - -/** - * Free all elements and free all Receive Heap - * - * @param tu - * @return - */ -void ksnTRUDPreceiveHeapDestroyAll(ksnTRUDPClass *tu) { - - #ifdef DEBUG_KSNET - ksn_puts(kev, MODULE, DEBUG_VV, "receive heap destroy all"); - #endif - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it)) { - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - if(ip_map_d->receive_heap != NULL) { - ksnTRUDPreceiveHeapRemoveAll(tu, ip_map_d->receive_heap); - pblHeapFree(ip_map_d->receive_heap); - ip_map_d->receive_heap = NULL; - } - } - pblIteratorFree(it); - } -} - -//! \todo: Expand source code documentation - -//! \todo: Describe Reset and Reset with remove in WiKi - -#endif - -#if TRUDP_VERSION == 2 - #include "trudp_ev.h" -#define kev ((ksnetEvMgrClass*)(((trudpData *)td)->user_data)) - -#ifdef USE_SEND_QUEUE - -/** - * Send queue processing data definition - */ -typedef struct process_send_queue_data { - - int inited; - trudpData *td; - struct ev_loop *loop; - ev_timer process_send_queue_w; - -} process_send_queue_data; - -/** - * Send queue processing timer libev callback - * - * @param loop - * @param w - * @param revents - */ -static void trudp_send_queue_process_cb(EV_P_ ev_timer *w, int revents) { - - process_send_queue_data *psd = (process_send_queue_data *) w->data; - ev_timer_stop(psd->loop, w); - - // Process send queue - uint64_t next_expected_time; - trudp_SendQueueProcess(psd->td, &next_expected_time); - - // Start new process_send_queue timer - if(next_expected_time) - trudp_send_queue_start_cb(psd, next_expected_time); -} - -/** - * Start send queue timer - * - * @param psd Pointer to process_send_queue_data - * @param next_expected_time - */ -static void trudp_send_queue_start_cb(process_send_queue_data *psd, - uint64_t next_expected_time) { - - uint64_t tt, next_et = UINT64_MAX, ts = trudpGetTimestampFull(); - - // If next_expected_time selected (non nil) - if(next_expected_time) { - next_et = next_expected_time > ts ? next_expected_time - ts : 0; - } - - // If next_expected_time (net) or GetSendQueueTimeout - if((tt = (next_et != UINT64_MAX) ? - next_et : trudp_SendQueueGetTimeout(psd->td, ts)) != UINT32_MAX) { - - double tt_d = tt / 1000000.0; - if(tt_d == 0.0) tt_d = 0.0001; +#define MODULE _ANSI_LIGHTGREEN "tr_udp" _ANSI_NONE - if(!psd->inited) { - ev_timer_init(&psd->process_send_queue_w, trudp_send_queue_process_cb, tt_d, 0.0); - psd->process_send_queue_w.data = (void*)psd; - psd->inited = 1; - } - else - { - if(ev_is_active(&psd->process_send_queue_w)) - ev_timer_stop(psd->loop, &psd->process_send_queue_w); - ev_timer_set(&psd->process_send_queue_w, tt_d, 0.0); - } +// Teonet TCP proxy functions +ssize_t teo_recvfrom (ksnetEvMgrClass* ke, + int fd, void *buffer, size_t buffer_len, int flags, + __SOCKADDR_ARG addr, socklen_t *__restrict addr_len); +ssize_t teo_sendto (ksnetEvMgrClass* ke, + int fd, const void *buffer, size_t buffer_len, int flags, + __CONST_SOCKADDR_ARG addr, socklen_t addr_len); - ev_timer_start(psd->loop, &psd->process_send_queue_w); - } -} -#endif +#define kev ((ksnetEvMgrClass*)(((trudpData *)td)->user_data)) /** * Allow or disallow send ACK event (EV_K_RECEIVED_ACK) to teonet event loop @@ -2531,5 +571,3 @@ void trudp_event_cb(void *tcd_pointer, int event, void *data, size_t data_length } break; } } - -#endif diff --git a/src/tr-udp.h b/src/tr-udp.h index babd1d21d..d322b8a04 100644 --- a/src/tr-udp.h +++ b/src/tr-udp.h @@ -10,94 +10,6 @@ #ifndef NET_TR_UDP_H #define NET_TR_UDP_H -#define TRUDP_VERSION 2 - -#if TRUDP_VERSION == 1 - -#ifdef HAVE_MINGW -#define WIN32_LEAN_AND_MEAN -#include -typedef int socklen_t; -#else -#include -#include -#include -#endif -#include -#include - - -/** - * registerProcessPacket callback function type definition - */ -typedef void (*ksnTRUDPprocessPacketCb) (void *kc, void *buf, size_t recvlen, - __SOCKADDR_ARG remaddr); - -/** - * TR-UDP Statistic data - */ -typedef struct tr_udp_stat { - - struct send_list { - size_t size_max; - size_t size_current; - size_t attempt; - } send_list; - - struct receive_heap { - size_t size_max; - size_t size_current; - } receive_heap; - -} tr_udp_stat; - -/** - * Teonet TR-UDP class data - */ -typedef struct ksnTRUDPClass { - - void *kc; ///< Pointer to KSNet core class object - PblMap *ip_map; ///< IP:port map - tr_udp_stat stat; ///< TR-UDP Common statistic data - ksnTRUDPprocessPacketCb process_packet; ///< TR-UDP recvfrom Process Packet function - double started; ///< Start module time - ev_io write_w; ///< Write watcher - int write_w_init_f; ///< Set to true after initialize - -} ksnTRUDPClass; - -#ifdef __cplusplus -extern "C" { -#endif - - -// Main functions -ksnTRUDPClass *ksnTRUDPinit(void *kc); -void ksnTRUDPDestroy(ksnTRUDPClass *tu); - -void ksnTRUDPremoveAll(ksnTRUDPClass *tu); - -ssize_t ksnTRUDPsendto(ksnTRUDPClass *tu, int resend_fl, uint32_t id, int attempt, - int cmd, int fd, const void *buf, size_t buf_len, int flags, - __CONST_SOCKADDR_ARG addr, socklen_t addr_len); -ssize_t ksnTRUDPrecvfrom(ksnTRUDPClass *tu, int fd, void *buf, size_t buf_len, - int flags, __SOCKADDR_ARG addr, socklen_t *addr_len); - -void *ksnTRUDPregisterProcessPacket(ksnTRUDPClass *tu, ksnTRUDPprocessPacketCb pc); - -void ksnTRUDPresetAddr(ksnTRUDPClass *tu, const char *addr, int port, int options); - -void *ksnTRUDPstatGet(ksnTRUDPClass *tu, int type, size_t *stat_len); - - -#ifdef __cplusplus -} -#endif - -#endif - -#if TRUDP_VERSION == 2 - #include "trudp.h" #define make_addr(addr_str, port, addr, addrlen) trudpUdpMakeAddr(addr_str, port, addr, addrlen) @@ -120,7 +32,5 @@ void trudp_event_cb(void *tcd_pointer, int event, void *data, } #endif -#endif - #endif /* NET_TR_UDP_H */ diff --git a/src/tr-udp_.h b/src/tr-udp_.h deleted file mode 100644 index 6bdc71dca..000000000 --- a/src/tr-udp_.h +++ /dev/null @@ -1,265 +0,0 @@ -/** - * File: tr-udp_.h - * Author: Kirill Scherba - * - * Private module structures and function definition - * - * Created on August 7, 2015, 11:34 PM - */ - - -#ifndef NET_TR_UDP__H -#define NET_TR_UDP__H - -#if TRUDP_VERSION == 1 - -#include "config/conf.h" - - -#define TR_UDP_PROTOCOL_VERSION 1 -#define MIN_ACK_WAIT 0.000732 // 000.732 MS -#define MAX_ACK_WAIT 0.500 // 500 MS -#define MAX_MAX_ACK_WAIT (MAX_ACK_WAIT * 20.0) // 10 sec -#define MAX_ATTEMPT 5 // maximum attempt with MAX_MAX_ACK_WAIT wait value - -/** - * Last 10 send statistic data - */ -typedef struct last10_data { - - uint32_t triptime; ///< Packet triptime - uint32_t size_b; ///< Size of backet in bites - uint32_t ts; ///< Packet time - -} last10_data; - -/** - * TR-UDP channel statistic data - */ -typedef struct channel_stat { - - #define LAST10_SIZE 10 - #define CS_KEY_LENGTH 21 - char key[CS_KEY_LENGTH]; ///< Channel key - uint32_t triptime_last; ///< Last trip time - uint32_t triptime_max; ///< Max trip time - uint32_t triptime_last_max; ///< Max trip time in last 10 packets - uint32_t triptime_min; ///< Min trip time - uint32_t triptime_avg; ///< Avr trip time - uint32_t packets_send; ///< Number of data or reset packets sent - uint32_t packets_attempt; ///< Number of attempt packets - uint32_t packets_receive; ///< Number of data or reset packets receive - uint32_t packets_receive_dropped; ///< Number of dropped received package - uint32_t ack_receive; ///< Number of ACK packets received - uint32_t receive_speed; ///< Receive speed in bytes per second - double receive_total; ///< Receive total in megabytes - uint32_t send_speed; ///< Send speed in bytes per second - double send_total; ///< Send total in megabytes - double wait; ///< Send repeat timer wait time value - uint32_t sq; ///< Send queue - uint32_t rq; ///< Receive queue - last10_data last_send_packets_ar[LAST10_SIZE]; ///< Last 10 send packets - size_t idx_snd; ///< Index of last_send_packet_ar - last10_data last_receive_packets_ar[LAST10_SIZE]; ///< Last 10 receive packets - size_t idx_rcv; ///< Index of last_receive_packets_ar - -} channel_stat; - -/** - * IP map records data - */ -typedef struct ip_map_data { - - uint32_t id; ///< Send message ID - uint32_t expected_id; ///< Receive message expected ID - PblMap *send_list; ///< Send messages list - PblHeap *receive_heap; ///< Received messages heap - PblPriorityQueue *write_queue; ///< Write queue - ksnet_arp_data *arp; - - channel_stat stat; ///< Channel statistic - -} ip_map_data; - -/** - * Receive heap data - */ -typedef struct rh_data { - - uint32_t id; ///< ID - struct sockaddr addr; ///< Address - socklen_t addr_len; ///< Address length - size_t data_len; ///< Data length - char data[]; ///< Data buffer - -} rh_data; - -/** - * Send List timer data structure - */ -typedef struct sl_timer_cb_data { - - ksnTRUDPClass *tu; - uint32_t id; - int fd; - int cmd; - int flags; - struct sockaddr addr; - socklen_t addr_len; - -} sl_timer_cb_data; - -#pragma pack(push) -#pragma pack(1) - -/** - * TR-UDP message header structure - */ -typedef struct ksnTRUDP_header { - - uint8_t checksum; ///< Checksum - unsigned int version : 4; ///< Protocol version number - /** - * Message type could be of type DATA(0x0), ACK(0x1) and RESET(0x2). - */ - unsigned int message_type : 4; - /** - * Payload length defines the number of bytes in the message payload - */ - uint16_t payload_length; - /** - * ID is a message serial number that sender assigns to DATA and RESET - * messages. The ACK messages must copy the ID from the corresponding DATA - * and RESET messages. - */ - uint32_t id; - /** - * Timestamp (32 byte) contains sending time of DATA and RESET messages and - * filled in by message sender. The ACK messages must copy the timestamp - * from the corresponding DATA and RESET messages. - */ - uint32_t timestamp; - -} ksnTRUDP_header; - -#pragma pack(pop) - -/** - * Send list data structure - */ -typedef struct sl_data { - - ev_timer w; ///< Watcher - sl_timer_cb_data w_data; ///< Watchers data - size_t attempt; ///< Number of attempt - size_t data_len; ///< Data buffer length - char header[sizeof (ksnTRUDP_header)]; ///< TR-UDP header - char data_buf[]; ///< Data buffer - -} sl_data; - -/** - * TR-UDP message type - */ -enum ksnTRUDP_type { - TRU_DATA, ///< The DATA messages are carrying payload. (has payload) - /** - * The ACK messages are used to acknowledge the arrival of the DATA and - * RESET messages. (has not payload) - */ - TRU_ACK, - TRU_RESET ///< The RESET messages reset messages counter. (has not payload) - -}; - -/** - * Write Queue data - */ -typedef struct write_queue_data { - - uint32_t id; - -} write_queue_data; - - -// Local methods -size_t ksnTRUDPkeyCreate(ksnTRUDPClass* tu, __CONST_SOCKADDR_ARG addr, char* key, - size_t key_len); -size_t ksnTRUDPkeyCreateAddr(ksnTRUDPClass* tu, const char *addr, int port, - char* key, size_t key_len); -ip_map_data *ksnTRUDPipMapData(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr, char *key_out, size_t key_len); -ip_map_data *ksnTRUDPipMapDataTry(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr, char *key_out, size_t key_len); -size_t ksnTRUDPkeyCreate(ksnTRUDPClass* tu, __CONST_SOCKADDR_ARG addr, - char* key, size_t key_len); -uint32_t ksnTRUDPtimestamp(); -int make_addr(const char *addr, int port, __SOCKADDR_ARG remaddr, - socklen_t *addr_len); -void ksnTRUDPsetActivity(ksnTRUDPClass* tu, __CONST_SOCKADDR_ARG addr); -// -uint8_t ksnTRUDPchecksumCalculate(ksnTRUDP_header *th); -void ksnTRUDPchecksumSet(ksnTRUDP_header *th, uint8_t chk); -int ksnTRUDPchecksumCheck(ksnTRUDP_header *th); -// -int ksnTRUDPsendListRemove(ksnTRUDPClass *tu, uint32_t id, - __CONST_SOCKADDR_ARG addr); -int ksnTRUDPsendListAdd(ksnTRUDPClass *tu, uint32_t id, int fd, int cmd, - const void *data, size_t data_len, int flags, int attempt, - __CONST_SOCKADDR_ARG addr, socklen_t addr_len, void *header); -uint32_t ksnTRUDPsendListNewID(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -void ksnTRUDPsendListDestroyAll(ksnTRUDPClass *tu); -PblMap *ksnTRUDPsendListGet(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, - char *key_out, size_t key_len); -sl_data *ksnTRUDPsendListGetData(ksnTRUDPClass *tu, uint32_t id, - __CONST_SOCKADDR_ARG addr); -void ksnTRUDPsendListRemoveAll(ksnTRUDPClass *tu, PblMap *send_list); -int ksnTRUDPwriteQueueFree(write_queue_data *wq); -void ksnTRUDPwriteQueueRemoveAll(ksnTRUDPClass *tu, PblPriorityQueue *write_queue); -void ksnTRUDPwriteQueueDestroyAll(ksnTRUDPClass *tu); -int ksnTRUDPwriteQueueAdd(ksnTRUDPClass *tu, int fd, const void *data, - size_t data_len, int flags, __CONST_SOCKADDR_ARG addr, - socklen_t addr_len, uint32_t id); -// -double sl_timer_ack_time(ksnTRUDPClass *tu, double *ack_wait_save, - __CONST_SOCKADDR_ARG addr); -ev_timer *sl_timer_init(ev_timer *w, void *w_data, ksnTRUDPClass *, uint32_t id, int fd, - int cmd, int flags, __CONST_SOCKADDR_ARG addr, socklen_t addr_len, - int attempt, double *ack_wait); -void sl_timer_stop(EV_P_ ev_timer *w); -void sl_timer_cb(EV_P_ ev_timer *w, int revents); -// -void write_cb(EV_P_ ev_io *w, int revents); -ev_io *write_cb_init(ksnTRUDPClass *tu); -ev_io *write_cb_start(ksnTRUDPClass *tu); -void write_cb_stop(ksnTRUDPClass *tu); -// -int ksnTRUDPreceiveHeapCompare(const void* prev, const void* next); -int ksnTRUDPreceiveHeapAdd(ksnTRUDPClass *tu, PblHeap *receive_heap, - uint32_t id, void *data, - size_t data_len, __CONST_SOCKADDR_ARG addr, socklen_t addr_len); -rh_data *ksnTRUDPreceiveHeapGetFirst(PblHeap *receive_heap); -rh_data *ksnTRUDPreceiveHeapGet(PblHeap *receive_heap, int index); -int ksnTRUDPreceiveHeapElementFree(rh_data *rh_d); -int ksnTRUDPreceiveHeapRemoveFirst(ksnTRUDPClass *tu, PblHeap *receive_heap); -int ksnTRUDPreceiveHeapRemove(ksnTRUDPClass *tu, PblHeap *receive_heap, int index); -void ksnTRUDPreceiveHeapRemoveAll(ksnTRUDPClass *tu, PblHeap *receive_heap); -void ksnTRUDPreceiveHeapDestroyAll(ksnTRUDPClass *tu); -// -void ksnTRUDPreset(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, int options); -void ksnTRUDPresetAddr(ksnTRUDPClass *tu, const char *addr, int port, int options); -void ksnTRUDPresetKey(ksnTRUDPClass *tu, char *key, size_t key_len, int options); -void ksnTRUDPresetSend(ksnTRUDPClass *tu, int fd, __CONST_SOCKADDR_ARG addr); - - -#ifdef __cplusplus -} -#endif - -#endif - -#if TRUDP_VERSION == 2 -#endif - -#endif /* NET_TR_UDP__H */ - diff --git a/src/tr-udp_stat.c b/src/tr-udp_stat.c index cbb74edc6..f7fdaf6b6 100644 --- a/src/tr-udp_stat.c +++ b/src/tr-udp_stat.c @@ -8,643 +8,7 @@ */ #include "tr-udp.h" -#include "tr-udp_.h" #include "tr-udp_stat.h" - -#if TRUDP_VERSION == 1 - -#include -#include - -#include "ev_mgr.h" -#include "tr-udp_stat.h" -#include "utils/utils.h" - -#include "net_core.h" - -#define MODULE _ANSI_LIGHTGREEN "tr_udp_stat" _ANSI_NONE - -/****************************************************************************** - * - * TR-UDP Common statistic - * - ******************************************************************************/ - -/** - * Initialize TR-UDP statistic submodule - * - * @param tu - * @return - */ -tr_udp_stat *ksnTRUDPstatInit(ksnTRUDPClass *tu) { - - if(tu == NULL) return 0; - - tu->stat.receive_heap.size_current = 0; - tu->stat.receive_heap.size_max = 0; - - tu->stat.send_list.size_current = 0; - tu->stat.send_list.size_max = 0; - tu->stat.send_list.attempt = 0; - - return &tu->stat; -} - -/** - * Reset TR-UDP statistic - * - * @param tu - */ -inline void ksnTRUDPstatReset(ksnTRUDPClass *tu) { - - ksnTRUDPstatInit(tu); -} - -/** - * Increment send list size - * - * @param tu - * @return - */ -inline size_t ksnTRUDPstatSendListAdd(ksnTRUDPClass *tu) { - - if(tu == NULL) return 0; - - tu->stat.send_list.size_current++; - if(tu->stat.send_list.size_current > tu->stat.send_list.size_max) - tu->stat.send_list.size_max = tu->stat.send_list.size_current; - - return tu->stat.send_list.size_current; -} - -/** - * Decrement send list size - * - * @param tu - * @return - */ -inline size_t ksnTRUDPstatSendListRemove(ksnTRUDPClass *tu) { - - if(tu == NULL) return 0; - - return --tu->stat.send_list.size_current; -} - -/** - * Increment number of send list attempts - * - * @param tu - * @param addr - * @return - */ -inline size_t ksnTRUDPstatSendListAttempt(ksnTRUDPClass *tu, - __CONST_SOCKADDR_ARG addr) { - - if(tu == NULL) return 0; - - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - ip_map_d->stat.packets_attempt++; - - return ++tu->stat.send_list.attempt; -} - -/** - * Increment receive heap size - * - * @param tu - * @return - */ -inline size_t ksnTRUDPstatReceiveHeapAdd(ksnTRUDPClass *tu) { - - if(tu == NULL) return 0; - - tu->stat.receive_heap.size_current++; - if(tu->stat.receive_heap.size_current > tu->stat.receive_heap.size_max) - tu->stat.receive_heap.size_max = tu->stat.receive_heap.size_current; - - return tu->stat.receive_heap.size_current; -} - -/** - * Increment receive heap size - * - * @param tu - * @return - */ -inline size_t ksnTRUDPstatReceiveHeapRemove(ksnTRUDPClass *tu) { - - if(tu == NULL) return 0; - - return --tu->stat.receive_heap.size_current; -} - -/** - * Show TR-UDP statistics - * - * Return string with statistics. It should be free after use. - * - * @param tu - * - * @return Pointer to allocated string with statistics - */ -char * ksnTRUDPstatShowStr(ksnTRUDPClass *tu) { - - - uint32_t packets_send = 0, packets_receive = 0, ack_receive = 0, - packets_dropped = 0; - - int i = 0; - char *tbl_str = strdup(null_str); - PblIterator *it = pblMapIteratorNew(tu->ip_map); - if(it != NULL) { - - while(pblIteratorHasNext(it)) { - - void *entry = pblIteratorNext(it); - char *key = pblMapEntryKey(entry); - size_t key_len = pblMapEntryKeyLength(entry); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - packets_send += ip_map_d->stat.packets_send; - ack_receive += ip_map_d->stat.ack_receive; - packets_receive += ip_map_d->stat.packets_receive; - packets_dropped += ip_map_d->stat.packets_receive_dropped; - - tbl_str = ksnet_sformatMessage(tbl_str, - "%s%3d "_ANSI_BROWN"%-20.*s"_ANSI_NONE" %8d %11.3f %10.3f %9.3f %8d %11.3f %10.3f %8d %8d %8d %6d %6d\n", - tbl_str, i + 1, - key_len, key, - ip_map_d->stat.packets_send, - (double)(1.0 * ip_map_d->stat.send_speed / 1024.0), - ip_map_d->stat.send_total, - ip_map_d->stat.wait, - ip_map_d->stat.packets_receive, - (double)(1.0 * ip_map_d->stat.receive_speed / 1024.0), - ip_map_d->stat.receive_total, - ip_map_d->stat.ack_receive, - ip_map_d->stat.packets_attempt, - ip_map_d->stat.packets_receive_dropped, - pblMapSize(ip_map_d->send_list), - pblHeapSize(ip_map_d->receive_heap) - ); - i++; - } - pblIteratorFree(it); - } - - char *ret_str = ksnet_formatMessage( - _ANSI_CLS"\033[0;0H" - "\n" - "---------------------------------------------------------------------------------------------------------------------------------------------\n" - "TR-UDP statistics:\n" - "---------------------------------------------------------------------------------------------------------------------------------------------\n" - "Run time: %f sec\n" - "\n" - "Packets sent: %d\n" - "ACK receive: %d\n" - "Packets receive: %d\n" - "Packets receive and dropped: %d\n" - "\n" - "Send list:\n" - " size_max: %d\n" - " size_current: %d\n" - " attempts: %d\n" - "\n" - "Receive Heap:\n" - " size_max: %d\n" - " size_current: %d\n" - "\n" - "---------------------------------------------------------------------------------------------------------------------------------------------\n" - " # Key Send Speed(kb/s) Total(mb) Wait(ms) ǀ Recv Speed(kb/s) Total(mb) ACK ǀ Repeat Drop ǀ SQ RQ \n" - "---------------------------------------------------------------------------------------------------------------------------------------------\n" - "%s" - "---------------------------------------------------------------------------------------------------------------------------------------------\n" - " " - _ANSI_GREEN"send:"_ANSI_NONE" send packets, " - _ANSI_GREEN"speed:"_ANSI_NONE" send speed(kb/s), " - _ANSI_GREEN"total:"_ANSI_NONE" send in megabytes, " - _ANSI_GREEN"wait:"_ANSI_NONE" time to wait ACK, " - _ANSI_GREEN"recv:"_ANSI_NONE" receive packets \n" - - " " - _ANSI_GREEN"ACK:"_ANSI_NONE" receive ACK, " - _ANSI_GREEN"repeat:"_ANSI_NONE" resend packets, " - _ANSI_GREEN"drop:"_ANSI_NONE" receive duplicate, " - _ANSI_GREEN"SQ:"_ANSI_NONE" send queue, " - _ANSI_GREEN"RQ:"_ANSI_NONE" receive queue \n" - , ksnetEvMgrGetTime(((ksnCoreClass *)tu->kc)->ke) - tu->started - , packets_send - , ack_receive - , packets_receive - , packets_dropped - - , tu->stat.send_list.size_max - , tu->stat.send_list.size_current - , tu->stat.send_list.attempt - , tu->stat.receive_heap.size_max - , tu->stat.receive_heap.size_current - , tbl_str - ); - - free(tbl_str); - - return ret_str; -} - -/** - * Show TR-UDP statistics on terminal - * - * Print string with statistics on terminal. - * - * @param tu - * - * @return Number if line in statistics text - */ -inline int ksnTRUDPstatShow(ksnTRUDPClass *tu) { - - int num_line = 0; - char *str = ksnTRUDPstatShowStr(tu); - - ksn_printf(((ksnetEvMgrClass*)(((ksnCoreClass*)tu->kc)->ke)), MODULE, - DISPLAY_M, - "%s", str); - - num_line = calculate_lines(str); - - free(str); - - return num_line; -} - -/** - * TR-UDP statistic data - */ -typedef struct trudp_stat { - - uint32_t packets_send; ///< Total packets send - uint32_t ack_receive; ///< Total ACK reseived - uint32_t packets_receive; ///< Total packet reseived - uint32_t packets_dropped; ///< Total packet droped - - uint32_t cs_num; ///< Number of chanels - channel_stat cs[]; ///< Cannels statistic - -} trudp_stat; - -/** - * Get TR-UDP statistic in binary or JSON format - * - * @param tu Pointer to ksnTRUDPClass - * @param type Output type: 0 - binary structure trudp_stat; 1 - JSON string - * @param stat_len [out] Size of return buffer - * @return Binary structure or JSON string depend of type parameter or NULL at - * error, should be free after use - */ -void *ksnTRUDPstatGet(ksnTRUDPClass *tu, int type, size_t *stat_len) { - - if(stat_len != NULL) *stat_len = 0; - void *retval = NULL; - - ksn_printf(((ksnetEvMgrClass*)(((ksnCoreClass*)tu->kc)->ke)), MODULE, DEBUG_VV, - "type: %d\n", type); - - // Binary output type - if(!type) { - - uint32_t cs_num = pblMapSize(tu->ip_map); - size_t ts_len = sizeof(trudp_stat) + cs_num * sizeof(channel_stat); - - trudp_stat *ts = malloc(ts_len); - if(ts != NULL) { - - memset(ts, 0, ts_len); - ts->cs_num = cs_num; - - if(cs_num) { - - PblIterator *it = pblMapIteratorNew(tu->ip_map); - if(it != NULL) { - - int i = 0; - while(pblIteratorHasNext(it)) { - - void *entry = pblIteratorNext(it); - char *key = pblMapEntryKey(entry); - size_t key_len = pblMapEntryKeyLength(entry); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - - // Common statistic - ts->packets_send += ip_map_d->stat.packets_send; - ts->ack_receive += ip_map_d->stat.ack_receive; - ts->packets_receive += ip_map_d->stat.packets_receive; - ts->packets_dropped += ip_map_d->stat.packets_receive_dropped; - - // Cannel statistic - memcpy(&ts->cs[i], &ip_map_d->stat, sizeof(ip_map_d->stat)); - memcpy(ts->cs[i].key, key, key_len < CS_KEY_LENGTH ? key_len : CS_KEY_LENGTH - 1); - ts->cs[i].sq = pblMapSize(ip_map_d->send_list); - ts->cs[i].rq = pblHeapSize(ip_map_d->receive_heap); - i++; - } - - free(it); - } - } - - // Set return values - if(stat_len != NULL) *stat_len = ts_len; - retval = ts; - } - } - - // JSON string output type - else { - - size_t ts_len; - trudp_stat *ts = ksnTRUDPstatGet(tu, 0, &ts_len); - - if(ts != NULL) { - - int i; - char *cs = strdup(""); - for(i = 0; i < ts->cs_num; i++) { - cs = ksnet_sformatMessage(cs, - "%s%s" - "{ " - "\"key\": \"%s\", " - "\"ack_receive\": %d, " - "\"packets_attempt\": %d, " - "\"packets_receive\": %d, " - "\"packets_receive_dropped\": %d, " - "\"packets_send\": %d, " - "\"receive_speed\": %11.3f, " - "\"receive_total\": %10.3f, " - "\"send_speed\": %11.3f, " - "\"send_total\": %10.3f, " - "\"triptime_avg\": %d, " - "\"triptime_last\": %d, " - "\"triptime_last_max\": %d, " - "\"triptime_max\": %d, " - "\"triptime_min\": %d, " - "\"wait\": %9.3f, " - "\"sq\": %d, " - "\"rq\": %d" - " }", - cs, i ? ", " : "", - ts->cs[i].key, - ts->cs[i].ack_receive, - ts->cs[i].packets_attempt, - ts->cs[i].packets_receive, - ts->cs[i].packets_receive_dropped, - ts->cs[i].packets_send, - (double)(1.0 * ts->cs[i].receive_speed / 1024.0), - ts->cs[i].receive_total, - (double)(1.0 * ts->cs[i].send_speed / 1024.0), - ts->cs[i].send_total, - ts->cs[i].triptime_avg, - ts->cs[i].triptime_last, - ts->cs[i].triptime_last_max, - ts->cs[i].triptime_max, - ts->cs[i].triptime_min, - ts->cs[i].wait, - ts->cs[i].sq, - ts->cs[i].rq - ); - } - - char *json_str = ksnet_formatMessage( - "{ " - "\"packets_send\": %d, " - "\"ack_receive\": %d, " - "\"packets_receive\": %d, " - "\"packets_dropped\": %d, " - "\"cs_num\": %d, " - "\"cs\": [ %s ]" - " }", - ts->packets_send, - ts->ack_receive, - ts->packets_receive, - ts->packets_dropped, - ts->cs_num, - cs - ); - free(cs); - - // Set return values and free used memory - if(stat_len != NULL) *stat_len = strlen(json_str); - retval = json_str; - free(ts); - - ksn_printf(((ksnetEvMgrClass*)(((ksnCoreClass*)tu->kc)->ke)), MODULE, DEBUG_VV, - "JSON created: %s\n", json_str); - } - } - - return retval; -} - -/****************************************************************************** - * - * TR-UDP statistic by address - * - ******************************************************************************/ - -void _ksnTRUDPstatAddrInit(ip_map_data *ip_map_d) { - - memset(&ip_map_d->stat, 0, sizeof(ip_map_d->stat)); - ip_map_d->stat.triptime_min = UINT32_MAX; -} - -/** - * Initialize packets time statistics by address - * - * @param tu - * @param addr - */ -void ksnTRUDPstatAddrInit(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) { - - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - _ksnTRUDPstatAddrInit(ip_map_d); -} - -inline void ksnTRUDPstatAddrReset(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) { - - ksnTRUDPstatAddrInit(tu, addr); -} - -void ksnTRUDPstatAddrResetAll(ksnTRUDPClass *tu) { - - PblIterator *it = pblMapIteratorReverseNew(tu->ip_map); - if (it != NULL) { - while (pblIteratorHasPrevious(it) > 0) { - void *entry = pblIteratorPrevious(it); - ip_map_data *ip_map_d = pblMapEntryValue(entry); - _ksnTRUDPstatAddrInit(ip_map_d); - } - pblIteratorFree(it); - } -} - -/** - * Destroy packets time statistics by address - * - * @param tu - * @param addr - */ -void ksnTRUDPstatAddrDestroy(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) { - - //ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); -} - -/** - * Save packets time statistics by address when ACK received - * - * @param tu - * @param addr - * @param tru_header - */ -void ksnTRUDPsetACKtime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, - ksnTRUDP_header *tru_header) { - - ip_map_data *ip_map_d = ksnTRUDPipMapDataTry(tu, addr, NULL, 0); - - if(ip_map_d != NULL) { - - // Calculate triptime last, minimal and maximum - ip_map_d->stat.triptime_last = ksnTRUDPtimestamp() - tru_header->timestamp; - ip_map_d->stat.triptime_avg = - ((uint64_t)ip_map_d->stat.ack_receive * - ip_map_d->stat.triptime_avg + ip_map_d->stat.triptime_last) / - (ip_map_d->stat.ack_receive + 1); - ip_map_d->stat.ack_receive++; - if(ip_map_d->stat.triptime_last < ip_map_d->stat.triptime_min) - ip_map_d->stat.triptime_min = ip_map_d->stat.triptime_last; - if(ip_map_d->stat.triptime_last > ip_map_d->stat.triptime_max) - ip_map_d->stat.triptime_max = ip_map_d->stat.triptime_last; - - // Add triptime to last 10 array - ip_map_d->stat.last_send_packets_ar[ip_map_d->stat.idx_snd].triptime = ip_map_d->stat.triptime_last; - - // Add last data size to last 10 array - size_t val_len; - sl_data *sl_d = pblMapGet(ip_map_d->send_list, &tru_header->id, sizeof(tru_header->id), &val_len); - if(sl_d != NULL) { - uint32_t size_b = sl_d->data_len + sizeof(ksnTRUDP_header); - ip_map_d->stat.last_send_packets_ar[ip_map_d->stat.idx_snd].size_b = size_b; - ip_map_d->stat.send_total += 1.0 * size_b / (1024.0 * 1024.0); - ip_map_d->stat.last_send_packets_ar[ip_map_d->stat.idx_snd].ts = tru_header->timestamp; - } - else { - ip_map_d->stat.last_send_packets_ar[ip_map_d->stat.idx_snd].size_b = 0; - ip_map_d->stat.last_send_packets_ar[ip_map_d->stat.idx_snd].ts = 0; - } - - // Last 10 array next index - ip_map_d->stat.idx_snd++; - if(ip_map_d->stat.idx_snd >= LAST10_SIZE) ip_map_d->stat.idx_snd = 0; - - - // Calculate max triptime & speed in bytes in sec in last 10 packet - { - int i; - uint32_t min_ts = UINT32_MAX, max_ts = 0, size_b = 0; - uint32_t triptime_last_max = 0; - for(i = 0; i < LAST10_SIZE; i++) { - - // Last maximum triptime - if(ip_map_d->stat.last_send_packets_ar[i].triptime > triptime_last_max) - triptime_last_max = ip_map_d->stat.last_send_packets_ar[i].triptime; - - // Calculate size sum & define minimum and maximum timestamp - size_b += ip_map_d->stat.last_send_packets_ar[i].size_b; - if(ip_map_d->stat.last_send_packets_ar[i].ts > max_ts) max_ts = ip_map_d->stat.last_send_packets_ar[i].ts; - else if (ip_map_d->stat.last_send_packets_ar[i].ts > 0 && ip_map_d->stat.last_send_packets_ar[i].ts < min_ts) min_ts = ip_map_d->stat.last_send_packets_ar[i].ts; - } - - // Last maximal triptime - ip_map_d->stat.triptime_last_max = (ip_map_d->stat.triptime_last_max + 2 * triptime_last_max) / 3; - - // Send speed - uint32_t dif_ts = max_ts - min_ts; - if(dif_ts) ip_map_d->stat.send_speed = 1.0 * size_b / (1.0 * (dif_ts) / 1000000.0); - else ip_map_d->stat.send_speed = 0; - } - } -} - -/** - * Save packets time statistics by address when DATE send - * - * @param tu - * @param addr - */ -inline void ksnTRUDPsetDATAsendTime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) { - - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - ip_map_d->stat.packets_send++; -} - -/** - * Save packets time statistics by address when DATE receive - * - * @param tu - * @param addr - * @param tru_header - * @return - */ -ip_map_data *ksnTRUDPsetDATAreceiveTime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, - ksnTRUDP_header *tru_header) { - - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - if(ip_map_d != NULL) { - - ip_map_d->stat.packets_receive++; - - // Add last data size to last 10 array - uint32_t size_b = tru_header->payload_length + sizeof(ksnTRUDP_header); - ip_map_d->stat.last_receive_packets_ar[ip_map_d->stat.idx_rcv].size_b = size_b; - ip_map_d->stat.last_receive_packets_ar[ip_map_d->stat.idx_rcv].ts = tru_header->timestamp; - ip_map_d->stat.receive_total += 1.0 * size_b / (1024.0 * 1024.0); - - // Last 10 array next index - ip_map_d->stat.idx_rcv++; - if(ip_map_d->stat.idx_rcv >= LAST10_SIZE) ip_map_d->stat.idx_rcv = 0; - - // Calculate speed in bytes in sec in last 10 packet - { - int i; - uint32_t min_ts = UINT32_MAX, max_ts = 0, size_b = 0; - for(i = 0; i < LAST10_SIZE; i++) { - - // Calculate size sum & define minimum and maximum timestamp - size_b += ip_map_d->stat.last_receive_packets_ar[i].size_b; - if(ip_map_d->stat.last_receive_packets_ar[i].ts > max_ts) max_ts = ip_map_d->stat.last_receive_packets_ar[i].ts; - else if (ip_map_d->stat.last_receive_packets_ar[i].ts > 0 && ip_map_d->stat.last_receive_packets_ar[i].ts < min_ts) min_ts = ip_map_d->stat.last_receive_packets_ar[i].ts; - } - - // Receive speed - uint32_t dif_ts = max_ts - min_ts; - if(dif_ts) ip_map_d->stat.receive_speed = 1.0 * size_b / (1.0 * (dif_ts) / 1000000.0); - else ip_map_d->stat.receive_speed = 0; - } - } - - return ip_map_d; -} - -/** - * Increment TR-UDP received and dropped statistic - * - * @param tu - * @param addr - */ -inline void ksnTRUDPsetDATAreceiveDropped(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) { - - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, addr, NULL, 0); - ip_map_d->stat.packets_receive_dropped++; -} - -#elif TRUDP_VERSION == 2 - #include /** @@ -733,5 +97,3 @@ inline int ksnTRUDPqueuesShow(trudpData *td) { return num_line; } - -#endif diff --git a/src/tr-udp_stat.h b/src/tr-udp_stat.h index 18cfe85aa..e6874df24 100644 --- a/src/tr-udp_stat.h +++ b/src/tr-udp_stat.h @@ -11,37 +11,11 @@ #define NET_TR_UDP_STAT_H #include "tr-udp.h" -#include "tr-udp_.h" #ifdef __cplusplus extern "C" { #endif -#if TRUDP_VERSION == 1 - -tr_udp_stat *ksnTRUDPstatInit(ksnTRUDPClass *tu); -void ksnTRUDPstatReset(ksnTRUDPClass *tu); -void ksnTRUDPstatAddrResetAll(ksnTRUDPClass *tu); -size_t ksnTRUDPstatSendListAdd(ksnTRUDPClass *tu); -size_t ksnTRUDPstatSendListRemove(ksnTRUDPClass *tu); -size_t ksnTRUDPstatSendListAttempt(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -size_t ksnTRUDPstatReceiveHeapAdd(ksnTRUDPClass *tu); -size_t ksnTRUDPstatReceiveHeapRemove(ksnTRUDPClass *tu); -char * ksnTRUDPstatShowStr(ksnTRUDPClass *tu); -int ksnTRUDPstatShow(ksnTRUDPClass *tu); - -void _ksnTRUDPstatAddrInit(ip_map_data *ip_map_d); -void ksnTRUDPstatAddrInit(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -void ksnTRUDPstatAddrDestroy(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -void ksnTRUDPstatAddrReset(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -void ksnTRUDPsetACKtime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, - ksnTRUDP_header *tru_header); -void ksnTRUDPsetDATAsendTime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); -ip_map_data *ksnTRUDPsetDATAreceiveTime(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr, ksnTRUDP_header *tru_header); -void ksnTRUDPsetDATAreceiveDropped(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr); - -#elif TRUDP_VERSION == 2 - #define MODULE _ANSI_LIGHTGREEN "tr_udp_stat" _ANSI_NONE #include "trudp_stat.h" @@ -52,7 +26,6 @@ void ksnTRUDPsetDATAreceiveDropped(ksnTRUDPClass *tu, __CONST_SOCKADDR_ARG addr) int ksnTRUDPstatShow(trudpData *tu); int ksnTRUDPqueuesShow(trudpData *td); -#endif #ifdef __cplusplus } diff --git a/src/utils/utils.h b/src/utils/utils.h index 0f55b37b8..e06bab8b7 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -56,14 +56,14 @@ typedef enum ksnet_printf_type { ksnet_printf(&((ke)->ksn_cfg), type, \ _ksn_printf_format_(format), \ _ksn_printf_type_(type), \ - module == NULL ? (ke)->ksn_cfg.app_name : module, \ + module[0] == '\0' ? (ke)->ksn_cfg.app_name : module, \ __func__, __FILE__, __LINE__, __VA_ARGS__) #define ksn_puts(ke, module, type, format) \ ksnet_printf(&((ke)->ksn_cfg), type, \ _ksn_printf_format_(format) "\n", \ _ksn_printf_type_(type), \ - module == NULL ? (ke)->ksn_cfg.app_name : module, \ + module[0] == '\0' ? (ke)->ksn_cfg.app_name : module, \ __func__, __FILE__, __LINE__) diff --git a/tests/Makefile.am b/tests/Makefile.am index 1d37be54d..542071409 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -42,7 +42,6 @@ teonet_tst_SOURCES = teonet_tst.c test_teonet_SOURCES = \ test_teonet.c \ - test_tr-udp.c \ test_crypt.c \ test_cque.c \ test_teodb.c \ diff --git a/tests/load_test/teoloadsi/src/main.c b/tests/load_test/teoloadsi/src/main.c index f381188ea..a1e8e1910 100644 --- a/tests/load_test/teoloadsi/src/main.c +++ b/tests/load_test/teoloadsi/src/main.c @@ -106,11 +106,11 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, if(!strcmp(SERVER_PEER, "none")) server_f = 1; if(!server_f) { - ksn_printf(ke, NULL, DEBUG, "Client mode, server name: %s\n\n", SERVER_PEER); + ksn_printf(ke, "", DEBUG, "Client mode, server name: %s\n\n", SERVER_PEER); id = 0; sendCmdT(ke, SERVER_PEER, ++id, 0); } - else ksn_puts(ke, NULL, DEBUG, "Server mode\n"); + else ksn_puts(ke, "", DEBUG, "Server mode\n"); start_f = 0; } @@ -118,7 +118,7 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // When peer connected case EV_K_CONNECTED: - ksn_printf(ke, NULL, DEBUG, "EV_K_CONNECTED: %s\n\n", rd->from); + ksn_printf(ke, "", DEBUG, "EV_K_CONNECTED: %s\n\n", rd->from); break; // When command received @@ -130,12 +130,12 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // Answer received with correct id if(d->type == 1 && d->id == id) { if(id == 1 || !(id%NUM_TO_SHOW)) { - ksn_printf(ke, NULL, DEBUG, + ksn_printf(ke, "", DEBUG, "EV_K_RECEIVED: <<- packet #%d <<- '%s'\n", d->id, rd->from ); if(errors) - ksn_printf(ke, NULL, DEBUG, ", %d - errors", + ksn_printf(ke, "", DEBUG, ", %d - errors", errors); printf("\n"); } @@ -144,7 +144,7 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // Request received else if(d->type == 0) { if(!(d->id%NUM_TO_SHOW)) - ksn_printf(ke, NULL, DEBUG, + ksn_printf(ke, "", DEBUG, "EV_K_RECEIVED: <<- packet #%d <<- '%s'\n", d->id, rd->from); } @@ -152,7 +152,7 @@ void event_cb(ksnetEvMgrClass *ke, ksnetEvMgrEvents event, void *data, // Answer received with incorrect id else { errors++; - ksn_printf(ke, NULL, ERROR_M, + ksn_printf(ke, "", ERROR_M, "EV_K_RECEIVED: <<- packet #%d <<- '%s'" " - Incorrect packet ID\n", d->id, rd->from); diff --git a/tests/test_teonet.c b/tests/test_teonet.c index da6793f10..2c418ecbe 100644 --- a/tests/test_teonet.c +++ b/tests/test_teonet.c @@ -18,9 +18,6 @@ // Modules functions int add_suite_1_tests(void); -#if TRUDP_VERSION == 1 -int add_suite_2_tests(void); -#endif int add_suite_3_tests(void); int add_suite_4_tests(void); int add_suite_5_tests(void); @@ -70,9 +67,6 @@ int main() { CU_cleanup_registry(); return CU_get_error(); } - #if TRUDP_VERSION == 1 - add_suite_2_tests(); - #endif // Add a suite to the registry pSuite = CU_add_suite("Teonet DB based at PBL KeyFile module functions", init_suite, clean_suite); diff --git a/tests/test_tr-udp.c b/tests/test_tr-udp.c deleted file mode 100644 index 22ccb5dab..000000000 --- a/tests/test_tr-udp.c +++ /dev/null @@ -1,849 +0,0 @@ -/** - * \file test_tr-udp.c - * \author Kirill Scherba - * - * TR-UDP module cUnit test suite - * - * cUnit test suite code: \include test_tr-udp.c - * - * Created on Aug 7, 2015, 9:31:12 PM - */ - -#include -#include -#include - -#include "ev_mgr.h" -#include "tr-udp_.h" - -#if TRUDP_VERSION == 1 - -extern CU_pSuite pSuite; - -//! Emulate initialization of ksnCoreClass -#define kc_emul() \ - ksnetEvMgrClass ke; \ - ksnCoreClass kc; \ - kc.ke = &ke; \ - kc.ka = NULL; \ - ke.kc = &kc; \ - ke.event_cb = NULL; \ - ke.ev_loop = ev_loop_new (0); \ - memset(&ke.ksn_cfg, 0 , sizeof(ke.ksn_cfg)) - -/** - * Test pblHeap functions - */ -void test_2_1() { - - // Create Receive Heap - rh_data *rh_d; - PblHeap *receive_heap; - - // Create new Heap and set compare function - CU_ASSERT((receive_heap = pblHeapNew()) != NULL); - pblHeapSetCompareFunction(receive_heap, ksnTRUDPreceiveHeapCompare); - - // Fill address - struct sockaddr_in addr; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - addr.sin_port = htons(0); - socklen_t addr_len = sizeof(addr); - - // Add some records to Receive Heap - CU_ASSERT(pblHeapSize(receive_heap) == 0); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(NULL, receive_heap, 15, "Hello 15", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(NULL, receive_heap, 12, "Hello 12", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(NULL, receive_heap, 9, "Hello 9", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(NULL, receive_heap, 14, "Hello 14", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(pblHeapSize(receive_heap) == 4); - - // Get saved Heap records and remove it - // 9 - CU_ASSERT( (rh_d = pblHeapGetFirst(receive_heap)) != NULL); - CU_ASSERT(rh_d->id == 9); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 9"); - pblHeapRemoveFirst(receive_heap); - // 12 - CU_ASSERT( (rh_d = pblHeapGetFirst(receive_heap)) != NULL); - CU_ASSERT(rh_d->id == 12); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 12"); - pblHeapRemoveFirst(receive_heap); - // 14 - CU_ASSERT( (rh_d = pblHeapGetFirst(receive_heap)) != NULL); - CU_ASSERT(rh_d->id == 14); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 14"); - pblHeapRemoveFirst(receive_heap); - // 15 - CU_ASSERT( (rh_d = pblHeapGetFirst(receive_heap)) != NULL); - CU_ASSERT(rh_d->id == 15); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 15"); - pblHeapRemoveFirst(receive_heap); - // - CU_ASSERT(pblHeapSize(receive_heap) == 0); - - // Destroy Receive Heap - pblHeapFree(receive_heap); - CU_PASS("pblHeapFree done"); -} - -/** - * Test Initialize/Destroy TR-UDP module - */ -void test_2_2() { - - // Emulate ksnCoreClass - kc_emul(); - - ksnTRUDPClass *tu; // Initialize ksnTRUDPClass - CU_ASSERT_PTR_NOT_NULL_FATAL((tu = ksnTRUDPinit(&kc))); - CU_ASSERT_PTR_NOT_NULL_FATAL(tu->ip_map); - ksnTRUDPDestroy(tu); // Destroy ksnTRUDPClass - CU_PASS("Destroy ksnTRUDPClass done"); -} - -/** - * Test TR-UDP utility functions - */ -void test_2_3() { - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const char *tst_key = "127.0.0.1:1327"; - const char *addr_str = "127.0.0.1"; - char key[KSN_BUFFER_SM_SIZE]; - struct sockaddr_in addr; - const int port = 1327; - size_t key_len; - - // Fill address - if(inet_aton(addr_str, &addr.sin_addr) == 0) CU_ASSERT(1 == 0); - addr.sin_port = htons(port); - - /* ---------------------------------------------------------------------- */ - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // 1) ksnTRUDPipMapData: Get IP map record by address or create new record if not exist - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, (__CONST_SOCKADDR_ARG) &addr, - key, KSN_BUFFER_SM_SIZE); - CU_ASSERT_STRING_EQUAL(key, tst_key); // Check key - CU_ASSERT_PTR_NOT_NULL_FATAL(ip_map_d); // Check IP map created - CU_ASSERT(ip_map_d->id == 0); // Check IP map created - CU_ASSERT(ip_map_d->expected_id == 0); // Check IP map created - CU_ASSERT_PTR_NOT_NULL_FATAL(ip_map_d->send_list); // Check send list created - CU_ASSERT_PTR_NOT_NULL_FATAL(ip_map_d->receive_heap); // Check receive heap created - CU_ASSERT(pblMapSize(ip_map_d->send_list) == 0); // Check send list functional - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 0); // Check receive heap functional - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); - - /* ---------------------------------------------------------------------- */ - // 2) ksnTRUDPKeyCreate: Create key from address - key_len = ksnTRUDPkeyCreate(NULL, (__CONST_SOCKADDR_ARG) &addr, key, - KSN_BUFFER_SM_SIZE); - // Check key - CU_ASSERT(key_len == strlen(tst_key)); - CU_ASSERT_STRING_EQUAL(key, tst_key); - - /* ---------------------------------------------------------------------- */ - // 3) ksnTRUDPKeyCreateAddr: Create key from string address and integer port - key_len = ksnTRUDPkeyCreateAddr(NULL, addr_str, port, key, KSN_BUFFER_SM_SIZE); - // Check key - CU_ASSERT(key_len == strlen(tst_key)); - CU_ASSERT_STRING_EQUAL(key, tst_key); -} - -//! Test TR-UDP reset functions -void test_2_4() { - - // Emulate ksnCoreClass - kc_emul(); - - int i; - for (i = 0; i < 2; i++) { - - // Test constants and variables - const char *addr_str = "127.0.0.1"; - struct sockaddr_in addr; - const int port = 1327; - - // Fill address - if(inet_aton(addr_str, &addr.sin_addr) == 0) CU_ASSERT(1 == 0); - addr.sin_port = htons(port); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // Add records to send list - // Create and Get pointer to Send List --------------------- - PblMap *sl = ksnTRUDPsendListGet(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl); - // Get 1 new ID = 0 ------------------ - uint32_t id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 0); - // Add 1 message to Send List - const size_t sl_d_len = sizeof(sl_data) + 12; - char sl_d_buf[sl_d_len]; - sl_data *sl_d = (void*) sl_d_buf; - sl_d->w.data = NULL; - strcpy(sl_d->data_buf, "Some data 1"); - sl_d->data_len = 12; - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - CU_ASSERT(pblMapSize(sl) == 1); - // Get 2 new ID = 1 ------------------ - id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 1); - // Add 2 message to Send List - sl_d->w.data = NULL; - strcpy(sl_d->data_buf, "Some data 2"); - sl_d->data_len = 12; - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - CU_ASSERT(pblMapSize(sl) == 2); - - // Add records to receive heap - // Add 1 records to receive heap - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, ip_map_d->expected_id, - "Some data 1", 12, (__CONST_SOCKADDR_ARG) &addr, sizeof(addr)); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 1); - CU_ASSERT(ip_map_d->expected_id == 0); - // Add 2 records to receive heap - //ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, ip_map_d->expected_id, - "Some data 2", 12, (__CONST_SOCKADDR_ARG) &addr, sizeof(addr)); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 2); - CU_ASSERT(ip_map_d->expected_id == 0); - - /* ---------------------------------------------------------------------- */ - // 1) ksnTRUDPreset: Remove send list and receive heap by input address - if(i == 0) { - ksnTRUDPreset(tu, (__CONST_SOCKADDR_ARG) &addr, i); - CU_ASSERT(pblMapSize(tu->ip_map) == 1); - CU_ASSERT(pblMapSize(sl) == 0); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 0); - } - // 2) ksnTRUDPresetAddr: Remove send list and receive heap by input address - else { - ksnTRUDPresetAddr(tu, addr_str, port, i); - CU_ASSERT(pblMapSize(tu->ip_map) == 0); // All IP map records was removed - } - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); - - //! \todo: ksnTRUDPresetSend: Send reset to peer - } -} - -//! Test TR-UDP send list functions -void test_2_5() { - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const char *addr_str = "127.0.0.1"; - struct sockaddr_in addr; - const int port = 1327; - - // Fill address - if(inet_aton(addr_str, &addr.sin_addr) == 0) CU_ASSERT(1 == 0); - addr.sin_port = htons(port); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // 1) ksnTRUDPsendListGet: Create and Get pointer to Send List - PblMap *sl = ksnTRUDPsendListGet(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl); - CU_ASSERT(pblMapSize(sl) == 0); - - // 2) ksnTRUDPsendListNewID: Get new ID - uint32_t id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 0); - - // Add 1 message to send list - const size_t sl_d_len = sizeof(sl_data) + 12; - char sl_d_buf[sl_d_len]; - sl_data *sl_d = (void*) sl_d_buf; - sl_d->w.data = NULL; - strcpy(sl_d->data_buf, "Some data 1"); - sl_d->data_len = 12; - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - CU_ASSERT(pblMapSize(sl) == 1); - - // Add 2 message to send list - id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 1); - sl_d->w.data = NULL; - strcpy(sl_d->data_buf, "Some data 2"); - sl_d->data_len = 12; - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - CU_ASSERT(pblMapSize(sl) == 2); - - // Add 3 message to send list - id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 2); - sl_d->w.data = NULL; - strcpy(sl_d->data_buf, "Some data 3"); - sl_d->data_len = 12; - pblMapAdd(sl, &id, sizeof (id), (void*) sl_d, sl_d_len); - CU_ASSERT(pblMapSize(sl) == 3); - - // 3) ksnTRUDPSendListGetData: Get Send List timer watcher and stop it - sl_data *sl_d_get = ksnTRUDPsendListGetData(tu, 1, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d_get); - CU_ASSERT_STRING_EQUAL(sl_d_get->data_buf, "Some data 2"); - - // 4) ksnTRUDPsendListRemove: Remove record from send list - ksnTRUDPsendListRemove(tu, 0, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(pblMapSize(sl) == 2); - - // 5) ksnTRUDPsendListRemove: Remove all record from send list - ksnTRUDPsendListRemoveAll(tu, sl); - CU_ASSERT(pblMapSize(sl) == 0); - - // 6 ksnTRUDPsendListAdd: Add packet to Sent message list - id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - ksnTRUDPsendListAdd(tu, id, 0, 0, "Some data 4", 12, 0, 0, (__CONST_SOCKADDR_ARG) &addr, sizeof(addr), NULL); - sl_d_get = ksnTRUDPsendListGetData(tu, id, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d_get); - CU_ASSERT_STRING_EQUAL(sl_d_get->data_buf, "Some data 4"); - sl_timer_stop(ke.ev_loop, &sl_d_get->w); - CU_ASSERT_PTR_NULL(sl_d_get->w.data); - CU_PASS("Send list timer was stopped"); - - // 7 ksnTRUDPSendListDestroyAll: Free all elements and free all Sent message lists - ksnTRUDPsendListDestroyAll(tu); - CU_PASS("Destroy all sent message lists done"); - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); -} - -//! Callback, this time for a time-out -static void timeout_cb (EV_P_ ev_timer *w, int revents) { - - //puts ("timeout"); - // this causes the innermost ev_run to stop iterating - ev_break (EV_A_ EVBREAK_ONE); -} - -//! Test TR-UDP send list timer functions -void test_2_6() { - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const char *addr_str = "127.0.0.1"; - struct sockaddr_in addr; - const int port = 1327; - - // Fill address - if(inet_aton(addr_str, &addr.sin_addr) == 0) CU_ASSERT(1 == 0); - addr.sin_port = htons(port); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // 1) sl_timer_start: Start the send list timer - // Create and Get pointer to Send List - PblMap *sl = ksnTRUDPsendListGet(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl); - // Get new ID - uint32_t id = ksnTRUDPsendListNewID(tu, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT(id == 0); - // Add message to send list and start the send list timer - ksnTRUDPsendListAdd(tu, id, 0, CMD_TUN, "Some data 1", 12, 0, 0, (__CONST_SOCKADDR_ARG) &addr, sizeof(addr), NULL); - CU_ASSERT(pblMapSize(sl) == 1); // Number of records in send list - - // 2) sl_timer_cb: Process send list timer callback - // Define timer to stop event loop after MAX_ACK_WAIT * 2 + 20%. This time need to run timer twice. - ev_timer timeout_watcher; - ev_timer_init (&timeout_watcher, timeout_cb, MAX_ACK_WAIT*2 + MAX_ACK_WAIT * 0.2, 0.0); - ev_timer_start (ke.ev_loop, &timeout_watcher); - // Start event loop - ev_run (ke.ev_loop, 0); - CU_ASSERT(pblMapSize(sl) == 1); // Number of records in send list - printf(" ev_loop exit ..."); - // Check data in send list - sl_data *sl_d_get = ksnTRUDPsendListGetData(tu, id, (__CONST_SOCKADDR_ARG) &addr); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d_get); - CU_ASSERT(sl_d_get->attempt == 2); // Number of attempt was done is equal 2 - - // 3) sl_timer_stop: Stop the send list timer - sl_timer_stop(ke.ev_loop, &sl_d_get->w); - CU_ASSERT_PTR_NULL(sl_d_get->w.data); - sl_timer_stop(ke.ev_loop, &sl_d_get->w); // Test stop timer twice - CU_PASS("Send list timer was stopped"); - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); -} - -//! Test TR-UDP receive heap functions -void test_2_7() { - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const size_t addr_len = sizeof(struct sockaddr_in); - const char *addr_str = "127.0.0.1"; - struct sockaddr_in addr; - const int port = 1327; - - // Fill address - if(inet_aton(addr_str, &addr.sin_addr) == 0) CU_ASSERT(1 == 0); - addr.sin_port = htons(port); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // Get IP Map - ip_map_data *ip_map_d = ksnTRUDPipMapData(tu, (__CONST_SOCKADDR_ARG) &addr, NULL, 0); - CU_ASSERT_PTR_NOT_NULL_FATAL(ip_map_d); - - // ksnTRUDPReceiveHeapCompare - - // 1) ksnTRUDPreceiveHeapAdd, ksnTRUDPreceiveHeapCompare: Add record to the Receive Heap - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, 15, "Hello 15", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, 12, "Hello 12", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, 9, "Hello 9", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(0 < ksnTRUDPreceiveHeapAdd(tu, ip_map_d->receive_heap, 14, "Hello 14", 9, (__SOCKADDR_ARG) &addr, addr_len)); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 4); - - // 2) ksnTRUDPreceiveHeapGetFirst: Get first element of Receive Heap (with lowest ID) - rh_data *rh_d = ksnTRUDPreceiveHeapGetFirst(ip_map_d->receive_heap); - CU_ASSERT_PTR_NOT_NULL_FATAL(rh_d); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 9"); - CU_ASSERT(rh_d->id == 9); - - // 3) ksnTRUDPreceiveHeapRemoveFirst, ksnTRUDPreceiveHeapElementFree: Remove first element from Receive Heap (with lowest ID) - CU_ASSERT(ksnTRUDPreceiveHeapRemoveFirst(tu, ip_map_d->receive_heap) == 1); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 3); - - // 4) ksnTRUDPreceiveHeapGetFirst: Get first element of Receive Heap (with lowest ID) - rh_d = ksnTRUDPreceiveHeapGetFirst(ip_map_d->receive_heap); - CU_ASSERT_PTR_NOT_NULL_FATAL(rh_d); - CU_ASSERT_STRING_EQUAL(rh_d->data, "Hello 12"); - CU_ASSERT(rh_d->id == 12); - - // 5) ksnTRUDPReceiveHeapRemoveAll: Remove all elements from Receive Heap - ksnTRUDPreceiveHeapRemoveAll(tu, ip_map_d->receive_heap); - CU_ASSERT(pblHeapSize(ip_map_d->receive_heap) == 0); - - // 6) ksnTRUDPReceiveHeapDestroyAll - ksnTRUDPreceiveHeapDestroyAll(tu); - CU_PASS("Destroy all receive heap"); - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); -} - -#include -#include -#include -#include - -/** - * Create and bind UDP socket for client/server - * - * @param port UDP port number - * @return - */ -int bind_udp(int *port) { - - int sd, i; - struct sockaddr_in addr; // Our address - - // Create a UDP socket - if((sd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror(" cannot create socket ..."); - return -1; - } - - // Set server socket options -// if (set_reuseaddr(sd) == -1) { -// // error handling -// perror(" can't set socket options\n"); -// return -3; -// } - - // Bind the socket to any valid IP address and a specific port, increment - // port if busy - for(i=0;;) { - - memset((char *)&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl(INADDR_ANY); - addr.sin_port = htons(*port); - - if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - - // Show message. Use perror to show this message in the test output - char *err_msg = ksnet_formatMessage( - " " - "Bind at port %d failed ...", - *port - ); - perror(err_msg); - free(err_msg); - (*port)++; - if(i++ < NUMBER_TRY_PORTS) continue; - else return -2; - - } - else break; - } - - // Set non block mode - teosockSetBlockingMode(sd, TEOSOCK_NON_BLOCKING_MODE); - - return sd; -} - -//! TR-UDP sendto function -void test_2_8() { - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const size_t addr_len = sizeof(struct sockaddr_in); - const char *addr_str = "127.0.0.1"; - struct sockaddr_in addr_s, addr_r; - int fd_s, fd_r, port_s = 9027, port_r = 9029; - - // Start test UDP sender - fd_s = bind_udp(&port_s); - CU_ASSERT_FATAL(fd_s > 0); - - // Start test UDP receiver - fd_r = bind_udp(&port_r); - CU_ASSERT_FATAL(fd_r > 0); - - // Fill sender address - if(inet_aton(addr_str, &addr_s.sin_addr) == 0) CU_ASSERT(1 == 0); - addr_s.sin_family = AF_INET; - addr_s.sin_port = htons(port_s); - - // Fill receiver address - if(inet_aton(addr_str, &addr_r.sin_addr) == 0) CU_ASSERT(1 == 0); - addr_r.sin_family = AF_INET; - addr_r.sin_port = htons(port_r); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // 1) ksnTRUDPsendto test - // - // Prepare data to SendTo receiver - const char *buf1 = "Hello world - 1"; // Data to send - const char *buf2 = "Hello world - 1"; // Data to send - size_t buf_len = strlen(buf1) + 1; // Size of send data - const size_t tru_ptr = sizeof (ksnTRUDP_header); // TR-UDP header size - // - // a) Send one message receiver - ssize_t sent = ksnTRUDPsendto(tu, 0, 0, 0, CMD_TUN, fd_s, buf1, buf_len, 0, - (__CONST_SOCKADDR_ARG) &addr_r, addr_len); // TR-UDP sendto - if(sent < 0) printf(" sent to %d = %d, fd = %d: %s ...", port_r, (int)sent, fd_s, strerror(errno)); - // Check sent result - CU_ASSERT_FATAL(sent > 0); - CU_ASSERT(sent == buf_len + tru_ptr); - // - // Prepare data to Read packet from socket - struct sockaddr_in addr_recv; - char buf_recv[KSN_BUFFER_SIZE]; - size_t addr_recv_len = sizeof(addr_recv); - ksnTRUDP_header *tru_header = (ksnTRUDP_header *) buf_recv; - // - // b) Receive packet from socket - ssize_t recvlen = recvfrom(fd_r, buf_recv, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t *__restrict)&addr_recv_len); - if(recvlen < 0) printf(" recv = %d: %s ...", (int)recvlen, strerror(errno)); - // Check receive result - CU_ASSERT_FATAL(recvlen == sent); // Receive length equal send length - CU_ASSERT(tru_header->id == 0); // Packet id = 0 - CU_ASSERT(tru_header->payload_length == buf_len); // Payload length equal send buffer length - CU_ASSERT_STRING_EQUAL(buf1, buf_recv + tru_ptr); // Content of send buffer equal to received data - // - // c) Send next packet - sent = ksnTRUDPsendto(tu, 0, 0, 0, CMD_TUN, fd_s, buf2, buf_len, 0, - (__CONST_SOCKADDR_ARG) &addr_r, addr_len); // TR-UDP sendto - CU_ASSERT_FATAL(sent > 0); - // - // d) Receive packet with next id = 1 - recvlen = recvfrom(fd_r, buf_recv, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t *__restrict)&addr_recv_len); - CU_ASSERT(tru_header->id == 1); // Packet id = 1 - // - // e) Check send list - it should contain 2 records (with id = 0 and 1) - PblMap *sl = ksnTRUDPsendListGet(tu, (__SOCKADDR_ARG) &addr_r, NULL, 0); - CU_ASSERT_PTR_NOT_NULL_FATAL(sl); - CU_ASSERT(pblMapSize(sl) == 2); - // - // Define timer to stop event loop after MAX_ACK_WAIT + 20%. This time need to run send list twice. - ev_timer timeout_watcher; - ev_timer_init (&timeout_watcher, timeout_cb, MAX_ACK_WAIT*1 + MAX_ACK_WAIT*0.2, 0.0); - ev_timer_start (ke.ev_loop, &timeout_watcher); - // - // f) Start event loop - ev_run (ke.ev_loop, 0); - // - // g) The sent packets will be resend by send list timer - recvlen = recvfrom(fd_r, buf_recv, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t *__restrict)&addr_recv_len); - CU_ASSERT(tru_header->id == 0); // Packet id = 0 - recvlen = recvfrom(fd_r, buf_recv, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t *__restrict)&addr_recv_len); - CU_ASSERT(tru_header->id == 1); // Packet id = 1 - // Check send list - it should contain 2 records (with id = 0 and 1 and attempt 1) - CU_ASSERT(pblMapSize(sl) == 2); // Send list size = 2 - sl_data *sl_d = ksnTRUDPsendListGetData(tu, 0, (__CONST_SOCKADDR_ARG)&addr_r); // Check id = 0 - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d); // id = 0 present - CU_ASSERT(sl_d->attempt == 1); // Number of attempt 1 - CU_ASSERT_STRING_EQUAL(sl_d->data_buf, buf1); // Receive buffer equal to send buffer - sl_d = ksnTRUDPsendListGetData(tu, 1, (__CONST_SOCKADDR_ARG)&addr_r); // Check id = 1 - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d); // id = 1 present - CU_ASSERT(sl_d->attempt == 1); // Number of attempt 1 - CU_ASSERT_STRING_EQUAL(sl_d->data_buf, buf2); // Receive buffer equal to send buffer - // - // h) Send ACK from receiver to sender to remove one packet from send list - tru_header->id = 1; - tru_header->message_type = TRU_ACK; - tru_header->payload_length = 0; - tru_header->timestamp = 0; - tru_header->version = TR_UDP_PROTOCOL_VERSION; - tru_header->checksum = ksnTRUDPchecksumCalculate(tru_header); - sent = sendto(fd_r, tru_header, tru_ptr, 0, (__CONST_SOCKADDR_ARG)&addr_s, addr_len); - CU_ASSERT_FATAL(sent > 0); - recvlen = ksnTRUDPrecvfrom(tu, fd_s, buf_recv, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, &addr_recv_len); - CU_ASSERT(recvlen == 0); - CU_ASSERT(pblMapSize(sl) == 1); // Send list size = 1 - sl_d = ksnTRUDPsendListGetData(tu, 0, (__CONST_SOCKADDR_ARG)&addr_r); // Check id = 0 - CU_ASSERT_PTR_NOT_NULL_FATAL(sl_d); // id = 0 present - // - // j) Clear send list - ksnTRUDPsendListRemoveAll(tu, sl); - CU_ASSERT(pblMapSize(sl) == 0); - - // Stop test UDP sender & receiver - close(fd_s); - close(fd_r); - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); -} - -uint32_t expected_id = 0; - -/** - * Process packet - * - * @param vkc - * @param buf - * @param recvlen - * @param remaddr - * - */ -void process_packet (void *vkc, void *buf, size_t recvlen, __SOCKADDR_ARG remaddr) { - - //ksnCoreClass *kc = vkc; // ksnCoreClass Class object - - uint32_t id; - sscanf((char*) buf,"%*s %*s %d", &id); - //printf("\nreceive: id %d ...\n", id); - CU_ASSERT(id == expected_id); - expected_id++; -} - -/** - * Random range - * - * @param min From - * @param max To - */ -unsigned int randr(unsigned int min, unsigned int max) -{ - double scaled = (double)rand()/RAND_MAX; - - return (max - min +1)*scaled + min; -} - -/** - * Send to for use in tests - */ -ssize_t test_sendto(int fd_s, uint32_t id, uint8_t message_type, void *buf, - size_t buf_len, __CONST_SOCKADDR_ARG addr_r, size_t addr_len) { - - char buf_send[KSN_BUFFER_SIZE]; - ksnTRUDP_header *tru_header = (ksnTRUDP_header *) buf_send; - const size_t tru_ptr = sizeof (ksnTRUDP_header); // TR-UDP header size - - tru_header->id = id; - tru_header->message_type = message_type; - tru_header->payload_length = buf_len; - tru_header->timestamp = 0; - tru_header->version = TR_UDP_PROTOCOL_VERSION; - tru_header->checksum = ksnTRUDPchecksumCalculate(tru_header); - memcpy(buf_send + tru_ptr, buf, buf_len); - - return sendto(fd_s, buf_send, tru_ptr + buf_len, 0, addr_r, addr_len); -} - -//! Test main TR-UDP function ksnTRUDPreceivefrom -void test_2_9() { - - /** - * Check ACK macro - */ - #define check_ACK(ID) { \ - recvlen = recvfrom(fd_s, buf, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t*)&addr_recv_len); \ - CU_ASSERT(recvlen == sizeof(ksnTRUDP_header)); \ - ksnTRUDP_header *rh = (ksnTRUDP_header *) buf; \ - CU_ASSERT(rh->id == ID); \ - CU_ASSERT(rh->message_type == TRU_ACK); \ - } - - // Emulate ksnCoreClass - kc_emul(); - - // Test constants and variables - const size_t addr_len = sizeof(struct sockaddr_in); - struct sockaddr_in addr_s, addr_r, addr_recv; - int fd_s, fd_r, port_s = 9027, port_r = 9029; - const char *addr_str = "127.0.0.1"; - size_t addr_recv_len = addr_len; - char buf[KSN_BUFFER_SIZE]; - - // Start test UDP sender - fd_s = bind_udp(&port_s); - CU_ASSERT_FATAL(fd_s > 0); - printf("bind s OK ..."); - - // Start test UDP receiver - fd_r = bind_udp(&port_r); - CU_ASSERT_FATAL(fd_r > 0); - printf("bind r OK ..."); - - // Fill sender address - if(inet_aton(addr_str, &addr_s.sin_addr) == 0) CU_ASSERT(1 == 0); - addr_s.sin_family = AF_INET; - addr_s.sin_port = htons(port_s); - - // Fill receiver address - if(inet_aton(addr_str, &addr_r.sin_addr) == 0) CU_ASSERT(1 == 0); - addr_r.sin_family = AF_INET; - addr_r.sin_port = htons(port_r); - - // Initialize ksnTRUDPClass - ksnTRUDPClass *tu = ksnTRUDPinit(&kc); // Initialize ksnTRUDPClass - kc.ku = tu; - CU_ASSERT_PTR_NOT_NULL_FATAL(tu); - - // Register process packet function - ksnTRUDPregisterProcessPacket(tu, process_packet); - - // 1) test ksnTRUDPreceivefrom: test receive packets with data - // a) Send one message to receiver - // ID 0 - const char *send_str = "Hello world 0"; // Data to send - size_t buf_len = strlen(send_str) + 1; // Size of send, data - ssize_t sent = test_sendto(fd_s, 0, TRU_DATA, (void*)send_str, buf_len, (__CONST_SOCKADDR_ARG) &addr_r, addr_len); - CU_ASSERT_FATAL(sent > 0); - ssize_t recvlen = ksnTRUDPrecvfrom(tu, fd_r, buf, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t*)&addr_recv_len); - CU_ASSERT(recvlen == 0); - // get ACK from receiver - check_ACK(0); - // b) Send two messages with mixed id to receiver - // ID 2 - send_str = "Hello world 2 "; // Data to send - buf_len = strlen(send_str) + 1; // Size of send, data - sent = test_sendto(fd_s, 2, TRU_DATA, (void*)send_str, buf_len, (__SOCKADDR_ARG) &addr_r, addr_len); - CU_ASSERT_FATAL(sent > 0); - recvlen = ksnTRUDPrecvfrom(tu, fd_r, buf, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t*)&addr_recv_len); - CU_ASSERT(recvlen == 0); - // get ACK from receiver - check_ACK(2); - // ID 1 - send_str = "Hello world 1 "; // Data to send - buf_len = strlen(send_str) + 1; // Size of send, data - sent = test_sendto(fd_s, 1, TRU_DATA, (void*)send_str, buf_len, (__CONST_SOCKADDR_ARG) &addr_r, addr_len); - CU_ASSERT_FATAL(sent > 0); - recvlen = ksnTRUDPrecvfrom(tu, fd_r, buf, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t*)&addr_recv_len); - CU_ASSERT(recvlen == 0); - // get ACK from receiver - check_ACK(1); - // c) send messages with random mixed id from 3 to 25 until recvfrom - // receive all messages from 3 to 25, all repeated id's in this transmission - // will be ignored and dropped - // ID 3 - 25 - while(expected_id < 26) { - uint32_t id = randr(3,25); - sprintf(buf, "Hello world %d", id); - //printf(" send: %s ...", buf); - buf_len = strlen(buf) + 1; // Size of send, data - sent = test_sendto(fd_s, id, TRU_DATA, buf, buf_len, (__CONST_SOCKADDR_ARG) &addr_r, addr_len); - CU_ASSERT_FATAL(sent > 0); - recvlen = ksnTRUDPrecvfrom(tu, fd_r, buf, KSN_BUFFER_SIZE, 0, (__SOCKADDR_ARG) &addr_recv, (socklen_t*)&addr_recv_len); - CU_ASSERT(recvlen == 0); - // get ACK from receiver - check_ACK(id); - } - - // Stop test UDP sender & receiver - close(fd_s); - close(fd_r); - - // Destroy ksnTRUDPClass - ksnTRUDPDestroy(tu); - CU_PASS("Destroy ksnTRUDPClass done"); -} - - -/** - * Add TR-UDP suite tests - * - * @return - */ -int add_suite_2_tests(void) { - - // Add the tests to the suite - if ((NULL == CU_add_test(pSuite, "pblHeap functions", test_2_1)) || - (NULL == CU_add_test(pSuite, "Initialize/Destroy TR-UDP module", test_2_2)) || - (NULL == CU_add_test(pSuite, "TR-UDP utility functions", test_2_3)) || - (NULL == CU_add_test(pSuite, "TR-UDP reset functions", test_2_4)) || - (NULL == CU_add_test(pSuite, "TR-UDP send list functions", test_2_5)) || - (NULL == CU_add_test(pSuite, "TR-UDP send list timer functions", test_2_6)) || - (NULL == CU_add_test(pSuite, "TR-UDP receive heap functions", test_2_7)) || - (NULL == CU_add_test(pSuite, "TR-UDP sendto function", test_2_8)) || - (NULL == CU_add_test(pSuite, "TR-UDP recvfrom function", test_2_9)) - ) { - CU_cleanup_registry(); - return CU_get_error(); - } - - return 0; -} - -#endif