Skip to content
Snippets Groups Projects
Commit 017846ea authored by Julian Kornberger's avatar Julian Kornberger Committed by takt
Browse files

Wrap errors (#161)

Package errors provides simple error handling primitives.
Read more on https://github.com/pkg/errors
parent 857732ea
Branches
Tags
No related merge requests found
Showing
with 107 additions and 88 deletions
......@@ -6,6 +6,7 @@ import (
"net"
"strings"
"github.com/pkg/errors"
"github.com/taktv6/tflow2/convert"
)
......@@ -29,7 +30,7 @@ func (g *Global) SetDefaultGlobalConfigValues() error {
if g.RouterID == 0 {
rtrid, err := generateRouterID()
if err != nil {
return fmt.Errorf("Unable to determine router ID: %v", err)
return errors.Wrap(err, "Unable to determine router ID")
}
g.RouterID = rtrid
}
......@@ -64,7 +65,7 @@ func _getHighestIP(ifs []net.Interface) (net.IP, error) {
for _, iface := range ifs {
addrs, err := iface.Addrs()
if err != nil {
return nil, fmt.Errorf("Unable to get interface addrs for %s: %v", iface.Name, err)
return nil, errors.Wrapf(err, "Unable to get interface addrs for %s", iface.Name)
}
for _, addr := range addrs {
......@@ -92,7 +93,7 @@ func _getHighestIP(ifs []net.Interface) (net.IP, error) {
func getLoopbackIP() (net.IP, error) {
iface, err := net.InterfaceByName("lo")
if err != nil {
return nil, fmt.Errorf("Unable to get interface lo: %v", err)
return nil, errors.Wrap(err, "Unable to get interface lo")
}
return _getLoopbackIP(iface)
......@@ -101,7 +102,7 @@ func getLoopbackIP() (net.IP, error) {
func _getLoopbackIP(iface *net.Interface) (net.IP, error) {
addrs, err := iface.Addrs()
if err != nil {
return nil, fmt.Errorf("Unable to get interface addresses: %v", err)
return nil, errors.Wrap(err, "Unable to get interface addresses")
}
candidates := make([]net.IP, 0)
......
......@@ -8,6 +8,7 @@ import (
"strings"
"github.com/bio-routing/bio-rd/net/api"
"github.com/pkg/errors"
)
// Prefix represents an IPv4 prefix
......@@ -62,7 +63,7 @@ func StrToAddr(x string) (uint32, error) {
for i := 0; i < 4; i++ {
y, err := strconv.Atoi(parts[i])
if err != nil {
return 0, fmt.Errorf("Unable to convert %q to int: %v", parts[i], err)
return 0, errors.Wrapf(err, "Unable to convert %q to int", parts[i])
}
if y > 255 {
......
......@@ -6,6 +6,7 @@ import (
"net"
"github.com/bio-routing/bio-rd/util/decode"
"github.com/pkg/errors"
"github.com/taktv6/tflow2/convert"
)
......@@ -13,12 +14,12 @@ import (
func Decode(buf *bytes.Buffer, opt *DecodeOptions) (*BGPMessage, error) {
hdr, err := decodeHeader(buf)
if err != nil {
return nil, fmt.Errorf("Failed to decode header: %v", err)
return nil, errors.Wrap(err, "Failed to decode header")
}
body, err := decodeMsgBody(buf, hdr.Type, hdr.Length-MinLen, opt)
if err != nil {
return nil, fmt.Errorf("Failed to decode message: %v", err)
return nil, errors.Wrap(err, "Failed to decode message")
}
return &BGPMessage{
......@@ -132,7 +133,7 @@ func invalidErrCode(n *BGPNotification) (*BGPNotification, error) {
func DecodeOpenMsg(buf *bytes.Buffer) (*BGPOpen, error) {
msg, err := _decodeOpenMsg(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode OPEN message: %v", err)
return nil, errors.Wrap(err, "Unable to decode OPEN message")
}
return msg.(*BGPOpen), err
}
......@@ -160,7 +161,7 @@ func _decodeOpenMsg(buf *bytes.Buffer) (interface{}, error) {
msg.OptParams, err = decodeOptParams(buf, msg.OptParmLen)
if err != nil {
return nil, fmt.Errorf("Unable to decode optional parameters: %v", err)
return nil, errors.Wrap(err, "Unable to decode optional parameters")
}
return msg, nil
......@@ -187,7 +188,7 @@ func decodeOptParams(buf *bytes.Buffer, optParmLen uint8) ([]OptParam, error) {
case CapabilitiesParamType:
caps, err := decodeCapabilities(buf, o.Length)
if err != nil {
return nil, fmt.Errorf("Unable to decode capabilities: %v", err)
return nil, errors.Wrap(err, "Unable to decode capabilities")
}
o.Value = caps
......@@ -210,7 +211,7 @@ func decodeCapabilities(buf *bytes.Buffer, length uint8) (Capabilities, error) {
for read < length {
cap, err := decodeCapability(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode capability: %v", err)
return nil, errors.Wrap(err, "Unable to decode capability")
}
ret = append(ret, cap)
......@@ -242,20 +243,20 @@ func decodeCapability(buf *bytes.Buffer) (Capability, error) {
case AddPathCapabilityCode:
addPathCap, err := decodeAddPathCapability(buf)
if err != nil {
return cap, fmt.Errorf("Unable to decode add path capability: %v", err)
return cap, errors.Wrap(err, "Unable to decode add path capability")
}
cap.Value = addPathCap
case ASN4CapabilityCode:
asn4Cap, err := decodeASN4Capability(buf)
if err != nil {
return cap, fmt.Errorf("Unable to decode 4 octet ASN capability: %v", err)
return cap, errors.Wrap(err, "Unable to decode 4 octet ASN capability")
}
cap.Value = asn4Cap
default:
for i := uint8(0); i < cap.Length; i++ {
_, err := buf.ReadByte()
if err != nil {
return cap, fmt.Errorf("Read failed: %v", err)
return cap, errors.Wrap(err, "Read failed")
}
}
}
......
......@@ -6,6 +6,7 @@ import (
bnet "github.com/bio-routing/bio-rd/net"
"github.com/bio-routing/bio-rd/util/decode"
"github.com/pkg/errors"
"github.com/taktv6/tflow2/convert"
)
......@@ -65,7 +66,7 @@ func deserializeMultiProtocolReachNLRI(b []byte, addPath bool) (MultiProtocolRea
n.NextHop, err = bnet.IPFromBytes(variable[:nextHopLength])
if err != nil {
return MultiProtocolReachNLRI{}, fmt.Errorf("Failed to decode next hop IP: %v", err)
return MultiProtocolReachNLRI{}, errors.Wrap(err, "Failed to decode next hop IP")
}
budget -= int(nextHopLength)
......
......@@ -7,6 +7,7 @@ import (
bnet "github.com/bio-routing/bio-rd/net"
"github.com/bio-routing/bio-rd/util/decode"
"github.com/pkg/errors"
"github.com/taktv6/tflow2/convert"
)
......@@ -32,7 +33,7 @@ func decodeNLRIs(buf *bytes.Buffer, length uint16, afi uint16, addPath bool) (*N
for p < length {
nlri, consumed, err = decodeNLRI(buf, afi, addPath)
if err != nil {
return nil, fmt.Errorf("Unable to decode NLRI: %v", err)
return nil, errors.Wrap(err, "Unable to decode NLRI")
}
p += uint16(consumed)
......@@ -59,7 +60,7 @@ func decodeNLRI(buf *bytes.Buffer, afi uint16, addPath bool) (*NLRI, uint8, erro
&nlri.PathIdentifier,
})
if err != nil {
return nil, consumed, fmt.Errorf("Unable to decode path identifier: %v", err)
return nil, consumed, errors.Wrap(err, "Unable to decode path identifier")
}
consumed += pathIdentifierLen
......
......@@ -9,6 +9,7 @@ import (
"github.com/bio-routing/bio-rd/protocols/bgp/types"
"github.com/bio-routing/bio-rd/route"
"github.com/bio-routing/bio-rd/util/decode"
"github.com/pkg/errors"
"github.com/taktv6/tflow2/convert"
)
......@@ -23,7 +24,7 @@ func decodePathAttrs(buf *bytes.Buffer, tpal uint16, opt *DecodeOptions) (*PathA
for p < tpal {
pa, consumed, err = decodePathAttr(buf, opt)
if err != nil {
return nil, fmt.Errorf("Unable to decode path attr: %v", err)
return nil, errors.Wrap(err, "Unable to decode path attr")
}
p += consumed
......@@ -44,7 +45,7 @@ func decodePathAttr(buf *bytes.Buffer, opt *DecodeOptions) (pa *PathAttribute, c
err = decodePathAttrFlags(buf, pa)
if err != nil {
return nil, consumed, fmt.Errorf("Unable to get path attribute flags: %v", err)
return nil, consumed, errors.Wrap(err, "Unable to get path attribute flags")
}
consumed++
......@@ -63,7 +64,7 @@ func decodePathAttr(buf *bytes.Buffer, opt *DecodeOptions) (pa *PathAttribute, c
switch pa.TypeCode {
case OriginAttr:
if err := pa.decodeOrigin(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode Origin: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode Origin")
}
case ASPathAttr:
asnLength := uint8(2)
......@@ -72,62 +73,62 @@ func decodePathAttr(buf *bytes.Buffer, opt *DecodeOptions) (pa *PathAttribute, c
}
if err := pa.decodeASPath(buf, asnLength); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode AS Path: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode AS Path")
}
/* Don't decodeAS4Paths yet: The rest of the software does not support it right yet!
case AS4PathAttr:
if err := pa.decodeASPath(buf, 4); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode AS4 Path: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode AS4 Path")
}*/
case NextHopAttr:
if err := pa.decodeNextHop(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode Next-Hop: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode Next-Hop")
}
case MEDAttr:
if err := pa.decodeMED(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode MED: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode MED")
}
case LocalPrefAttr:
if err := pa.decodeLocalPref(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode local pref: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode local pref")
}
case AggregatorAttr:
if err := pa.decodeAggregator(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode Aggregator: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode Aggregator")
}
case AtomicAggrAttr:
// Nothing to do for 0 octet long attribute
case CommunitiesAttr:
if err := pa.decodeCommunities(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode Community: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode Community")
}
case OriginatorIDAttr:
if err := pa.decodeOriginatorID(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode OriginatorID: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode OriginatorID")
}
case ClusterListAttr:
if err := pa.decodeClusterList(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode OriginatorID: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode OriginatorID")
}
case MultiProtocolReachNLRICode:
if err := pa.decodeMultiProtocolReachNLRI(buf, opt.AddPath); err != nil {
return nil, consumed, fmt.Errorf("Failed to multi protocol reachable NLRI: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to multi protocol reachable NLRI")
}
case MultiProtocolUnreachNLRICode:
if err := pa.decodeMultiProtocolUnreachNLRI(buf, opt.AddPath); err != nil {
return nil, consumed, fmt.Errorf("Failed to multi protocol unreachable NLRI: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to multi protocol unreachable NLRI")
}
case AS4AggregatorAttr:
if err := pa.decodeAS4Aggregator(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to skip not supported AS4Aggregator: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to skip not supported AS4Aggregator")
}
case LargeCommunitiesAttr:
if err := pa.decodeLargeCommunities(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode large communities: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode large communities")
}
default:
if err := pa.decodeUnknown(buf); err != nil {
return nil, consumed, fmt.Errorf("Failed to decode unknown attribute: %v", err)
return nil, consumed, errors.Wrap(err, "Failed to decode unknown attribute")
}
}
......@@ -138,7 +139,7 @@ func (pa *PathAttribute) decodeMultiProtocolReachNLRI(buf *bytes.Buffer, addPath
b := make([]byte, pa.Length)
n, err := buf.Read(b)
if err != nil {
return fmt.Errorf("Unable to read %d bytes from buffer: %v", pa.Length, err)
return errors.Wrapf(err, "Unable to read %d bytes from buffer", pa.Length)
}
if n != int(pa.Length) {
return fmt.Errorf("Unable to read %d bytes from buffer, only got %d bytes", pa.Length, n)
......@@ -146,7 +147,7 @@ func (pa *PathAttribute) decodeMultiProtocolReachNLRI(buf *bytes.Buffer, addPath
nlri, err := deserializeMultiProtocolReachNLRI(b, addPath)
if err != nil {
return fmt.Errorf("Unable to decode MP_REACH_NLRI: %v", err)
return errors.Wrap(err, "Unable to decode MP_REACH_NLRI")
}
pa.Value = nlri
......@@ -157,7 +158,7 @@ func (pa *PathAttribute) decodeMultiProtocolUnreachNLRI(buf *bytes.Buffer, addPa
b := make([]byte, pa.Length)
n, err := buf.Read(b)
if err != nil {
return fmt.Errorf("Unable to read %d bytes from buffer: %v", pa.Length, err)
return errors.Wrapf(err, "Unable to read %d bytes from buffer", pa.Length)
}
if n != int(pa.Length) {
return fmt.Errorf("Unable to read %d bytes from buffer, only got %d bytes", pa.Length, n)
......@@ -165,7 +166,7 @@ func (pa *PathAttribute) decodeMultiProtocolUnreachNLRI(buf *bytes.Buffer, addPa
nlri, err := deserializeMultiProtocolUnreachNLRI(b, addPath)
if err != nil {
return fmt.Errorf("Unable to decode MP_UNREACH_NLRI: %v", err)
return errors.Wrap(err, "Unable to decode MP_UNREACH_NLRI")
}
pa.Value = nlri
......@@ -177,7 +178,7 @@ func (pa *PathAttribute) decodeUnknown(buf *bytes.Buffer) error {
err := decode.Decode(buf, []interface{}{&u})
if err != nil {
return fmt.Errorf("Unable to decode: %v", err)
return errors.Wrap(err, "Unable to decode")
}
pa.Value = u
......@@ -190,7 +191,7 @@ func (pa *PathAttribute) decodeOrigin(buf *bytes.Buffer) error {
p := uint16(0)
err := decode.Decode(buf, []interface{}{&origin})
if err != nil {
return fmt.Errorf("Unable to decode: %v", err)
return errors.Wrap(err, "Unable to decode")
}
pa.Value = origin
......@@ -269,7 +270,7 @@ func (pa *PathAttribute) decodeNextHop(buf *bytes.Buffer) error {
nextHop := uint32(0)
err := decode.Decode(buf, []interface{}{&nextHop})
if err != nil {
return fmt.Errorf("Unable to decode next hop: %v", err)
return errors.Wrap(err, "Unable to decode next hop")
}
pa.Value = bnet.IPv4(nextHop)
......@@ -360,7 +361,7 @@ func (pa *PathAttribute) decodeAS4Aggregator(buf *bytes.Buffer) error {
func (pa *PathAttribute) decodeUint32(buf *bytes.Buffer, attrName string) error {
v, err := read4BytesAsUint32(buf)
if err != nil {
return fmt.Errorf("Unable to decode %s: %v", attrName, err)
return errors.Wrapf(err, "Unable to decode %s", attrName)
}
pa.Value = v
......@@ -368,7 +369,7 @@ func (pa *PathAttribute) decodeUint32(buf *bytes.Buffer, attrName string) error
p := uint16(4)
err = dumpNBytes(buf, pa.Length-p)
if err != nil {
return fmt.Errorf("dumpNBytes failed: %v", err)
return errors.Wrap(err, "dumpNBytes failed")
}
return nil
......
......@@ -13,6 +13,7 @@ import (
"github.com/bio-routing/bio-rd/routingtable"
"github.com/bio-routing/bio-rd/routingtable/filter"
"github.com/bio-routing/bio-rd/routingtable/locRIB"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/taktv6/tflow2/convert"
)
......@@ -280,7 +281,7 @@ func (r *router) processPeerUpNotification(msg *bmppkt.PeerUpNotification) error
sentOpen, err := packet.DecodeOpenMsg(bytes.NewBuffer(msg.SentOpenMsg[packet.HeaderLen:]))
if err != nil {
return fmt.Errorf("Unable to decode sent open message sent from %v to %v: %v", r.address.String(), msg.PerPeerHeader.PeerAddress, err)
return errors.Wrapf(err, "Unable to decode sent open message sent from %v to %v", r.address.String(), msg.PerPeerHeader.PeerAddress)
}
if len(msg.ReceivedOpenMsg) < packet.MinOpenLen {
......@@ -289,7 +290,7 @@ func (r *router) processPeerUpNotification(msg *bmppkt.PeerUpNotification) error
recvOpen, err := packet.DecodeOpenMsg(bytes.NewBuffer(msg.ReceivedOpenMsg[packet.HeaderLen:]))
if err != nil {
return fmt.Errorf("Unable to decode received open message sent from %v to %v: %v", msg.PerPeerHeader.PeerAddress, r.address.String(), err)
return errors.Wrapf(err, "Unable to decode received open message sent from %v to %v", msg.PerPeerHeader.PeerAddress, r.address.String())
}
addrLen := net.IPv4len
......
......@@ -10,6 +10,7 @@ import (
bmppkt "github.com/bio-routing/bio-rd/protocols/bmp/packet"
"github.com/bio-routing/bio-rd/routingtable"
"github.com/bio-routing/bio-rd/routingtable/locRIB"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/taktv6/tflow2/convert"
)
......@@ -132,7 +133,7 @@ func recvBMPMsg(c net.Conn) (msg []byte, err error) {
buffer := make([]byte, defaultBufferLen)
_, err = io.ReadFull(c, buffer[0:bmppkt.MinLen])
if err != nil {
return nil, fmt.Errorf("Read failed: %v", err)
return nil, errors.Wrap(err, "Read failed")
}
l := convert.Uint32b(buffer[1:5])
......@@ -145,7 +146,7 @@ func recvBMPMsg(c net.Conn) (msg []byte, err error) {
toRead := l
_, err = io.ReadFull(c, buffer[bmppkt.MinLen:toRead])
if err != nil {
return nil, fmt.Errorf("Read failed: %v", err)
return nil, errors.Wrap(err, "Read failed")
}
return buffer[0:toRead], nil
......
......@@ -9,6 +9,7 @@ import (
"time"
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
......@@ -267,7 +268,7 @@ func (fsm *FSM) sendOpen() error {
_, err := fsm.con.Write(msg)
if err != nil {
return fmt.Errorf("Unable to send OPEN message: %v", err)
return errors.Wrap(err, "Unable to send OPEN message")
}
return nil
......@@ -296,7 +297,7 @@ func (fsm *FSM) sendNotification(errorCode uint8, errorSubCode uint8) error {
_, err := fsm.con.Write(msg)
if err != nil {
return fmt.Errorf("Unable to send NOTIFICATION message: %v", err)
return errors.Wrap(err, "Unable to send NOTIFICATION message")
}
return nil
......@@ -307,7 +308,7 @@ func (fsm *FSM) sendKeepalive() error {
_, err := fsm.con.Write(msg)
if err != nil {
return fmt.Errorf("Unable to send KEEPALIVE message: %v", err)
return errors.Wrap(err, "Unable to send KEEPALIVE message")
}
return nil
......@@ -317,14 +318,14 @@ func recvMsg(c net.Conn) (msg []byte, err error) {
buffer := make([]byte, packet.MaxLen)
_, err = io.ReadFull(c, buffer[0:packet.MinLen])
if err != nil {
return nil, fmt.Errorf("Read failed: %v", err)
return nil, errors.Wrap(err, "Read failed")
}
l := int(buffer[16])*256 + int(buffer[17])
toRead := l
_, err = io.ReadFull(c, buffer[packet.MinLen:toRead])
if err != nil {
return nil, fmt.Errorf("Read failed: %v", err)
return nil, errors.Wrap(err, "Read failed")
}
return buffer, nil
......
......@@ -9,6 +9,7 @@ import (
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/bio-routing/bio-rd/route"
"github.com/bio-routing/bio-rd/routingtable"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
......@@ -58,11 +59,11 @@ func (s establishedState) run() (state, string) {
func (s *establishedState) init() error {
host, _, err := net.SplitHostPort(s.fsm.con.LocalAddr().String())
if err != nil {
return fmt.Errorf("Unable to get local address: %v", err)
return errors.Wrap(err, "Unable to get local address")
}
localAddr, err := bnet.IPFromString(host)
if err != nil {
return fmt.Errorf("Unable to parse address: %v", err)
return errors.Wrap(err, "Unable to parse address")
}
n := &routingtable.Neighbor{
......
package server
import (
"fmt"
"net"
"strings"
"sync"
"github.com/bio-routing/bio-rd/config"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
......@@ -38,7 +38,7 @@ func (b *bgpServer) RouterID() uint32 {
func (b *bgpServer) Start(c *config.Global) error {
if err := c.SetDefaultGlobalConfigValues(); err != nil {
return fmt.Errorf("Failed to load defaults: %v", err)
return errors.Wrap(err, "Failed to load defaults")
}
log.Infof("ROUTER ID: %d\n", c.RouterID)
......@@ -50,7 +50,7 @@ func (b *bgpServer) Start(c *config.Global) error {
for _, addr := range c.LocalAddressList {
l, err := NewTCPListener(addr, c.Port, acceptCh)
if err != nil {
return fmt.Errorf("Failed to start TCPListener for %s: %v", addr.String(), err)
return errors.Wrapf(err, "Failed to start TCPListener for %s", addr.String())
}
b.listeners = append(b.listeners, l)
}
......
package server
import (
"fmt"
"io"
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
......@@ -18,7 +18,7 @@ func serializeAndSendUpdate(out io.Writer, update serializeAbleUpdate, opt *pack
_, err = out.Write(updateBytes)
if err != nil {
return fmt.Errorf("Failed sending Update: %v", err)
return errors.Wrap(err, "Failed sending Update")
}
return nil
}
......
......@@ -2,12 +2,12 @@ package server
import (
"bytes"
"errors"
"io"
"testing"
bnet "github.com/bio-routing/bio-rd/net"
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
......@@ -89,7 +89,12 @@ func TestSerializeAndSendUpdate(t *testing.T) {
t.Run(test.name, func(t *testing.T) {
opt := &packet.EncodeOptions{}
err := serializeAndSendUpdate(test.buf, test.testUpdate, opt)
assert.Equal(t, test.err, err)
if test.err == nil {
assert.NoError(t, err)
} else {
assert.Equal(t, test.err.Error(), err.Error())
}
assert.Equal(t, test.expected, test.buf.Bytes())
})
......
......@@ -3,6 +3,8 @@ package packet
import (
"bytes"
"fmt"
"github.com/pkg/errors"
)
const (
......@@ -38,7 +40,7 @@ func Decode(msg []byte) (Msg, error) {
ch, err := decodeCommonHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode common header: %v", err)
return nil, errors.Wrap(err, "Unable to decode common header")
}
if ch.Version != BMPVersion {
......@@ -49,49 +51,49 @@ func Decode(msg []byte) (Msg, error) {
case RouteMonitoringType:
rm, err := decodeRouteMonitoringMsg(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode route monitoring message: %v", err)
return nil, errors.Wrap(err, "Unable to decode route monitoring message")
}
return rm, err
case StatisticsReportType:
sr, err := decodeStatsReport(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode stats report: %v", err)
return nil, errors.Wrap(err, "Unable to decode stats report")
}
return sr, nil
case PeerDownNotificationType:
pd, err := decodePeerDownNotification(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode peer down notification: %v", err)
return nil, errors.Wrap(err, "Unable to decode peer down notification")
}
return pd, nil
case PeerUpNotificationType:
pu, err := decodePeerUpNotification(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode peer up notification: %v", err)
return nil, errors.Wrap(err, "Unable to decode peer up notification")
}
return pu, nil
case InitiationMessageType:
im, err := decodeInitiationMessage(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode initiation message: %v", err)
return nil, errors.Wrap(err, "Unable to decode initiation message")
}
return im, nil
case TerminationMessageType:
tm, err := decodeTerminationMessage(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode termination message: %v", err)
return nil, errors.Wrap(err, "Unable to decode termination message")
}
return tm, nil
case RouteMirroringMessageType:
rm, err := decodeRouteMirroringMsg(buf, ch)
if err != nil {
return nil, fmt.Errorf("Unable to decode route mirroring message: %v", err)
return nil, errors.Wrap(err, "Unable to decode route mirroring message")
}
return rm, nil
......
......@@ -2,7 +2,8 @@ package packet
import (
"bytes"
"fmt"
"github.com/pkg/errors"
)
// InitiationMessage represents an initiation message
......@@ -28,7 +29,7 @@ func decodeInitiationMessage(buf *bytes.Buffer, ch *CommonHeader) (Msg, error) {
for read < toRead {
tlv, err := decodeInformationTLV(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode TLV: %v", err)
return nil, errors.Wrap(err, "Unable to decode TLV")
}
im.TLVs = append(im.TLVs, tlv)
......
......@@ -2,9 +2,9 @@ package packet
import (
"bytes"
"fmt"
"github.com/bio-routing/bio-rd/util/decoder"
"github.com/pkg/errors"
)
const (
......@@ -32,7 +32,7 @@ func decodePeerDownNotification(buf *bytes.Buffer, ch *CommonHeader) (*PeerDownN
pph, err := decodePerPeerHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode per peer header: %v", err)
return nil, errors.Wrap(err, "Unable to decode per peer header")
}
p.PerPeerHeader = pph
......@@ -57,7 +57,7 @@ func decodePeerDownNotification(buf *bytes.Buffer, ch *CommonHeader) (*PeerDownN
err = decoder.Decode(buf, fields)
if err != nil {
return nil, fmt.Errorf("Unable to read Data: %v", err)
return nil, errors.Wrap(err, "Unable to read Data")
}
return p, nil
......
......@@ -2,9 +2,9 @@ package packet
import (
"bytes"
"fmt"
"github.com/bio-routing/bio-rd/util/decoder"
"github.com/pkg/errors"
)
const (
......@@ -36,7 +36,7 @@ func decodePeerUpNotification(buf *bytes.Buffer, ch *CommonHeader) (*PeerUpNotif
pph, err := decodePerPeerHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode per peer header: %v", err)
return nil, errors.Wrap(err, "Unable to decode per peer header")
}
p.PerPeerHeader = pph
......@@ -54,13 +54,13 @@ func decodePeerUpNotification(buf *bytes.Buffer, ch *CommonHeader) (*PeerUpNotif
sentOpenMsg, err := getOpenMsg(buf)
if err != nil {
return nil, fmt.Errorf("Unable to get OPEN message: %v", err)
return nil, errors.Wrap(err, "Unable to get OPEN message")
}
p.SentOpenMsg = sentOpenMsg
recvOpenMsg, err := getOpenMsg(buf)
if err != nil {
return nil, fmt.Errorf("Unable to get OPEN message: %v", err)
return nil, errors.Wrap(err, "Unable to get OPEN message")
}
p.ReceivedOpenMsg = recvOpenMsg
......@@ -87,7 +87,7 @@ func getOpenMsg(buf *bytes.Buffer) ([]byte, error) {
}
err := decoder.Decode(buf, fields)
if err != nil {
return nil, fmt.Errorf("Unable to read: %v", err)
return nil, errors.Wrap(err, "Unable to read")
}
if msg[OpenMsgMinLen-1] == 0 {
......@@ -101,7 +101,7 @@ func getOpenMsg(buf *bytes.Buffer) ([]byte, error) {
err = decoder.Decode(buf, fields)
if err != nil {
return nil, fmt.Errorf("Unable to read: %v", err)
return nil, errors.Wrap(err, "Unable to read")
}
msg = append(msg, optParams...)
......
......@@ -2,7 +2,8 @@ package packet
import (
"bytes"
"fmt"
"github.com/pkg/errors"
)
// RouteMirroringMsg represents a route mirroring message
......@@ -24,7 +25,7 @@ func decodeRouteMirroringMsg(buf *bytes.Buffer, ch *CommonHeader) (*RouteMirrori
pph, err := decodePerPeerHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode per peer header: %v", err)
return nil, errors.Wrap(err, "Unable to decode per peer header")
}
rm.PerPeerHeader = pph
......@@ -35,7 +36,7 @@ func decodeRouteMirroringMsg(buf *bytes.Buffer, ch *CommonHeader) (*RouteMirrori
for read < toRead {
tlv, err := decodeInformationTLV(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode TLV: %v", err)
return nil, errors.Wrap(err, "Unable to decode TLV")
}
rm.TLVs = append(rm.TLVs, tlv)
......
......@@ -2,9 +2,9 @@ package packet
import (
"bytes"
"fmt"
"github.com/bio-routing/bio-rd/util/decoder"
"github.com/pkg/errors"
)
// RouteMonitoringMsg represents a Route Monitoring Message
......@@ -26,7 +26,7 @@ func decodeRouteMonitoringMsg(buf *bytes.Buffer, ch *CommonHeader) (*RouteMonito
pph, err := decodePerPeerHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode per peer header: %v", err)
return nil, errors.Wrap(err, "Unable to decode per peer header")
}
rm.PerPeerHeader = pph
......
......@@ -2,9 +2,9 @@ package packet
import (
"bytes"
"fmt"
"github.com/bio-routing/bio-rd/util/decoder"
"github.com/pkg/errors"
)
// StatsReport represents a stats report message
......@@ -27,7 +27,7 @@ func decodeStatsReport(buf *bytes.Buffer, ch *CommonHeader) (Msg, error) {
pph, err := decodePerPeerHeader(buf)
if err != nil {
return nil, fmt.Errorf("Unable to decode per peer header: %v", err)
return nil, errors.Wrap(err, "Unable to decode per peer header")
}
sr.PerPeerHeader = pph
......@@ -45,7 +45,7 @@ func decodeStatsReport(buf *bytes.Buffer, ch *CommonHeader) (Msg, error) {
for i := uint32(0); i < sr.StatsCount; i++ {
infoTLV, err := decodeInformationTLV(buf)
if err != nil {
return sr, fmt.Errorf("Unable to decode information TLV: %v", err)
return sr, errors.Wrap(err, "Unable to decode information TLV")
}
sr.Stats[i] = infoTLV
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment