diff options
Diffstat (limited to 'dhcpv6')
-rw-r--r-- | dhcpv6/dhcpv6_test.go | 6 | ||||
-rw-r--r-- | dhcpv6/dhcpv6message.go | 14 |
2 files changed, 16 insertions, 4 deletions
diff --git a/dhcpv6/dhcpv6_test.go b/dhcpv6/dhcpv6_test.go index 10a7296..5de2294 100644 --- a/dhcpv6/dhcpv6_test.go +++ b/dhcpv6/dhcpv6_test.go @@ -195,6 +195,12 @@ func TestNewReplyFromMessage(t *testing.T) { msg.MessageType = MessageTypeSolicit rep, err = NewReplyFromMessage(&msg) require.Error(t, err) + + msg.MessageType = MessageTypeSolicit + msg.AddOption(&OptionGeneric{OptionCode: OptionRapidCommit}) + rep, err = NewReplyFromMessage(&msg) + require.NoError(t, err) + msg.Options.Del(OptionRapidCommit) } func TestNewMessageTypeSolicit(t *testing.T) { diff --git a/dhcpv6/dhcpv6message.go b/dhcpv6/dhcpv6message.go index 707a65d..f4f5eb1 100644 --- a/dhcpv6/dhcpv6message.go +++ b/dhcpv6/dhcpv6message.go @@ -161,17 +161,23 @@ func NewRequestFromAdvertise(adv *Message, modifiers ...Modifier) (*Message, err } // NewReplyFromMessage creates a new REPLY packet based on a -// Message. The function is to be used when generating a reply to -// REQUEST, CONFIRM, RENEW, REBIND, RELEASE and INFORMATION-REQUEST packets. +// Message. The function is to be used when generating a reply to a SOLICIT with +// rapid-commit, REQUEST, CONFIRM, RENEW, REBIND, RELEASE and INFORMATION-REQUEST +// packets. func NewReplyFromMessage(msg *Message, modifiers ...Modifier) (*Message, error) { if msg == nil { - return nil, errors.New("Message cannot be nil") + return nil, errors.New("message cannot be nil") } switch msg.Type() { + case MessageTypeSolicit: + if msg.GetOneOption(OptionRapidCommit) == nil { + return nil, errors.New("cannot create REPLY from a SOLICIT without rapid-commit option") + } + modifiers = append([]Modifier{WithRapidCommit}, modifiers...) case MessageTypeRequest, MessageTypeConfirm, MessageTypeRenew, MessageTypeRebind, MessageTypeRelease, MessageTypeInformationRequest: default: - return nil, errors.New("Cannot create REPLY from the passed message type set") + return nil, errors.New("cannot create REPLY from the passed message type set") } // build REPLY from MESSAGE |