func ApiStruct2Peer(p *gobgpapi.Peer) *Peer { localCaps := capabilities{} remoteCaps := capabilities{} for _, buf := range p.Conf.LocalCap { c, _ := bgp.DecodeCapability(buf) localCaps = append(localCaps, c) } for _, buf := range p.Conf.RemoteCap { c, _ := bgp.DecodeCapability(buf) remoteCaps = append(remoteCaps, c) } remoteIp, _ := net.ResolveIPAddr("ip", p.Conf.NeighborAddress) localIp, _ := net.ResolveIPAddr("ip", p.Conf.LocalAddress) conf := PeerConf{ RemoteIp: remoteIp.String(), Id: net.ParseIP(p.Conf.Id), RemoteAs: p.Conf.PeerAs, LocalAs: p.Conf.LocalAs, RemoteCap: remoteCaps, LocalCap: localCaps, PrefixLimits: p.Conf.PrefixLimits, LocalIp: localIp.String(), Interface: p.Conf.NeighborInterface, } return &Peer{ Conf: conf, Info: p.Info, Timers: p.Timers, RouteReflector: p.RouteReflector, RouteServer: p.RouteServer, } }
func ApiStruct2Peer(p *gobgpapi.Peer) *Peer { localCaps := capabilities{} remoteCaps := capabilities{} for _, buf := range p.Conf.LocalCap { c, _ := bgp.DecodeCapability(buf) localCaps = append(localCaps, c) } for _, buf := range p.Conf.RemoteCap { c, _ := bgp.DecodeCapability(buf) remoteCaps = append(remoteCaps, c) } conf := PeerConf{ RemoteIp: net.ParseIP(p.Conf.NeighborAddress), Id: net.ParseIP(p.Conf.Id), RemoteAs: p.Conf.PeerAs, LocalAs: p.Conf.LocalAs, RemoteCap: remoteCaps, LocalCap: localCaps, PrefixLimits: p.Conf.PrefixLimits, } return &Peer{ Conf: conf, Info: p.Info, Timers: p.Timers, } }
//export decode_capabilities func decode_capabilities(p *C.buf) *C.char { buf := []byte(C.GoStringN(p.value, p.len)) c, err := bgp.DecodeCapability(buf) if err != nil { return nil } j, _ := json.Marshal(c) return C.CString(string(j)) }
func (peer *Peer) ToConfig(getAdvertised bool) *config.Neighbor { // create copy which can be access to without mutex conf := *peer.fsm.pConf conf.AfiSafis = make([]config.AfiSafi, len(peer.fsm.pConf.AfiSafis)) for i := 0; i < len(peer.fsm.pConf.AfiSafis); i++ { conf.AfiSafis[i] = peer.fsm.pConf.AfiSafis[i] } remoteCap := make([]bgp.ParameterCapabilityInterface, 0, len(peer.fsm.capMap)) for _, c := range peer.fsm.capMap { for _, m := range c { // need to copy all values here buf, _ := m.Serialize() cap, _ := bgp.DecodeCapability(buf) remoteCap = append(remoteCap, cap) } } conf.State.RemoteCapabilityList = remoteCap conf.State.LocalCapabilityList = capabilitiesFromConfig(peer.fsm.pConf) conf.State.RemoteRouterId = peer.fsm.peerInfo.ID.To4().String() conf.State.SessionState = config.IntToSessionStateMap[int(peer.fsm.state)] conf.State.AdminState = config.IntToAdminStateMap[int(peer.fsm.adminState)] if peer.fsm.state == bgp.BGP_FSM_ESTABLISHED { rfList := peer.configuredRFlist() if getAdvertised { pathList, _ := peer.getBestFromLocal(rfList) conf.State.AdjTable.Advertised = uint32(len(pathList)) } else { conf.State.AdjTable.Advertised = 0 } conf.State.AdjTable.Received = uint32(peer.adjRibIn.Count(rfList)) conf.State.AdjTable.Accepted = uint32(peer.adjRibIn.Accepted(rfList)) conf.Transport.State.LocalAddress, conf.Transport.State.LocalPort = peer.fsm.LocalHostPort() _, conf.Transport.State.RemotePort = peer.fsm.RemoteHostPort() buf, _ := peer.fsm.recvOpen.Serialize() // need to copy all values here conf.State.ReceivedOpenMessage, _ = bgp.ParseBGPMessage(buf) } return &conf }