128 lines
5.5 KiB
C
Executable File
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
|
|
|