package route import "fmt" type Path struct { Type uint8 StaticPath *StaticPath BGPPath *BGPPath } // Compare returns negative if p < q, 0 if paths are equal, positive if p > q func (p *Path) Compare(q *Path) int8 { if p.Type > q.Type { return 1 } if p.Type < q.Type { return -1 } switch p.Type { case BGPPathType: return p.BGPPath.Compare(q.BGPPath) case StaticPathType: return p.StaticPath.Compare(q.StaticPath) } panic("Unknown path type") } func (p *Path) ECMP(q *Path) bool { switch p.Type { case BGPPathType: return p.BGPPath.ECMP(q.BGPPath) case StaticPathType: return p.StaticPath.ECMP(q.StaticPath) } panic("Unknown path type") } func (p *Path) Equal(q *Path) bool { if p == nil || q == nil { return false } if p.Type != q.Type { return false } switch p.Type { case BGPPathType: if *p.BGPPath != *q.BGPPath { return false } } return true } // PathsDiff gets the list of elements contained by a but not b func PathsDiff(a, b []*Path) []*Path { ret := make([]*Path, 0) for _, pa := range a { if !pathsContains(pa, b) { ret = append(ret, pa) } } return ret } func pathsContains(needle *Path, haystack []*Path) bool { for _, p := range haystack { if p == needle { return true } } return false } func (p *Path) Print() string { protocol := "" switch p.Type { case StaticPathType: protocol = "static" case BGPPathType: protocol = "BGP" } ret := fmt.Sprintf("\tProtocol: %s\n", protocol) switch p.Type { case StaticPathType: ret += "Not implemented yet" case BGPPathType: ret += p.BGPPath.Print() } return ret }