diff options
Diffstat (limited to 'server/peer.go')
-rw-r--r-- | server/peer.go | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/server/peer.go b/server/peer.go index 4dbc6c73..faea1a02 100644 --- a/server/peer.go +++ b/server/peer.go @@ -78,36 +78,43 @@ func (peer *Peer) handleBGPmessage(m *bgp.BGPMessage) { peer.sendToHub("", PEER_MSG_PATH, pathList) } -func (peer *Peer) handlePeermessage(m *message) { - switch m.event { - case PEER_MSG_PATH: - pList, wList, _ := peer.rib.ProcessPaths(m.data.([]table.Path)) - // TODO: merge multiple messages - // TODO: 4bytes and 2bytes conversion. - adjPathLists := append([]table.Path(nil), pList...) +func (peer *Peer) sendMessages(msgs []*bgp.BGPMessage) { + for _, m := range msgs { + peer.outgoing <- m + } +} - msgs := make([]*bgp.BGPMessage, 0) - for _, p := range pList { +func (peer *Peer) path2update(pathList []table.Path) []*bgp.BGPMessage { + // TODO: merge multiple messages + // TODO: 4bytes and 2bytes conversion. + msgs := make([]*bgp.BGPMessage, 0) + for _, p := range pathList { + if p.IsWithdraw() { + draw := p.GetNlri().(*bgp.WithdrawnRoute) + msgs = append(msgs, bgp.NewBGPUpdateMessage([]bgp.WithdrawnRoute{*draw}, []bgp.PathAttributeInterface{}, []bgp.NLRInfo{})) + } else { pathAttrs := p.GetPathAttrs() nlri := p.GetNlri().(*bgp.NLRInfo) - m := bgp.NewBGPUpdateMessage([]bgp.WithdrawnRoute{}, pathAttrs, []bgp.NLRInfo{*nlri}) - msgs = append(msgs, m) + msgs = append(msgs, bgp.NewBGPUpdateMessage([]bgp.WithdrawnRoute{}, pathAttrs, []bgp.NLRInfo{*nlri})) } + } + return msgs +} + +func (peer *Peer) handlePeermessage(m *message) { + switch m.event { + case PEER_MSG_PATH: + pList, wList, _ := peer.rib.ProcessPaths(m.data.([]table.Path)) + pathList := append([]table.Path(nil), pList...) for _, dest := range wList { p := dest.GetOldBestPath() - draw := p.GetNlri().(*bgp.WithdrawnRoute) - m := bgp.NewBGPUpdateMessage([]bgp.WithdrawnRoute{*draw}, []bgp.PathAttributeInterface{}, []bgp.NLRInfo{}) - msgs = append(msgs, m) - - adjPathLists = append(adjPathLists, p.Clone(true)) + pathList = append(pathList, p.Clone(true)) } - peer.adjRib.UpdateOut(adjPathLists) + peer.adjRib.UpdateOut(pathList) - for _, m := range msgs { - peer.outgoing <- m - } + peer.sendMessages(peer.path2update(pathList)) } } @@ -123,6 +130,11 @@ func (peer *Peer) loop() error { h.Wait() peer.fsm.StateChange(nextState) sameState = false + // TODO: check peer's rf + if nextState == bgp.BGP_FSM_ESTABLISHED { + pathList := peer.adjRib.GetOutPathList(table.RF_IPv4_UC) + peer.sendMessages(peer.path2update(pathList)) + } case <-peer.t.Dying(): close(peer.acceptedConnCh) h.Stop() |