summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--server/fsm.go4
-rw-r--r--server/peer.go16
-rw-r--r--server/server.go24
-rw-r--r--table/destination.go13
4 files changed, 31 insertions, 26 deletions
diff --git a/server/fsm.go b/server/fsm.go
index d20de598..2de4787e 100644
--- a/server/fsm.go
+++ b/server/fsm.go
@@ -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{
diff --git a/server/peer.go b/server/peer.go
index 6f9627a7..82c61ae9 100644
--- a/server/peer.go
+++ b/server/peer.go
@@ -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),
diff --git a/server/server.go b/server/server.go
index 386e82f3..80c6059a 100644
--- a/server/server.go
+++ b/server/server.go
@@ -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++
diff --git a/table/destination.go b/table/destination.go
index 7d3fe487..f5d30f29 100644
--- a/table/destination.go
+++ b/table/destination.go
@@ -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