Skip to content

Commit df1d78d

Browse files
committed
Port parsing better asymmetric speed handling
Add support to generic_data graph (port_bits) share with custom map code
1 parent c9321af commit df1d78d

File tree

3 files changed

+38
-40
lines changed

3 files changed

+38
-40
lines changed

app/Http/Controllers/Maps/CustomMapDataController.php

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -79,36 +79,11 @@ public function get(Request $request, CustomMap $map): JsonResponse
7979
$edges[$edgeid]['port_name'] = $edge->port->device->displayName() . ' - ' . $edge->port->getLabel();
8080
$edges[$edgeid]['port_info'] = Blade::render('<x-port-link-map :port="$port" />', ['port' => $edge->port]);
8181

82-
// Work out speed to and from
83-
$speedto = 0;
84-
$speedfrom = 0;
85-
$rateto = 0;
86-
$ratefrom = 0;
87-
88-
// Try to interpret the SNMP speeds
89-
if ($edge->port->port_descr_speed) {
90-
$speed_parts = explode('/', (string) $edge->port->port_descr_speed, 2);
91-
92-
if (count($speed_parts) == 1) {
93-
$speedto = $this->snmpSpeed($speed_parts[0]);
94-
$speedfrom = $speedto;
95-
} elseif ($edge->reverse) {
96-
$speedto = $this->snmpSpeed($speed_parts[1]);
97-
$speedfrom = $this->snmpSpeed($speed_parts[0]);
98-
} else {
99-
$speedto = $this->snmpSpeed($speed_parts[0]);
100-
$speedfrom = $this->snmpSpeed($speed_parts[1]);
101-
}
102-
if ($speedto == 0 || $speedfrom == 0) {
103-
$speedto = 0;
104-
$speedfrom = 0;
105-
}
106-
}
107-
108-
// If we did not get a speed from the snmp desc, use the deteced speed
109-
if ($speedto == 0 && $edge->port->ifSpeed) {
110-
$speedto = $edge->port->ifSpeed;
111-
$speedfrom = $edge->port->ifSpeed;
82+
// Get speed to and from
83+
if ($edge->reverse) {
84+
[$speedto, $speedfrom] = $edge->port->getSpeeds();
85+
} else {
86+
[$speedfrom, $speedto] = $edge->port->getSpeeds();
11287
}
11388

11489
// Get the to/from rates
@@ -339,12 +314,6 @@ private function rateString(int $rate): string
339314
return Number::formatSi($rate, 2, 3, 'bps');
340315
}
341316

342-
private function snmpSpeed(string $speeds): int
343-
{
344-
// Only succeed if the string starts with a number optionally followed by a unit, return 0 for non-parsable
345-
return (int) Number::toBytes($speeds);
346-
}
347-
348317
private function fixedColour(array $colours, float $pct): string
349318
{
350319
$last_colour = 'black';

app/Models/Port.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Illuminate\Database\Eloquent\Relations\MorphMany;
1313
use Illuminate\Support\Facades\DB;
1414
use Illuminate\Support\Str;
15+
use LibreNMS\Util\Number;
1516
use LibreNMS\Util\Rewrite;
1617
use Permissions;
1718

@@ -130,6 +131,28 @@ public function getDescription(): string
130131
return (string) $this->ifAlias;
131132
}
132133

134+
/**
135+
* Get port speeds, respecting parsed interface circuit speeds as bps
136+
* @return array{int, int} [egress bps, ingress bps]
137+
*/
138+
public function getSpeeds(): array
139+
{
140+
$egress = $ingress = (int) $this->ifSpeed;
141+
142+
if (! empty($this->port_descr_speed)) {
143+
$speed_parts = explode('/', $this->port_descr_speed, 2);
144+
$parsed_egress = Number::toBytes($speed_parts[0]);
145+
$parsed_ingress = isset($speed_parts[1]) ? Number::toBytes($speed_parts[1]) : $parsed_egress;
146+
147+
if ($parsed_egress > 0 && $parsed_ingress > 0) {
148+
$egress = $parsed_egress;
149+
$ingress = $parsed_ingress;
150+
}
151+
}
152+
153+
return [$egress, $ingress];
154+
}
155+
133156
/**
134157
* Check if user can access this port.
135158
*

includes/html/graphs/generic_data.inc.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
require 'includes/html/graphs/common.inc.php';
2121

22-
$stacked = generate_stacked_graphs(! empty($port['ifSpeed']) && ($vars['port_speed_zoom'] ?? LibrenmsConfig::get('graphs.port_speed_zoom')));
2322
$inverse ??= false;
2423
$multiplier ??= false;
2524
$format ??= '';
@@ -31,10 +30,13 @@
3130
if ($inverse) {
3231
$in = 'out';
3332
$out = 'in';
33+
[$ingress_speed, $egress_speed] = PortCache::get($port['port_id'])->getSpeeds();
3434
} else {
3535
$in = 'in';
3636
$out = 'out';
37+
[$egress_speed, $ingress_speed] = PortCache::get($port['port_id'])->getSpeeds();
3738
}
39+
$stacked = generate_stacked_graphs(($egress_speed || $ingress_speed) && ($vars['port_speed_zoom'] ?? LibrenmsConfig::get('graphs.port_speed_zoom')));
3840

3941
if ($multiplier) {
4042
$rrd_options .= ' DEF:p' . $out . 'octets=' . $rrd_filename_out . ':' . $ds_out . ':AVERAGE';
@@ -167,9 +169,13 @@
167169
$rrd_options .= ' LINE1:percentile_in#aa0000';
168170
$rrd_options .= ' LINE1:dpercentile_out#aa0000';
169171

170-
if (! empty($port['ifSpeed'])) {
171-
$speed_line_type = ($vars['port_speed_zoom'] ?? LibrenmsConfig::get('graphs.port_speed_zoom')) ? 'LINE2' : 'HRULE';
172-
$rrd_options .= " $speed_line_type:{$port['ifSpeed']}#000000:'Port Speed " . Number::formatSi($port['ifSpeed'], 2, 0, 'bps') . "\\n'";
172+
173+
$speed_line_type = ($vars['port_speed_zoom'] ?? LibrenmsConfig::get('graphs.port_speed_zoom')) ? 'LINE2' : 'HRULE';
174+
if ($egress_speed && $ingress_speed && $ingress_speed != $egress_speed) {
175+
$rrd_options .= " $speed_line_type:$ingress_speed#000000:'In Port Speed " . Number::formatSi($ingress_speed, 2, 0, 'bps') . "\\n'";
176+
$rrd_options .= " $speed_line_type:-$egress_speed#000000:'Out Port Speed " . Number::formatSi($egress_speed, 2, 0, 'bps') . "\\n'";
177+
} elseif ($egress_speed) {
178+
$rrd_options .= " $speed_line_type:$egress_speed#000000:'Port Speed " . Number::formatSi($egress_speed, 2, 0, 'bps') . "\\n'";
173179
}
174180

175181
// Linear prediction of trend

0 commit comments

Comments
 (0)