From 21e90498549fedb59dfe288e866e020bb30e58a3 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Wed, 2 Sep 2015 21:42:59 +0900 Subject: server: fix gobgp hang gobgp asks for non existing thing (e.g. local rib for non route server peer), gobgpd doesn't send anything so gobgp will hang up. This fixes gobgpd to send an empty response. Signed-off-by: FUJITA Tomonori --- server/rpki.go | 4 ++-- server/server.go | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) (limited to 'server') diff --git a/server/rpki.go b/server/rpki.go index dc8a94cc..ec7c9afe 100644 --- a/server/rpki.go +++ b/server/rpki.go @@ -137,8 +137,8 @@ func (c *roaClient) handleGRPC(grpcReq *GrpcRequest) { break } + results := make([]*GrpcResponse, 0) if tree, ok := c.roas[grpcReq.RouteFamily]; ok { - results := make([]*GrpcResponse, 0) tree.Walk(func(s string, v interface{}) bool { r, _ := v.(*roa) result := &GrpcResponse{} @@ -146,8 +146,8 @@ func (c *roaClient) handleGRPC(grpcReq *GrpcRequest) { results = append(results, result) return false }) - go sendMultipleResponses(grpcReq, results) } + go sendMultipleResponses(grpcReq, results) } } diff --git a/server/server.go b/server/server.go index 971cc517..458703fe 100644 --- a/server/server.go +++ b/server/server.go @@ -1186,8 +1186,9 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { switch grpcReq.RequestType { case REQ_GLOBAL_RIB: + var results []*GrpcResponse if t, ok := server.localRibMap[GLOBAL_RIB_NAME].rib.Tables[grpcReq.RouteFamily]; ok { - results := make([]*GrpcResponse, len(t.GetDestinations())) + results = make([]*GrpcResponse, len(t.GetDestinations())) switch grpcReq.RouteFamily { case bgp.RF_IPv4_UC, bgp.RF_IPv6_UC: results = sortedDsts(server.localRibMap[GLOBAL_RIB_NAME].rib.Tables[grpcReq.RouteFamily]) @@ -1200,8 +1201,8 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { i++ } } - go sendMultipleResponses(grpcReq, results) } + go sendMultipleResponses(grpcReq, results) case REQ_MOD_PATH: pathList := server.handleModPathRequest(grpcReq) @@ -1239,10 +1240,11 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { if err != nil { break } + var results []*GrpcResponse if peer.isRouteServerClient() && peer.fsm.adminState != ADMIN_STATE_DOWN { remoteAddr := grpcReq.Name if t, ok := server.localRibMap[remoteAddr].rib.Tables[grpcReq.RouteFamily]; ok { - results := make([]*GrpcResponse, len(t.GetDestinations())) + results = make([]*GrpcResponse, len(t.GetDestinations())) switch grpcReq.RouteFamily { case bgp.RF_IPv4_UC, bgp.RF_IPv6_UC: results = sortedDsts(server.localRibMap[remoteAddr].rib.Tables[grpcReq.RouteFamily]) @@ -1255,9 +1257,9 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg { i++ } } - go sendMultipleResponses(grpcReq, results) } } + go sendMultipleResponses(grpcReq, results) case REQ_ADJ_RIB_IN, REQ_ADJ_RIB_OUT: peer, err := server.checkNeighborRequest(grpcReq) -- cgit v1.2.3