summaryrefslogtreecommitdiffhomepage
path: root/config/default.go
diff options
context:
space:
mode:
Diffstat (limited to 'config/default.go')
-rw-r--r--config/default.go76
1 files changed, 75 insertions, 1 deletions
diff --git a/config/default.go b/config/default.go
index 5c472909..f5bf809e 100644
--- a/config/default.go
+++ b/config/default.go
@@ -2,13 +2,15 @@ package config
import (
"fmt"
+ "math"
"net"
"reflect"
+ "github.com/spf13/viper"
+
"github.com/osrg/gobgp/packet/bgp"
"github.com/osrg/gobgp/packet/bmp"
"github.com/osrg/gobgp/packet/rtr"
- "github.com/spf13/viper"
)
const (
@@ -265,6 +267,43 @@ func SetDefaultGlobalConfigValues(g *Global) error {
return nil
}
+func setDefaultVrfConfigValues(v *Vrf) error {
+ if v == nil {
+ return fmt.Errorf("cannot set default values for nil vrf config")
+ }
+
+ if v.Config.Name == "" {
+ return fmt.Errorf("specify vrf name")
+ }
+
+ _, err := bgp.ParseRouteDistinguisher(v.Config.Rd)
+ if err != nil {
+ return fmt.Errorf("invalid rd for vrf %s: %s", v.Config.Name, v.Config.Rd)
+ }
+
+ if len(v.Config.ImportRtList) == 0 {
+ v.Config.ImportRtList = v.Config.BothRtList
+ }
+ for _, rtString := range v.Config.ImportRtList {
+ _, err := bgp.ParseRouteTarget(rtString)
+ if err != nil {
+ return fmt.Errorf("invalid import rt for vrf %s: %s", v.Config.Name, rtString)
+ }
+ }
+
+ if len(v.Config.ExportRtList) == 0 {
+ v.Config.ExportRtList = v.Config.BothRtList
+ }
+ for _, rtString := range v.Config.ExportRtList {
+ _, err := bgp.ParseRouteTarget(rtString)
+ if err != nil {
+ return fmt.Errorf("invalid export rt for vrf %s: %s", v.Config.Name, rtString)
+ }
+ }
+
+ return nil
+}
+
func SetDefaultConfigValues(b *BgpConfigSet) error {
return setDefaultConfigValuesWithViper(nil, b)
}
@@ -309,6 +348,41 @@ func setDefaultConfigValuesWithViper(v *viper.Viper, b *BgpConfigSet) error {
b.BmpServers[idx] = server
}
+ vrfNames := make(map[string]struct{})
+ vrfIDs := make(map[uint32]struct{})
+ for idx, vrf := range b.Vrfs {
+ if err := setDefaultVrfConfigValues(&vrf); err != nil {
+ return err
+ }
+
+ if _, ok := vrfNames[vrf.Config.Name]; ok {
+ return fmt.Errorf("duplicated vrf name: %s", vrf.Config.Name)
+ }
+ vrfNames[vrf.Config.Name] = struct{}{}
+
+ if vrf.Config.Id != 0 {
+ if _, ok := vrfIDs[vrf.Config.Id]; ok {
+ return fmt.Errorf("duplicated vrf id: %d", vrf.Config.Id)
+ }
+ vrfIDs[vrf.Config.Id] = struct{}{}
+ }
+
+ b.Vrfs[idx] = vrf
+ }
+ // Auto assign VRF identifier
+ for idx, vrf := range b.Vrfs {
+ if vrf.Config.Id == 0 {
+ for id := uint32(1); id < math.MaxUint32; id++ {
+ if _, ok := vrfIDs[id]; !ok {
+ vrf.Config.Id = id
+ vrfIDs[id] = struct{}{}
+ break
+ }
+ }
+ }
+ b.Vrfs[idx] = vrf
+ }
+
if b.Zebra.Config.Url == "" {
b.Zebra.Config.Url = "unix:/var/run/quagga/zserv.api"
}