From bba4e7b231aa872aa1fde81fdd55f7d57987f082 Mon Sep 17 00:00:00 2001 From: Pablo Mazzini Date: Tue, 14 Aug 2018 20:41:40 +0100 Subject: NewRelayReplFromRelayForw: add remoteid --- dhcpv6/dhcpv6relay.go | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'dhcpv6/dhcpv6relay.go') diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index d9555cb..f7125b1 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -165,6 +165,7 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { err error linkAddr, peerAddr []net.IP optiids []Option + optrid []Option ) if relayForw == nil { return nil, errors.New("RELAY_FORW cannot be nil") @@ -186,6 +187,7 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { linkAddr = append(linkAddr, relay.LinkAddr()) peerAddr = append(peerAddr, relay.PeerAddr()) optiids = append(optiids, relay.GetOneOption(OptionInterfaceID)) + optrid = append(optrid, relay.GetOneOption(OptionRemoteID)) decap, err := DecapsulateRelay(relay) if err != nil { return nil, err @@ -201,6 +203,9 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { if opt := optiids[i]; opt != nil { msg.AddOption(opt) } + if opt := optrid[i]; opt != nil { + msg.AddOption(opt) + } if err != nil { return nil, err } -- cgit v1.2.3 From 337d948d66828e88fd12e980091dda0e28bf78ba Mon Sep 17 00:00:00 2001 From: Pablo Mazzini Date: Wed, 15 Aug 2018 09:28:14 +0100 Subject: NewRelayReplFromRelayForw: increase test coverage --- dhcpv6/dhcpv6relay.go | 18 ++++++++++-------- dhcpv6/dhcpv6relay_test.go | 22 ++++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) (limited to 'dhcpv6/dhcpv6relay.go') diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index f7125b1..93836c5 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -158,13 +158,15 @@ func (d *DHCPv6Relay) GetInnerMessage() (DHCPv6, error) { } } -// NewRelayReplFromRelayForw creates a RELAY_REPL packet based on a RELAY_FORW -// packet and replaces the inner message with the passed DHCPv6 message. +// NewRelayReplFromRelayForw creates a MessageTypeRelayReply based on a +// MessageTypeRelayForward and replaces the inner message with the passed +// DHCPv6 message. It copies the OptionInterfaceID and OptionRemoteID if the +// options are present in the Relay packet. func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { var ( err error linkAddr, peerAddr []net.IP - optiids []Option + optiid []Option optrid []Option ) if relayForw == nil { @@ -186,7 +188,7 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { for { linkAddr = append(linkAddr, relay.LinkAddr()) peerAddr = append(peerAddr, relay.PeerAddr()) - optiids = append(optiids, relay.GetOneOption(OptionInterfaceID)) + optiid = append(optiid, relay.GetOneOption(OptionInterfaceID)) optrid = append(optrid, relay.GetOneOption(OptionRemoteID)) decap, err := DecapsulateRelay(relay) if err != nil { @@ -200,15 +202,15 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { } for i := len(linkAddr) - 1; i >= 0; i-- { msg, err = EncapsulateRelay(msg, MessageTypeRelayReply, linkAddr[i], peerAddr[i]) - if opt := optiids[i]; opt != nil { + if err != nil { + return nil, err + } + if opt := optiid[i]; opt != nil { msg.AddOption(opt) } if opt := optrid[i]; opt != nil { msg.AddOption(opt) } - if err != nil { - return nil, err - } } return msg, nil } diff --git a/dhcpv6/dhcpv6relay_test.go b/dhcpv6/dhcpv6relay_test.go index afb4086..0a10e4c 100644 --- a/dhcpv6/dhcpv6relay_test.go +++ b/dhcpv6/dhcpv6relay_test.go @@ -108,19 +108,23 @@ func TestDHCPv6RelayToBytes(t *testing.T) { } func TestNewRelayRepFromRelayForw(t *testing.T) { + // create a new RelayForward rf := DHCPv6Relay{} rf.SetMessageType(MessageTypeRelayForward) rf.SetPeerAddr(net.IPv6linklocalallrouters) rf.SetLinkAddr(net.IPv6interfacelocalallnodes) - oro := OptRelayMsg{} - s := DHCPv6Message{} - s.SetMessage(MessageTypeSolicit) - cid := OptClientId{} - s.AddOption(&cid) - oro.SetRelayMessage(&s) - rf.AddOption(&oro) + rf.AddOption(&OptInterfaceId{}) + rf.AddOption(&OptRemoteId{}) - a, err := NewAdvertiseFromSolicit(&s) + // create the inner message + s, err := NewMessage() + require.NoError(t, err) + s.AddOption(&OptClientId{}) + orm := OptRelayMsg{} + orm.SetRelayMessage(s) + rf.AddOption(&orm) + + a, err := NewAdvertiseFromSolicit(s) require.NoError(t, err) rr, err := NewRelayReplFromRelayForw(&rf, a) require.NoError(t, err) @@ -129,6 +133,8 @@ func TestNewRelayRepFromRelayForw(t *testing.T) { require.Equal(t, relay.HopCount(), rf.HopCount()) require.Equal(t, relay.PeerAddr(), rf.PeerAddr()) require.Equal(t, relay.LinkAddr(), rf.LinkAddr()) + require.NotNil(t, rr.GetOneOption(OptionInterfaceID)) + require.NotNil(t, rr.GetOneOption(OptionRemoteID)) m, err := relay.GetInnerMessage() require.NoError(t, err) require.Equal(t, m, a) -- cgit v1.2.3 From de987a05eec1b93526f241337b0da5f9c1c10582 Mon Sep 17 00:00:00 2001 From: Pablo Mazzini Date: Wed, 15 Aug 2018 09:42:23 +0100 Subject: NewRelayReplFromRelayForw --- dhcpv6/dhcpv6relay.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dhcpv6/dhcpv6relay.go') diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index 93836c5..070b17b 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -170,14 +170,14 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { optrid []Option ) if relayForw == nil { - return nil, errors.New("RELAY_FORW cannot be nil") + return nil, errors.New("MessageTypeRelayForward cannot be nil") } relay, ok := relayForw.(*DHCPv6Relay) if !ok { return nil, errors.New("Not a DHCPv6Relay") } if relay.Type() != MessageTypeRelayForward { - return nil, errors.New("The passed packet is not of type RELAY_FORW") + return nil, errors.New("The passed packet is not of type MessageTypeRelayForward") } if msg == nil { return nil, errors.New("The passed message cannot be nil") -- cgit v1.2.3 From a8edbc5bd469e0595110c2dcf8d695d955323b24 Mon Sep 17 00:00:00 2001 From: Pablo Mazzini Date: Wed, 15 Aug 2018 14:14:19 +0100 Subject: NewRelayReplFromRelayForw: update error msg --- dhcpv6/dhcpv6relay.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dhcpv6/dhcpv6relay.go') diff --git a/dhcpv6/dhcpv6relay.go b/dhcpv6/dhcpv6relay.go index 070b17b..5c30bad 100644 --- a/dhcpv6/dhcpv6relay.go +++ b/dhcpv6/dhcpv6relay.go @@ -170,7 +170,7 @@ func NewRelayReplFromRelayForw(relayForw, msg DHCPv6) (DHCPv6, error) { optrid []Option ) if relayForw == nil { - return nil, errors.New("MessageTypeRelayForward cannot be nil") + return nil, errors.New("Relay message cannot be nil") } relay, ok := relayForw.(*DHCPv6Relay) if !ok { -- cgit v1.2.3