Skip to content
Snippets Groups Projects
Commit 176dff42 authored by Oliver Herms's avatar Oliver Herms Committed by Daniel Czerwonk
Browse files

Fixing AGGREGATOR and ATOMIC_AGGREGATE

parent d7f18db7
No related branches found
No related tags found
No related merge requests found
......@@ -140,8 +140,3 @@ type PathAttribute struct {
Value interface{}
Next *PathAttribute
}
type Aggretator struct {
Addr uint32
ASN uint16
}
......@@ -1197,9 +1197,9 @@ func TestDecodeUpdateMsg(t *testing.T) {
ExtendedLength: false,
Length: 6,
TypeCode: 7,
Value: Aggretator{
ASN: uint16(258),
Addr: strAddr("10.11.12.13"),
Value: types.Aggregator{
ASN: uint16(258),
Address: strAddr("10.11.12.13"),
},
},
},
......
......@@ -232,7 +232,7 @@ func (pa *PathAttribute) decodeLocalPref(buf *bytes.Buffer) error {
}
func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
aggr := Aggretator{}
aggr := types.Aggregator{}
p := uint16(0)
err := decode(buf, []interface{}{&aggr.ASN})
......@@ -249,7 +249,7 @@ func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
if n != 4 {
return fmt.Errorf("Unable to read next hop: buf.Read read %d bytes", n)
}
aggr.Addr = fourBytesToUint32(addr)
aggr.Address = fourBytesToUint32(addr)
pa.Value = aggr
p += 4
......@@ -630,33 +630,39 @@ func (pa *PathAttribute) AddOptionalPathAttributes(p *route.Path) *PathAttribute
}
// PathAttributes converts a path object into a linked list of path attributes
func PathAttributes(p *route.Path) (*PathAttribute, error) {
func PathAttributes(p *route.Path, iBGP bool) (*PathAttribute, error) {
asPath := &PathAttribute{
TypeCode: ASPathAttr,
Value: p.BGPPath.ASPath,
}
last := asPath
origin := &PathAttribute{
TypeCode: OriginAttr,
Value: p.BGPPath.Origin,
}
asPath.Next = origin
last.Next = origin
last = origin
nextHop := &PathAttribute{
TypeCode: NextHopAttr,
Value: p.BGPPath.NextHop,
}
origin.Next = nextHop
last.Next = nextHop
last = nextHop
localPref := &PathAttribute{
TypeCode: LocalPrefAttr,
Value: p.BGPPath.LocalPref,
if iBGP {
localPref := &PathAttribute{
TypeCode: LocalPrefAttr,
Value: p.BGPPath.LocalPref,
}
last.Next = localPref
last = localPref
}
nextHop.Next = localPref
optionals := localPref.AddOptionalPathAttributes(p)
optionals := last.AddOptionalPathAttributes(p)
last := optionals
last = optionals
for _, unknownAttr := range p.BGPPath.UnknownAttributes {
last.Next = &PathAttribute{
TypeCode: unknownAttr.TypeCode,
......
......@@ -564,9 +564,9 @@ func TestDecodeAggregator(t *testing.T) {
wantFail: false,
expected: &PathAttribute{
Length: 6,
Value: Aggretator{
ASN: 222,
Addr: strAddr("10.20.30.40"),
Value: types.Aggregator{
ASN: 222,
Address: strAddr("10.20.30.40"),
},
},
},
......
......@@ -244,6 +244,10 @@ func (s *establishedState) processAttributes(attrs *packet.PathAttribute, path *
case packet.ASPathAttr:
path.BGPPath.ASPath = pa.Value.(types.ASPath)
path.BGPPath.ASPathLen = path.BGPPath.ASPath.Length()
case packet.AggregatorAttr:
path.BGPPath.Aggregator = pa.Value.(types.Aggregator)
case packet.AtomicAggrAttr:
path.BGPPath.AtomicAggregate = true
case packet.CommunitiesAttr:
path.BGPPath.Communities = pa.Value.([]uint32)
case packet.LargeCommunitiesAttr:
......
......@@ -86,7 +86,7 @@ func (u *UpdateSender) sender(aggrTime time.Duration) {
for key, pathNLRIs := range u.toSend {
budget = packet.MaxLen - packet.HeaderLen - packet.MinUpdateLen - int(pathNLRIs.path.BGPPath.Length())
pathAttrs, err = packet.PathAttributes(pathNLRIs.path)
pathAttrs, err = packet.PathAttributes(pathNLRIs.path, u.iBGP)
if err != nil {
log.Errorf("Unable to get path attributes: %v", err)
continue
......
......@@ -20,6 +20,8 @@ type BGPPath struct {
Origin uint8
MED uint32
EBGP bool
AtomicAggregate bool
Aggregator types.Aggregator
BGPIdentifier uint32
Source bnet.IP
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