mirror of
https://github.com/osrg/gobgp.git
synced 2024-05-11 05:55:10 +00:00
server: move peerInfo from peer to fsm
fsm needs it with the later commit. Signed-off-by: FUJITA Tomonori <[email protected]>
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/osrg/gobgp/config"
|
||||
"github.com/osrg/gobgp/packet"
|
||||
"github.com/osrg/gobgp/table"
|
||||
"gopkg.in/tomb.v2"
|
||||
"io"
|
||||
"net"
|
||||
@@ -80,6 +81,7 @@ type FSM struct {
|
||||
h *FSMHandler
|
||||
rfMap map[bgp.RouteFamily]bool
|
||||
confedCheck bool
|
||||
peerInfo *table.PeerInfo
|
||||
}
|
||||
|
||||
func (fsm *FSM) bgpMessageStateUpdate(MessageType uint8, isIn bool) {
|
||||
@@ -147,6 +149,7 @@ func NewFSM(gConf *config.Global, pConf *config.Neighbor) *FSM {
|
||||
getActiveCh: make(chan struct{}),
|
||||
rfMap: make(map[bgp.RouteFamily]bool),
|
||||
confedCheck: !config.IsConfederationMember(gConf, pConf) && config.IsEBGPPeer(gConf, pConf),
|
||||
peerInfo: table.NewPeerInfo(gConf, pConf),
|
||||
}
|
||||
fsm.t.Go(fsm.connectLoop)
|
||||
return fsm
|
||||
@@ -567,6 +570,7 @@ func (h *FSMHandler) opensent() bgp.FSMState {
|
||||
fsm.sendNotificatonFromErrorMsg(h.conn, err.(*bgp.MessageError))
|
||||
return bgp.BGP_FSM_IDLE
|
||||
}
|
||||
fsm.peerInfo.ID = body.ID
|
||||
_, fsm.rfMap = open2Cap(body, fsm.pConf)
|
||||
|
||||
e := &fsmMsg{
|
||||
|
||||
+2
-14
@@ -38,7 +38,6 @@ type Peer struct {
|
||||
rfMap map[bgp.RouteFamily]bool
|
||||
capMap map[bgp.BGPCapabilityCode][]bgp.ParameterCapabilityInterface
|
||||
adjRib *table.AdjRib
|
||||
peerInfo *table.PeerInfo
|
||||
outgoing chan *bgp.BGPMessage
|
||||
inPolicies []*table.Policy
|
||||
defaultInPolicy table.RouteType
|
||||
@@ -57,18 +56,8 @@ func NewPeer(g config.Global, conf config.Neighbor, loc *table.TableManager) *Pe
|
||||
outgoing: make(chan *bgp.BGPMessage, 128),
|
||||
localRib: loc,
|
||||
}
|
||||
|
||||
conf.NeighborState.SessionState = uint32(bgp.BGP_FSM_IDLE)
|
||||
conf.Timers.TimersState.Downtime = time.Now().Unix()
|
||||
id := net.ParseIP(string(conf.RouteReflector.RouteReflectorConfig.RouteReflectorClusterId)).To4()
|
||||
peer.peerInfo = &table.PeerInfo{
|
||||
AS: conf.NeighborConfig.PeerAs,
|
||||
LocalAS: g.GlobalConfig.As,
|
||||
LocalID: g.GlobalConfig.RouterId,
|
||||
Address: conf.NeighborConfig.NeighborAddress,
|
||||
RouteReflectorClient: peer.isRouteReflectorClient(),
|
||||
RouteReflectorClusterID: id,
|
||||
}
|
||||
peer.adjRib = table.NewAdjRib(peer.configuredRFlist())
|
||||
peer.fsm = NewFSM(&g, &conf)
|
||||
return peer
|
||||
@@ -158,7 +147,6 @@ func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) ([]*table.Path, bool, []*b
|
||||
case bgp.BGP_MSG_OPEN:
|
||||
peer.recvOpen = m
|
||||
body := m.Body.(*bgp.BGPOpen)
|
||||
peer.peerInfo.ID = m.Body.(*bgp.BGPOpen).ID
|
||||
peer.capMap, peer.rfMap = open2Cap(body, &peer.conf)
|
||||
|
||||
// calculate HoldTime
|
||||
@@ -207,7 +195,7 @@ func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) ([]*table.Path, bool, []*b
|
||||
peer.conf.Timers.TimersState.UpdateRecvTime = time.Now().Unix()
|
||||
body := m.Body.(*bgp.BGPUpdate)
|
||||
table.UpdatePathAttrs4ByteAs(body)
|
||||
pathList = table.ProcessMessage(m, peer.peerInfo)
|
||||
pathList = table.ProcessMessage(m, peer.fsm.peerInfo)
|
||||
if len(pathList) > 0 {
|
||||
peer.staleAccepted = true
|
||||
peer.ApplyPolicy(table.POLICY_DIRECTION_IN, pathList)
|
||||
@@ -268,7 +256,7 @@ func (peer *Peer) ToApiStruct() *api.Peer {
|
||||
|
||||
conf := &api.PeerConf{
|
||||
NeighborAddress: c.NeighborConfig.NeighborAddress.String(),
|
||||
Id: peer.peerInfo.ID.To4().String(),
|
||||
Id: peer.fsm.peerInfo.ID.To4().String(),
|
||||
PeerAs: c.NeighborConfig.PeerAs,
|
||||
LocalAs: c.NeighborConfig.LocalAs,
|
||||
PeerType: uint32(c.NeighborConfig.PeerType),
|
||||
|
||||
+12
-12
@@ -329,7 +329,7 @@ func (server *BgpServer) Serve() {
|
||||
for _, p := range targetPeer.adjRib.GetInPathList(targetPeer.configuredRFlist()) {
|
||||
// avoid to merge for timestamp
|
||||
u := table.CreateUpdateMsgFromPaths([]*table.Path{p})
|
||||
bmpMsgList = append(bmpMsgList, bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, targetPeer.peerInfo, p.GetTimestamp().Unix(), u[0]))
|
||||
bmpMsgList = append(bmpMsgList, bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, targetPeer.fsm.peerInfo, p.GetTimestamp().Unix(), u[0]))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -487,7 +487,7 @@ func filterpath(peer *Peer, pathList []*table.Path) []*table.Path {
|
||||
// If the local CLUSTER_ID is found in the CLUSTER_LIST,
|
||||
// the advertisement received SHOULD be ignored.
|
||||
for _, clusterId := range path.GetClusterList() {
|
||||
if clusterId.Equal(peer.peerInfo.RouteReflectorClusterID) {
|
||||
if clusterId.Equal(peer.fsm.peerInfo.RouteReflectorClusterID) {
|
||||
log.WithFields(log.Fields{
|
||||
"Topic": "Peer",
|
||||
"Key": remoteAddr,
|
||||
@@ -550,7 +550,7 @@ func (server *BgpServer) dropPeerAllRoutes(peer *Peer) []*SenderMsg {
|
||||
if !targetPeer.isRouteServerClient() || rib.OwnerName() == peer.conf.NeighborConfig.NeighborAddress.String() {
|
||||
continue
|
||||
}
|
||||
pathList, _ := rib.DeletePathsforPeer(peer.peerInfo, rf)
|
||||
pathList, _ := rib.DeletePathsforPeer(peer.fsm.peerInfo, rf)
|
||||
if targetPeer.fsm.state != bgp.BGP_FSM_ESTABLISHED || len(pathList) == 0 {
|
||||
continue
|
||||
}
|
||||
@@ -560,7 +560,7 @@ func (server *BgpServer) dropPeerAllRoutes(peer *Peer) []*SenderMsg {
|
||||
}
|
||||
} else {
|
||||
rib := server.globalRib
|
||||
pathList, _ := rib.DeletePathsforPeer(peer.peerInfo, rf)
|
||||
pathList, _ := rib.DeletePathsforPeer(peer.fsm.peerInfo, rf)
|
||||
if len(pathList) == 0 {
|
||||
continue
|
||||
}
|
||||
@@ -718,7 +718,7 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan *
|
||||
if ch := server.bmpClient.send(); ch != nil {
|
||||
m := &broadcastBMPMsg{
|
||||
ch: ch,
|
||||
msgList: []*bgp.BMPMessage{bmpPeerDown(bgp.BMP_PEER_DOWN_REASON_UNKNOWN, bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.peerInfo, peer.conf.Timers.TimersState.Downtime)},
|
||||
msgList: []*bgp.BMPMessage{bmpPeerDown(bgp.BMP_PEER_DOWN_REASON_UNKNOWN, bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.fsm.peerInfo, peer.conf.Timers.TimersState.Downtime)},
|
||||
}
|
||||
server.broadcastMsgs = append(server.broadcastMsgs, m)
|
||||
}
|
||||
@@ -742,7 +742,7 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan *
|
||||
_, rport := peer.fsm.RemoteHostPort()
|
||||
m := &broadcastBMPMsg{
|
||||
ch: ch,
|
||||
msgList: []*bgp.BMPMessage{bmpPeerUp(laddr, lport, rport, buildopen(peer.fsm.gConf, peer.fsm.pConf), peer.recvOpen, bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.peerInfo, peer.conf.Timers.TimersState.Uptime)},
|
||||
msgList: []*bgp.BMPMessage{bmpPeerUp(laddr, lport, rport, buildopen(peer.fsm.gConf, peer.fsm.pConf), peer.recvOpen, bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.fsm.peerInfo, peer.conf.Timers.TimersState.Uptime)},
|
||||
}
|
||||
server.broadcastMsgs = append(server.broadcastMsgs, m)
|
||||
}
|
||||
@@ -801,9 +801,9 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan *
|
||||
l, _ := peer.fsm.LocalHostPort()
|
||||
bm := &broadcastBGPMsg{
|
||||
message: m,
|
||||
peerAS: peer.peerInfo.AS,
|
||||
localAS: peer.peerInfo.LocalAS,
|
||||
peerAddress: peer.peerInfo.Address,
|
||||
peerAS: peer.fsm.peerInfo.AS,
|
||||
localAS: peer.fsm.peerInfo.LocalAS,
|
||||
peerAddress: peer.fsm.peerInfo.Address,
|
||||
localAddress: net.ParseIP(l),
|
||||
fourBytesAs: y,
|
||||
ch: server.dumper.sendCh(),
|
||||
@@ -813,7 +813,7 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan *
|
||||
if ch := server.bmpClient.send(); ch != nil {
|
||||
bm := &broadcastBMPMsg{
|
||||
ch: ch,
|
||||
msgList: []*bgp.BMPMessage{bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.peerInfo, time.Now().Unix(), m)},
|
||||
msgList: []*bgp.BMPMessage{bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.fsm.peerInfo, time.Now().Unix(), m)},
|
||||
}
|
||||
server.broadcastMsgs = append(server.broadcastMsgs, bm)
|
||||
}
|
||||
@@ -2275,7 +2275,7 @@ func (server *BgpServer) handleMrt(grpcReq *GrpcRequest) {
|
||||
func (server *BgpServer) mkMrtPeerIndexTableMsg(t uint32, view string) (*bgp.MRTMessage, error) {
|
||||
peers := make([]*bgp.Peer, 0, len(server.neighborMap))
|
||||
for _, peer := range server.neighborMap {
|
||||
id := peer.peerInfo.ID.To4().String()
|
||||
id := peer.fsm.peerInfo.ID.To4().String()
|
||||
ipaddr := peer.conf.NeighborConfig.NeighborAddress.String()
|
||||
asn := peer.conf.NeighborConfig.PeerAs
|
||||
peers = append(peers, bgp.NewPeer(id, ipaddr, asn, true))
|
||||
@@ -2289,7 +2289,7 @@ func (server *BgpServer) mkMrtRibMsgs(tbl *table.Table, t uint32) ([]*bgp.MRTMes
|
||||
getPeerIndex := func(info *table.PeerInfo) uint16 {
|
||||
var idx uint16
|
||||
for _, peer := range server.neighborMap {
|
||||
if peer.peerInfo.Equal(info) {
|
||||
if peer.fsm.peerInfo.Equal(info) {
|
||||
return idx
|
||||
}
|
||||
idx++
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
"fmt"
|
||||
log "github.com/Sirupsen/logrus"
|
||||
api "github.com/osrg/gobgp/api"
|
||||
"github.com/osrg/gobgp/config"
|
||||
"github.com/osrg/gobgp/packet"
|
||||
"net"
|
||||
)
|
||||
@@ -103,6 +104,18 @@ func (i *PeerInfo) String() string {
|
||||
return s.String()
|
||||
}
|
||||
|
||||
func NewPeerInfo(g *config.Global, p *config.Neighbor) *PeerInfo {
|
||||
id := net.ParseIP(string(p.RouteReflector.RouteReflectorConfig.RouteReflectorClusterId)).To4()
|
||||
return &PeerInfo{
|
||||
AS: p.NeighborConfig.PeerAs,
|
||||
LocalAS: g.GlobalConfig.As,
|
||||
LocalID: g.GlobalConfig.RouterId,
|
||||
Address: p.NeighborConfig.NeighborAddress,
|
||||
RouteReflectorClient: p.RouteReflector.RouteReflectorConfig.RouteReflectorClient,
|
||||
RouteReflectorClusterID: id,
|
||||
}
|
||||
}
|
||||
|
||||
type Destination struct {
|
||||
routeFamily bgp.RouteFamily
|
||||
nlri bgp.AddrPrefixInterface
|
||||
|
||||
Reference in New Issue
Block a user