func (s *Server) AddNeighbor(ctx context.Context, arg *AddNeighborRequest) (*AddNeighborResponse, error) { c, err := func(a *Peer) (*config.Neighbor, error) { pconf := &config.Neighbor{} if a.Conf != nil { pconf.Config.NeighborAddress = a.Conf.NeighborAddress pconf.Config.PeerAs = a.Conf.PeerAs pconf.Config.LocalAs = a.Conf.LocalAs pconf.Config.AuthPassword = a.Conf.AuthPassword pconf.Config.RemovePrivateAs = config.RemovePrivateAsOption(a.Conf.RemovePrivateAs) pconf.Config.RouteFlapDamping = a.Conf.RouteFlapDamping pconf.Config.SendCommunity = config.CommunityType(a.Conf.SendCommunity) pconf.Config.Description = a.Conf.Description pconf.Config.PeerGroup = a.Conf.PeerGroup pconf.Config.NeighborAddress = a.Conf.NeighborAddress pconf.Config.NeighborInterface = a.Conf.NeighborInterface } if a.Timers != nil && a.Timers.Config != nil { pconf.Timers.Config.ConnectRetry = float64(a.Timers.Config.ConnectRetry) pconf.Timers.Config.HoldTime = float64(a.Timers.Config.HoldTime) pconf.Timers.Config.KeepaliveInterval = float64(a.Timers.Config.KeepaliveInterval) pconf.Timers.Config.MinimumAdvertisementInterval = float64(a.Timers.Config.MinimumAdvertisementInterval) } if a.RouteReflector != nil { pconf.RouteReflector.Config.RouteReflectorClusterId = config.RrClusterIdType(a.RouteReflector.RouteReflectorClusterId) pconf.RouteReflector.Config.RouteReflectorClient = a.RouteReflector.RouteReflectorClient } if a.RouteServer != nil { pconf.RouteServer.Config.RouteServerClient = a.RouteServer.RouteServerClient } if a.ApplyPolicy != nil { if a.ApplyPolicy.ImportPolicy != nil { pconf.ApplyPolicy.Config.DefaultImportPolicy = config.DefaultPolicyType(a.ApplyPolicy.ImportPolicy.Default) for _, p := range a.ApplyPolicy.ImportPolicy.Policies { pconf.ApplyPolicy.Config.ImportPolicyList = append(pconf.ApplyPolicy.Config.ImportPolicyList, p.Name) } } if a.ApplyPolicy.ExportPolicy != nil { pconf.ApplyPolicy.Config.DefaultExportPolicy = config.DefaultPolicyType(a.ApplyPolicy.ExportPolicy.Default) for _, p := range a.ApplyPolicy.ExportPolicy.Policies { pconf.ApplyPolicy.Config.ExportPolicyList = append(pconf.ApplyPolicy.Config.ExportPolicyList, p.Name) } } if a.ApplyPolicy.InPolicy != nil { pconf.ApplyPolicy.Config.DefaultInPolicy = config.DefaultPolicyType(a.ApplyPolicy.InPolicy.Default) for _, p := range a.ApplyPolicy.InPolicy.Policies { pconf.ApplyPolicy.Config.InPolicyList = append(pconf.ApplyPolicy.Config.InPolicyList, p.Name) } } } if a.Families != nil { for _, family := range a.Families { name, ok := bgp.AddressFamilyNameMap[bgp.RouteFamily(family)] if !ok { return pconf, fmt.Errorf("invalid address family: %d", family) } cAfiSafi := config.AfiSafi{ Config: config.AfiSafiConfig{ AfiSafiName: config.AfiSafiType(name), }, } pconf.AfiSafis = append(pconf.AfiSafis, cAfiSafi) } } if a.Transport != nil { pconf.Transport.Config.LocalAddress = a.Transport.LocalAddress pconf.Transport.Config.PassiveMode = a.Transport.PassiveMode } if a.EbgpMultihop != nil { pconf.EbgpMultihop.Config.Enabled = a.EbgpMultihop.Enabled pconf.EbgpMultihop.Config.MultihopTtl = uint8(a.EbgpMultihop.MultihopTtl) } return pconf, nil }(arg.Peer) if err != nil { return nil, err } return &AddNeighborResponse{}, s.bgpServer.AddNeighbor(c) }
func modNeighbor(cmdType string, args []string) error { m := extractReserved(args, []string{"interface", "as", "vrf", "route-reflector-client", "route-server-client"}) usage := fmt.Sprintf("usage: gobgp neighbor %s [<neighbor-address>| interface <neighbor-interface>]", cmdType) if cmdType == CMD_ADD { usage += " as <VALUE> [ vrf <vrf-name> | route-reflector-client [<cluster-id>] | route-server-client ]" } if (len(m[""]) != 1 && len(m["interface"]) != 1) || len(m["as"]) > 1 || len(m["vrf"]) > 1 || len(m["route-reflector-client"]) > 1 { return fmt.Errorf("%s", usage) } unnumbered := len(m["interface"]) > 0 if !unnumbered { if _, err := net.ResolveIPAddr("ip", m[""][0]); err != nil { return err } } getConf := func(asn int) *config.Neighbor { peer := &config.Neighbor{ Config: config.NeighborConfig{ PeerAs: uint32(asn), }, } if unnumbered { peer.Config.NeighborInterface = m["interface"][0] } else { peer.Config.NeighborAddress = m[""][0] } if len(m["vrf"]) == 1 { peer.Config.Vrf = m["vrf"][0] } if rr, ok := m["route-reflector-client"]; ok { peer.RouteReflector.Config = config.RouteReflectorConfig{ RouteReflectorClient: true, } if len(rr) == 1 { peer.RouteReflector.Config.RouteReflectorClusterId = config.RrClusterIdType(rr[0]) } } if _, ok := m["route-server-client"]; ok { peer.RouteServer.Config = config.RouteServerConfig{ RouteServerClient: true, } } return peer } var err error switch cmdType { case CMD_ADD: if len(m["as"]) != 1 { return fmt.Errorf("%s", usage) } var as int as, err = strconv.Atoi(m["as"][0]) if err != nil { return err } err = client.AddNeighbor(getConf(as)) case CMD_DEL: err = client.DeleteNeighbor(getConf(0)) } return err }