2026-01-22 23:46:56 -08:00
|
|
|
package tendrils
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"log"
|
|
|
|
|
"net"
|
|
|
|
|
|
2026-01-29 21:44:39 -08:00
|
|
|
"github.com/gopatchy/multicast"
|
2026-01-22 23:46:56 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func (t *Tendrils) listenIGMP(ctx context.Context, iface net.Interface) {
|
2026-01-29 21:44:39 -08:00
|
|
|
listener, err := multicast.NewListener(&iface,
|
|
|
|
|
func(sourceIP, groupIP net.IP, join bool) {
|
|
|
|
|
if join {
|
|
|
|
|
t.nodes.UpdateMulticastMembership(sourceIP, groupIP)
|
|
|
|
|
} else {
|
|
|
|
|
t.nodes.RemoveMulticastMembership(sourceIP, groupIP)
|
2026-01-22 23:46:56 -08:00
|
|
|
}
|
2026-01-29 21:44:39 -08:00
|
|
|
})
|
2026-01-22 23:46:56 -08:00
|
|
|
if err != nil {
|
2026-01-29 21:44:39 -08:00
|
|
|
log.Printf("[ERROR] failed to create igmp listener on %s: %v", iface.Name, err)
|
2026-01-22 23:46:56 -08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-29 21:44:39 -08:00
|
|
|
querier, err := multicast.NewQuerier(&iface)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Printf("[ERROR] failed to create igmp querier on %s: %v", iface.Name, err)
|
2026-01-22 23:46:56 -08:00
|
|
|
}
|
2026-01-29 21:44:39 -08:00
|
|
|
if querier != nil {
|
|
|
|
|
go querier.Run(ctx)
|
2026-01-22 23:46:56 -08:00
|
|
|
}
|
|
|
|
|
|
2026-01-29 21:44:39 -08:00
|
|
|
listener.Run(ctx)
|
2026-01-22 23:46:56 -08:00
|
|
|
}
|