diff options
Diffstat (limited to 'api')
-rw-r--r-- | api/grpc_server.go | 22 | ||||
-rw-r--r-- | api/util.go | 27 |
2 files changed, 44 insertions, 5 deletions
diff --git a/api/grpc_server.go b/api/grpc_server.go index 3b8f2fe4..1d8cca6a 100644 --- a/api/grpc_server.go +++ b/api/grpc_server.go @@ -26,13 +26,14 @@ import ( "sync" "time" + log "github.com/sirupsen/logrus" + "golang.org/x/net/context" + "google.golang.org/grpc" + "github.com/osrg/gobgp/config" "github.com/osrg/gobgp/packet/bgp" "github.com/osrg/gobgp/server" "github.com/osrg/gobgp/table" - log "github.com/sirupsen/logrus" - "golang.org/x/net/context" - "google.golang.org/grpc" ) type Server struct { @@ -345,6 +346,18 @@ func (s *Server) GetNeighbor(ctx context.Context, arg *GetNeighborRequest) (*Get return &GetNeighborResponse{Peers: p}, nil } +func NewValidationFromTableStruct(v *table.Validation) *RPKIValidation { + if v == nil { + return &RPKIValidation{} + } + return &RPKIValidation{ + Reason: RPKIValidation_Reason(v.Reason.ToInt()), + Matched: NewRoaListFromTableStructList(v.Matched), + UnmatchedAs: NewRoaListFromTableStructList(v.UnmatchedAs), + UnmatchedLength: NewRoaListFromTableStructList(v.UnmatchedLength), + } +} + func ToPathApi(path *table.Path) *Path { nlri := path.GetNlri() n, _ := nlri.Serialize() @@ -362,7 +375,8 @@ func ToPathApi(path *table.Path) *Path { Pattrs: pattrs, Age: path.GetTimestamp().Unix(), IsWithdraw: path.IsWithdraw, - Validation: int32(path.Validation().ToInt()), + Validation: int32(path.ValidationStatus().ToInt()), + ValidationDetail: NewValidationFromTableStruct(path.Validation()), Filtered: path.Filtered("") == table.POLICY_DIRECTION_IN, Family: family, Stale: path.IsStale(), diff --git a/api/util.go b/api/util.go index dabb65b7..53d4f1df 100644 --- a/api/util.go +++ b/api/util.go @@ -121,7 +121,13 @@ func (p *Path) ToNativePath(option ...ToNativeOption) (*table.Path, error) { t := time.Unix(p.Age, 0) nlri.SetPathIdentifier(p.Identifier) path := table.NewPath(info, nlri, p.IsWithdraw, pattr, t, false) - path.SetValidation(config.IntToRpkiValidationResultTypeMap[int(p.Validation)]) + path.SetValidation(&table.Validation{ + Status: config.IntToRpkiValidationResultTypeMap[int(p.Validation)], + Reason: table.IntToRpkiValidationReasonTypeMap[int(p.ValidationDetail.Reason)], + Matched: NewROAListFromApiStructList(p.ValidationDetail.Matched), + UnmatchedAs: NewROAListFromApiStructList(p.ValidationDetail.UnmatchedAs), + UnmatchedLength: NewROAListFromApiStructList(p.ValidationDetail.UnmatchedLength), + }) path.MarkStale(p.Stale) path.SetUUID(p.Uuid) if p.Filtered { @@ -130,3 +136,22 @@ func (p *Path) ToNativePath(option ...ToNativeOption) (*table.Path, error) { path.IsNexthopInvalid = p.IsNexthopInvalid return path, nil } + +func NewROAListFromApiStructList(l []*Roa) []*table.ROA { + roas := make([]*table.ROA, 0, len(l)) + for _, r := range l { + ip := net.ParseIP(r.Prefix) + rf := func(prefix string) bgp.RouteFamily { + a, _, _ := net.ParseCIDR(prefix) + if a.To4() != nil { + return bgp.RF_IPv4_UC + } else { + return bgp.RF_IPv6_UC + } + }(r.Prefix) + afi, _ := bgp.RouteFamilyToAfiSafi(rf) + roa := table.NewROA(int(afi), []byte(ip), uint8(r.Prefixlen), uint8(r.Maxlen), r.As, net.JoinHostPort(r.Conf.Address, r.Conf.RemotePort)) + roas = append(roas, roa) + } + return roas +} |