Support matrix

Which model can do what, over which protocol. Every table on this page is generated at build time from src/netgear_switch/registry.py and src/netgear_switch/capabilities.py — the same data the library consults when it dispatches an operation — so a table here cannot disagree with what the code does.

The same answers are available at runtime:

from netgear_switch import Backend, support, matrix

support("gs110emx", Backend.NSDP, "get_poe").supported   # False
support("gs110emx", Backend.NSDP, "get_poe").reason
# 'NSDP has no PoE status tag (measured by an exhaustive NSDP tag sweep ...)'

for capability in matrix():
    ...

Important

These tables describe SyncSwitch. The SNMP, NSDP and HTTP entries hold for AsyncSwitch too, but the CLI columns do not: all three CLI transports are blocking, so the async facade has no CLI backend and refuses SSH, telnet and console outright. See Concepts.

Protocol support

Which backends each model exposes — the model’s backends, and exactly what resolve_backend accepts.

Model

SNMP

NSDP

HTTP

SSH

TELNET

m4300-24x

m4300-16x

gsm7252ps

gsm7228ps

gs110emx

gs305ep

gs728tpp

gs105pe

SSH and TELNET are two transports for the same FASTPATH command surface. A third, CONSOLE, drives that same CLI over a serial line; being a transport rather than a network backend, it is never registered on a model and never selected automatically.

Read operations

Rows are operations, columns are models. Each cell names the backends that serve that operation on that model:

S = SNMP · N = NSDP · H = HTTP web UI · C = FASTPATH CLI · = not available on any backend.

Operation

m4300-24x

m4300-16x

gsm7252ps

gsm7228ps

gs110emx

gs305ep

gs728tpp

gs105pe

get_ports

S H C

S H C

S H C

S H C

N H

N H

S H

N H

get_stats

S H C

S H C

S H C

S H C

N H

N H

S

N H

get_vlans

S H C

S H C

S H C

S H C

N H

N H

S H

N H

get_pvids

S H C

S H C

S H C

S H C

N H

N H

S H

N H

get_lldp

S H C

S H C

S H C

S H C

S H

get_macs

S H C

S H C

S H C

S H C

S H

get_poe

S H C

S H C

S H C

H

S H

get_sensors

S H C

S H C

S H C

S C

S H

get_mgmt_ip

S H C

S H C

S H C

S H C

N H

N

S H

N H

get_hostname

S C

S C

S C

S C

N H

N

S

N H

get_users

C

C

C

C

get_services

C

C

C

C

get_syslog

S C

S C

S C

S C

nsdp_device

N

N

N

Write operations

Operation

m4300-24x

m4300-16x

gsm7252ps

gsm7228ps

gs110emx

gs305ep

gs728tpp

gs105pe

set_port_enabled

S H C

S H C

S H C

S H C

H

S

set_poe

S H C

S H C

S H C

H

S

cycle_poe

S H C

S H C

S H C

H

S

clear_poe_fault

S H C

S H C

S H C

H

S

set_pvid

S H C

S H C

S H C

S H C

N H

N H

S H

N H

set_vlan_membership

S H C

S H C

S H C

S H C

N H

N H

S

N H

create_vlan

S C

S C

S C

S C

N

N H

S

N H

delete_vlan

S C

S C

S C

S C

N

N H

S

N H

set_mgmt_ip

S H C

S H C

S H C

S H C

N

N

N

set_hostname

S C

S C

S C

S C

N

N

S

N

upload_certificate

H

H

upload_certificate_scp

C

C

C

Backend parity gaps

Every case where one backend of a model serves an operation and another does not. This project treats a gap as a missing implementation to build, not a device limitation, unless captured device output proves otherwise — so this table is a work list as much as a reference.

Operations that are backend-fixed by nature are excluded: nsdp_device is NSDP-only, and the two certificate-upload methods name their own transport.

Model

Operation

Served by

Not served by

Why

m4300-24x

get_hostname

SNMP, SSH, TELNET

HTTP

model ‘m4300-24x’ web UI has no page for get_hostname (The switch’s host name)

m4300-24x

create_vlan

SNMP, SSH, TELNET

HTTP

model ‘m4300-24x’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

m4300-24x

delete_vlan

SNMP, SSH, TELNET

HTTP

model ‘m4300-24x’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

m4300-16x

get_hostname

SNMP, SSH, TELNET

HTTP

model ‘m4300-16x’ web UI has no page for get_hostname (The switch’s host name)

m4300-16x

create_vlan

SNMP, SSH, TELNET

HTTP

model ‘m4300-16x’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

m4300-16x

delete_vlan

SNMP, SSH, TELNET

HTTP

model ‘m4300-16x’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

gsm7252ps

get_hostname

SNMP, SSH, TELNET

HTTP

model ‘gsm7252ps’ web UI has no page for get_hostname (The switch’s host name)

gsm7252ps

create_vlan

SNMP, SSH, TELNET

HTTP

model ‘gsm7252ps’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

gsm7252ps

delete_vlan

SNMP, SSH, TELNET

HTTP

model ‘gsm7252ps’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

gsm7228ps

get_sensors

SNMP, TELNET

HTTP

model ‘gsm7228ps’ web UI has no page for get_sensors (Fan/PSU/temperature sensors)

gsm7228ps

get_hostname

SNMP, TELNET

HTTP

model ‘gsm7228ps’ web UI has no page for get_hostname (The switch’s host name)

gsm7228ps

create_vlan

SNMP, TELNET

HTTP

model ‘gsm7228ps’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

gsm7228ps

delete_vlan

SNMP, TELNET

HTTP

model ‘gsm7228ps’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

gs110emx

set_port_enabled

HTTP

NSDP

per-port admin-enable over NSDP is UNPROVEN on these Plus models: the measured tag inventory (GS110EMX fw 1.0.2.8) has two candidate per-port config tags (0x0800, 0x9400) whose semantics were never settled – no write has been attempted against either, and a wrong guess can drop the port’s link. Use the HTTP backend, whose port-settings page IS grounded

gs110emx

create_vlan

NSDP

HTTP

model ‘gs110emx’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

gs110emx

delete_vlan

NSDP

HTTP

model ‘gs110emx’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

gs110emx

set_mgmt_ip

NSDP

HTTP

model ‘gs110emx’ web UI has no page for set_mgmt_ip (Set the management IP/mask/gateway)

gs305ep

get_poe

HTTP

NSDP

NSDP has no PoE status tag (measured by an exhaustive NSDP tag sweep of a real GS110EMX (10.1.5.25, firmware 1.0.2.8, 2026-07-30) covering every tag in the 16-bit space; see nsdp_read.py for the full tag inventory); use the HTTP backend for PoE

gs305ep

get_mgmt_ip

NSDP

HTTP

model ‘gs305ep’ web UI has no page for get_mgmt_ip (Management IP configuration)

gs305ep

get_hostname

NSDP

HTTP

model ‘gs305ep’ web UI has no page for get_hostname (The switch’s host name)

gs305ep

set_poe

HTTP

NSDP

NSDP has no PoE control tag (measured by an exhaustive tag sweep of a real GS110EMX, 10.1.5.25 fw 1.0.2.8, 2026-07-30 – see nsdp_read._SWEEP); use the HTTP backend for PoE

gs305ep

cycle_poe

HTTP

NSDP

NSDP has no PoE control tag (measured by an exhaustive tag sweep of a real GS110EMX, 10.1.5.25 fw 1.0.2.8, 2026-07-30 – see nsdp_read._SWEEP); use the HTTP backend for PoE

gs305ep

clear_poe_fault

HTTP

NSDP

NSDP has no PoE control tag (measured by an exhaustive tag sweep of a real GS110EMX, 10.1.5.25 fw 1.0.2.8, 2026-07-30 – see nsdp_read._SWEEP); use the HTTP backend for PoE

gs305ep

set_mgmt_ip

NSDP

HTTP

model ‘gs305ep’ web UI has no page for set_mgmt_ip (Set the management IP/mask/gateway)

gs728tpp

get_stats

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for get_stats (Per-port octet/packet counters)

gs728tpp

get_hostname

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for get_hostname (The switch’s host name)

gs728tpp

set_port_enabled

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for set_port_enabled (Bring a port up or down)

gs728tpp

set_poe

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for set_poe (Enable or disable PoE on a port)

gs728tpp

cycle_poe

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for cycle_poe (Power-cycle a PoE port)

gs728tpp

clear_poe_fault

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for clear_poe_fault (Clear a latched PoE fault)

gs728tpp

set_vlan_membership

SNMP

HTTP

model ‘gs728tpp’ web UI has no page for set_vlan_membership (Set a port tagged/untagged/excluded on a VLAN)

gs728tpp

create_vlan

SNMP

HTTP

model ‘gs728tpp’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires

gs728tpp

delete_vlan

SNMP

HTTP

model ‘gs728tpp’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires

gs105pe

set_mgmt_ip

NSDP

HTTP

model ‘gs105pe’ web UI has no page for set_mgmt_ip (Set the management IP/mask/gateway)

How to read a refusal

The reasons above are the same strings the library raises, because capabilities.py imports them from the readers and writers rather than restating them. A refusal falls into one of three kinds:

The protocol has no such notion.

NSDP has no PoE, MAC-table, LLDP or sensor tag. This was established by an exhaustive tag sweep of a live GS110EMX, not by reading a specification.

The device has no such hardware.

The M4300-24X has no PSE silicon, so PoE is refused identically on SNMP, HTTP and the CLI — rather than SNMP returning an empty list from an empty pethPsePortTable while the other two raise.

This model’s web UI has no such page.

The web UI is a real, limited interface: if the firmware ships no page carrying the data, no amount of scraping produces it. These are the entries most likely to move, because a page that exists but has not been found yet looks exactly the same from here.

What is not on this list is “not implemented yet”. A backend that could serve an operation but does not is a bug in this library, and is fixed rather than documented.

Verification status

Two flags gate dispatch, and both appear in these tables as ?:

HttpModelSpec.reads_verified

Set once that model’s web-UI reads have been cross-verified against live hardware. While False, the facade refuses HTTP for both reads and writes: unchecked output is worse than no output.

CliModelSpec.reads_verified / writes_verified

The same for the FASTPATH CLI. writes_verified requires reads_verified, and not incidentally — every CLI write confirms itself by reading back, so a model whose CLI reads are not trusted cannot honestly verify a CLI write either.

At the time this page was generated no registered model is gated off by either flag; the mechanism is documented because it is what keeps an unverified backend from quietly becoming a source of truth.