Skip to content
Snippets Groups Projects
Commit fa3eae17 authored by Oliver Herms's avatar Oliver Herms
Browse files

Fixing aggregate attribute

parent 4b5f965a
No related branches found
No related tags found
No related merge requests found
......@@ -227,25 +227,12 @@ func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
aggr := types.Aggregator{}
p := uint16(0)
err := decode(buf, []interface{}{&aggr.ASN})
err := decode(buf, []interface{}{&aggr.ASN, &aggr.Address})
if err != nil {
return err
}
p += 2
addr := [4]byte{}
n, err := buf.Read(addr[:])
if err != nil {
return err
}
if n != 4 {
return fmt.Errorf("Unable to read next hop: buf.Read read %d bytes", n)
}
aggr.Address = fourBytesToUint32(addr)
p += 6
pa.Value = aggr
p += 4
return dumpNBytes(buf, pa.Length-p)
}
......@@ -497,10 +484,14 @@ func (pa *PathAttribute) serializeAggregator(buf *bytes.Buffer) uint8 {
attrFlags = setTransitive(attrFlags)
buf.WriteByte(attrFlags)
buf.WriteByte(AggregatorAttr)
length := uint8(2)
length := uint8(6)
buf.WriteByte(length)
buf.Write(convert.Uint16Byte(pa.Value.(uint16)))
return 5
aggregator := pa.Value.(types.Aggregator)
buf.Write(convert.Uint16Byte(aggregator.ASN))
buf.Write(convert.Uint32Byte(aggregator.Address))
return 9
}
func (pa *PathAttribute) serializeCommunities(buf *bytes.Buffer) uint8 {
......@@ -643,6 +634,23 @@ func PathAttributes(p *route.Path, iBGP bool) (*PathAttribute, error) {
last.Next = nextHop
last = nextHop
if p.BGPPath.AtomicAggregate {
atomicAggr := &PathAttribute{
TypeCode: AtomicAggrAttr,
}
last.Next = atomicAggr
last = atomicAggr
}
if p.BGPPath.Aggregator != nil {
aggregator := &PathAttribute{
TypeCode: AggregatorAttr,
Value: p.BGPPath.Aggregator,
}
last.Next = aggregator
last = aggregator
}
if iBGP {
localPref := &PathAttribute{
TypeCode: LocalPrefAttr,
......
......@@ -1137,15 +1137,19 @@ func TestSerializeAggregator(t *testing.T) {
name: "Test #1",
input: &PathAttribute{
TypeCode: AggregatorAttr,
Value: uint16(174),
Value: types.Aggregator{
ASN: 174,
Address: strAddr("10.20.30.40"),
},
},
expected: []byte{
192, // Attribute flags
7, // Type
2, // Length
6, // Length
0, 174, // Value = 174
10, 20, 30, 40,
},
expectedLen: 5,
expectedLen: 9,
},
}
......@@ -1510,7 +1514,10 @@ func TestSerialize(t *testing.T) {
TypeCode: AtomicAggrAttr,
Next: &PathAttribute{
TypeCode: AggregatorAttr,
Value: uint16(200),
Value: types.Aggregator{
ASN: 200,
Address: strAddr("10.20.30.40"),
},
},
},
},
......@@ -1529,7 +1536,7 @@ func TestSerialize(t *testing.T) {
},
expected: []byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0, 86, // Length
0, 90, // Length
2, // Msg Type
// Withdraws
......@@ -1537,7 +1544,7 @@ func TestSerialize(t *testing.T) {
8, 10, // Withdraw 10/8
16, 192, 168, // Withdraw 192.168/16
0, 50, // Total Path Attribute Length
0, 54, // Total Path Attribute Length
// ORIGIN
64, // Attr. Flags
......@@ -1576,8 +1583,9 @@ func TestSerialize(t *testing.T) {
// Aggregator
192, // Attr. Flags
7, // Attr. Type Code
2, // Length
6, // Length
0, 200, // Aggregator ASN = 200
10, 20, 30, 40, // Aggregator Address
// NLRI
24, 8, 8, 8, // 8.8.8.0/24
......@@ -1715,7 +1723,10 @@ func TestSerializeAddPath(t *testing.T) {
TypeCode: AtomicAggrAttr,
Next: &PathAttribute{
TypeCode: AggregatorAttr,
Value: uint16(200),
Value: types.Aggregator{
ASN: 200,
Address: strAddr("10.20.30.40"),
},
},
},
},
......@@ -1734,7 +1745,7 @@ func TestSerializeAddPath(t *testing.T) {
},
expected: []byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0, 102, // Length
0, 106, // Length
2, // Msg Type
// Withdraws
......@@ -1744,7 +1755,7 @@ func TestSerializeAddPath(t *testing.T) {
0, 0, 0, 0, // Path Identifier
16, 192, 168, // Withdraw 192.168/16
0, 50, // Total Path Attribute Length
0, 54, // Total Path Attribute Length
// ORIGIN
64, // Attr. Flags
......@@ -1783,8 +1794,9 @@ func TestSerializeAddPath(t *testing.T) {
// Aggregator
192, // Attr. Flags
7, // Attr. Type Code
2, // Length
6, // Length
0, 200, // Aggregator ASN = 200
10, 20, 30, 40, // Aggregator Address
// NLRI
0, 0, 0, 0, // Path Identifier
......
......@@ -245,7 +245,8 @@ func (s *establishedState) processAttributes(attrs *packet.PathAttribute, path *
path.BGPPath.ASPath = pa.Value.(types.ASPath)
path.BGPPath.ASPathLen = path.BGPPath.ASPath.Length()
case packet.AggregatorAttr:
path.BGPPath.Aggregator = pa.Value.(types.Aggregator)
aggr := pa.Value.(types.Aggregator)
path.BGPPath.Aggregator = &aggr
case packet.AtomicAggrAttr:
path.BGPPath.AtomicAggregate = true
case packet.CommunitiesAttr:
......
......@@ -20,7 +20,7 @@ type BGPPath struct {
MED uint32
EBGP bool
AtomicAggregate bool
Aggregator types.Aggregator
Aggregator *types.Aggregator
BGPIdentifier uint32
Source uint32
Communities []uint32
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment