|
@@ -84,6 +84,8 @@ func (m *Manager) initDefaults() {
|
|
|
RedistributeConnected: false,
|
|
RedistributeConnected: false,
|
|
|
RedistributeStatic: true,
|
|
RedistributeStatic: true,
|
|
|
RedistributeBGP: false,
|
|
RedistributeBGP: false,
|
|
|
|
|
+ RedistributeDefault: false,
|
|
|
|
|
+ OriginateDefault: "never",
|
|
|
DefaultMetric: 10,
|
|
DefaultMetric: 10,
|
|
|
},
|
|
},
|
|
|
OSPFAreas: []OSPFArea{
|
|
OSPFAreas: []OSPFArea{
|
|
@@ -267,6 +269,7 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
sb.WriteString(" metric 0;\n")
|
|
sb.WriteString(" metric 0;\n")
|
|
|
sb.WriteString(" ipv4 {\n")
|
|
sb.WriteString(" ipv4 {\n")
|
|
|
sb.WriteString(" export filter {\n")
|
|
sb.WriteString(" export filter {\n")
|
|
|
|
|
+ sb.WriteString(" if proto ~ \"ospf_def_*\" then reject;\n")
|
|
|
sb.WriteString(" if source = RTS_DEVICE then reject;\n")
|
|
sb.WriteString(" if source = RTS_DEVICE then reject;\n")
|
|
|
sb.WriteString(" if source = RTS_BGP then {\n")
|
|
sb.WriteString(" if source = RTS_BGP then {\n")
|
|
|
sb.WriteString(" if bgp_path.first = bgp_path.last && bgp_path.len = 0 then\n")
|
|
sb.WriteString(" if bgp_path.first = bgp_path.last && bgp_path.len = 0 then\n")
|
|
@@ -555,6 +558,8 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
RedistributeConnected: legacy.RedistributeConnected,
|
|
RedistributeConnected: legacy.RedistributeConnected,
|
|
|
RedistributeStatic: legacy.RedistributeStatic,
|
|
RedistributeStatic: legacy.RedistributeStatic,
|
|
|
RedistributeBGP: legacy.RedistributeBGP,
|
|
RedistributeBGP: legacy.RedistributeBGP,
|
|
|
|
|
+ RedistributeDefault: legacy.RedistributeDefault,
|
|
|
|
|
+ OriginateDefault: legacy.OriginateDefault,
|
|
|
DefaultMetric: legacy.DefaultMetric,
|
|
DefaultMetric: legacy.DefaultMetric,
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
@@ -571,6 +576,30 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
instProtoName := sanitizeIdentifier("ospf", inst.Name)
|
|
instProtoName := sanitizeIdentifier("ospf", inst.Name)
|
|
|
|
|
+
|
|
|
|
|
+ // Determine Originate Default mode
|
|
|
|
|
+ origDefault := strings.ToLower(strings.TrimSpace(inst.OriginateDefault))
|
|
|
|
|
+ if inst.RedistributeDefault && (origDefault == "" || origDefault == "never") {
|
|
|
|
|
+ origDefault = "if-installed"
|
|
|
|
|
+ }
|
|
|
|
|
+ if origDefault == "" {
|
|
|
|
|
+ origDefault = "never"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ defaultMetric := inst.DefaultMetric
|
|
|
|
|
+ if defaultMetric <= 0 {
|
|
|
|
|
+ defaultMetric = 10
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ defProtoName := ""
|
|
|
|
|
+ if origDefault == "always" {
|
|
|
|
|
+ defProtoName = fmt.Sprintf("ospf_def_%s", instProtoName)
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf("protocol static %s {\n", defProtoName))
|
|
|
|
|
+ sb.WriteString(" ipv4;\n")
|
|
|
|
|
+ sb.WriteString(" route 0.0.0.0/0 unreachable;\n")
|
|
|
|
|
+ sb.WriteString("}\n\n")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
sb.WriteString(fmt.Sprintf("protocol ospf v%d %s {\n", inst.Version, instProtoName))
|
|
sb.WriteString(fmt.Sprintf("protocol ospf v%d %s {\n", inst.Version, instProtoName))
|
|
|
if inst.VRF != "" && inst.VRF != "main" && inst.VRF != "default" {
|
|
if inst.VRF != "" && inst.VRF != "main" && inst.VRF != "default" {
|
|
|
sb.WriteString(fmt.Sprintf(" vrf %s;\n", inst.VRF))
|
|
sb.WriteString(fmt.Sprintf(" vrf %s;\n", inst.VRF))
|
|
@@ -593,12 +622,33 @@ func (m *Manager) generateBirdConfig() string {
|
|
|
ospfExports = append(ospfExports, "RTS_BGP")
|
|
ospfExports = append(ospfExports, "RTS_BGP")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if len(ospfExports) > 0 {
|
|
|
|
|
- if inst.DefaultMetric > 0 {
|
|
|
|
|
- sb.WriteString(fmt.Sprintf(" export filter {\n if source ~ [ %s ] then {\n ospf_metric1 = %d;\n accept;\n }\n reject;\n };\n", strings.Join(ospfExports, ", "), inst.DefaultMetric))
|
|
|
|
|
|
|
+ hasDefaultOrig := origDefault == "always" || origDefault == "if-installed"
|
|
|
|
|
+ if len(ospfExports) > 0 || hasDefaultOrig {
|
|
|
|
|
+ sb.WriteString(" export filter {\n")
|
|
|
|
|
+ if origDefault == "always" {
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf(" if proto = \"%s\" || (net = 0.0.0.0/0 && source != RTS_OSPF) then {\n", defProtoName))
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf(" ospf_metric1 = %d;\n", defaultMetric))
|
|
|
|
|
+ sb.WriteString(" accept;\n")
|
|
|
|
|
+ sb.WriteString(" }\n")
|
|
|
|
|
+ } else if origDefault == "if-installed" {
|
|
|
|
|
+ sb.WriteString(" if net = 0.0.0.0/0 && source != RTS_OSPF then {\n")
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf(" ospf_metric1 = %d;\n", defaultMetric))
|
|
|
|
|
+ sb.WriteString(" accept;\n")
|
|
|
|
|
+ sb.WriteString(" }\n")
|
|
|
} else {
|
|
} else {
|
|
|
- sb.WriteString(fmt.Sprintf(" export where source ~ [ %s ];\n", strings.Join(ospfExports, ", ")))
|
|
|
|
|
|
|
+ sb.WriteString(" if net = 0.0.0.0/0 then reject;\n")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if len(ospfExports) > 0 {
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf(" if source ~ [ %s ] then {\n", strings.Join(ospfExports, ", ")))
|
|
|
|
|
+ if inst.DefaultMetric > 0 {
|
|
|
|
|
+ sb.WriteString(fmt.Sprintf(" ospf_metric1 = %d;\n", inst.DefaultMetric))
|
|
|
|
|
+ }
|
|
|
|
|
+ sb.WriteString(" accept;\n")
|
|
|
|
|
+ sb.WriteString(" }\n")
|
|
|
}
|
|
}
|
|
|
|
|
+ sb.WriteString(" reject;\n")
|
|
|
|
|
+ sb.WriteString(" };\n")
|
|
|
} else {
|
|
} else {
|
|
|
sb.WriteString(" export none;\n")
|
|
sb.WriteString(" export none;\n")
|
|
|
}
|
|
}
|