From a36c84c510bd7cde344e6cbabd043153e4a0196c Mon Sep 17 00:00:00 2001 From: ISHIDA Wataru Date: Wed, 2 Dec 2015 16:01:47 +0900 Subject: make adj-rib implementation more clear and efficient Signed-off-by: ISHIDA Wataru --- table/table_manager.go | 118 ------------------------------------------------- 1 file changed, 118 deletions(-) (limited to 'table/table_manager.go') diff --git a/table/table_manager.go b/table/table_manager.go index 03d8ed83..637299b9 100644 --- a/table/table_manager.go +++ b/table/table_manager.go @@ -21,7 +21,6 @@ import ( log "github.com/Sirupsen/logrus" "github.com/osrg/gobgp/packet" "net" - "reflect" "time" ) @@ -489,120 +488,3 @@ func (manager *TableManager) GetBestPathList(rfList []bgp.RouteFamily) []*Path { } return paths } - -// process BGPUpdate message -// this function processes only BGPUpdate -func (manager *TableManager) ProcessUpdate(fromPeer *PeerInfo, message *bgp.BGPMessage) ([]*Path, error) { - // check msg's type if it's BGPUpdate - if message.Header.Type != bgp.BGP_MSG_UPDATE { - log.WithFields(log.Fields{ - "Topic": "table", - "Owner": manager.owner, - "key": fromPeer.Address.String(), - "Type": message.Header.Type, - }).Warn("message is not BGPUpdate") - return []*Path{}, nil - } - - return manager.ProcessPaths(ProcessMessage(message, fromPeer, time.Now())) -} - -type AdjRib struct { - adjRibIn map[bgp.RouteFamily]map[string]*Path - adjRibOut map[bgp.RouteFamily]map[string]*Path -} - -func NewAdjRib(rfList []bgp.RouteFamily) *AdjRib { - r := &AdjRib{ - adjRibIn: make(map[bgp.RouteFamily]map[string]*Path), - adjRibOut: make(map[bgp.RouteFamily]map[string]*Path), - } - for _, rf := range rfList { - r.adjRibIn[rf] = make(map[string]*Path) - r.adjRibOut[rf] = make(map[string]*Path) - } - return r -} - -func (adj *AdjRib) update(rib map[bgp.RouteFamily]map[string]*Path, pathList []*Path) { - for _, path := range pathList { - rf := path.GetRouteFamily() - key := path.getPrefix() - old, found := rib[rf][key] - if path.IsWithdraw { - if found { - delete(rib[rf], key) - } - } else { - if found && reflect.DeepEqual(old.GetPathAttrs(), path.GetPathAttrs()) { - path.setTimestamp(old.GetTimestamp()) - } - rib[rf][key] = path - } - } -} - -func (adj *AdjRib) UpdateIn(pathList []*Path) { - adj.update(adj.adjRibIn, pathList) -} - -func (adj *AdjRib) UpdateOut(pathList []*Path) { - adj.update(adj.adjRibOut, pathList) -} - -func (adj *AdjRib) GetInPathList(rfList []bgp.RouteFamily) []*Path { - pathList := make([]*Path, 0, adj.GetInCount(rfList)) - for _, rf := range rfList { - for _, rr := range adj.adjRibIn[rf] { - pathList = append(pathList, rr) - } - } - return pathList -} - -func (adj *AdjRib) GetOutPathList(rfList []bgp.RouteFamily) []*Path { - pathList := make([]*Path, 0, adj.GetOutCount(rfList)) - for _, rf := range rfList { - for _, rr := range adj.adjRibOut[rf] { - pathList = append(pathList, rr) - } - } - return pathList -} - -func (adj *AdjRib) GetInCount(rfList []bgp.RouteFamily) int { - count := 0 - for _, rf := range rfList { - if _, ok := adj.adjRibIn[rf]; ok { - count += len(adj.adjRibIn[rf]) - - } - } - return count -} - -func (adj *AdjRib) GetOutCount(rfList []bgp.RouteFamily) int { - count := 0 - for _, rf := range rfList { - if _, ok := adj.adjRibOut[rf]; ok { - count += len(adj.adjRibOut[rf]) - } - } - return count -} - -func (adj *AdjRib) DropIn(rfList []bgp.RouteFamily) { - for _, rf := range rfList { - if _, ok := adj.adjRibIn[rf]; ok { - adj.adjRibIn[rf] = make(map[string]*Path) - } - } -} - -func (adj *AdjRib) DropOut(rfList []bgp.RouteFamily) { - for _, rf := range rfList { - if _, ok := adj.adjRibIn[rf]; ok { - adj.adjRibOut[rf] = make(map[string]*Path) - } - } -} -- cgit v1.2.3