From 5ab48261d4a4c2b3c4a01f7fde9c4a3aa6d1d753 Mon Sep 17 00:00:00 2001 From: Motok1 Date: Sat, 8 Jun 2024 15:08:09 +0000 Subject: [PATCH] Unsynchronized sessions can delete --- pkg/server/grpc_server.go | 15 +++++++++------ pkg/server/server.go | 10 +++++++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/pkg/server/grpc_server.go b/pkg/server/grpc_server.go index 786e090..16ac922 100644 --- a/pkg/server/grpc_server.go +++ b/pkg/server/grpc_server.go @@ -156,7 +156,7 @@ func (s *APIServer) createSRPolicy(_ context.Context, input *pb.CreateSRPolicyIn s.logger.Info("Received CreateSRPolicy API request") s.logger.Debug("Received paramater", zap.String("input", string(inputJson))) - pcepSession, err := getPcepSession(s.pce, inputSRPolicy.GetPcepSessionAddr()) + pcepSession, err := getSyncedPcepSession(s.pce, inputSRPolicy.GetPcepSessionAddr()) if err != nil { return &pb.RequestStatus{IsSuccess: false}, err } @@ -216,7 +216,7 @@ func (s *APIServer) DeleteSRPolicy(ctx context.Context, input *pb.DeleteSRPolicy s.logger.Info("Received DeleteSRPolicy API request") s.logger.Debug("Received paramater", zap.String("input", string(inputJson))) - pcepSession, err := getPcepSession(s.pce, inputSRPolicy.GetPcepSessionAddr()) + pcepSession, err := getSyncedPcepSession(s.pce, inputSRPolicy.GetPcepSessionAddr()) if err != nil { return &pb.RequestStatus{IsSuccess: false}, err } @@ -284,11 +284,11 @@ var validator = map[ValidationKind]func(policy *pb.SRPolicy, asn uint32) bool{ }, } -func getPcepSession(pce *Server, addr []byte) (*Session, error) { +func getSyncedPcepSession(pce *Server, addr []byte) (*Session, error) { pcepSessionAddr, _ := netip.AddrFromSlice(addr) - pcepSession := pce.SearchSession(pcepSessionAddr) + pcepSession := pce.SearchSession(pcepSessionAddr, true) if pcepSession == nil { - return nil, fmt.Errorf("no session with %s", pcepSessionAddr) + return nil, fmt.Errorf("no synced session with %s", pcepSessionAddr) } return pcepSession, nil } @@ -477,7 +477,10 @@ func (c *APIServer) DeleteSession(ctx context.Context, input *pb.Session) (*pb.R ssAddr, _ := netip.AddrFromSlice(input.GetAddr()) s := c.pce - ss := s.SearchSession(ssAddr) + var ss *Session + if ss = s.SearchSession(ssAddr, false); ss == nil { + return nil, fmt.Errorf("no session with %s", ssAddr) + } if err := ss.SendClose(pcep.R_NO_EXPLANATION_PROVIDED); err != nil { return &pb.RequestStatus{IsSuccess: false}, err } diff --git a/pkg/server/server.go b/pkg/server/server.go index 1959ec2..6a0a486 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -133,10 +133,14 @@ func (s *Server) closeSession(session *Session) { } } -func (s *Server) SearchSession(peerAddr netip.Addr) *Session { +// SearchSession returns a struct pointer of (Synced) session. +// if not exist, return nil +func (s *Server) SearchSession(peerAddr netip.Addr, onlySynced bool) *Session { for _, pcepSession := range s.sessionList { - if pcepSession.peerAddr == peerAddr && pcepSession.isSynced { - return pcepSession + if pcepSession.peerAddr == peerAddr { + if !(onlySynced) || pcepSession.isSynced { + return pcepSession + } } } return nil