diff options
author | Andrea Barberio <insomniac@slackware.it> | 2019-05-02 16:28:30 +0100 |
---|---|---|
committer | insomniac <insomniacslk@users.noreply.github.com> | 2019-05-02 21:03:04 +0100 |
commit | 2ecf202a098f82731efe88ed625a463913309124 (patch) | |
tree | 17a065050d82ac84a821b611a08b89badb12b752 | |
parent | 807624aab3131a49f1200102bff1259316c05e56 (diff) |
[dhcpv6] Handle SOLICIT with rapid commit in NewReplyFromMessage
NewReplyFromMessage creates a reply from a message. With this patch it
can handle Solicit messages with rapid-commit.
RFC3315 states that:
```
If the client has included a Rapid Commit option in its Solicit
message, the client terminates the waiting process as soon as a Reply
message with a Rapid Commit option is received.
```
Signed-off-by: Andrea Barberio <insomniac@slackware.it>
-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 |