summaryrefslogtreecommitdiffhomepage
path: root/api
diff options
context:
space:
mode:
authorSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2017-07-14 13:56:37 +0900
committerSatoshi Fujimoto <satoshi.fujimoto7@gmail.com>2017-07-19 09:44:20 +0900
commit1aa5bf7f210a3361913b5b9b48b922ff1229aab4 (patch)
treefd0b267889dade31591c59028b0cbc1845152247 /api
parent810ba2f791bb9d50b3e9a2777444211ea2e6351a (diff)
table: Include detailed information about RPKI in originInfo
Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
Diffstat (limited to 'api')
-rw-r--r--api/grpc_server.go22
-rw-r--r--api/util.go27
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
+}