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 }