/** * Print out the entirety of the server cache. * * @param ssp server stats pointer */ void server_stats_dump(SERVER_STATS *ssp) { SFXHASH_NODE *nodep; if(ssp && ssp->ipv4_table) { for( nodep = sfxhash_ghead(ssp->ipv4_table); nodep != NULL; nodep = sfxhash_gnext(nodep) ) { SERVER_KEY *kp = (SERVER_KEY *) nodep->key; u_int32_t count = *(u_int32_t *) nodep->data; flow_printf("hits: %u proto: %3u port: %5u ip: %s\n", count, kp->protocol, kp->port, inet_ntoa(*(struct in_addr *)&kp->address)); } } else { flow_printf("nothing to dump!\n"); } }
/*! * Return the most recently used data from the global list * * @param t SFXHASH table pointer * * @return void* valid pointer to the users data * @retval 0 node not found * */ void * sfxhash_mru( SFXHASH * t ) { SFXHASH_NODE * hnode; hnode = sfxhash_ghead(t); if( hnode ) return hnode->data; return NULL; }
/*! * Return the most recently used node from the global list * * @param t SFXHASH table pointer * * @return SFXHASH_NODE* valid pointer to a node * @retval 0 node not found * */ SFXHASH_NODE * sfxhash_mru_node( SFXHASH * t ) { SFXHASH_NODE * hnode; hnode = sfxhash_ghead(t); if( hnode ) return hnode; return NULL; }
/** * Print out the entirety of the scoreboard * * @param ssp unique tracker */ void scoreboard_dump(SCOREBOARD *ssp) { SFXHASH_NODE *nodep; if(ssp && ssp->ipv4_table) { for( nodep = sfxhash_ghead(ssp->ipv4_table); nodep != NULL; nodep = sfxhash_gnext(nodep) ) { u_int32_t *address = (u_int32_t *) nodep->key; SCORE_ENTRY *entry = (SCORE_ENTRY *) nodep->data; flowps_entry_print(entry, address); } } else { flow_printf("nothing to dump!\n"); } }
int server_stats_save(SERVER_STATS *ssp, char *filename) { SFXHASH_NODE *nodep; unsigned char buf[STATSREC_SIZE]; int fd; if(!filename || !ssp) return FLOW_ENULL; #ifndef O_SYNC #define O_SYNC O_FSYNC #endif /* open this description, create it if necessary, always wait on * sync to disk w/ every write, only write */ fd = open(filename, O_CREAT|O_TRUNC|O_SYNC|O_WRONLY); if(fd < 0) { if(s_debug) { flow_printf("%s was not found\n", filename); } return FLOW_NOTFOUND; } /* this is a crappy parser... that's par for the course */ for( nodep = sfxhash_ghead(ssp->ipv4_table); nodep != NULL; nodep = sfxhash_gnext(nodep) ) { SERVER_KEY *kp = (SERVER_KEY *) nodep->key; u_int32_t count = *(u_int32_t *) nodep->data; u_int8_t family = '4'; u_int32_t ipv4_address; u_int16_t port; u_int8_t protocol; ssize_t wbytes = 0; ssize_t wsize; count = ntohl(count); ipv4_address = htonl(kp->address); port = htons(kp->port); protocol = kp->protocol; memcpy(buf + FAMILY_OFFSET, &family, FAMILY_SIZE); memcpy(buf + IPV4_OFFSET, &ipv4_address, IPV4_SIZE); memcpy(buf + PORT_OFFSET, &port, PORT_SIZE); memcpy(buf + IP_PROTO_OFFSET, &protocol, IP_PROTO_SIZE); memcpy(buf + COUNT_OFFSET, &count, COUNT_SIZE); /* now make sure we get a full record on disk */ while(wbytes < STATSREC_SIZE) { /* write the number of bytes we already have - the # * already written */ wsize = write(fd, buf, (STATSREC_SIZE - wbytes)); if(wsize < 0) { /* this record was truncated */ flow_printf("Truncated Server Record!\n"); return FLOW_EINVALID; } else { wbytes += wsize; } } } return FLOW_SUCCESS; }