github.com/cilium/cilium@v1.16.2/pkg/maps/ctmap/gc/signals.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package gc 5 6 import ( 7 "fmt" 8 9 "github.com/cilium/cilium/pkg/signal" 10 ) 11 12 // SignalData holds the IP address family type BPF program sent along with 13 // the SignalNatFillUp and SignalCTFillUp signals. 14 type SignalData uint32 15 16 const ( 17 // SignalProtoV4 denotes IPv4 protocol 18 SignalProtoV4 SignalData = iota 19 // SignalProtoV6 denotes IPv6 protocol 20 SignalProtoV6 21 SignalProtoMax 22 ) 23 24 var signalProto = [SignalProtoMax]string{ 25 SignalProtoV4: "ipv4", 26 SignalProtoV6: "ipv6", 27 } 28 29 // String implements fmt.Stringer for SignalData 30 func (d SignalData) String() string { 31 return signalProto[d] 32 } 33 34 type SignalHandler struct { 35 signals chan SignalData 36 manager signal.SignalManager 37 } 38 39 func newSignalHandler(sm signal.SignalManager) (SignalHandler, error) { 40 handler := SignalHandler{ 41 // wakeup is buffered to not block the sender while GC is running. If this overflows it is possible 42 // to lose a wakeup signal for IPv4 while IPv6 GC is running, and all the buffered wakeups are for 43 // IPv6 and the ones for IPv4 overflowed. Keep the buffer big enough for that to be unlikely. 44 signals: make(chan SignalData, 1024), 45 manager: sm, 46 } 47 48 err := sm.RegisterHandler(signal.ChannelHandler(handler.signals), signal.SignalCTFillUp, signal.SignalNatFillUp) 49 if err != nil { 50 return SignalHandler{}, fmt.Errorf("failed to set up signal channel for CT & NAT fill-up events: %w", err) 51 } 52 53 return handler, nil 54 } 55 56 func (sh *SignalHandler) Signals() <-chan SignalData { 57 return sh.signals 58 } 59 60 func (sh *SignalHandler) MuteSignals() error { 61 return sh.manager.MuteSignals(signal.SignalCTFillUp, signal.SignalNatFillUp) 62 } 63 64 func (sh *SignalHandler) UnmuteSignals() error { 65 return sh.manager.UnmuteSignals(signal.SignalCTFillUp, signal.SignalNatFillUp) 66 }