From d4d97da22058ef2e1a4e41474fc80384014402e2 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Sat, 1 Jul 2023 13:35:40 +0900 Subject: [PATCH] pkg/packet/mrt: restore compatibility restore the API breakage due to c801e18495e36e48a4. However, this is a hack. Should be removed with the major version updated. Signed-off-by: FUJITA Tomonori --- pkg/packet/mrt/mrt.go | 27 +++++++++++++++++++++++---- pkg/packet/mrt/mrt_test.go | 8 ++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/pkg/packet/mrt/mrt.go b/pkg/packet/mrt/mrt.go index cad57709..cdb0c9c9 100644 --- a/pkg/packet/mrt/mrt.go +++ b/pkg/packet/mrt/mrt.go @@ -365,7 +365,7 @@ type RibEntry struct { var errNotAllRibEntryBytesAvailable = errors.New("not all RibEntry bytes are available") -func (e *RibEntry) DecodeFromBytes(data []byte, prefix bgp.AddrPrefixInterface) ([]byte, error) { +func (e *RibEntry) DecodeFromBytes(data []byte, prefix ...bgp.AddrPrefixInterface) ([]byte, error) { if len(data) < 8 { return nil, errNotAllRibEntryBytesAvailable } @@ -384,7 +384,16 @@ func (e *RibEntry) DecodeFromBytes(data []byte, prefix bgp.AddrPrefixInterface) if err != nil { return nil, err } - err = p.DecodeFromBytes(data, &bgp.MarshallingOption{ImplicitPrefix: prefix}) + + // HACK: keeps compatibility + switch len(prefix) { + case 0: + err = p.DecodeFromBytes(data) + case 1: + err = p.DecodeFromBytes(data, &bgp.MarshallingOption{ImplicitPrefix: prefix[0]}) + default: + return nil, fmt.Errorf("only one prefix should be used") + } if err != nil { return nil, err } @@ -398,11 +407,21 @@ func (e *RibEntry) DecodeFromBytes(data []byte, prefix bgp.AddrPrefixInterface) return data, nil } -func (e *RibEntry) Serialize(prefix bgp.AddrPrefixInterface) ([]byte, error) { +func (e *RibEntry) Serialize(prefix ...bgp.AddrPrefixInterface) ([]byte, error) { pbuf := make([]byte, 0) totalLen := 0 for _, pattr := range e.PathAttributes { - pb, err := pattr.Serialize(&bgp.MarshallingOption{ImplicitPrefix: prefix}) + var pb []byte + var err error + // HACK: keeps compatibility + switch len(prefix) { + case 0: + pb, err = pattr.Serialize() + case 1: + pb, err = pattr.Serialize(&bgp.MarshallingOption{ImplicitPrefix: prefix[0]}) + default: + return nil, fmt.Errorf("only one prefix should be used") + } if err != nil { return nil, err } diff --git a/pkg/packet/mrt/mrt_test.go b/pkg/packet/mrt/mrt_test.go index 2020ecfb..275b094e 100644 --- a/pkg/packet/mrt/mrt_test.go +++ b/pkg/packet/mrt/mrt_test.go @@ -116,13 +116,13 @@ func TestMrtRibEntry(t *testing.T) { } e1 := NewRibEntry(1, uint32(time.Now().Unix()), 0, p, false) - b1, err := e1.Serialize(nil) + b1, err := e1.Serialize() if err != nil { t.Fatal(err) } e2 := &RibEntry{} - rest, err := e2.DecodeFromBytes(b1, nil) + rest, err := e2.DecodeFromBytes(b1) if err != nil { t.Fatal(err) } @@ -145,13 +145,13 @@ func TestMrtRibEntryWithAddPath(t *testing.T) { bgp.NewPathAttributeLocalPref(1 << 22), } e1 := NewRibEntry(1, uint32(time.Now().Unix()), 200, p, true) - b1, err := e1.Serialize(nil) + b1, err := e1.Serialize() if err != nil { t.Fatal(err) } e2 := &RibEntry{isAddPath: true} - rest, err := e2.DecodeFromBytes(b1, nil) + rest, err := e2.DecodeFromBytes(b1) if err != nil { t.Fatal(err) }