/* See the DRL-LICENSE file for this file's software license. */ /** Defines a structure that is common to all of the flow accounting * mechanisms. This includes the aggregate rate and the time it was last * updated. */ #ifndef _COMMON_ACCOUNTING_H_ #define _COMMON_ACCOUNTING_H_ #include #include #include /** Representation of a flow that is to be used as a key into the table. */ typedef struct key_flow { /* Identification information. Some or all of this information is used * by the accounting table hash functions to identify flows. */ /** The source IP address. */ uint32_t source_ip; /** The destination IP address. */ uint32_t dest_ip; /** The source TCP/UDP port. */ uint16_t source_port; /** The destination TCP/UDP port. */ uint16_t dest_port; /** The value of the IP header protocol field. */ uint8_t protocol; /* * Packet information. This is not used by the accounting tables for * hashing, but is useful when sampling a new packet. */ /** The size of the packet (in bytes). */ uint16_t packet_size; /** The time at which the packet was sent. */ time_t packet_time; } key_flow; /** * This structure is used to store information common to all flow accounting * mechanisms. It includes the aggregate rate information that will be read * by the estimation and allocation functions. */ typedef struct { /** The best estimate of the rate for the current estimate interval. This * includes EWMA smoothing. */ uint32_t rate; /** The best estimate of the rate for the previous estimate inteval. This * includes EWMA smoothing. */ uint32_t last_rate; /** The instantaneous rate for the current estimate interval.*/ uint32_t inst_rate; /** The instantaneous rate for the previous estimate interval.*/ uint32_t last_inst_rate; /** The rate of the largest flow being tracked by the table. */ uint32_t max_flow_rate; /** The time at which this structure was last updated. */ struct timeval last_update; /** The number of bytes sent since the last_update time. */ uint32_t bytes_since; /* Statistics below. */ /** The current number of flows. */ uint32_t num_flows; /** The number of flows sending above 5KB/s. */ uint32_t num_flows_5k; /** The number of flows sending above 10KB/s. */ uint32_t num_flows_10k; /** The number of flows sending above 20KB/s. */ uint32_t num_flows_20k; /** The number of flows sending above 50KB/s. */ uint32_t num_flows_50k; /** The average flow rate. */ uint32_t avg_rate; /** The hash of the flow whose rate is the max_flow_rate. */ uint32_t max_flow_rate_flow_hash; } common_accounting_t; /** Determines the difference between two timeval structs (in seconds, with * fractions). */ #define timeval_subtract(big, small) ((double) (big.tv_sec - small.tv_sec) + (big.tv_usec - small.tv_usec) / 1000000.0) #endif /* _COMMON_ACCOUNTING_H_ */