Skip to content

Your Top Peers Table/Link breaks if first virtual interface is reseller uplink port #986

@chris240189

Description

@chris240189
ISSUE TYPE

Bug Report

OS

Ubuntu 24.04

VERSION
define( 'APPLICATION_VERSION', '7.2.0' );
define( 'APPLICATION_VERDATE', '2026051200' );
ENVIRONMENT
php -v
PHP 8.4.20 (cli) (built: Apr 11 2026 07:43:26) (NTS)
Copyright (c) The PHP Group
Built by Debian
Zend Engine v4.4.20, Copyright (c) Zend Technologies
    with Zend OPcache v8.4.20, Copyright (c), by Zend Technologies


dpkg -l | grep php
ii  libapache2-mod-php8.4                  8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  php-common                             2:101~+ubuntu24.04.1+deb.sury.org+1              all          Common files for PHP packages
ii  php8.4                                 8.4.20-1+ubuntu24.04.1+deb.sury.org+1            all          server-side, HTML-embedded scripting language (metapackage)
ii  php8.4-bcmath                          8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        Bcmath module for PHP
ii  php8.4-cgi                             8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        server-side, HTML-embedded scripting language (CGI binary)
ii  php8.4-cli                             8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        command-line interpreter for the PHP scripting language
ii  php8.4-common                          8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        documentation, examples and common module for PHP
ii  php8.4-curl                            8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        CURL module for PHP
ii  php8.4-ds                              1.6.0-2+ubuntu24.04.1+deb.sury.org+1             amd64        PHP extension providing efficient data structures for PHP 7
ii  php8.4-gd                              8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        GD module for PHP
ii  php8.4-igbinary                        3.2.16-6+ubuntu24.04.1+deb.sury.org+1            amd64        igbinary PHP serializer
ii  php8.4-intl                            8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        Internationalisation module for PHP
ii  php8.4-mbstring                        8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        MBSTRING module for PHP
ii  php8.4-memcache                        8.2-5+ubuntu24.04.1+deb.sury.org+1               amd64        memcache extension module for PHP
ii  php8.4-memcached                       3.4.0-1+ubuntu24.04.1+deb.sury.org+1             amd64        memcached extension module for PHP, uses libmemcached
ii  php8.4-msgpack                         1:3.0.0-2+ubuntu24.04.1+deb.sury.org+1           amd64        PHP extension for interfacing with MessagePack
ii  php8.4-mysql                           8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        MySQL module for PHP
ii  php8.4-opcache                         8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        Zend OpCache module for PHP
ii  php8.4-readline                        8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        readline module for PHP
ii  php8.4-rrd                             2.0.3++-4+ubuntu24.04.1+deb.sury.org+1           amd64        PHP bindings to rrd tool system
ii  php8.4-snmp                            8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        SNMP module for PHP
ii  php8.4-xml                             8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        DOM, SimpleXML, XML, and XSL module for PHP
ii  php8.4-yaml                            2.3.0-2+ubuntu24.04.1+deb.sury.org+1             amd64        YAML-1.1 parser and emitter for PHP
ii  php8.4-zip                             8.4.20-1+ubuntu24.04.1+deb.sury.org+1            amd64        Zip module for PHP



SUMMARY

A customer reported that upon login ixp manager, ixp manager shows errors.
The "Your Top Peers" table breaks while generating the links to the p2p statistics pages.

We think that the code

[ 'srcVli' => $t->c->virtualInterfaces[0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[0]->vlanInterfaces[0]->id ]

is to blame as virtualInterfaces[0] is not guaranteed to be an interface used for peering.

We have a customer with a reseller uplink port and peering, where the reseller uplink port was created prior to the creation of the peering interface (reseller uplink port virtualinterface has a lower database ID than the virtual interface that has peering).

To temporarily fix the issue we have altered the code as follows:
[ 'srcVli' => $t->c->virtualInterfaces[ $t->c->abbreviatedName == '<affected_customer>' ? 1 : 0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[ ($t->ee( $p2p->peer->abbreviatedName ) == '<affected_customer>') ? 1 : 0 ]->vlanInterfaces[0]->id ]
which will use virtualInterface at index 1 when rendering the link containing the affected customer.

STEPS TO REPRODUCE

create a customer, create the reseller uplink port first, then create a peering port.

EXPECTED RESULTS

A "Your Top Peers" table without errors.

ACTUAL RESULTS

A broken "Your Top Peers" table.

IMPORTANCE

We are affected in production. We have identified at least one customer that is affected from the "Your Top Peers" getting rendered with issues when they are on said table for other customers.

RELEVANT LOGS
laravel.log

[2026-05-27 21:06:18] production.ERROR: Undefined array key 0 {"userId":542,"exception":"[object] (ErrorException(code: 0): Undefined array key 0 at /srv/ixpmanager
/vendor/laravel/framework/src/Illuminate/Collections/Collection.php:1971)
[stacktrace]
#0 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(258): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->hand
leError()
#1 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(1971): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->{closure:Illuminat
e\\Foundation\\Bootstrap\\HandleExceptions::forwardsTo():257}()
#2 /srv/ixpmanager/resources/views/dashboard/dashboard-tabs/overview.foil.php(109): Illuminate\\Support\\Collection->offsetGet()
#3 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(287): require('...')
#4 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(231): Foil\\Template\\Template->collect()
#5 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(307): Foil\\Template\\Template->render()
#6 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(211): Foil\\Engine->doRender()
#7 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(188): Foil\\Engine->render()
#8 /srv/ixpmanager/resources/views/dashboard/index.foil.php(123): Foil\\Template\\Template->insert()
#9 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(287): require('...')
#10 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(231): Foil\\Template\\Template->collect()
#11 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(307): Foil\\Template\\Template->render()
#12 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(231): Foil\\Engine->doRender()
#13 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(204): Foil\\Engine->renderTemplate()
#14 /srv/ixpmanager/app/Services/FoilEngine.php(54): Foil\\Engine->render()
#15 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(208): IXP\\Services\\FoilEngine->get()
#16 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(191): Illuminate\\View\\View->getContents()
#17 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(160): Illuminate\\View\\View->renderContents()
#18 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Response.php(78): Illuminate\\View\\View->render()
#19 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Response.php(34): Illuminate\\Http\\Response->setContent()
#20 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(939): Illuminate\\Http\\Response->__construct()
#21 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(906): Illuminate\\Routing\\Router::toResponse()
#22 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(821): Illuminate\\Routing\\Router->prepareResponse()
#23 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Router->{closure:Illuminate\\Routing\\Router::runRouteWithinStack():821}()
#24 /srv/ixpmanager/app/Http/Middleware/Google2FA.php(81): Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
#25 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\Google2FA->handle()
#26 /srv/ixpmanager/app/Http/Middleware/ControllerEnabled.php(103): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#27 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\ControllerEnabled->handle()
#28 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#29 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /srv/ixpmanager/app/Http/Middleware/Authenticate.php(106): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#31 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\Authenticate->handle()
#32 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(87): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#33 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#34 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(48): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#35 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#36 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(120): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#37 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#38 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Session\\Middleware\\StartSession->handle()
#39 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(36): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#40 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#41 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(74): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#42 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#43 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#44 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(821): Illuminate\\Pipeline\\Pipeline->then()
#45 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\\Routing\\Router->runRouteWithinStack()
#46 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(764): Illuminate\\Routing\\Router->runRoute()
#47 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(753): Illuminate\\Routing\\Router->dispatchToRoute()
#48 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
#49 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Kernel->{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}()
#50 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
#51 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#52 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#53 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#54 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#55 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#56 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#57 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
#58 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(109): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#59 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#60 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(61): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#61 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\HandleCors->handle()
#62 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#63 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#64 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#65 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
#66 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#67 /srv/ixpmanager/public/index.php(88): Illuminate\\Foundation\\Http\\Kernel->handle()
#68 {main}
"} 

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions