summaryrefslogtreecommitdiffhomepage
path: root/packet/bgp.go
diff options
context:
space:
mode:
Diffstat (limited to 'packet/bgp.go')
-rw-r--r--packet/bgp.go40
1 files changed, 28 insertions, 12 deletions
diff --git a/packet/bgp.go b/packet/bgp.go
index 3ff5615e..b5bf7924 100644
--- a/packet/bgp.go
+++ b/packet/bgp.go
@@ -204,7 +204,9 @@ func (c *DefaultParameterCapability) DecodeFromBytes(data []byte) error {
if len(data) < 2+int(c.CapLen) {
return fmt.Errorf("Not all OptionParameterCapability bytes available")
}
- c.CapValue = data[2 : 2+c.CapLen]
+ if c.CapLen > 0 {
+ c.CapValue = data[2 : 2+c.CapLen]
+ }
return nil
}
@@ -485,7 +487,6 @@ func (o *OptionParameterCapability) DecodeFromBytes(data []byte) error {
func (o *OptionParameterCapability) Serialize() ([]byte, error) {
buf := make([]byte, 2)
buf[0] = o.ParamType
- //buf[1] = o.ParamLen
for _, p := range o.Capability {
pbuf, err := p.Serialize()
if err != nil {
@@ -493,7 +494,8 @@ func (o *OptionParameterCapability) Serialize() ([]byte, error) {
}
buf = append(buf, pbuf...)
}
- buf[1] = uint8(len(buf) - 2)
+ o.ParamLen = uint8(len(buf) - 2)
+ buf[1] = o.ParamLen
return buf, nil
}
@@ -533,13 +535,14 @@ func (msg *BGPOpen) DecodeFromBytes(data []byte) error {
msg.Version = data[0]
msg.MyAS = binary.BigEndian.Uint16(data[1:3])
msg.HoldTime = binary.BigEndian.Uint16(data[3:5])
- msg.ID = data[5:9]
+ msg.ID = net.IP(data[5:9]).To4()
msg.OptParamLen = data[9]
data = data[10:]
if len(data) < int(msg.OptParamLen) {
return fmt.Errorf("Not all BGP Open message bytes available")
}
+ msg.OptParams = []OptionParameterInterface{}
for rest := msg.OptParamLen; rest > 0; {
paramtype := data[0]
paramlen := data[1]
@@ -568,7 +571,7 @@ func (msg *BGPOpen) Serialize() ([]byte, error) {
buf[0] = msg.Version
binary.BigEndian.PutUint16(buf[1:3], msg.MyAS)
binary.BigEndian.PutUint16(buf[3:5], msg.HoldTime)
- copy(buf[5:9], msg.ID)
+ copy(buf[5:9], msg.ID.To4())
pbuf := make([]byte, 0)
for _, p := range msg.OptParams {
onepbuf, err := p.Serialize()
@@ -577,7 +580,8 @@ func (msg *BGPOpen) Serialize() ([]byte, error) {
}
pbuf = append(pbuf, onepbuf...)
}
- buf[9] = uint8(len(pbuf))
+ msg.OptParamLen = uint8(len(pbuf))
+ buf[9] = msg.OptParamLen
return append(buf, pbuf...), nil
}
@@ -627,6 +631,9 @@ func (r *IPAddrPrefixDefault) serializePrefix(bitlen uint8) ([]byte, error) {
last_byte_value := buf[bytelen-1] & byte(mask)
buf[bytelen-1] = last_byte_value
}
+ b := make([]byte, len(r.Prefix))
+ copy(b, buf)
+ copy(r.Prefix, b)
return buf, nil
}
@@ -1026,7 +1033,7 @@ func NewLabeledVPNIPAddrPrefix(length uint8, prefix string, label MPLSLabelStack
rdlen = rd.Len()
}
return &LabeledVPNIPAddrPrefix{
- IPAddrPrefixDefault{length + uint8(8*(label.Len()+rdlen)), net.ParseIP(prefix)},
+ IPAddrPrefixDefault{length + uint8(8*(label.Len()+rdlen)), net.ParseIP(prefix).To4()},
label,
rd,
4,
@@ -1128,7 +1135,7 @@ func (l *LabeledIPAddrPrefix) Serialize() ([]byte, error) {
func NewLabeledIPAddrPrefix(length uint8, prefix string, label MPLSLabelStack) *LabeledIPAddrPrefix {
return &LabeledIPAddrPrefix{
- IPAddrPrefixDefault{length + uint8(label.Len()*8), net.ParseIP(prefix)},
+ IPAddrPrefixDefault{length + uint8(label.Len()*8), net.ParseIP(prefix).To4()},
label,
4,
}
@@ -2048,7 +2055,9 @@ func (p *PathAttribute) DecodeFromBytes(data []byte) error {
if len(data) < int(p.Length) {
return NewMessageError(eCode, eSubCode, data, "attribute value length is short")
}
- p.Value = data[:p.Length]
+ if len(data[:p.Length]) > 0 {
+ p.Value = data[:p.Length]
+ }
ok, eMsg := ValidateFlags(p.Type, p.Flags)
if !ok {
@@ -3176,6 +3185,7 @@ type DefaultOpaqueExtendedValue struct {
}
func (v *DefaultOpaqueExtendedValue) Serialize() ([]byte, error) {
+ v.Value = v.Value[:7]
return v.Value[:7], nil
}
@@ -3313,6 +3323,7 @@ func (e *UnknownExtended) Serialize() ([]byte, error) {
buf := make([]byte, 8)
buf[0] = uint8(e.Type)
copy(buf[1:], e.Value)
+ e.Value = buf[1:]
return buf, nil
}
@@ -3577,7 +3588,7 @@ func NewPathAttributeAs4Aggregator(as uint32, address string) *PathAttributeAs4A
},
Value: PathAttributeAggregatorParam{
AS: as,
- Address: net.ParseIP(address),
+ Address: net.ParseIP(address).To4(),
},
}
}
@@ -4033,6 +4044,7 @@ func (msg *BGPUpdate) DecodeFromBytes(data []byte) error {
return NewMessageError(eCode, eSubCode, nil, "withdrawn route length exceeds message length")
}
+ msg.WithdrawnRoutes = []WithdrawnRoute{}
for routelen := msg.WithdrawnRoutesLen; routelen > 0; {
w := WithdrawnRoute{}
err := w.DecodeFromBytes(data)
@@ -4060,6 +4072,7 @@ func (msg *BGPUpdate) DecodeFromBytes(data []byte) error {
return NewMessageError(eCode, eSubCode, nil, "path total attribute length exceeds message length")
}
+ msg.PathAttributes = []PathAttributeInterface{}
for pathlen := msg.TotalPathAttributeLen; pathlen > 0; {
p, err := GetPathAttribute(data)
if err != nil {
@@ -4077,6 +4090,7 @@ func (msg *BGPUpdate) DecodeFromBytes(data []byte) error {
msg.PathAttributes = append(msg.PathAttributes, p)
}
+ msg.NLRI = []NLRInfo{}
for restlen := len(data); restlen > 0; {
n := NLRInfo{}
err := n.DecodeFromBytes(data)
@@ -4103,7 +4117,8 @@ func (msg *BGPUpdate) Serialize() ([]byte, error) {
}
wbuf = append(wbuf, onewbuf...)
}
- binary.BigEndian.PutUint16(wbuf, uint16(len(wbuf)-2))
+ msg.WithdrawnRoutesLen = uint16(len(wbuf) - 2)
+ binary.BigEndian.PutUint16(wbuf, msg.WithdrawnRoutesLen)
pbuf := make([]byte, 2)
for _, p := range msg.PathAttributes {
@@ -4113,7 +4128,8 @@ func (msg *BGPUpdate) Serialize() ([]byte, error) {
}
pbuf = append(pbuf, onepbuf...)
}
- binary.BigEndian.PutUint16(pbuf, uint16(len(pbuf)-2))
+ msg.TotalPathAttributeLen = uint16(len(pbuf) - 2)
+ binary.BigEndian.PutUint16(pbuf, msg.TotalPathAttributeLen)
buf := append(wbuf, pbuf...)
for _, n := range msg.NLRI {