summaryrefslogtreecommitdiffhomepage
path: root/packet
diff options
context:
space:
mode:
authorSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2017-08-03 10:44:27 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-09-29 15:05:43 +0900
commitf70827b68c190e3793ace65f116fef8c7c36e752 (patch)
tree52b1132afb0bbb4336e92b1d20eaa08150030e2e /packet
parente2e8a840e67868cc3070530fe5e1a0dc3edf73f1 (diff)
server: Revised Error Handling (RFC7606)
This patch enables GoBGP to keep the session established even if the received BGPUpdate message contains some errors, and to handle these errors according to what defined in RFC7606. This feature is enabled when 'treat-as-withdraw' in 'neighbors.error-handling.config' is specified to true in the GoBGP config file. Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
Diffstat (limited to 'packet')
-rw-r--r--packet/bgp/bgp.go25
1 files changed, 25 insertions, 0 deletions
diff --git a/packet/bgp/bgp.go b/packet/bgp/bgp.go
index 7e60b96e..fb9e2a1c 100644
--- a/packet/bgp/bgp.go
+++ b/packet/bgp/bgp.go
@@ -7982,6 +7982,31 @@ func (msg *BGPUpdate) IsEndOfRib() (bool, RouteFamily) {
return false, RouteFamily(0)
}
+func TreatAsWithdraw(msg *BGPUpdate) *BGPUpdate {
+ withdraw := &BGPUpdate{
+ WithdrawnRoutesLen: 0,
+ WithdrawnRoutes: []*IPAddrPrefix{},
+ TotalPathAttributeLen: 0,
+ PathAttributes: make([]PathAttributeInterface, 0, len(msg.PathAttributes)),
+ NLRI: []*IPAddrPrefix{},
+ }
+ withdraw.WithdrawnRoutes = append(msg.WithdrawnRoutes, msg.NLRI...)
+ var unreach []AddrPrefixInterface
+
+ for _, p := range msg.PathAttributes {
+ switch nlri := p.(type) {
+ case *PathAttributeMpReachNLRI:
+ unreach = append(unreach, nlri.Value...)
+ case *PathAttributeMpUnreachNLRI:
+ unreach = append(unreach, nlri.Value...)
+ }
+ }
+ if len(unreach) != 0 {
+ withdraw.PathAttributes = append(withdraw.PathAttributes, NewPathAttributeMpUnreachNLRI(unreach))
+ }
+ return withdraw
+}
+
func NewBGPUpdateMessage(withdrawnRoutes []*IPAddrPrefix, pathattrs []PathAttributeInterface, nlri []*IPAddrPrefix) *BGPMessage {
return &BGPMessage{
Header: BGPHeader{Type: BGP_MSG_UPDATE},