github.com/ooni/psiphon/tunnel-core@v0.0.0-20230105123940-fe12a24c96ee/oovendor/quic-go/logging/multiplex.go (about)

     1  package logging
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"time"
     7  )
     8  
     9  type tracerMultiplexer struct {
    10  	tracers []Tracer
    11  }
    12  
    13  var _ Tracer = &tracerMultiplexer{}
    14  
    15  // NewMultiplexedTracer creates a new tracer that multiplexes events to multiple tracers.
    16  func NewMultiplexedTracer(tracers ...Tracer) Tracer {
    17  	if len(tracers) == 0 {
    18  		return nil
    19  	}
    20  	if len(tracers) == 1 {
    21  		return tracers[0]
    22  	}
    23  	return &tracerMultiplexer{tracers}
    24  }
    25  
    26  func (m *tracerMultiplexer) TracerForConnection(ctx context.Context, p Perspective, odcid ConnectionID) ConnectionTracer {
    27  	var connTracers []ConnectionTracer
    28  	for _, t := range m.tracers {
    29  		if ct := t.TracerForConnection(ctx, p, odcid); ct != nil {
    30  			connTracers = append(connTracers, ct)
    31  		}
    32  	}
    33  	return NewMultiplexedConnectionTracer(connTracers...)
    34  }
    35  
    36  func (m *tracerMultiplexer) SentPacket(remote net.Addr, hdr *Header, size ByteCount, frames []Frame) {
    37  	for _, t := range m.tracers {
    38  		t.SentPacket(remote, hdr, size, frames)
    39  	}
    40  }
    41  
    42  func (m *tracerMultiplexer) DroppedPacket(remote net.Addr, typ PacketType, size ByteCount, reason PacketDropReason) {
    43  	for _, t := range m.tracers {
    44  		t.DroppedPacket(remote, typ, size, reason)
    45  	}
    46  }
    47  
    48  type connTracerMultiplexer struct {
    49  	tracers []ConnectionTracer
    50  }
    51  
    52  var _ ConnectionTracer = &connTracerMultiplexer{}
    53  
    54  // NewMultiplexedConnectionTracer creates a new connection tracer that multiplexes events to multiple tracers.
    55  func NewMultiplexedConnectionTracer(tracers ...ConnectionTracer) ConnectionTracer {
    56  	if len(tracers) == 0 {
    57  		return nil
    58  	}
    59  	if len(tracers) == 1 {
    60  		return tracers[0]
    61  	}
    62  	return &connTracerMultiplexer{tracers: tracers}
    63  }
    64  
    65  func (m *connTracerMultiplexer) StartedConnection(local, remote net.Addr, srcConnID, destConnID ConnectionID) {
    66  	for _, t := range m.tracers {
    67  		t.StartedConnection(local, remote, srcConnID, destConnID)
    68  	}
    69  }
    70  
    71  func (m *connTracerMultiplexer) NegotiatedVersion(chosen VersionNumber, clientVersions, serverVersions []VersionNumber) {
    72  	for _, t := range m.tracers {
    73  		t.NegotiatedVersion(chosen, clientVersions, serverVersions)
    74  	}
    75  }
    76  
    77  func (m *connTracerMultiplexer) ClosedConnection(e error) {
    78  	for _, t := range m.tracers {
    79  		t.ClosedConnection(e)
    80  	}
    81  }
    82  
    83  func (m *connTracerMultiplexer) SentTransportParameters(tp *TransportParameters) {
    84  	for _, t := range m.tracers {
    85  		t.SentTransportParameters(tp)
    86  	}
    87  }
    88  
    89  func (m *connTracerMultiplexer) ReceivedTransportParameters(tp *TransportParameters) {
    90  	for _, t := range m.tracers {
    91  		t.ReceivedTransportParameters(tp)
    92  	}
    93  }
    94  
    95  func (m *connTracerMultiplexer) RestoredTransportParameters(tp *TransportParameters) {
    96  	for _, t := range m.tracers {
    97  		t.RestoredTransportParameters(tp)
    98  	}
    99  }
   100  
   101  func (m *connTracerMultiplexer) SentPacket(hdr *ExtendedHeader, size ByteCount, ack *AckFrame, frames []Frame) {
   102  	for _, t := range m.tracers {
   103  		t.SentPacket(hdr, size, ack, frames)
   104  	}
   105  }
   106  
   107  func (m *connTracerMultiplexer) ReceivedVersionNegotiationPacket(hdr *Header, versions []VersionNumber) {
   108  	for _, t := range m.tracers {
   109  		t.ReceivedVersionNegotiationPacket(hdr, versions)
   110  	}
   111  }
   112  
   113  func (m *connTracerMultiplexer) ReceivedRetry(hdr *Header) {
   114  	for _, t := range m.tracers {
   115  		t.ReceivedRetry(hdr)
   116  	}
   117  }
   118  
   119  func (m *connTracerMultiplexer) ReceivedPacket(hdr *ExtendedHeader, size ByteCount, frames []Frame) {
   120  	for _, t := range m.tracers {
   121  		t.ReceivedPacket(hdr, size, frames)
   122  	}
   123  }
   124  
   125  func (m *connTracerMultiplexer) BufferedPacket(typ PacketType) {
   126  	for _, t := range m.tracers {
   127  		t.BufferedPacket(typ)
   128  	}
   129  }
   130  
   131  func (m *connTracerMultiplexer) DroppedPacket(typ PacketType, size ByteCount, reason PacketDropReason) {
   132  	for _, t := range m.tracers {
   133  		t.DroppedPacket(typ, size, reason)
   134  	}
   135  }
   136  
   137  func (m *connTracerMultiplexer) UpdatedCongestionState(state CongestionState) {
   138  	for _, t := range m.tracers {
   139  		t.UpdatedCongestionState(state)
   140  	}
   141  }
   142  
   143  func (m *connTracerMultiplexer) UpdatedMetrics(rttStats *RTTStats, cwnd, bytesInFLight ByteCount, packetsInFlight int) {
   144  	for _, t := range m.tracers {
   145  		t.UpdatedMetrics(rttStats, cwnd, bytesInFLight, packetsInFlight)
   146  	}
   147  }
   148  
   149  func (m *connTracerMultiplexer) AcknowledgedPacket(encLevel EncryptionLevel, pn PacketNumber) {
   150  	for _, t := range m.tracers {
   151  		t.AcknowledgedPacket(encLevel, pn)
   152  	}
   153  }
   154  
   155  func (m *connTracerMultiplexer) LostPacket(encLevel EncryptionLevel, pn PacketNumber, reason PacketLossReason) {
   156  	for _, t := range m.tracers {
   157  		t.LostPacket(encLevel, pn, reason)
   158  	}
   159  }
   160  
   161  func (m *connTracerMultiplexer) UpdatedPTOCount(value uint32) {
   162  	for _, t := range m.tracers {
   163  		t.UpdatedPTOCount(value)
   164  	}
   165  }
   166  
   167  func (m *connTracerMultiplexer) UpdatedKeyFromTLS(encLevel EncryptionLevel, perspective Perspective) {
   168  	for _, t := range m.tracers {
   169  		t.UpdatedKeyFromTLS(encLevel, perspective)
   170  	}
   171  }
   172  
   173  func (m *connTracerMultiplexer) UpdatedKey(generation KeyPhase, remote bool) {
   174  	for _, t := range m.tracers {
   175  		t.UpdatedKey(generation, remote)
   176  	}
   177  }
   178  
   179  func (m *connTracerMultiplexer) DroppedEncryptionLevel(encLevel EncryptionLevel) {
   180  	for _, t := range m.tracers {
   181  		t.DroppedEncryptionLevel(encLevel)
   182  	}
   183  }
   184  
   185  func (m *connTracerMultiplexer) DroppedKey(generation KeyPhase) {
   186  	for _, t := range m.tracers {
   187  		t.DroppedKey(generation)
   188  	}
   189  }
   190  
   191  func (m *connTracerMultiplexer) SetLossTimer(typ TimerType, encLevel EncryptionLevel, exp time.Time) {
   192  	for _, t := range m.tracers {
   193  		t.SetLossTimer(typ, encLevel, exp)
   194  	}
   195  }
   196  
   197  func (m *connTracerMultiplexer) LossTimerExpired(typ TimerType, encLevel EncryptionLevel) {
   198  	for _, t := range m.tracers {
   199  		t.LossTimerExpired(typ, encLevel)
   200  	}
   201  }
   202  
   203  func (m *connTracerMultiplexer) LossTimerCanceled() {
   204  	for _, t := range m.tracers {
   205  		t.LossTimerCanceled()
   206  	}
   207  }
   208  
   209  func (m *connTracerMultiplexer) Debug(name, msg string) {
   210  	for _, t := range m.tracers {
   211  		t.Debug(name, msg)
   212  	}
   213  }
   214  
   215  func (m *connTracerMultiplexer) Close() {
   216  	for _, t := range m.tracers {
   217  		t.Close()
   218  	}
   219  }