From 704135410381e69e2f39fea84cd029b65148da01 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Sun, 21 Dec 2014 05:53:20 -0800 Subject: table: implement Clone() to copy pathattributes in Path struct In some cases, we need to modify pathattributes in Path and creates an update message based on it. Clone() is used to avoid chaning the pathattributes in the table. Signed-off-by: FUJITA Tomonori --- table/path.go | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) (limited to 'table/path.go') diff --git a/table/path.go b/table/path.go index e7536f22..846c7e16 100644 --- a/table/path.go +++ b/table/path.go @@ -18,7 +18,6 @@ package table import ( "fmt" "github.com/osrg/gobgp/packet" - //"github.com/osrg/gobgp/utils" "net" "reflect" ) @@ -27,7 +26,6 @@ type Path interface { String() string GetPathAttrs() []bgp.PathAttributeInterface GetPathAttr(int) (int, bgp.PathAttributeInterface) - // clone(forWithdrawal bool) Path getRouteFamily() RouteFamily setSource(source *PeerInfo) getSource() *PeerInfo @@ -41,6 +39,7 @@ type Path interface { getPrefix() net.IP setMedSetByTargetNeighbor(medSetByTargetNeighbor bool) getMedSetByTargetNeighbor() bool + Clone() Path } type PathDefault struct { @@ -74,6 +73,18 @@ func NewPathDefault(rf RouteFamily, source *PeerInfo, nlri bgp.AddrPrefixInterfa return path } +// create new PathAttributes +func (pd *PathDefault) Clone() Path { + copiedAttrs := append([]bgp.PathAttributeInterface(nil), pd.pathAttrs...) + for i, attr := range copiedAttrs { + t, v := reflect.TypeOf(attr), reflect.ValueOf(attr) + newAttrObjp := reflect.New(t.Elem()) + newAttrObjp.Elem().Set(v.Elem()) + copiedAttrs[i] = newAttrObjp.Interface().(bgp.PathAttributeInterface) + } + return CreatePath(pd.source, pd.nlri, copiedAttrs, pd.withdraw) +} + func (pd *PathDefault) getRouteFamily() RouteFamily { return pd.routeFamily } @@ -152,23 +163,6 @@ func (pd *PathDefault) GetPathAttr(pattrType int) (int, bgp.PathAttributeInterfa return -1, nil } -// func (pi *PathDefault) clone(forWithdrawal bool) Path { -// pathAttrs := utils.NewOrderedMap() -// if !forWithdrawal { -// pathAttrs = pi.getPathAttributeMap() -// } -// def := NewPathDefault(pi.getRouteFamily(), pi.getSource(), pi.GetNlri(), pi.getSourceVerNum(), -// pi.getNexthop(), forWithdrawal, pathAttrs, pi.getMedSetByTargetNeighbor()) -// switch pi.getRouteFamily() { -// case RF_IPv4_UC: -// return &IPv4Path{PathDefault: def} -// case RF_IPv6_UC: -// return &IPv6Path{PathDefault: def} -// default: -// return def -// } -//} - // return Path's string representation func (pi *PathDefault) String() string { str := fmt.Sprintf("IPv4Path Source: %d, ", pi.getSourceVerNum()) -- cgit v1.2.3