summaryrefslogtreecommitdiffhomepage
path: root/table/message.go
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2014-12-30 21:04:01 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2014-12-30 21:04:01 +0900
commitde9a26d9f36ebd9c918c3f7c88764093a54152dc (patch)
tree9b54677b50b30b04b750677b074b86b86ef243c7 /table/message.go
parent7e7b78e775bb40e0998418c5c294ed2668e3ea1a (diff)
table: add helper functions to modify PathAttributes for 4 and 2 byte AS.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Diffstat (limited to 'table/message.go')
-rw-r--r--table/message.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/table/message.go b/table/message.go
new file mode 100644
index 00000000..35eb501a
--- /dev/null
+++ b/table/message.go
@@ -0,0 +1,109 @@
+// Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+// implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package table
+
+import (
+ "github.com/osrg/gobgp/packet"
+)
+
+func UpdatePathAttrs2ByteAs(msg *bgp.BGPUpdate) error {
+ var asAttr *bgp.PathAttributeAsPath
+ for _, attr := range msg.PathAttributes {
+ switch attr.(type) {
+ case *bgp.PathAttributeAsPath:
+ asAttr = attr.(*bgp.PathAttributeAsPath)
+ }
+ }
+
+ as4pathParam := make([]*bgp.As4PathParam, 0)
+ for i, param := range asAttr.Value {
+ asParam, y := param.(*bgp.As4PathParam)
+ if !y {
+ continue
+ }
+
+ newAs := make([]uint32, 0)
+ oldAs := make([]uint16, len(asParam.AS))
+ for j := 0; j < len(asParam.AS); j++ {
+ if asParam.AS[j] > (1<<16)-1 {
+ oldAs[j] = bgp.AS_TRANS
+ newAs = append(newAs, asParam.AS[j])
+ } else {
+ oldAs[j] = uint16(asParam.AS[j])
+ }
+ }
+ asAttr.Value[i] = bgp.NewAsPathParam(asParam.Type, oldAs)
+ if len(newAs) > 0 {
+ as4pathParam = append(as4pathParam, bgp.NewAs4PathParam(asParam.Type, newAs))
+ }
+ }
+ if len(as4pathParam) > 0 {
+ msg.PathAttributes = append(msg.PathAttributes, bgp.NewPathAttributeAs4Path(as4pathParam))
+ }
+ return nil
+}
+
+func UpdatePathAttrs4ByteAs(msg *bgp.BGPUpdate) error {
+ newPathAttrs := make([]bgp.PathAttributeInterface, 0)
+ var asAttr *bgp.PathAttributeAsPath
+ var as4Attr *bgp.PathAttributeAs4Path
+
+ for _, attr := range msg.PathAttributes {
+ switch attr.(type) {
+ case *bgp.PathAttributeAsPath:
+ asAttr = attr.(*bgp.PathAttributeAsPath)
+ newPathAttrs = append(newPathAttrs, attr)
+ case *bgp.PathAttributeAs4Path:
+ as4Attr = attr.(*bgp.PathAttributeAs4Path)
+ default:
+ newPathAttrs = append(newPathAttrs, attr)
+ }
+ }
+
+ AS := make([]uint32, 0)
+ if as4Attr != nil {
+ for _, p := range as4Attr.Value {
+ AS = append(AS, p.AS...)
+ }
+ msg.PathAttributes = newPathAttrs
+ }
+
+ transIdx := 0
+ for i, param := range asAttr.Value {
+ asParam, y := param.(*bgp.AsPathParam)
+ if !y {
+ continue
+ }
+
+ newAS := make([]uint32, len(asParam.AS))
+ for j := 0; j < len(asParam.AS); j++ {
+ if asParam.AS[j] == bgp.AS_TRANS {
+ if transIdx == len(AS) {
+ //return error
+ }
+ newAS[j] = AS[transIdx]
+ transIdx++
+ } else {
+ newAS[j] = uint32(asParam.AS[j])
+ }
+ }
+ asAttr.Value[i] = bgp.NewAs4PathParam(asParam.Type, newAS)
+ }
+ if len(AS) != transIdx {
+ //return error
+ }
+ return nil
+}