func UpdatePathAggregator4ByteAs(msg *bgp.BGPUpdate) error { var aggAttr *bgp.PathAttributeAggregator var agg4Attr *bgp.PathAttributeAs4Aggregator agg4AttrPos := 0 for i, attr := range msg.PathAttributes { switch attr.(type) { case *bgp.PathAttributeAggregator: attr := attr.(*bgp.PathAttributeAggregator) if attr.Value.Askind == reflect.Uint16 { aggAttr = attr aggAttr.Value.Askind = reflect.Uint32 } case *bgp.PathAttributeAs4Aggregator: agg4Attr = attr.(*bgp.PathAttributeAs4Aggregator) agg4AttrPos = i } } if aggAttr == nil && agg4Attr == nil { return nil } if aggAttr == nil && agg4Attr != nil { return bgp.NewMessageError(bgp.BGP_ERROR_UPDATE_MESSAGE_ERROR, bgp.BGP_ERROR_SUB_MALFORMED_ATTRIBUTE_LIST, nil, "AS4 AGGREGATOR attribute exists, but AGGREGATOR doesn't") } if agg4Attr != nil { msg.PathAttributes = append(msg.PathAttributes[:agg4AttrPos], msg.PathAttributes[agg4AttrPos+1:]...) aggAttr.Value.AS = agg4Attr.Value.AS } return nil }
func (fsm *FSM) sendNotification(code, subType uint8, data []byte, msg string) error { e := bgp.NewMessageError(code, subType, data, msg) return fsm.sendNotificationFromErrorMsg(e.(*bgp.MessageError)) }