Skip to content

advanced: add IGMP Proxy (multicast/IPTV) support - #139

Open
ispyisail wants to merge 1 commit into
masterfrom
feat/igmp-proxy-advanced
Open

advanced: add IGMP Proxy (multicast/IPTV) support#139
ispyisail wants to merge 1 commit into
masterfrom
feat/igmp-proxy-advanced

Conversation

@ispyisail

Copy link
Copy Markdown
Owner

Summary

Adds IGMP proxying (RFC discussion #69), folded into the existing Advanced page rather than a standalone plugin package, per the design already agreed there. Uses the standard igmpproxy feed package (net/igmpproxy, openwrt/packages) -- selected across every target profile, and core-listed in gargoyle-profiles so it's always available.

  • Backend (advanced.sh): enumerates real IPv4 interfaces as upstream/downstream candidates (igmpproxy has no IPv6 support, so dhcpv6/*6 protocols are filtered out), resolving each interface's firewall zone via fw4 -q network since igmpproxy's own generated rules are keyed off zone, not interface name. Surfaces live running-state via ubus service list, matching the pattern doh.sh already uses for its own proxy status.
  • Frontend (advanced.js): a full enable / upstream / downstream / altnet / quickleave form. Saves by wholesale-rewriting the igmpproxy phyint sections -- same approach doh.js takes for its resolver list, simpler and safer than diffing existing sections in place. Upstream source subnets get a dedicated CIDR validator rather than reusing validateIP(), because validateIP() rejects 0.0.0.0 as a reserved/invalid host address -- but 0.0.0.0/0 ("any source") is the correct default value for this field and a completely valid network address.
  • Opt-in by default: igmpproxy's own postinst enables the service unconditionally, which gargoyle-init now explicitly overrides (matching the existing pattern for miniupnpd/qos_gargoyle/webmon_gargoyle) so a fresh install never silently runs a multicast proxy nobody configured.

Test plan

  • i18n cross-referenced by hand: every <%~ Igmp* %> in advanced.sh has a matching string, every advancedStr.Igmp* used in advanced.js is defined
  • node --check clean on advanced.js and the i18n file
  • Covered by vnet phase 50 (7 cases): package availability, opt-in default, enable/disable via the Advanced-page save path, phyint section generation for upstream + multiple downstream interfaces, altnet CIDR validation
  • Full build + 51-phase simulator suite run end-to-end against this exact commit (banner-verified): 381/387 passed, 0 failed, phase 50 7/7, phase 30 (page_smoke, catches Advanced-page rendering regressions) 43/43

Folds IGMP proxying into the existing Advanced page rather than a
standalone plugin package (discussion #69), using the standard
igmpproxy feed package (net/igmpproxy, openwrt/packages) -- selected
across every target profile, core-listed in gargoyle-profiles so it's
always available.

Backend (advanced.sh): enumerates real IPv4 interfaces as upstream/
downstream candidates (igmpproxy has no IPv6 support, so dhcpv6/*6
protocols are filtered out), resolving each interface's firewall zone
via `fw4 -q network` since igmpproxy's own generated rules are keyed
off zone, not interface name. Surfaces live running-state via ubus
service list, matching the pattern doh.sh already uses for its own
proxy status.

Frontend (advanced.js): a full enable/upstream/downstream/altnet/
quickleave form. Saves by wholesale-rewriting the igmpproxy phyint
sections (same approach doh.js takes for its resolver list -- simpler
and safer than diffing existing sections in place). Upstream source
subnets get a dedicated CIDR validator rather than reusing validateIP(),
because validateIP() rejects 0.0.0.0 as a reserved/invalid host address
-- but 0.0.0.0/0 ("any source") is the correct default value for this
field and a completely valid network address.

Opt-in by default: igmpproxy's own postinst enables the service
unconditionally, which gargoyle-init now explicitly overrides (matching
the existing pattern for miniupnpd/qos_gargoyle/webmon_gargoyle) so a
fresh install never silently runs a multicast proxy nobody configured.

Covered by vnet phase 50 (7 cases): package availability, opt-in
default, enable/disable via the Advanced-page save path, phyint section
generation for upstream+multiple downstream interfaces, and altnet CIDR
validation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant