Network based RRD graphs Bytes to Bits

Message ID 20210524140419.29733-1-nateos2g@fastmail.com
State Dropped
Headers show
Series Network based RRD graphs Bytes to Bits | expand

Commit Message

nateos2g May 24, 2021, 2:04 p.m. UTC
From: Nate Oaks <nateos2g@fastmail.com>

For proper display of network measurements, Bps (bytes) should be
converted to bps (bits). Bytes are for data/storage (RAM, HDD, SSD,
etc.), bits are for network bandwidth or throughput (NICs, switches,
routers, WiFi adapters, etc.).

Networks transfer data as single bits at a time. It’s both more accurate
and more intuitive to measure network speed in bits per second that a
network connection is transmitting, not the amount of data units, or
bytes, it transmits. Notice all network devices are marketed, measure
and diplay in bits per second.

I simply used RRD CDEF to multiply by 8.

NOTE: Found: "ERROR: rpn expressions without DEF or CDEF variables are
not supported".
Specifically in updateqosgraph, CDEF does not like a number as a
variable name. ie. "204" from $classline[1].

Requires update of the language cache files:
perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
or: update-lang-cache

Found one other asking for this:
https://community.ipfire.org/t/ipfire-bandwidth-usage/1203

Signed-off-by: Nate Oaks <nateos2g@fastmail.com>
---
 config/cfgroot/graphs.pl | 202 +++++++++++++++++++++------------------
 langs/en/cgi-bin/en.pl   |  13 +--
 2 files changed, 117 insertions(+), 98 deletions(-)

Comments

Matthias Fischer May 24, 2021, 4:18 p.m. UTC | #1
Hi,

thanks for the corrected patch - now I could apply it.

I made a quick test => please see attachments.

Seems to work as expected.

However I cannot test VPN connections, sorry.

Best,
Matthias

On 24.05.2021 16:04, nateos2g@fastmail.com wrote:
> From: Nate Oaks <nateos2g@fastmail.com>
> 
> For proper display of network measurements, Bps (bytes) should be
> converted to bps (bits). Bytes are for data/storage (RAM, HDD, SSD,
> etc.), bits are for network bandwidth or throughput (NICs, switches,
> routers, WiFi adapters, etc.).
> 
> Networks transfer data as single bits at a time. It’s both more accurate
> and more intuitive to measure network speed in bits per second that a
> network connection is transmitting, not the amount of data units, or
> bytes, it transmits. Notice all network devices are marketed, measure
> and diplay in bits per second.
> 
> I simply used RRD CDEF to multiply by 8.
> 
> NOTE: Found: "ERROR: rpn expressions without DEF or CDEF variables are
> not supported".
> Specifically in updateqosgraph, CDEF does not like a number as a
> variable name. ie. "204" from $classline[1].
> 
> Requires update of the language cache files:
> perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
> or: update-lang-cache
> 
> Found one other asking for this:
> https://community.ipfire.org/t/ipfire-bandwidth-usage/1203
> 
> Signed-off-by: Nate Oaks <nateos2g@fastmail.com>
> ---
>  config/cfgroot/graphs.pl | 202 +++++++++++++++++++++------------------
>  langs/en/cgi-bin/en.pl   |  13 +--
>  2 files changed, 117 insertions(+), 98 deletions(-)
> 
> diff --git a/config/cfgroot/graphs.pl b/config/cfgroot/graphs.pl
> index 441d4c483a46..c83ae67bbfc1 100644
> --- a/config/cfgroot/graphs.pl
> +++ b/config/cfgroot/graphs.pl
> @@ -545,28 +545,30 @@ sub updateifgraph {
>  		"-1".$period,
>  		"-r",
>  		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
> -		"-v ".$Lang::tr{'bytes per second'},
> +		"-v ".$Lang::tr{'bits per second'},
>  		"--color=SHADEA".$color{"color19"},
>  		"--color=SHADEB".$color{"color19"},
>  		"--color=BACK".$color{"color21"},
>  		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:rx:AVERAGE",
>  		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:tx:AVERAGE",
> -		"CDEF:outgoingn=outgoing,-1,*",
> +		"CDEF:outgoingb=outgoing,8,*",
> +		"CDEF:outgoingn=outgoingb,-1,*",
> +		"CDEF:incomingb=incoming,8,*",
>  		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
> -		"AREA:incoming".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
> -		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
> +		"AREA:incomingb".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
> +		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>  		);
>  		$ERROR = RRDs::error;
>  		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
> @@ -582,28 +584,30 @@ sub updatevpngraph {
>  		"-1".$period,
>  		"-r",
>  		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
> -		"-v ".$Lang::tr{'bytes per second'},
> +		"-v ".$Lang::tr{'bits per second'},
>  		"--color=SHADEA".$color{"color19"},
>  		"--color=SHADEB".$color{"color19"},
>  		"--color=BACK".$color{"color21"},
>  		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:rx:AVERAGE",
>  		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:tx:AVERAGE",
> -		"CDEF:outgoingn=outgoing,-1,*",
> +		"CDEF:outgoingb=outgoing,8,*",
> +		"CDEF:outgoingn=outgoingb,-1,*",
> +		"CDEF:incomingb=incoming,8,*",
>  		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
> -		"AREA:incoming#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
> -		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
> +		"AREA:incomingb#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
> +		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>  		);
>  		$ERROR = RRDs::error;
>  		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
> @@ -619,7 +623,7 @@ sub updatevpnn2ngraph {
>  		"-1".$period,
>  		"-r",
>  		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
> -		"-v ".$Lang::tr{'bytes per second'},
> +		"-v ".$Lang::tr{'bits per second'},
>  		"--color=SHADEA".$color{"color19"},
>  		"--color=SHADEB".$color{"color19"},
>  		"--color=BACK".$color{"color21"},
> @@ -629,44 +633,50 @@ sub updatevpnn2ngraph {
>  		"DEF:overhead_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive-overhead.rrd:tx:AVERAGE",
>  		"DEF:compression_in=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_in.rrd:uncompressed:AVERAGE",
>  		"DEF:compression_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_out.rrd:uncompressed:AVERAGE",
> -		"CDEF:outgoingn=outgoing,-1,*",
> -		"CDEF:overhead_outn=overhead_out,-1,*",
> -		"CDEF:compression_outn=compression_out,-1,*",
> +		"CDEF:outgoingb=outgoing,8,*",
> +		"CDEF:outgoingn=outgoingb,-1,*",
> +		"CDEF:incomingb=incoming,8,*",
> +		"CDEF:overhead_outb=overhead_out,8,*",
> +		"CDEF:overhead_outn=overhead_outb,-1,*",
> +		"CDEF:overhead_inb=overhead_in,8,*",
> +		"CDEF:compression_outb=compression_out,8,*",
> +		"CDEF:compression_outn=compression_outb,-1,*",
> +		"CDEF:compression_inb=compression_in,8,*",
>  		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
> -		"AREA:incoming#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bytes per second'}),
> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
> -		"STACK:overhead_in#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bytes per second'}),
> -		"GPRINT:overhead_in:MAX:%8.1lf %sBps",
> -		"GPRINT:overhead_in:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:overhead_in:MIN:%8.1lf %sBps",
> -		"GPRINT:overhead_in:LAST:%8.1lf %sBps\\j",
> -		"LINE1:compression_in#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bytes per second'}),
> -		"GPRINT:compression_in:MAX:%8.1lf %sBps",
> -		"GPRINT:compression_in:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:compression_in:MIN:%8.1lf %sBps",
> -		"GPRINT:compression_in:LAST:%8.1lf %sBps\\j",
> -		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bytes per second'}),
> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
> -		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bytes per second'}),
> -		"GPRINT:overhead_out:MAX:%8.1lf %sBps",
> -		"GPRINT:overhead_out:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:overhead_out:MIN:%8.1lf %sBps",
> -		"GPRINT:overhead_out:LAST:%8.1lf %sBps\\j",
> -		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bytes per second'}),
> -		"GPRINT:compression_out:MAX:%8.1lf %sBps",
> -		"GPRINT:compression_out:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:compression_out:MIN:%8.1lf %sBps",
> -		"GPRINT:compression_out:LAST:%8.1lf %sBps\\j",
> +		"AREA:incomingb#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bits per second'}),
> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
> +		"STACK:overhead_inb#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bits per second'}),
> +		"GPRINT:overhead_inb:MAX:%8.1lf %sbps",
> +		"GPRINT:overhead_inb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:overhead_inb:MIN:%8.1lf %sbps",
> +		"GPRINT:overhead_inb:bLAST:%8.1lf %sbps\\j",
> +		"LINE1:compression_inb#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bits per second'}),
> +		"GPRINT:compression_inb:MAX:%8.1lf %sbps",
> +		"GPRINT:compression_inb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:compression_inb:MIN:%8.1lf %sbps",
> +		"GPRINT:compression_inb:LAST:%8.1lf %sbps\\j",
> +		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bits per second'}),
> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
> +		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bits per second'}),
> +		"GPRINT:overhead_outb:MAX:%8.1lf %sbps",
> +		"GPRINT:overhead_outb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:overhead_outb:MIN:%8.1lf %sbps",
> +		"GPRINT:overhead_outb:LAST:%8.1lf %sbps\\j",
> +		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bits per second'}),
> +		"GPRINT:compression_outb:MAX:%8.1lf %sbps",
> +		"GPRINT:compression_outb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:compression_outb:MIN:%8.1lf %sbps",
> +		"GPRINT:compression_outb:LAST:%8.1lf %sbps\\j",
>  		);
>  		$ERROR = RRDs::error;
>  		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
> @@ -683,7 +693,7 @@ sub updatefwhitsgraph {
>  		"-1".$period,
>  		"-r",
>  		"-t ".$Lang::tr{'firewall hits per'}." ".$Lang::tr{$period."-graph"},
> -		"-v ".$Lang::tr{'bytes per second'},
> +		"-v ".$Lang::tr{'bits per second'},
>  		"--color=SHADEA".$color{"color19"},
>  		"--color=SHADEB".$color{"color19"},
>  		"--color=BACK".$color{"color21"},
> @@ -692,36 +702,41 @@ sub updatefwhitsgraph {
>  		"DEF:forward=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-POLICYFWD/ipt_bytes-DROP_FORWARD.rrd:value:AVERAGE",
>  		"DEF:newnotsyn=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-NEWNOTSYN/ipt_bytes-DROP_NEWNOTSYN.rrd:value:AVERAGE",
>  		"DEF:portscan=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-PSCAN/ipt_bytes-DROP_PScan.rrd:value:AVERAGE",
> +		"CDEF:outputb=output,8,*",
> +		"CDEF:inputb=input,8,*",
> +		"CDEF:forwardb=forward,8,*",
> +		"CDEF:newnotsynb=newnotsyn,8,*",
> +		"CDEF:portscanb=portscan,8,*",
>  		"COMMENT:".sprintf("%-26s",$Lang::tr{'caption'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>  		"COMMENT:".sprintf("%14s",$Lang::tr{'minimal'}),
>  		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
> -		"AREA:output".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
> -		"GPRINT:output:MAX:%8.1lf %sBps",
> -		"GPRINT:output:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:output:MIN:%8.1lf %sBps",
> -		"GPRINT:output:LAST:%8.1lf %sBps\\j",
> -		"STACK:forward".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
> -		"GPRINT:forward:MAX:%8.1lf %sBps",
> -		"GPRINT:forward:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:forward:MIN:%8.1lf %sBps",
> -		"GPRINT:forward:LAST:%8.1lf %sBps\\j",
> -		"STACK:input".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
> -		"GPRINT:input:MAX:%8.1lf %sBps",
> -		"GPRINT:input:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:input:MIN:%8.1lf %sBps",
> -		"GPRINT:input:LAST:%8.1lf %sBps\\j",
> -		"STACK:newnotsyn".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
> -		"GPRINT:newnotsyn:MAX:%8.1lf %sBps",
> -		"GPRINT:newnotsyn:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:newnotsyn:MIN:%8.1lf %sBps",
> -		"GPRINT:newnotsyn:LAST:%8.1lf %sBps\\j",
> -		"STACK:portscan".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
> -		"GPRINT:portscan:MAX:%8.1lf %sBps",
> -		"GPRINT:portscan:AVERAGE:%8.1lf %sBps",
> -		"GPRINT:portscan:MIN:%8.1lf %sBps",
> -		"GPRINT:portscan:LAST:%8.1lf %sBps\\j",
> +		"AREA:outputb".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
> +		"GPRINT:outputb:MAX:%8.1lf %sbps",
> +		"GPRINT:outputb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:outputb:MIN:%8.1lf %sbps",
> +		"GPRINT:outputb:LAST:%8.1lf %sbps\\j",
> +		"STACK:forwardb".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
> +		"GPRINT:forwardb:MAX:%8.1lf %sbps",
> +		"GPRINT:forwardb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:forwardb:MIN:%8.1lf %sbps",
> +		"GPRINT:forwardb:LAST:%8.1lf %sbps\\j",
> +		"STACK:inputb".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
> +		"GPRINT:inputb:MAX:%8.1lf %sbps",
> +		"GPRINT:inputb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:inputb:MIN:%8.1lf %sbps",
> +		"GPRINT:inputb:LAST:%8.1lf %sbps\\j",
> +		"STACK:newnotsynb".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
> +		"GPRINT:newnotsynb:MAX:%8.1lf %sbps",
> +		"GPRINT:newnotsynb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:newnotsynb:MIN:%8.1lf %sbps",
> +		"GPRINT:newnotsynb:LAST:%8.1lf %sbps\\j",
> +		"STACK:portscanb".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
> +		"GPRINT:portscanb:MAX:%8.1lf %sbps",
> +		"GPRINT:portscanb:AVERAGE:%8.1lf %sbps",
> +		"GPRINT:portscanb:MIN:%8.1lf %sbps",
> +		"GPRINT:portscanb:LAST:%8.1lf %sbps\\j",
>  		);
>  		$ERROR = RRDs::error;
>  		return "Error in RRD::graph for firewallhits: ".$ERROR."\n" if $ERROR;
> @@ -1012,7 +1027,7 @@ sub updateqosgraph {
>  		"-1".$period,
>  		"-r",
>  		"-t ".$Lang::tr{'Utilization on'}." (".$qossettings{'DEV'}.") ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
> -		"-v ".$Lang::tr{'bytes per second'},
> +		"-v ".$Lang::tr{'bits per second'},
>  		"--color=SHADEA".$color{"color19"},
>  		"--color=SHADEB".$color{"color19"},
>  		"--color=BACK".$color{"color21"},
> @@ -1039,21 +1054,24 @@ sub updateqosgraph {
>  			}
>  
>  			if ( $classline[0] eq $qossettings{'DEV'} ){
> -				push(@command, "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
> +				# Found: ERROR: rpn expressions without DEF or CDEF variables are not supported
> +				# CDEF does not like a number as a variable name. ie. "204" from $classline[1]
> +				push(@command, "DEF:$classline[1]bit=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
> +				push(@command, "CDEF:$classline[8]=$classline[1]bit,8,*");
>  
>  				# get color to be used for this graph
>  				my $graphColor = $colorMap{$colorKey};
>  
>  				if ($count eq "1") {
> -					push(@command, "AREA:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
> +					push(@command, "AREA:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>  				} else {
> -					push(@command, "STACK:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
> +					push(@command, "STACK:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>  				}
>  
> -				push(@command, "GPRINT:$classline[1]:MAX:%8.1lf %sBps"
> -						, "GPRINT:$classline[1]:AVERAGE:%8.1lf %sBps"
> -						, "GPRINT:$classline[1]:MIN:%8.1lf %sBps"
> -						, "GPRINT:$classline[1]:LAST:%8.1lf %sBps\\j");
> +				push(@command, "GPRINT:$classline[8]:MAX:%8.1lf %sbps"
> +						, "GPRINT:$classline[8]:AVERAGE:%8.1lf %sbps"
> +						, "GPRINT:$classline[8]:MIN:%8.1lf %sbps"
> +						, "GPRINT:$classline[8]:LAST:%8.1lf %sbps\\j");
>  				$count++;
>  			}
>  		}
> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
> index dc1fd8d67b30..b0097074beb0 100644
> --- a/langs/en/cgi-bin/en.pl
> +++ b/langs/en/cgi-bin/en.pl
> @@ -515,6 +515,7 @@
>  'broken pipe' => 'Broken pipe',
>  'buffered memory' => 'Buffered Memory',
>  'buffers' => 'buffers',
> +'bits per second' => 'Bits per Second',
>  'bytes per second' => 'Bytes per Second',
>  'bytes received' => 'Bytes Received',
>  'bytes sent' => 'Bytes Sent',
> @@ -1431,10 +1432,10 @@
>  'inactive' => 'inactive',
>  'include logfiles' => 'Include logfiles',
>  'incoming' => 'incoming',
> -'incoming compression in bytes per second' => 'Incoming Compression',
> +'incoming compression in bits per second' => 'Incoming Compression',
>  'incoming firewall access' => 'Incoming Firewall Access',
> -'incoming overhead in bytes per second' => 'Incoming Overhead',
> -'incoming traffic in bytes per second' => 'Incoming Traffic',
> +'incoming overhead in bits per second' => 'Incoming Overhead',
> +'incoming traffic in bits per second' => 'Incoming Traffic',
>  'incorrect password' => 'Incorrect password',
>  'info' => 'Info',
>  'init string' => 'Init:',
> @@ -1907,7 +1908,7 @@
>  'our donors' => 'Our donors',
>  'out' => 'Out',
>  'outgoing' => 'outgoing',
> -'outgoing compression in bytes per second' => 'Outgoing compression',
> +'outgoing compression in bits per second' => 'Outgoing compression',
>  'outgoing firewall' => 'Outgoing Firewall',
>  'outgoing firewall access' => 'Outgoing Firewall Access',
>  'outgoing firewall add ip group' => 'Add IP Address Group',
> @@ -1930,8 +1931,8 @@
>  'outgoing firewall reset' => 'Reset all',
>  'outgoing firewall view group' => 'View group',
>  'outgoing firewall warning' => 'Not selecting source ip or mac ignores them',
> -'outgoing overhead in bytes per second' => 'Outgoing Overhead',
> -'outgoing traffic in bytes per second' => 'Outgoing Traffic',
> +'outgoing overhead in bits per second' => 'Outgoing Overhead',
> +'outgoing traffic in bits per second' => 'Outgoing Traffic',
>  'override mtu' => 'Override default MTU',
>  'ovpn' => 'OpenVPN',
>  'ovpn add conf' => 'Additional configuration',
>
Bernhard Bitsch May 24, 2021, 7:43 p.m. UTC | #2
Hi,

I've tested also, for the qos and network graphs.
No problem.

One annotation: why are the legends 'incoming traffic in bytes per 
second' ( new '... bits per second' )? The associated text is 'incoming 
traffic' ( obviously in both versions ).
Can't we change this key just to 'incoming traffic'?
This is true for 'outgoing traffic...', 'incoming overhead...', ...
I didn't search where this texts are used  in the project.

Regards,
Bernhard

Am 24.05.2021 um 18:18 schrieb Matthias Fischer:
> Hi,
> 
> thanks for the corrected patch - now I could apply it.
> 
> I made a quick test => please see attachments.
> 
> Seems to work as expected.
> 
> However I cannot test VPN connections, sorry.
> 
> Best,
> Matthias
> 
> On 24.05.2021 16:04, nateos2g@fastmail.com wrote:
>> From: Nate Oaks <nateos2g@fastmail.com>
>>
>> For proper display of network measurements, Bps (bytes) should be
>> converted to bps (bits). Bytes are for data/storage (RAM, HDD, SSD,
>> etc.), bits are for network bandwidth or throughput (NICs, switches,
>> routers, WiFi adapters, etc.).
>>
>> Networks transfer data as single bits at a time. It’s both more accurate
>> and more intuitive to measure network speed in bits per second that a
>> network connection is transmitting, not the amount of data units, or
>> bytes, it transmits. Notice all network devices are marketed, measure
>> and diplay in bits per second.
>>
>> I simply used RRD CDEF to multiply by 8.
>>
>> NOTE: Found: "ERROR: rpn expressions without DEF or CDEF variables are
>> not supported".
>> Specifically in updateqosgraph, CDEF does not like a number as a
>> variable name. ie. "204" from $classline[1].
>>
>> Requires update of the language cache files:
>> perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
>> or: update-lang-cache
>>
>> Found one other asking for this:
>> https://community.ipfire.org/t/ipfire-bandwidth-usage/1203
>>
>> Signed-off-by: Nate Oaks <nateos2g@fastmail.com>
>> ---
>>   config/cfgroot/graphs.pl | 202 +++++++++++++++++++++------------------
>>   langs/en/cgi-bin/en.pl   |  13 +--
>>   2 files changed, 117 insertions(+), 98 deletions(-)
>>
>> diff --git a/config/cfgroot/graphs.pl b/config/cfgroot/graphs.pl
>> index 441d4c483a46..c83ae67bbfc1 100644
>> --- a/config/cfgroot/graphs.pl
>> +++ b/config/cfgroot/graphs.pl
>> @@ -545,28 +545,30 @@ sub updateifgraph {
>>   		"-1".$period,
>>   		"-r",
>>   		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>> -		"-v ".$Lang::tr{'bytes per second'},
>> +		"-v ".$Lang::tr{'bits per second'},
>>   		"--color=SHADEA".$color{"color19"},
>>   		"--color=SHADEB".$color{"color19"},
>>   		"--color=BACK".$color{"color21"},
>>   		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:rx:AVERAGE",
>>   		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:tx:AVERAGE",
>> -		"CDEF:outgoingn=outgoing,-1,*",
>> +		"CDEF:outgoingb=outgoing,8,*",
>> +		"CDEF:outgoingn=outgoingb,-1,*",
>> +		"CDEF:incomingb=incoming,8,*",
>>   		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>> -		"AREA:incoming".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
>> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
>> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
>> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>> -		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
>> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
>> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
>> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>> +		"AREA:incomingb".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
>> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>> +		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
>> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>>   		);
>>   		$ERROR = RRDs::error;
>>   		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
>> @@ -582,28 +584,30 @@ sub updatevpngraph {
>>   		"-1".$period,
>>   		"-r",
>>   		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>> -		"-v ".$Lang::tr{'bytes per second'},
>> +		"-v ".$Lang::tr{'bits per second'},
>>   		"--color=SHADEA".$color{"color19"},
>>   		"--color=SHADEB".$color{"color19"},
>>   		"--color=BACK".$color{"color21"},
>>   		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:rx:AVERAGE",
>>   		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:tx:AVERAGE",
>> -		"CDEF:outgoingn=outgoing,-1,*",
>> +		"CDEF:outgoingb=outgoing,8,*",
>> +		"CDEF:outgoingn=outgoingb,-1,*",
>> +		"CDEF:incomingb=incoming,8,*",
>>   		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>> -		"AREA:incoming#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
>> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
>> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
>> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>> -		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
>> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
>> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
>> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>> +		"AREA:incomingb#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
>> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>> +		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
>> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>>   		);
>>   		$ERROR = RRDs::error;
>>   		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
>> @@ -619,7 +623,7 @@ sub updatevpnn2ngraph {
>>   		"-1".$period,
>>   		"-r",
>>   		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>> -		"-v ".$Lang::tr{'bytes per second'},
>> +		"-v ".$Lang::tr{'bits per second'},
>>   		"--color=SHADEA".$color{"color19"},
>>   		"--color=SHADEB".$color{"color19"},
>>   		"--color=BACK".$color{"color21"},
>> @@ -629,44 +633,50 @@ sub updatevpnn2ngraph {
>>   		"DEF:overhead_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive-overhead.rrd:tx:AVERAGE",
>>   		"DEF:compression_in=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_in.rrd:uncompressed:AVERAGE",
>>   		"DEF:compression_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_out.rrd:uncompressed:AVERAGE",
>> -		"CDEF:outgoingn=outgoing,-1,*",
>> -		"CDEF:overhead_outn=overhead_out,-1,*",
>> -		"CDEF:compression_outn=compression_out,-1,*",
>> +		"CDEF:outgoingb=outgoing,8,*",
>> +		"CDEF:outgoingn=outgoingb,-1,*",
>> +		"CDEF:incomingb=incoming,8,*",
>> +		"CDEF:overhead_outb=overhead_out,8,*",
>> +		"CDEF:overhead_outn=overhead_outb,-1,*",
>> +		"CDEF:overhead_inb=overhead_in,8,*",
>> +		"CDEF:compression_outb=compression_out,8,*",
>> +		"CDEF:compression_outn=compression_outb,-1,*",
>> +		"CDEF:compression_inb=compression_in,8,*",
>>   		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>> -		"AREA:incoming#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bytes per second'}),
>> -		"GPRINT:incoming:MAX:%8.1lf %sBps",
>> -		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:incoming:MIN:%8.1lf %sBps",
>> -		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>> -		"STACK:overhead_in#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bytes per second'}),
>> -		"GPRINT:overhead_in:MAX:%8.1lf %sBps",
>> -		"GPRINT:overhead_in:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:overhead_in:MIN:%8.1lf %sBps",
>> -		"GPRINT:overhead_in:LAST:%8.1lf %sBps\\j",
>> -		"LINE1:compression_in#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bytes per second'}),
>> -		"GPRINT:compression_in:MAX:%8.1lf %sBps",
>> -		"GPRINT:compression_in:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:compression_in:MIN:%8.1lf %sBps",
>> -		"GPRINT:compression_in:LAST:%8.1lf %sBps\\j",
>> -		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bytes per second'}),
>> -		"GPRINT:outgoing:MAX:%8.1lf %sBps",
>> -		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:outgoing:MIN:%8.1lf %sBps",
>> -		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>> -		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bytes per second'}),
>> -		"GPRINT:overhead_out:MAX:%8.1lf %sBps",
>> -		"GPRINT:overhead_out:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:overhead_out:MIN:%8.1lf %sBps",
>> -		"GPRINT:overhead_out:LAST:%8.1lf %sBps\\j",
>> -		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bytes per second'}),
>> -		"GPRINT:compression_out:MAX:%8.1lf %sBps",
>> -		"GPRINT:compression_out:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:compression_out:MIN:%8.1lf %sBps",
>> -		"GPRINT:compression_out:LAST:%8.1lf %sBps\\j",
>> +		"AREA:incomingb#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bits per second'}),
>> +		"GPRINT:incomingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:incomingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:overhead_inb#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bits per second'}),
>> +		"GPRINT:overhead_inb:MAX:%8.1lf %sbps",
>> +		"GPRINT:overhead_inb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:overhead_inb:MIN:%8.1lf %sbps",
>> +		"GPRINT:overhead_inb:bLAST:%8.1lf %sbps\\j",
>> +		"LINE1:compression_inb#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bits per second'}),
>> +		"GPRINT:compression_inb:MAX:%8.1lf %sbps",
>> +		"GPRINT:compression_inb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:compression_inb:MIN:%8.1lf %sbps",
>> +		"GPRINT:compression_inb:LAST:%8.1lf %sbps\\j",
>> +		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bits per second'}),
>> +		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
>> +		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bits per second'}),
>> +		"GPRINT:overhead_outb:MAX:%8.1lf %sbps",
>> +		"GPRINT:overhead_outb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:overhead_outb:MIN:%8.1lf %sbps",
>> +		"GPRINT:overhead_outb:LAST:%8.1lf %sbps\\j",
>> +		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bits per second'}),
>> +		"GPRINT:compression_outb:MAX:%8.1lf %sbps",
>> +		"GPRINT:compression_outb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:compression_outb:MIN:%8.1lf %sbps",
>> +		"GPRINT:compression_outb:LAST:%8.1lf %sbps\\j",
>>   		);
>>   		$ERROR = RRDs::error;
>>   		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
>> @@ -683,7 +693,7 @@ sub updatefwhitsgraph {
>>   		"-1".$period,
>>   		"-r",
>>   		"-t ".$Lang::tr{'firewall hits per'}." ".$Lang::tr{$period."-graph"},
>> -		"-v ".$Lang::tr{'bytes per second'},
>> +		"-v ".$Lang::tr{'bits per second'},
>>   		"--color=SHADEA".$color{"color19"},
>>   		"--color=SHADEB".$color{"color19"},
>>   		"--color=BACK".$color{"color21"},
>> @@ -692,36 +702,41 @@ sub updatefwhitsgraph {
>>   		"DEF:forward=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-POLICYFWD/ipt_bytes-DROP_FORWARD.rrd:value:AVERAGE",
>>   		"DEF:newnotsyn=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-NEWNOTSYN/ipt_bytes-DROP_NEWNOTSYN.rrd:value:AVERAGE",
>>   		"DEF:portscan=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-PSCAN/ipt_bytes-DROP_PScan.rrd:value:AVERAGE",
>> +		"CDEF:outputb=output,8,*",
>> +		"CDEF:inputb=input,8,*",
>> +		"CDEF:forwardb=forward,8,*",
>> +		"CDEF:newnotsynb=newnotsyn,8,*",
>> +		"CDEF:portscanb=portscan,8,*",
>>   		"COMMENT:".sprintf("%-26s",$Lang::tr{'caption'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>   		"COMMENT:".sprintf("%14s",$Lang::tr{'minimal'}),
>>   		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>> -		"AREA:output".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
>> -		"GPRINT:output:MAX:%8.1lf %sBps",
>> -		"GPRINT:output:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:output:MIN:%8.1lf %sBps",
>> -		"GPRINT:output:LAST:%8.1lf %sBps\\j",
>> -		"STACK:forward".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
>> -		"GPRINT:forward:MAX:%8.1lf %sBps",
>> -		"GPRINT:forward:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:forward:MIN:%8.1lf %sBps",
>> -		"GPRINT:forward:LAST:%8.1lf %sBps\\j",
>> -		"STACK:input".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
>> -		"GPRINT:input:MAX:%8.1lf %sBps",
>> -		"GPRINT:input:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:input:MIN:%8.1lf %sBps",
>> -		"GPRINT:input:LAST:%8.1lf %sBps\\j",
>> -		"STACK:newnotsyn".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
>> -		"GPRINT:newnotsyn:MAX:%8.1lf %sBps",
>> -		"GPRINT:newnotsyn:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:newnotsyn:MIN:%8.1lf %sBps",
>> -		"GPRINT:newnotsyn:LAST:%8.1lf %sBps\\j",
>> -		"STACK:portscan".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
>> -		"GPRINT:portscan:MAX:%8.1lf %sBps",
>> -		"GPRINT:portscan:AVERAGE:%8.1lf %sBps",
>> -		"GPRINT:portscan:MIN:%8.1lf %sBps",
>> -		"GPRINT:portscan:LAST:%8.1lf %sBps\\j",
>> +		"AREA:outputb".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
>> +		"GPRINT:outputb:MAX:%8.1lf %sbps",
>> +		"GPRINT:outputb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:outputb:MIN:%8.1lf %sbps",
>> +		"GPRINT:outputb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:forwardb".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
>> +		"GPRINT:forwardb:MAX:%8.1lf %sbps",
>> +		"GPRINT:forwardb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:forwardb:MIN:%8.1lf %sbps",
>> +		"GPRINT:forwardb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:inputb".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
>> +		"GPRINT:inputb:MAX:%8.1lf %sbps",
>> +		"GPRINT:inputb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:inputb:MIN:%8.1lf %sbps",
>> +		"GPRINT:inputb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:newnotsynb".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
>> +		"GPRINT:newnotsynb:MAX:%8.1lf %sbps",
>> +		"GPRINT:newnotsynb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:newnotsynb:MIN:%8.1lf %sbps",
>> +		"GPRINT:newnotsynb:LAST:%8.1lf %sbps\\j",
>> +		"STACK:portscanb".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
>> +		"GPRINT:portscanb:MAX:%8.1lf %sbps",
>> +		"GPRINT:portscanb:AVERAGE:%8.1lf %sbps",
>> +		"GPRINT:portscanb:MIN:%8.1lf %sbps",
>> +		"GPRINT:portscanb:LAST:%8.1lf %sbps\\j",
>>   		);
>>   		$ERROR = RRDs::error;
>>   		return "Error in RRD::graph for firewallhits: ".$ERROR."\n" if $ERROR;
>> @@ -1012,7 +1027,7 @@ sub updateqosgraph {
>>   		"-1".$period,
>>   		"-r",
>>   		"-t ".$Lang::tr{'Utilization on'}." (".$qossettings{'DEV'}.") ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>> -		"-v ".$Lang::tr{'bytes per second'},
>> +		"-v ".$Lang::tr{'bits per second'},
>>   		"--color=SHADEA".$color{"color19"},
>>   		"--color=SHADEB".$color{"color19"},
>>   		"--color=BACK".$color{"color21"},
>> @@ -1039,21 +1054,24 @@ sub updateqosgraph {
>>   			}
>>   
>>   			if ( $classline[0] eq $qossettings{'DEV'} ){
>> -				push(@command, "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
>> +				# Found: ERROR: rpn expressions without DEF or CDEF variables are not supported
>> +				# CDEF does not like a number as a variable name. ie. "204" from $classline[1]
>> +				push(@command, "DEF:$classline[1]bit=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
>> +				push(@command, "CDEF:$classline[8]=$classline[1]bit,8,*");
>>   
>>   				# get color to be used for this graph
>>   				my $graphColor = $colorMap{$colorKey};
>>   
>>   				if ($count eq "1") {
>> -					push(@command, "AREA:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>> +					push(@command, "AREA:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>>   				} else {
>> -					push(@command, "STACK:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>> +					push(@command, "STACK:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
>>   				}
>>   
>> -				push(@command, "GPRINT:$classline[1]:MAX:%8.1lf %sBps"
>> -						, "GPRINT:$classline[1]:AVERAGE:%8.1lf %sBps"
>> -						, "GPRINT:$classline[1]:MIN:%8.1lf %sBps"
>> -						, "GPRINT:$classline[1]:LAST:%8.1lf %sBps\\j");
>> +				push(@command, "GPRINT:$classline[8]:MAX:%8.1lf %sbps"
>> +						, "GPRINT:$classline[8]:AVERAGE:%8.1lf %sbps"
>> +						, "GPRINT:$classline[8]:MIN:%8.1lf %sbps"
>> +						, "GPRINT:$classline[8]:LAST:%8.1lf %sbps\\j");
>>   				$count++;
>>   			}
>>   		}
>> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
>> index dc1fd8d67b30..b0097074beb0 100644
>> --- a/langs/en/cgi-bin/en.pl
>> +++ b/langs/en/cgi-bin/en.pl
>> @@ -515,6 +515,7 @@
>>   'broken pipe' => 'Broken pipe',
>>   'buffered memory' => 'Buffered Memory',
>>   'buffers' => 'buffers',
>> +'bits per second' => 'Bits per Second',
>>   'bytes per second' => 'Bytes per Second',
>>   'bytes received' => 'Bytes Received',
>>   'bytes sent' => 'Bytes Sent',
>> @@ -1431,10 +1432,10 @@
>>   'inactive' => 'inactive',
>>   'include logfiles' => 'Include logfiles',
>>   'incoming' => 'incoming',
>> -'incoming compression in bytes per second' => 'Incoming Compression',
>> +'incoming compression in bits per second' => 'Incoming Compression',
>>   'incoming firewall access' => 'Incoming Firewall Access',
>> -'incoming overhead in bytes per second' => 'Incoming Overhead',
>> -'incoming traffic in bytes per second' => 'Incoming Traffic',
>> +'incoming overhead in bits per second' => 'Incoming Overhead',
>> +'incoming traffic in bits per second' => 'Incoming Traffic',
>>   'incorrect password' => 'Incorrect password',
>>   'info' => 'Info',
>>   'init string' => 'Init:',
>> @@ -1907,7 +1908,7 @@
>>   'our donors' => 'Our donors',
>>   'out' => 'Out',
>>   'outgoing' => 'outgoing',
>> -'outgoing compression in bytes per second' => 'Outgoing compression',
>> +'outgoing compression in bits per second' => 'Outgoing compression',
>>   'outgoing firewall' => 'Outgoing Firewall',
>>   'outgoing firewall access' => 'Outgoing Firewall Access',
>>   'outgoing firewall add ip group' => 'Add IP Address Group',
>> @@ -1930,8 +1931,8 @@
>>   'outgoing firewall reset' => 'Reset all',
>>   'outgoing firewall view group' => 'View group',
>>   'outgoing firewall warning' => 'Not selecting source ip or mac ignores them',
>> -'outgoing overhead in bytes per second' => 'Outgoing Overhead',
>> -'outgoing traffic in bytes per second' => 'Outgoing Traffic',
>> +'outgoing overhead in bits per second' => 'Outgoing Overhead',
>> +'outgoing traffic in bits per second' => 'Outgoing Traffic',
>>   'override mtu' => 'Override default MTU',
>>   'ovpn' => 'OpenVPN',
>>   'ovpn add conf' => 'Additional configuration',
>>
>
nateos2g May 24, 2021, 9:21 p.m. UTC | #3
I noticed your pic is missing 'Outgoing Traffic'.
Did you regenerate the language cache files? This only has to done by us 
manually, but I assume an update package would do this, or the files 
would already be in new version, like the ISO.

The Lang keys are in langs/en/cgi-bin/en.pl, which is in this patch. As 
these keys are only used for these graphs, as far as I can find, I guess 
we could change/shorten them. But I didn't want to change something that 
I wasn't specifically focusing on.

Thanks,
Nate

On 24/05/2021 15:43, Bernhard Bitsch wrote:
> Hi,
>
> I've tested also, for the qos and network graphs.
> No problem.
>
> One annotation: why are the legends 'incoming traffic in bytes per 
> second' ( new '... bits per second' )? The associated text is 
> 'incoming traffic' ( obviously in both versions ).
> Can't we change this key just to 'incoming traffic'?
> This is true for 'outgoing traffic...', 'incoming overhead...', ...
> I didn't search where this texts are used in the project.
>
> Regards,
> Bernhard
>
> Am 24.05.2021 um 18:18 schrieb Matthias Fischer:
>> Hi,
>>
>> thanks for the corrected patch - now I could apply it.
>>
>> I made a quick test => please see attachments.
>>
>> Seems to work as expected.
>>
>> However I cannot test VPN connections, sorry.
>>
>> Best,
>> Matthias
>>
>> On 24.05.2021 16:04, nateos2g@fastmail.com wrote:
>>> From: Nate Oaks <nateos2g@fastmail.com>
>>>
>>> For proper display of network measurements, Bps (bytes) should be
>>> converted to bps (bits). Bytes are for data/storage (RAM, HDD, SSD,
>>> etc.), bits are for network bandwidth or throughput (NICs, switches,
>>> routers, WiFi adapters, etc.).
>>>
>>> Networks transfer data as single bits at a time. It’s both more 
>>> accurate
>>> and more intuitive to measure network speed in bits per second that a
>>> network connection is transmitting, not the amount of data units, or
>>> bytes, it transmits. Notice all network devices are marketed, measure
>>> and diplay in bits per second.
>>>
>>> I simply used RRD CDEF to multiply by 8.
>>>
>>> NOTE: Found: "ERROR: rpn expressions without DEF or CDEF variables are
>>> not supported".
>>> Specifically in updateqosgraph, CDEF does not like a number as a
>>> variable name. ie. "204" from $classline[1].
>>>
>>> Requires update of the language cache files:
>>> perl -e "require '/var/ipfire/lang.pl'; &Lang::BuildCacheLang"
>>> or: update-lang-cache
>>>
>>> Found one other asking for this:
>>> https://community.ipfire.org/t/ipfire-bandwidth-usage/1203
>>>
>>> Signed-off-by: Nate Oaks <nateos2g@fastmail.com>
>>> ---
>>>   config/cfgroot/graphs.pl | 202 
>>> +++++++++++++++++++++------------------
>>>   langs/en/cgi-bin/en.pl   |  13 +--
>>>   2 files changed, 117 insertions(+), 98 deletions(-)
>>>
>>> diff --git a/config/cfgroot/graphs.pl b/config/cfgroot/graphs.pl
>>> index 441d4c483a46..c83ae67bbfc1 100644
>>> --- a/config/cfgroot/graphs.pl
>>> +++ b/config/cfgroot/graphs.pl
>>> @@ -545,28 +545,30 @@ sub updateifgraph {
>>>           "-1".$period,
>>>           "-r",
>>>           "-t ".$Lang::tr{'traffic on'}." ".$interface." 
>>> ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>>> -        "-v ".$Lang::tr{'bytes per second'},
>>> +        "-v ".$Lang::tr{'bits per second'},
>>>           "--color=SHADEA".$color{"color19"},
>>>           "--color=SHADEB".$color{"color19"},
>>>           "--color=BACK".$color{"color21"},
>>> "DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:rx:AVERAGE",
>>> "DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:tx:AVERAGE",
>>> -        "CDEF:outgoingn=outgoing,-1,*",
>>> +        "CDEF:outgoingb=outgoing,8,*",
>>> +        "CDEF:outgoingn=outgoingb,-1,*",
>>> +        "CDEF:incomingb=incoming,8,*",
>>>           "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>> "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>>> - 
>>> "AREA:incoming".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:incoming:MAX:%8.1lf %sBps",
>>> -        "GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:incoming:MIN:%8.1lf %sBps",
>>> -        "GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:outgoing:MAX:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:MIN:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>>> + 
>>> "AREA:incomingb".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming 
>>> traffic in bits per second'}),
>>> +        "GPRINT:incomingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing 
>>> traffic in bits per second'}),
>>> +        "GPRINT:outgoingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>>>           );
>>>           $ERROR = RRDs::error;
>>>           return "Error in RRD::graph for ".$interface.": 
>>> ".$ERROR."\n" if $ERROR;
>>> @@ -582,28 +584,30 @@ sub updatevpngraph {
>>>           "-1".$period,
>>>           "-r",
>>>           "-t ".$Lang::tr{'traffic on'}." ".$interface." 
>>> ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>>> -        "-v ".$Lang::tr{'bytes per second'},
>>> +        "-v ".$Lang::tr{'bits per second'},
>>>           "--color=SHADEA".$color{"color19"},
>>>           "--color=SHADEB".$color{"color19"},
>>>           "--color=BACK".$color{"color21"},
>>> "DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:rx:AVERAGE",
>>> "DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:tx:AVERAGE",
>>> -        "CDEF:outgoingn=outgoing,-1,*",
>>> +        "CDEF:outgoingb=outgoing,8,*",
>>> +        "CDEF:outgoingn=outgoingb,-1,*",
>>> +        "CDEF:incomingb=incoming,8,*",
>>>           "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>> "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>>> - "AREA:incoming#00dd00:".sprintf("%-20s",$Lang::tr{'incoming 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:incoming:MAX:%8.1lf %sBps",
>>> -        "GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:incoming:MIN:%8.1lf %sBps",
>>> -        "GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>>> - "AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:outgoing:MAX:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:MIN:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>>> + "AREA:incomingb#00dd00:".sprintf("%-20s",$Lang::tr{'incoming 
>>> traffic in bits per second'}),
>>> +        "GPRINT:incomingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>>> + "AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing 
>>> traffic in bits per second'}),
>>> +        "GPRINT:outgoingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>>>           );
>>>           $ERROR = RRDs::error;
>>>           return "Error in RRD::graph for ".$interface.": 
>>> ".$ERROR."\n" if $ERROR;
>>> @@ -619,7 +623,7 @@ sub updatevpnn2ngraph {
>>>           "-1".$period,
>>>           "-r",
>>>           "-t ".$Lang::tr{'traffic on'}." ".$interface." 
>>> ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
>>> -        "-v ".$Lang::tr{'bytes per second'},
>>> +        "-v ".$Lang::tr{'bits per second'},
>>>           "--color=SHADEA".$color{"color19"},
>>>           "--color=SHADEB".$color{"color19"},
>>>           "--color=BACK".$color{"color21"},
>>> @@ -629,44 +633,50 @@ sub updatevpnn2ngraph {
>>> "DEF:overhead_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive-overhead.rrd:tx:AVERAGE",
>>> "DEF:compression_in=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_in.rrd:uncompressed:AVERAGE",
>>> "DEF:compression_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_out.rrd:uncompressed:AVERAGE",
>>> -        "CDEF:outgoingn=outgoing,-1,*",
>>> -        "CDEF:overhead_outn=overhead_out,-1,*",
>>> -        "CDEF:compression_outn=compression_out,-1,*",
>>> +        "CDEF:outgoingb=outgoing,8,*",
>>> +        "CDEF:outgoingn=outgoingb,-1,*",
>>> +        "CDEF:incomingb=incoming,8,*",
>>> +        "CDEF:overhead_outb=overhead_out,8,*",
>>> +        "CDEF:overhead_outn=overhead_outb,-1,*",
>>> +        "CDEF:overhead_inb=overhead_in,8,*",
>>> +        "CDEF:compression_outb=compression_out,8,*",
>>> +        "CDEF:compression_outn=compression_outb,-1,*",
>>> +        "CDEF:compression_inb=compression_in,8,*",
>>>           "COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
>>> "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>>> - "AREA:incoming#00dd00:".sprintf("%-23s",$Lang::tr{'incoming 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:incoming:MAX:%8.1lf %sBps",
>>> -        "GPRINT:incoming:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:incoming:MIN:%8.1lf %sBps",
>>> -        "GPRINT:incoming:LAST:%8.1lf %sBps\\j",
>>> - "STACK:overhead_in#116B11:".sprintf("%-23s",$Lang::tr{'incoming 
>>> overhead in bytes per second'}),
>>> -        "GPRINT:overhead_in:MAX:%8.1lf %sBps",
>>> -        "GPRINT:overhead_in:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:overhead_in:MIN:%8.1lf %sBps",
>>> -        "GPRINT:overhead_in:LAST:%8.1lf %sBps\\j",
>>> - "LINE1:compression_in#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming 
>>> compression in bytes per second'}),
>>> -        "GPRINT:compression_in:MAX:%8.1lf %sBps",
>>> -        "GPRINT:compression_in:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:compression_in:MIN:%8.1lf %sBps",
>>> -        "GPRINT:compression_in:LAST:%8.1lf %sBps\\j",
>>> - "AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> traffic in bytes per second'}),
>>> -        "GPRINT:outgoing:MAX:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:MIN:%8.1lf %sBps",
>>> -        "GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
>>> - "STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> overhead in bytes per second'}),
>>> -        "GPRINT:overhead_out:MAX:%8.1lf %sBps",
>>> -        "GPRINT:overhead_out:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:overhead_out:MIN:%8.1lf %sBps",
>>> -        "GPRINT:overhead_out:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> compression in bytes per second'}),
>>> -        "GPRINT:compression_out:MAX:%8.1lf %sBps",
>>> -        "GPRINT:compression_out:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:compression_out:MIN:%8.1lf %sBps",
>>> -        "GPRINT:compression_out:LAST:%8.1lf %sBps\\j",
>>> + "AREA:incomingb#00dd00:".sprintf("%-23s",$Lang::tr{'incoming 
>>> traffic in bits per second'}),
>>> +        "GPRINT:incomingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
>>> + "STACK:overhead_inb#116B11:".sprintf("%-23s",$Lang::tr{'incoming 
>>> overhead in bits per second'}),
>>> +        "GPRINT:overhead_inb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:overhead_inb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:overhead_inb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:overhead_inb:bLAST:%8.1lf %sbps\\j",
>>> + 
>>> "LINE1:compression_inb#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming 
>>> compression in bits per second'}),
>>> +        "GPRINT:compression_inb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:compression_inb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:compression_inb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:compression_inb:LAST:%8.1lf %sbps\\j",
>>> + "AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> traffic in bits per second'}),
>>> +        "GPRINT:outgoingb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
>>> + "STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> overhead in bits per second'}),
>>> +        "GPRINT:overhead_outb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:overhead_outb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:overhead_outb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:overhead_outb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing 
>>> compression in bits per second'}),
>>> +        "GPRINT:compression_outb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:compression_outb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:compression_outb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:compression_outb:LAST:%8.1lf %sbps\\j",
>>>           );
>>>           $ERROR = RRDs::error;
>>>           return "Error in RRD::graph for ".$interface.": 
>>> ".$ERROR."\n" if $ERROR;
>>> @@ -683,7 +693,7 @@ sub updatefwhitsgraph {
>>>           "-1".$period,
>>>           "-r",
>>>           "-t ".$Lang::tr{'firewall hits per'}." 
>>> ".$Lang::tr{$period."-graph"},
>>> -        "-v ".$Lang::tr{'bytes per second'},
>>> +        "-v ".$Lang::tr{'bits per second'},
>>>           "--color=SHADEA".$color{"color19"},
>>>           "--color=SHADEB".$color{"color19"},
>>>           "--color=BACK".$color{"color21"},
>>> @@ -692,36 +702,41 @@ sub updatefwhitsgraph {
>>> "DEF:forward=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-POLICYFWD/ipt_bytes-DROP_FORWARD.rrd:value:AVERAGE",
>>> "DEF:newnotsyn=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-NEWNOTSYN/ipt_bytes-DROP_NEWNOTSYN.rrd:value:AVERAGE",
>>> "DEF:portscan=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-PSCAN/ipt_bytes-DROP_PScan.rrd:value:AVERAGE",
>>> +        "CDEF:outputb=output,8,*",
>>> +        "CDEF:inputb=input,8,*",
>>> +        "CDEF:forwardb=forward,8,*",
>>> +        "CDEF:newnotsynb=newnotsyn,8,*",
>>> +        "CDEF:portscanb=portscan,8,*",
>>>           "COMMENT:".sprintf("%-26s",$Lang::tr{'caption'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
>>>           "COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
>>>           "COMMENT:".sprintf("%14s",$Lang::tr{'minimal'}),
>>> "COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
>>> - 
>>> "AREA:output".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (OUTPUT)"),
>>> -        "GPRINT:output:MAX:%8.1lf %sBps",
>>> -        "GPRINT:output:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:output:MIN:%8.1lf %sBps",
>>> -        "GPRINT:output:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "STACK:forward".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (FORWARD)"),
>>> -        "GPRINT:forward:MAX:%8.1lf %sBps",
>>> -        "GPRINT:forward:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:forward:MIN:%8.1lf %sBps",
>>> -        "GPRINT:forward:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "STACK:input".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (INPUT)"),
>>> -        "GPRINT:input:MAX:%8.1lf %sBps",
>>> -        "GPRINT:input:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:input:MIN:%8.1lf %sBps",
>>> -        "GPRINT:input:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "STACK:newnotsyn".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
>>> -        "GPRINT:newnotsyn:MAX:%8.1lf %sBps",
>>> -        "GPRINT:newnotsyn:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:newnotsyn:MIN:%8.1lf %sBps",
>>> -        "GPRINT:newnotsyn:LAST:%8.1lf %sBps\\j",
>>> - 
>>> "STACK:portscan".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
>>> -        "GPRINT:portscan:MAX:%8.1lf %sBps",
>>> -        "GPRINT:portscan:AVERAGE:%8.1lf %sBps",
>>> -        "GPRINT:portscan:MIN:%8.1lf %sBps",
>>> -        "GPRINT:portscan:LAST:%8.1lf %sBps\\j",
>>> + 
>>> "AREA:outputb".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (OUTPUT)"),
>>> +        "GPRINT:outputb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:outputb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:outputb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:outputb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "STACK:forwardb".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (FORWARD)"),
>>> +        "GPRINT:forwardb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:forwardb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:forwardb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:forwardb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "STACK:inputb".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." 
>>> (INPUT)"),
>>> +        "GPRINT:inputb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:inputb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:inputb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:inputb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "STACK:newnotsynb".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"), 
>>>
>>> +        "GPRINT:newnotsynb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:newnotsynb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:newnotsynb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:newnotsynb:LAST:%8.1lf %sbps\\j",
>>> + 
>>> "STACK:portscanb".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
>>> +        "GPRINT:portscanb:MAX:%8.1lf %sbps",
>>> +        "GPRINT:portscanb:AVERAGE:%8.1lf %sbps",
>>> +        "GPRINT:portscanb:MIN:%8.1lf %sbps",
>>> +        "GPRINT:portscanb:LAST:%8.1lf %sbps\\j",
>>>           );
>>>           $ERROR = RRDs::error;
>>>           return "Error in RRD::graph for firewallhits: 
>>> ".$ERROR."\n" if $ERROR;
>>> @@ -1012,7 +1027,7 @@ sub updateqosgraph {
>>>           "-1".$period,
>>>           "-r",
>>>           "-t ".$Lang::tr{'Utilization on'}." 
>>> (".$qossettings{'DEV'}.") ".$Lang::tr{'graph per'}." 
>>> ".$Lang::tr{$period."-graph"},
>>> -        "-v ".$Lang::tr{'bytes per second'},
>>> +        "-v ".$Lang::tr{'bits per second'},
>>>           "--color=SHADEA".$color{"color19"},
>>>           "--color=SHADEB".$color{"color19"},
>>>           "--color=BACK".$color{"color21"},
>>> @@ -1039,21 +1054,24 @@ sub updateqosgraph {
>>>               }
>>>                 if ( $classline[0] eq $qossettings{'DEV'} ){
>>> -                push(@command, 
>>> "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
>>> +                # Found: ERROR: rpn expressions without DEF or CDEF 
>>> variables are not supported
>>> +                # CDEF does not like a number as a variable name. 
>>> ie. "204" from $classline[1]
>>> +                push(@command, 
>>> "DEF:$classline[1]bit=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
>>> +                push(@command, 
>>> "CDEF:$classline[8]=$classline[1]bit,8,*");
>>>                     # get color to be used for this graph
>>>                   my $graphColor = $colorMap{$colorKey};
>>>                     if ($count eq "1") {
>>> -                    push(@command, 
>>> "AREA:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] 
>>> -".sprintf("%15s",$classline[8]));
>>> +                    push(@command, 
>>> "AREA:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] 
>>> -".sprintf("%15s",$classline[8]));
>>>                   } else {
>>> -                    push(@command, 
>>> "STACK:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] 
>>> -".sprintf("%15s",$classline[8]));
>>> +                    push(@command, 
>>> "STACK:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] 
>>> -".sprintf("%15s",$classline[8]));
>>>                   }
>>>   -                push(@command, "GPRINT:$classline[1]:MAX:%8.1lf 
>>> %sBps"
>>> -                        , "GPRINT:$classline[1]:AVERAGE:%8.1lf %sBps"
>>> -                        , "GPRINT:$classline[1]:MIN:%8.1lf %sBps"
>>> -                        , "GPRINT:$classline[1]:LAST:%8.1lf 
>>> %sBps\\j");
>>> +                push(@command, "GPRINT:$classline[8]:MAX:%8.1lf %sbps"
>>> +                        , "GPRINT:$classline[8]:AVERAGE:%8.1lf %sbps"
>>> +                        , "GPRINT:$classline[8]:MIN:%8.1lf %sbps"
>>> +                        , "GPRINT:$classline[8]:LAST:%8.1lf 
>>> %sbps\\j");
>>>                   $count++;
>>>               }
>>>           }
>>> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
>>> index dc1fd8d67b30..b0097074beb0 100644
>>> --- a/langs/en/cgi-bin/en.pl
>>> +++ b/langs/en/cgi-bin/en.pl
>>> @@ -515,6 +515,7 @@
>>>   'broken pipe' => 'Broken pipe',
>>>   'buffered memory' => 'Buffered Memory',
>>>   'buffers' => 'buffers',
>>> +'bits per second' => 'Bits per Second',
>>>   'bytes per second' => 'Bytes per Second',
>>>   'bytes received' => 'Bytes Received',
>>>   'bytes sent' => 'Bytes Sent',
>>> @@ -1431,10 +1432,10 @@
>>>   'inactive' => 'inactive',
>>>   'include logfiles' => 'Include logfiles',
>>>   'incoming' => 'incoming',
>>> -'incoming compression in bytes per second' => 'Incoming Compression',
>>> +'incoming compression in bits per second' => 'Incoming Compression',
>>>   'incoming firewall access' => 'Incoming Firewall Access',
>>> -'incoming overhead in bytes per second' => 'Incoming Overhead',
>>> -'incoming traffic in bytes per second' => 'Incoming Traffic',
>>> +'incoming overhead in bits per second' => 'Incoming Overhead',
>>> +'incoming traffic in bits per second' => 'Incoming Traffic',
>>>   'incorrect password' => 'Incorrect password',
>>>   'info' => 'Info',
>>>   'init string' => 'Init:',
>>> @@ -1907,7 +1908,7 @@
>>>   'our donors' => 'Our donors',
>>>   'out' => 'Out',
>>>   'outgoing' => 'outgoing',
>>> -'outgoing compression in bytes per second' => 'Outgoing compression',
>>> +'outgoing compression in bits per second' => 'Outgoing compression',
>>>   'outgoing firewall' => 'Outgoing Firewall',
>>>   'outgoing firewall access' => 'Outgoing Firewall Access',
>>>   'outgoing firewall add ip group' => 'Add IP Address Group',
>>> @@ -1930,8 +1931,8 @@
>>>   'outgoing firewall reset' => 'Reset all',
>>>   'outgoing firewall view group' => 'View group',
>>>   'outgoing firewall warning' => 'Not selecting source ip or mac 
>>> ignores them',
>>> -'outgoing overhead in bytes per second' => 'Outgoing Overhead',
>>> -'outgoing traffic in bytes per second' => 'Outgoing Traffic',
>>> +'outgoing overhead in bits per second' => 'Outgoing Overhead',
>>> +'outgoing traffic in bits per second' => 'Outgoing Traffic',
>>>   'override mtu' => 'Override default MTU',
>>>   'ovpn' => 'OpenVPN',
>>>   'ovpn add conf' => 'Additional configuration',
>>>
>>

Patch

diff --git a/config/cfgroot/graphs.pl b/config/cfgroot/graphs.pl
index 441d4c483a46..c83ae67bbfc1 100644
--- a/config/cfgroot/graphs.pl
+++ b/config/cfgroot/graphs.pl
@@ -545,28 +545,30 @@  sub updateifgraph {
 		"-1".$period,
 		"-r",
 		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
-		"-v ".$Lang::tr{'bytes per second'},
+		"-v ".$Lang::tr{'bits per second'},
 		"--color=SHADEA".$color{"color19"},
 		"--color=SHADEB".$color{"color19"},
 		"--color=BACK".$color{"color21"},
 		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:rx:AVERAGE",
 		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/interface/if_octets-".$interface.".rrd:tx:AVERAGE",
-		"CDEF:outgoingn=outgoing,-1,*",
+		"CDEF:outgoingb=outgoing,8,*",
+		"CDEF:outgoingn=outgoingb,-1,*",
+		"CDEF:incomingb=incoming,8,*",
 		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
-		"AREA:incoming".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
-		"GPRINT:incoming:MAX:%8.1lf %sBps",
-		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
-		"GPRINT:incoming:MIN:%8.1lf %sBps",
-		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
-		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
-		"GPRINT:outgoing:MAX:%8.1lf %sBps",
-		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
-		"GPRINT:outgoing:MIN:%8.1lf %sBps",
-		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
+		"AREA:incomingb".$color{"color12"}."A0:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
+		"GPRINT:incomingb:MAX:%8.1lf %sbps",
+		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:incomingb:MIN:%8.1lf %sbps",
+		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
+		"AREA:outgoingn".$color{"color13"}."A0:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
+		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
+		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
+		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
 		);
 		$ERROR = RRDs::error;
 		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
@@ -582,28 +584,30 @@  sub updatevpngraph {
 		"-1".$period,
 		"-r",
 		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
-		"-v ".$Lang::tr{'bytes per second'},
+		"-v ".$Lang::tr{'bits per second'},
 		"--color=SHADEA".$color{"color19"},
 		"--color=SHADEB".$color{"color19"},
 		"--color=BACK".$color{"color21"},
 		"DEF:incoming=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:rx:AVERAGE",
 		"DEF:outgoing=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive.rrd:tx:AVERAGE",
-		"CDEF:outgoingn=outgoing,-1,*",
+		"CDEF:outgoingb=outgoing,8,*",
+		"CDEF:outgoingn=outgoingb,-1,*",
+		"CDEF:incomingb=incoming,8,*",
 		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
-		"AREA:incoming#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bytes per second'}),
-		"GPRINT:incoming:MAX:%8.1lf %sBps",
-		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
-		"GPRINT:incoming:MIN:%8.1lf %sBps",
-		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
-		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bytes per second'}),
-		"GPRINT:outgoing:MAX:%8.1lf %sBps",
-		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
-		"GPRINT:outgoing:MIN:%8.1lf %sBps",
-		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
+		"AREA:incomingb#00dd00:".sprintf("%-20s",$Lang::tr{'incoming traffic in bits per second'}),
+		"GPRINT:incomingb:MAX:%8.1lf %sbps",
+		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:incomingb:MIN:%8.1lf %sbps",
+		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
+		"AREA:outgoingn#dd0000:".sprintf("%-20s",$Lang::tr{'outgoing traffic in bits per second'}),
+		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
+		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
+		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
 		);
 		$ERROR = RRDs::error;
 		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
@@ -619,7 +623,7 @@  sub updatevpnn2ngraph {
 		"-1".$period,
 		"-r",
 		"-t ".$Lang::tr{'traffic on'}." ".$interface." ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
-		"-v ".$Lang::tr{'bytes per second'},
+		"-v ".$Lang::tr{'bits per second'},
 		"--color=SHADEA".$color{"color19"},
 		"--color=SHADEB".$color{"color19"},
 		"--color=BACK".$color{"color21"},
@@ -629,44 +633,50 @@  sub updatevpnn2ngraph {
 		"DEF:overhead_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/if_octets_derive-overhead.rrd:tx:AVERAGE",
 		"DEF:compression_in=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_in.rrd:uncompressed:AVERAGE",
 		"DEF:compression_out=".$mainsettings{'RRDLOG'}."/collectd/localhost/openvpn-$interface/compression_derive-data_out.rrd:uncompressed:AVERAGE",
-		"CDEF:outgoingn=outgoing,-1,*",
-		"CDEF:overhead_outn=overhead_out,-1,*",
-		"CDEF:compression_outn=compression_out,-1,*",
+		"CDEF:outgoingb=outgoing,8,*",
+		"CDEF:outgoingn=outgoingb,-1,*",
+		"CDEF:incomingb=incoming,8,*",
+		"CDEF:overhead_outb=overhead_out,8,*",
+		"CDEF:overhead_outn=overhead_outb,-1,*",
+		"CDEF:overhead_inb=overhead_in,8,*",
+		"CDEF:compression_outb=compression_out,8,*",
+		"CDEF:compression_outn=compression_outb,-1,*",
+		"CDEF:compression_inb=compression_in,8,*",
 		"COMMENT:".sprintf("%-20s",$Lang::tr{'caption'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'minimal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
-		"AREA:incoming#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bytes per second'}),
-		"GPRINT:incoming:MAX:%8.1lf %sBps",
-		"GPRINT:incoming:AVERAGE:%8.1lf %sBps",
-		"GPRINT:incoming:MIN:%8.1lf %sBps",
-		"GPRINT:incoming:LAST:%8.1lf %sBps\\j",
-		"STACK:overhead_in#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bytes per second'}),
-		"GPRINT:overhead_in:MAX:%8.1lf %sBps",
-		"GPRINT:overhead_in:AVERAGE:%8.1lf %sBps",
-		"GPRINT:overhead_in:MIN:%8.1lf %sBps",
-		"GPRINT:overhead_in:LAST:%8.1lf %sBps\\j",
-		"LINE1:compression_in#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bytes per second'}),
-		"GPRINT:compression_in:MAX:%8.1lf %sBps",
-		"GPRINT:compression_in:AVERAGE:%8.1lf %sBps",
-		"GPRINT:compression_in:MIN:%8.1lf %sBps",
-		"GPRINT:compression_in:LAST:%8.1lf %sBps\\j",
-		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bytes per second'}),
-		"GPRINT:outgoing:MAX:%8.1lf %sBps",
-		"GPRINT:outgoing:AVERAGE:%8.1lf %sBps",
-		"GPRINT:outgoing:MIN:%8.1lf %sBps",
-		"GPRINT:outgoing:LAST:%8.1lf %sBps\\j",
-		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bytes per second'}),
-		"GPRINT:overhead_out:MAX:%8.1lf %sBps",
-		"GPRINT:overhead_out:AVERAGE:%8.1lf %sBps",
-		"GPRINT:overhead_out:MIN:%8.1lf %sBps",
-		"GPRINT:overhead_out:LAST:%8.1lf %sBps\\j",
-		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bytes per second'}),
-		"GPRINT:compression_out:MAX:%8.1lf %sBps",
-		"GPRINT:compression_out:AVERAGE:%8.1lf %sBps",
-		"GPRINT:compression_out:MIN:%8.1lf %sBps",
-		"GPRINT:compression_out:LAST:%8.1lf %sBps\\j",
+		"AREA:incomingb#00dd00:".sprintf("%-23s",$Lang::tr{'incoming traffic in bits per second'}),
+		"GPRINT:incomingb:MAX:%8.1lf %sbps",
+		"GPRINT:incomingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:incomingb:MIN:%8.1lf %sbps",
+		"GPRINT:incomingb:LAST:%8.1lf %sbps\\j",
+		"STACK:overhead_inb#116B11:".sprintf("%-23s",$Lang::tr{'incoming overhead in bits per second'}),
+		"GPRINT:overhead_inb:MAX:%8.1lf %sbps",
+		"GPRINT:overhead_inb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:overhead_inb:MIN:%8.1lf %sbps",
+		"GPRINT:overhead_inb:bLAST:%8.1lf %sbps\\j",
+		"LINE1:compression_inb#ff00ff:".sprintf("%-23s",$Lang::tr{'incoming compression in bits per second'}),
+		"GPRINT:compression_inb:MAX:%8.1lf %sbps",
+		"GPRINT:compression_inb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:compression_inb:MIN:%8.1lf %sbps",
+		"GPRINT:compression_inb:LAST:%8.1lf %sbps\\j",
+		"AREA:outgoingn#dd0000:".sprintf("%-23s",$Lang::tr{'outgoing traffic in bits per second'}),
+		"GPRINT:outgoingb:MAX:%8.1lf %sbps",
+		"GPRINT:outgoingb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:outgoingb:MIN:%8.1lf %sbps",
+		"GPRINT:outgoingb:LAST:%8.1lf %sbps\\j",
+		"STACK:overhead_outn#870C0C:".sprintf("%-23s",$Lang::tr{'outgoing overhead in bits per second'}),
+		"GPRINT:overhead_outb:MAX:%8.1lf %sbps",
+		"GPRINT:overhead_outb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:overhead_outb:MIN:%8.1lf %sbps",
+		"GPRINT:overhead_outb:LAST:%8.1lf %sbps\\j",
+		"LINE1:compression_outn#000000:".sprintf("%-23s",$Lang::tr{'outgoing compression in bits per second'}),
+		"GPRINT:compression_outb:MAX:%8.1lf %sbps",
+		"GPRINT:compression_outb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:compression_outb:MIN:%8.1lf %sbps",
+		"GPRINT:compression_outb:LAST:%8.1lf %sbps\\j",
 		);
 		$ERROR = RRDs::error;
 		return "Error in RRD::graph for ".$interface.": ".$ERROR."\n" if $ERROR;
@@ -683,7 +693,7 @@  sub updatefwhitsgraph {
 		"-1".$period,
 		"-r",
 		"-t ".$Lang::tr{'firewall hits per'}." ".$Lang::tr{$period."-graph"},
-		"-v ".$Lang::tr{'bytes per second'},
+		"-v ".$Lang::tr{'bits per second'},
 		"--color=SHADEA".$color{"color19"},
 		"--color=SHADEB".$color{"color19"},
 		"--color=BACK".$color{"color21"},
@@ -692,36 +702,41 @@  sub updatefwhitsgraph {
 		"DEF:forward=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-POLICYFWD/ipt_bytes-DROP_FORWARD.rrd:value:AVERAGE",
 		"DEF:newnotsyn=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-NEWNOTSYN/ipt_bytes-DROP_NEWNOTSYN.rrd:value:AVERAGE",
 		"DEF:portscan=".$mainsettings{'RRDLOG'}."/collectd/localhost/iptables-filter-PSCAN/ipt_bytes-DROP_PScan.rrd:value:AVERAGE",
+		"CDEF:outputb=output,8,*",
+		"CDEF:inputb=input,8,*",
+		"CDEF:forwardb=forward,8,*",
+		"CDEF:newnotsynb=newnotsyn,8,*",
+		"CDEF:portscanb=portscan,8,*",
 		"COMMENT:".sprintf("%-26s",$Lang::tr{'caption'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'maximal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'average'}),
 		"COMMENT:".sprintf("%14s",$Lang::tr{'minimal'}),
 		"COMMENT:".sprintf("%15s",$Lang::tr{'current'})."\\j",
-		"AREA:output".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
-		"GPRINT:output:MAX:%8.1lf %sBps",
-		"GPRINT:output:AVERAGE:%8.1lf %sBps",
-		"GPRINT:output:MIN:%8.1lf %sBps",
-		"GPRINT:output:LAST:%8.1lf %sBps\\j",
-		"STACK:forward".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
-		"GPRINT:forward:MAX:%8.1lf %sBps",
-		"GPRINT:forward:AVERAGE:%8.1lf %sBps",
-		"GPRINT:forward:MIN:%8.1lf %sBps",
-		"GPRINT:forward:LAST:%8.1lf %sBps\\j",
-		"STACK:input".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
-		"GPRINT:input:MAX:%8.1lf %sBps",
-		"GPRINT:input:AVERAGE:%8.1lf %sBps",
-		"GPRINT:input:MIN:%8.1lf %sBps",
-		"GPRINT:input:LAST:%8.1lf %sBps\\j",
-		"STACK:newnotsyn".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
-		"GPRINT:newnotsyn:MAX:%8.1lf %sBps",
-		"GPRINT:newnotsyn:AVERAGE:%8.1lf %sBps",
-		"GPRINT:newnotsyn:MIN:%8.1lf %sBps",
-		"GPRINT:newnotsyn:LAST:%8.1lf %sBps\\j",
-		"STACK:portscan".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
-		"GPRINT:portscan:MAX:%8.1lf %sBps",
-		"GPRINT:portscan:AVERAGE:%8.1lf %sBps",
-		"GPRINT:portscan:MIN:%8.1lf %sBps",
-		"GPRINT:portscan:LAST:%8.1lf %sBps\\j",
+		"AREA:outputb".$color{"color25"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (OUTPUT)"),
+		"GPRINT:outputb:MAX:%8.1lf %sbps",
+		"GPRINT:outputb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:outputb:MIN:%8.1lf %sbps",
+		"GPRINT:outputb:LAST:%8.1lf %sbps\\j",
+		"STACK:forwardb".$color{"color23"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (FORWARD)"),
+		"GPRINT:forwardb:MAX:%8.1lf %sbps",
+		"GPRINT:forwardb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:forwardb:MIN:%8.1lf %sbps",
+		"GPRINT:forwardb:LAST:%8.1lf %sbps\\j",
+		"STACK:inputb".$color{"color24"}."A0:".sprintf("%-25s",$Lang::tr{'firewallhits'}." (INPUT)"),
+		"GPRINT:inputb:MAX:%8.1lf %sbps",
+		"GPRINT:inputb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:inputb:MIN:%8.1lf %sbps",
+		"GPRINT:inputb:LAST:%8.1lf %sbps\\j",
+		"STACK:newnotsynb".$color{"color14"}."A0:".sprintf("%-25s","NewNotSYN"),
+		"GPRINT:newnotsynb:MAX:%8.1lf %sbps",
+		"GPRINT:newnotsynb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:newnotsynb:MIN:%8.1lf %sbps",
+		"GPRINT:newnotsynb:LAST:%8.1lf %sbps\\j",
+		"STACK:portscanb".$color{"color16"}."A0:".sprintf("%-25s",$Lang::tr{'portscans'}),
+		"GPRINT:portscanb:MAX:%8.1lf %sbps",
+		"GPRINT:portscanb:AVERAGE:%8.1lf %sbps",
+		"GPRINT:portscanb:MIN:%8.1lf %sbps",
+		"GPRINT:portscanb:LAST:%8.1lf %sbps\\j",
 		);
 		$ERROR = RRDs::error;
 		return "Error in RRD::graph for firewallhits: ".$ERROR."\n" if $ERROR;
@@ -1012,7 +1027,7 @@  sub updateqosgraph {
 		"-1".$period,
 		"-r",
 		"-t ".$Lang::tr{'Utilization on'}." (".$qossettings{'DEV'}.") ".$Lang::tr{'graph per'}." ".$Lang::tr{$period."-graph"},
-		"-v ".$Lang::tr{'bytes per second'},
+		"-v ".$Lang::tr{'bits per second'},
 		"--color=SHADEA".$color{"color19"},
 		"--color=SHADEB".$color{"color19"},
 		"--color=BACK".$color{"color21"},
@@ -1039,21 +1054,24 @@  sub updateqosgraph {
 			}
 
 			if ( $classline[0] eq $qossettings{'DEV'} ){
-				push(@command, "DEF:$classline[1]=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
+				# Found: ERROR: rpn expressions without DEF or CDEF variables are not supported
+				# CDEF does not like a number as a variable name. ie. "204" from $classline[1]
+				push(@command, "DEF:$classline[1]bit=$mainsettings{'RRDLOG'}/class_$qossettings{'CLASSPRFX'}-$classline[1]_$qossettings{'DEV'}.rrd:bytes:AVERAGE");
+				push(@command, "CDEF:$classline[8]=$classline[1]bit,8,*");
 
 				# get color to be used for this graph
 				my $graphColor = $colorMap{$colorKey};
 
 				if ($count eq "1") {
-					push(@command, "AREA:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
+					push(@command, "AREA:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
 				} else {
-					push(@command, "STACK:$classline[1]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
+					push(@command, "STACK:$classline[8]$graphColor:$Lang::tr{'Class'} $classline[1] -".sprintf("%15s",$classline[8]));
 				}
 
-				push(@command, "GPRINT:$classline[1]:MAX:%8.1lf %sBps"
-						, "GPRINT:$classline[1]:AVERAGE:%8.1lf %sBps"
-						, "GPRINT:$classline[1]:MIN:%8.1lf %sBps"
-						, "GPRINT:$classline[1]:LAST:%8.1lf %sBps\\j");
+				push(@command, "GPRINT:$classline[8]:MAX:%8.1lf %sbps"
+						, "GPRINT:$classline[8]:AVERAGE:%8.1lf %sbps"
+						, "GPRINT:$classline[8]:MIN:%8.1lf %sbps"
+						, "GPRINT:$classline[8]:LAST:%8.1lf %sbps\\j");
 				$count++;
 			}
 		}
diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
index dc1fd8d67b30..b0097074beb0 100644
--- a/langs/en/cgi-bin/en.pl
+++ b/langs/en/cgi-bin/en.pl
@@ -515,6 +515,7 @@ 
 'broken pipe' => 'Broken pipe',
 'buffered memory' => 'Buffered Memory',
 'buffers' => 'buffers',
+'bits per second' => 'Bits per Second',
 'bytes per second' => 'Bytes per Second',
 'bytes received' => 'Bytes Received',
 'bytes sent' => 'Bytes Sent',
@@ -1431,10 +1432,10 @@ 
 'inactive' => 'inactive',
 'include logfiles' => 'Include logfiles',
 'incoming' => 'incoming',
-'incoming compression in bytes per second' => 'Incoming Compression',
+'incoming compression in bits per second' => 'Incoming Compression',
 'incoming firewall access' => 'Incoming Firewall Access',
-'incoming overhead in bytes per second' => 'Incoming Overhead',
-'incoming traffic in bytes per second' => 'Incoming Traffic',
+'incoming overhead in bits per second' => 'Incoming Overhead',
+'incoming traffic in bits per second' => 'Incoming Traffic',
 'incorrect password' => 'Incorrect password',
 'info' => 'Info',
 'init string' => 'Init:',
@@ -1907,7 +1908,7 @@ 
 'our donors' => 'Our donors',
 'out' => 'Out',
 'outgoing' => 'outgoing',
-'outgoing compression in bytes per second' => 'Outgoing compression',
+'outgoing compression in bits per second' => 'Outgoing compression',
 'outgoing firewall' => 'Outgoing Firewall',
 'outgoing firewall access' => 'Outgoing Firewall Access',
 'outgoing firewall add ip group' => 'Add IP Address Group',
@@ -1930,8 +1931,8 @@ 
 'outgoing firewall reset' => 'Reset all',
 'outgoing firewall view group' => 'View group',
 'outgoing firewall warning' => 'Not selecting source ip or mac ignores them',
-'outgoing overhead in bytes per second' => 'Outgoing Overhead',
-'outgoing traffic in bytes per second' => 'Outgoing Traffic',
+'outgoing overhead in bits per second' => 'Outgoing Overhead',
+'outgoing traffic in bits per second' => 'Outgoing Traffic',
 'override mtu' => 'Override default MTU',
 'ovpn' => 'OpenVPN',
 'ovpn add conf' => 'Additional configuration',