nfdump/bin/nfdump_inline.c
2015-10-03 14:06:34 +02:00

128 lines
5.5 KiB
C
Executable File

/*
* Copyright (c) 2014, Peter Haag
* Copyright (c) 2009, Peter Haag
* Copyright (c) 2004-2008, SWITCH - Teleinformatikdienste fuer Lehre und Forschung
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of the author nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Author: haag $
*
* $Id: nfdump_inline.c 39 2009-11-25 08:11:15Z haag $
*
* $LastChangedRevision: 39 $
*
*
*/
// to improve readability - separate some code blocks in functions and make them inline
// as it's called for every single flow
static inline void UpdateStat(stat_record_t *stat_record, master_record_t *master_record);
static inline void UpdateXStat(xstat_t *xstat, master_record_t *master_record);
static inline void UpdateStat(stat_record_t *stat_record, master_record_t *master_record) {
switch (master_record->prot) {
case IPPROTO_ICMP:
case IPPROTO_ICMPV6:
stat_record->numflows_icmp += master_record->aggr_flows ? master_record->aggr_flows : 1;
stat_record->numpackets_icmp += master_record->dPkts;
stat_record->numpackets_icmp += master_record->out_pkts;
stat_record->numbytes_icmp += master_record->dOctets;
stat_record->numbytes_icmp += master_record->out_bytes;
break;
case IPPROTO_TCP:
stat_record->numflows_tcp += master_record->aggr_flows ? master_record->aggr_flows : 1;
stat_record->numpackets_tcp += master_record->dPkts;
stat_record->numpackets_tcp += master_record->out_pkts;
stat_record->numbytes_tcp += master_record->dOctets;
stat_record->numbytes_tcp += master_record->out_bytes;
break;
case IPPROTO_UDP:
stat_record->numflows_udp += master_record->aggr_flows ? master_record->aggr_flows : 1;
stat_record->numpackets_udp += master_record->dPkts;
stat_record->numpackets_udp += master_record->out_pkts;
stat_record->numbytes_udp += master_record->dOctets;
stat_record->numbytes_udp += master_record->out_bytes;
break;
default:
stat_record->numflows_other += master_record->aggr_flows ? master_record->aggr_flows : 1;
stat_record->numpackets_other += master_record->dPkts;
stat_record->numpackets_other += master_record->out_pkts;
stat_record->numbytes_other += master_record->dOctets;
stat_record->numbytes_other += master_record->out_bytes;
}
stat_record->numflows += master_record->aggr_flows ? master_record->aggr_flows : 1;
stat_record->numpackets += master_record->dPkts;
stat_record->numpackets += master_record->out_pkts;
stat_record->numbytes += master_record->dOctets;
stat_record->numbytes += master_record->out_bytes;
if ( master_record->first < stat_record->first_seen ) {
stat_record->first_seen = master_record->first;
stat_record->msec_first = master_record->msec_first;
}
if ( master_record->first == stat_record->first_seen &&
master_record->msec_first < stat_record->msec_first )
stat_record->msec_first = master_record->msec_first;
if ( master_record->last > stat_record->last_seen ) {
stat_record->last_seen = master_record->last;
stat_record->msec_last = master_record->msec_last;
}
if ( master_record->last == stat_record->last_seen &&
master_record->msec_last > stat_record->msec_last )
stat_record->msec_last = master_record->msec_last;
} // End of UpdateStat
static inline void UpdateXStat(xstat_t *xstat, master_record_t *master_record) {
uint32_t bpp = master_record->dPkts ? master_record->dOctets/master_record->dPkts : 0;
if ( bpp > MAX_BPP )
bpp = MAX_BPP;
if ( master_record->prot == IPPROTO_TCP ) {
xstat->bpp_histogram->tcp.bpp[bpp]++;
xstat->bpp_histogram->tcp.count++;
xstat->port_histogram->src_tcp.port[master_record->srcport]++;
xstat->port_histogram->dst_tcp.port[master_record->dstport]++;
xstat->port_histogram->src_tcp.count++;
xstat->port_histogram->dst_tcp.count++;
} else if ( master_record->prot == IPPROTO_UDP ) {
xstat->bpp_histogram->udp.bpp[bpp]++;
xstat->bpp_histogram->udp.count++;
xstat->port_histogram->src_udp.port[master_record->srcport]++;
xstat->port_histogram->dst_udp.port[master_record->dstport]++;
xstat->port_histogram->src_udp.count++;
xstat->port_histogram->dst_udp.count++;
}
} // End of UpdateXStat