Skip to content

Commit 61af226

Browse files
committed
Log unwrapped sequence numbers
1 parent 8ab42e0 commit 61af226

File tree

2 files changed

+56
-5
lines changed

2 files changed

+56
-5
lines changed

log_format_test.go

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,40 @@ package bwe_test
88
import (
99
"fmt"
1010
"log/slog"
11-
"time"
1211

1312
"github.com/pion/interceptor"
1413
"github.com/pion/rtcp"
1514
"github.com/pion/rtp"
1615
)
1716

17+
const (
18+
maxSequenceNumberPlusOne = int64(65536)
19+
breakpoint = 32768 // half of max uint16
20+
)
21+
1822
type packetLogger struct {
1923
logger *slog.Logger
2024
direction string
25+
seq *unwrapper
26+
}
27+
28+
func newPacketLogger(logger *slog.Logger, direction string) *packetLogger {
29+
return &packetLogger{
30+
logger: logger,
31+
direction: direction,
32+
seq: &unwrapper{},
33+
}
2134
}
2235

2336
func (l *packetLogger) LogRTPPacket(header *rtp.Header, payload []byte, attributes interceptor.Attributes) {
24-
ts := time.Now()
37+
u := l.seq.Unwrap(header.SequenceNumber)
2538
l.logger.Info(
2639
"rtp",
2740
"direction", l.direction,
28-
"ts", ts,
2941
"pt", header.PayloadType,
3042
"ssrc", header.SSRC,
3143
"sequence-number", header.SequenceNumber,
44+
"unwrapped-sequence-number", u,
3245
"rtp-timestamp", header.Timestamp,
3346
"marker", header.Marker,
3447
"payload-size", len(payload),
@@ -44,3 +57,41 @@ func (l *packetLogger) LogRTCPPackets(pkts []rtcp.Packet, attributes interceptor
4457
)
4558
}
4659
}
60+
61+
// Unwrapper stores an unwrapped sequence number.
62+
type unwrapper struct {
63+
init bool
64+
lastUnwrapped int64
65+
}
66+
67+
func isNewer(value, previous uint16) bool {
68+
if value-previous == breakpoint {
69+
return value > previous
70+
}
71+
72+
return value != previous && (value-previous) < breakpoint
73+
}
74+
75+
// Unwrap unwraps the next sequencenumber.
76+
func (u *unwrapper) Unwrap(i uint16) int64 {
77+
if !u.init {
78+
u.init = true
79+
u.lastUnwrapped = int64(i)
80+
81+
return u.lastUnwrapped
82+
}
83+
84+
lastWrapped := uint16(u.lastUnwrapped) //nolint:gosec // G115
85+
delta := int64(i - lastWrapped)
86+
if isNewer(i, lastWrapped) {
87+
if delta < 0 {
88+
delta += maxSequenceNumberPlusOne
89+
}
90+
} else if delta > 0 && u.lastUnwrapped+delta-maxSequenceNumberPlusOne >= 0 {
91+
delta -= maxSequenceNumberPlusOne
92+
}
93+
94+
u.lastUnwrapped += delta
95+
96+
return u.lastUnwrapped
97+
}

peer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ func registerDefaultCodecs() option {
5454

5555
func registerPacketLogger(logger *slog.Logger) option {
5656
return func(p *peer) error {
57-
ipl := &packetLogger{logger: logger, direction: "in"}
57+
ipl := newPacketLogger(logger, "in")
5858
rd, err := packetdump.NewReceiverInterceptor(packetdump.PacketLog(ipl))
5959
if err != nil {
6060
return err
6161
}
62-
opl := &packetLogger{logger: logger, direction: "out"}
62+
opl := newPacketLogger(logger, "out")
6363
sd, err := packetdump.NewSenderInterceptor(packetdump.PacketLog(opl))
6464
if err != nil {
6565
return err

0 commit comments

Comments
 (0)