summaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-12-30 20:56:27 +0900
committerISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2016-01-09 22:52:15 +0900
commitd94bb930dc2778a39dd96050193743136a26fb0e (patch)
tree2eb3755fc82df74a28f433cf79b2ec2b7febd7d8 /server
parentaff1c244ad0d88a814f2ce573800717ccd08b450 (diff)
api: support bmp configuration
Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'server')
-rw-r--r--server/bmp.go16
-rw-r--r--server/grpc_server.go5
-rw-r--r--server/server.go31
3 files changed, 50 insertions, 2 deletions
diff --git a/server/bmp.go b/server/bmp.go
index 90928acd..3f845b27 100644
--- a/server/bmp.go
+++ b/server/bmp.go
@@ -224,8 +224,10 @@ func (w *bmpWatcher) loop() error {
case conn := <-w.endCh:
host := conn.RemoteAddr().String()
log.Debugf("bmp connection to %s killed", host)
- w.connMap[host].conn = nil
- go w.tryConnect(w.connMap[host])
+ if _, y := w.connMap[host]; y {
+ w.connMap[host].conn = nil
+ go w.tryConnect(w.connMap[host])
+ }
}
}
}
@@ -261,6 +263,16 @@ func (w *bmpWatcher) addServer(c config.BmpServerConfig) error {
return <-ch
}
+func (w *bmpWatcher) deleteServer(c config.BmpServerConfig) error {
+ ch := make(chan error)
+ w.ctlCh <- &bmpConfig{
+ config: c,
+ del: true,
+ errCh: ch,
+ }
+ return <-ch
+}
+
func (w *bmpWatcher) watchingEventTypes() []watcherEventType {
state := false
pre := false
diff --git a/server/grpc_server.go b/server/grpc_server.go
index 554c62a9..9afb9f8a 100644
--- a/server/grpc_server.go
+++ b/server/grpc_server.go
@@ -50,6 +50,7 @@ const (
REQ_MRT_GLOBAL_RIB
REQ_MRT_LOCAL_RIB
REQ_MOD_MRT
+ REQ_MOD_BMP
REQ_RPKI
REQ_MOD_RPKI
REQ_ROA
@@ -284,6 +285,10 @@ func (s *Server) ModMrt(ctx context.Context, arg *api.ModMrtArguments) (*api.Err
return s.mod(REQ_MOD_MRT, arg)
}
+func (s *Server) ModBmp(ctx context.Context, arg *api.ModBmpArguments) (*api.Error, error) {
+ return s.mod(REQ_MOD_BMP, arg)
+}
+
func (s *Server) ModRPKI(ctx context.Context, arg *api.ModRpkiArguments) (*api.Error, error) {
return s.mod(REQ_MOD_RPKI, arg)
}
diff --git a/server/server.go b/server/server.go
index cd86da38..2deb9b0f 100644
--- a/server/server.go
+++ b/server/server.go
@@ -1975,6 +1975,8 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg {
server.handleMrt(grpcReq)
case REQ_MOD_MRT:
server.handleModMrt(grpcReq)
+ case REQ_MOD_BMP:
+ server.handleModBmp(grpcReq)
case REQ_MOD_RPKI:
server.handleModRpki(grpcReq)
case REQ_ROA, REQ_RPKI:
@@ -2532,6 +2534,35 @@ func (server *BgpServer) handleModMrt(grpcReq *GrpcRequest) {
}
}
+func (server *BgpServer) handleModBmp(grpcReq *GrpcRequest) {
+ arg := grpcReq.Data.(*api.ModBmpArguments)
+ w, y := server.watchers[WATCHER_BMP]
+ if !y {
+ if arg.Operation == api.Operation_ADD {
+ w, _ = newBmpWatcher(server.GrpcReqCh)
+ server.watchers[WATCHER_BMP] = w
+ } else if arg.Operation == api.Operation_DEL {
+ grpcDone(grpcReq, fmt.Errorf("not enabled yet"))
+ return
+ }
+ }
+ c := config.BmpServerConfig{
+ Address: arg.Address,
+ Port: arg.Port,
+ RouteMonitoringPolicy: config.BmpRouteMonitoringPolicyType(arg.Type),
+ }
+ switch arg.Operation {
+ case api.Operation_ADD:
+ err := w.(*bmpWatcher).addServer(c)
+ grpcDone(grpcReq, err)
+ case api.Operation_DEL:
+ err := w.(*bmpWatcher).deleteServer(c)
+ grpcDone(grpcReq, err)
+ default:
+ grpcDone(grpcReq, fmt.Errorf("unsupported operation: %s", arg.Operation))
+ }
+}
+
func (server *BgpServer) handleModRpki(grpcReq *GrpcRequest) {
arg := grpcReq.Data.(*api.ModRpkiArguments)