Skip to content

Commit 50801df

Browse files
committed
Implement uio.Unmarshaler for Message/RelayMessage/Options and use them
Moves towards avoiding allocating a new buf.NewBigEndianBuffer in every single FromBytes / ToBytes function. Signed-off-by: Chris Koch <[email protected]>
1 parent d75d3f1 commit 50801df

15 files changed

+54
-52
lines changed

dhcpv6/dhcpv6message.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -364,21 +364,21 @@ type Message struct {
364364
// FromBytes parses a DHCPv6 message from a byte stream.
365365
func (m *Message) FromBytes(data []byte) error {
366366
buf := uio.NewBigEndianBuffer(data)
367+
m.Unmarshal(buf)
368+
return buf.FinError()
369+
}
370+
371+
// Unmarshal parses a DHCPv6 message from buf.
372+
func (m *Message) Unmarshal(buf *uio.Lexer) {
367373
messageType := MessageType(buf.Read8())
368374

369375
if messageType == MessageTypeRelayForward || messageType == MessageTypeRelayReply {
370-
return fmt.Errorf("wrong message type")
376+
buf.SetError(fmt.Errorf("wrong message type"))
371377
}
372378

373379
m.MessageType = messageType
374380
buf.ReadBytes(m.TransactionID[:])
375-
if buf.Error() != nil {
376-
return fmt.Errorf("failed to parse DHCPv6 header: %w", buf.Error())
377-
}
378-
if err := m.Options.FromBytes(buf.Data()); err != nil {
379-
return err
380-
}
381-
return nil
381+
m.Options.Unmarshal(buf)
382382
}
383383

384384
var randomRead = rand.Read

dhcpv6/dhcpv6relay.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,25 +82,25 @@ type RelayMessage struct {
8282
// FromBytes parses a relay message from a byte stream.
8383
func (r *RelayMessage) FromBytes(data []byte) error {
8484
buf := uio.NewBigEndianBuffer(data)
85+
r.Unmarshal(buf)
86+
return buf.FinError()
87+
}
88+
89+
// Unmarshal parses a relay message from a buf.
90+
func (r *RelayMessage) Unmarshal(buf *uio.Lexer) {
8591
messageType := MessageType(buf.Read8())
8692

8793
if messageType != MessageTypeRelayForward && messageType != MessageTypeRelayReply {
88-
return fmt.Errorf("wrong message type")
94+
buf.SetError(fmt.Errorf("wrong message type"))
8995
}
9096

9197
r.MessageType = messageType
9298
r.HopCount = buf.Read8()
9399
r.LinkAddr = net.IP(buf.CopyN(net.IPv6len))
94100
r.PeerAddr = net.IP(buf.CopyN(net.IPv6len))
95101

96-
if buf.Error() != nil {
97-
return fmt.Errorf("error parsing RelayMessage header: %w", buf.Error())
98-
}
99102
// TODO: fail if no OptRelayMessage is present.
100-
if err := r.Options.FromBytes(buf.Data()); err != nil {
101-
return err
102-
}
103-
return nil
103+
r.Options.Unmarshal(buf)
104104
}
105105

106106
func write16(b *uio.Lexer, ip net.IP) {

dhcpv6/option_iaaddress.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ func (op *OptIAAddress) FromBytes(data []byte) error {
8080
t2.Unmarshal(buf)
8181
op.PreferredLifetime = t1.Duration
8282
op.ValidLifetime = t2.Duration
83-
84-
if err := op.Options.FromBytes(buf.ReadAll()); err != nil {
85-
return err
86-
}
83+
op.Options.Unmarshal(buf)
8784
return buf.FinError()
8885
}

dhcpv6/option_iaaddress_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ func TestIAAddressParseAndGetter(t *testing.T) {
9090
},
9191
},
9292
{
93-
buf: []byte{0, 3, 0, 1, 0},
93+
buf: []byte{0, 5, 0, 1, 0},
9494
want: nil,
95-
err: uio.ErrUnreadBytes,
95+
err: uio.ErrBufferTooShort,
9696
},
9797
{
9898
buf: []byte{

dhcpv6/option_iapd.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ func (op *OptIAPD) FromBytes(data []byte) error {
9393
t2.Unmarshal(buf)
9494
op.T1 = t1.Duration
9595
op.T2 = t2.Duration
96-
97-
if err := op.Options.FromBytes(buf.ReadAll()); err != nil {
98-
return err
99-
}
96+
op.Options.Unmarshal(buf)
10097
return buf.FinError()
10198
}

dhcpv6/option_iapd_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func TestIAPDParseAndGetter(t *testing.T) {
111111
{
112112
buf: []byte{0, 25, 0, 1, 0},
113113
want: nil,
114-
err: uio.ErrUnreadBytes,
114+
err: uio.ErrBufferTooShort,
115115
},
116116
{
117117
buf: []byte{

dhcpv6/option_iaprefix.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ func (op *OptIAPrefix) FromBytes(data []byte) error {
9696
IP: ip,
9797
}
9898
}
99-
if err := op.Options.FromBytes(buf.ReadAll()); err != nil {
100-
return err
101-
}
99+
op.Options.Unmarshal(buf)
102100
return buf.FinError()
103101
}

dhcpv6/option_iaprefix_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ func TestIAPrefixParseAndGetter(t *testing.T) {
9696
},
9797
},
9898
{
99-
buf: []byte{0, 3, 0, 1, 0},
99+
buf: []byte{0, 26, 0, 1, 0},
100100
want: nil,
101-
err: uio.ErrUnreadBytes,
101+
err: uio.ErrBufferTooShort,
102102
},
103103
{
104104
buf: []byte{

dhcpv6/option_nontemporaryaddress.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,6 @@ func (op *OptIANA) FromBytes(data []byte) error {
113113
t2.Unmarshal(buf)
114114
op.T1 = t1.Duration
115115
op.T2 = t2.Duration
116-
117-
if err := op.Options.FromBytes(buf.ReadAll()); err != nil {
118-
return err
119-
}
116+
op.Options.Unmarshal(buf)
120117
return buf.FinError()
121118
}

dhcpv6/option_nontemporaryaddress_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func TestIANAParseAndGetter(t *testing.T) {
9797
{
9898
buf: []byte{0, 3, 0, 1, 0},
9999
want: nil,
100-
err: uio.ErrUnreadBytes,
100+
err: uio.ErrBufferTooShort,
101101
},
102102
{
103103
buf: []byte{

0 commit comments

Comments
 (0)