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 |
|||||
|---|---|---|---|---|---|
✓ |
— |
✓ |
✓ |
✓ |
|
✓ |
— |
✓ |
✓ |
✓ |
|
✓ |
— |
✓ |
✓ |
✓ |
|
✓ |
— |
✓ |
— |
✓ |
|
— |
✓ |
✓ |
— |
— |
|
— |
✓ |
✓ |
— |
— |
|
✓ |
— |
✓ |
— |
— |
|
— |
✓ |
✓ |
— |
— |
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 |
|---|---|---|---|---|---|---|---|---|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S H |
N H |
|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S |
N H |
|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S H |
N H |
|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S H |
N H |
|
S H C |
S H C |
S H C |
S H C |
— |
— |
S H |
— |
|
S H C |
S H C |
S H C |
S H C |
— |
— |
S H |
— |
|
— |
S H C |
S H C |
S H C |
— |
H |
S H |
— |
|
S H C |
S H C |
S H C |
S C |
— |
— |
S H |
— |
|
S H C |
S H C |
S H C |
S H C |
N H |
N |
S H |
N H |
|
S C |
S C |
S C |
S C |
N H |
N |
S H |
N H |
|
H C |
H C |
H C |
C |
— |
— |
— |
— |
|
H C |
H C |
H C |
C |
— |
— |
— |
— |
|
S H C |
S H C |
S H C |
S H C |
— |
— |
— |
— |
|
— |
— |
— |
— |
N |
N |
— |
N |
Write operations¶
Operation |
m4300-24x |
m4300-16x |
gsm7252ps |
gsm7228ps |
gs110emx |
gs305ep |
gs728tpp |
gs105pe |
|---|---|---|---|---|---|---|---|---|
S H C |
S H C |
S H C |
S H C |
H |
— |
S H |
— |
|
— |
S H C |
S H C |
S H C |
— |
H |
S H |
— |
|
— |
S H C |
S H C |
S H C |
— |
H |
S H |
— |
|
— |
S H C |
S H C |
S H C |
— |
H |
S H |
— |
|
S C |
S C |
S C |
S C |
N |
N |
S H |
N |
|
C |
C |
C |
C |
— |
— |
H |
— |
|
C |
C |
C |
C |
— |
— |
— |
— |
|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S H |
N H |
|
S H C |
S H C |
S H C |
S H C |
N H |
N H |
S H |
N H |
|
S C |
S C |
S C |
S C |
N |
N H |
H |
N H |
|
S C |
S C |
S C |
S C |
N |
N H |
S H |
N H |
|
S H C |
S H C |
S H C |
S H C |
N |
N |
— |
N |
|
S C |
S C |
S C |
S C |
N H |
N |
S H |
N |
|
S C |
S C |
S C |
S C |
— |
— |
— |
— |
|
C |
C |
C |
C |
— |
— |
— |
— |
|
S H C |
S H C |
S C |
S C |
— |
— |
— |
— |
|
— |
— |
— |
H |
— |
— |
H |
— |
|
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 |
|---|---|---|---|---|
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-24x’ web UI has no page for get_hostname (The switch’s host name) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-24x’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-24x’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-24x’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-16x’ web UI has no page for get_hostname (The switch’s host name) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-16x’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-16x’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires |
||
SNMP, SSH, TELNET |
HTTP |
model ‘m4300-16x’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires |
||
SNMP, SSH, TELNET |
HTTP |
model ‘gsm7252ps’ web UI has no page for get_hostname (The switch’s host name) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘gsm7252ps’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
SNMP, SSH, TELNET |
HTTP |
model ‘gsm7252ps’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires |
||
SNMP, SSH, TELNET |
HTTP |
model ‘gsm7252ps’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires |
||
SNMP, TELNET |
HTTP |
model ‘gsm7228ps’ web UI has no page for get_sensors (Fan/PSU/temperature sensors) |
||
SNMP, TELNET |
HTTP |
model ‘gsm7228ps’ web UI has no page for get_hostname (The switch’s host name) |
||
SNMP, TELNET |
HTTP |
model ‘gsm7228ps’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
SNMP, TELNET |
HTTP |
model ‘gsm7228ps’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires |
||
SNMP, TELNET |
HTTP |
model ‘gsm7228ps’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires |
||
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 |
||
NSDP |
HTTP |
model ‘gs110emx’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
NSDP |
HTTP |
model ‘gs110emx’ web UI carries no CSRF ‘hash’ token, which the HTTP create_vlan writer requires |
||
NSDP |
HTTP |
model ‘gs110emx’ web UI carries no CSRF ‘hash’ token, which the HTTP delete_vlan writer requires |
||
NSDP |
HTTP |
model ‘gs110emx’ web UI has no page for set_mgmt_ip (Set the management IP/mask/gateway) |
||
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 |
||
NSDP |
HTTP |
model ‘gs305ep’ web UI has no page for get_mgmt_ip (Management IP configuration) |
||
NSDP |
HTTP |
model ‘gs305ep’ web UI has no page for get_hostname (The switch’s host name) |
||
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 |
||
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 |
||
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 |
||
NSDP |
HTTP |
model ‘gs305ep’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
NSDP |
HTTP |
model ‘gs305ep’ web UI has no page for set_mgmt_ip (Set the management IP/mask/gateway) |
||
SNMP |
HTTP |
model ‘gs728tpp’ web UI has no page for get_stats (Per-port octet/packet counters) |
||
HTTP |
SNMP |
model ‘gs728tpp’: this model’s SNMP agent cannot create a VLAN: every RowStatus mechanism (createAndGo, createAndGo+name in one PDU, createAndWait->name->active, the name column alone, and createAndGo carrying an egress PortList) is answered inconsistentValue – measured on the device. Membership, PVID and delete DO work over SNMP; create a VLAN over the HTTP backend |
||
NSDP |
HTTP |
model ‘gs105pe’ web UI has no page for set_port_description (Set or clear a port’s description) |
||
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
pethPsePortTablewhile 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.
- The device’s agent does not implement that operation.
The protocol defines it, the hardware has it, and the switch still refuses. The GS728TPP’s SNMP agent will not create a VLAN: every documented RowStatus mechanism —
createAndGoalone,createAndGocarryingdot1qVlanStaticNamein one PDU,createAndWait→ name →active, setting the name column alone, andcreateAndGowith an egress PortList — is answeredinconsistentValue. That it is the agent and not the table is shown by what the same firmware does accept: an existing VLAN’s membership columns,dot1qPvid, anddestroy(6), while its web UI creates a VLAN without complaint. So VLAN creation on that model is an HTTP operation, and the refusal names the backend that does work.
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_verifiedSet 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_verifiedThe same for the FASTPATH CLI.
writes_verifiedrequiresreads_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.