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  }