46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"github.com/nspcc-dev/neofs-proto/internal"
|
||
|
"google.golang.org/grpc/codes"
|
||
|
"google.golang.org/grpc/status"
|
||
|
)
|
||
|
|
||
|
// TTLRequest to verify and update ttl requests.
|
||
|
type TTLRequest interface {
|
||
|
GetTTL() uint32
|
||
|
SetTTL(uint32)
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
// ZeroTTL is empty ttl, should produce ErrZeroTTL.
|
||
|
ZeroTTL = iota
|
||
|
|
||
|
// NonForwardingTTL is a ttl that allows direct connections only.
|
||
|
NonForwardingTTL
|
||
|
|
||
|
// SingleForwardingTTL is a ttl that allows connections through another node.
|
||
|
SingleForwardingTTL
|
||
|
|
||
|
// ErrZeroTTL is raised when zero ttl is passed.
|
||
|
ErrZeroTTL = internal.Error("zero ttl")
|
||
|
|
||
|
// ErrIncorrectTTL is raised when NonForwardingTTL is passed and NodeRole != InnerRingNode.
|
||
|
ErrIncorrectTTL = internal.Error("incorrect ttl")
|
||
|
)
|
||
|
|
||
|
// CheckTTLRequest validates and update ttl requests.
|
||
|
func CheckTTLRequest(req TTLRequest, role NodeRole) error {
|
||
|
var ttl = req.GetTTL()
|
||
|
|
||
|
if ttl == ZeroTTL {
|
||
|
return status.New(codes.InvalidArgument, ErrZeroTTL.Error()).Err()
|
||
|
} else if ttl == NonForwardingTTL && role != InnerRingNode {
|
||
|
return status.New(codes.InvalidArgument, ErrIncorrectTTL.Error()).Err()
|
||
|
}
|
||
|
|
||
|
req.SetTTL(ttl - 1)
|
||
|
|
||
|
return nil
|
||
|
}
|