summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2016-03-04 12:09:06 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2016-03-04 15:09:11 +0900
commit199d658c2f01b25d42961f6336a38529660c1b92 (patch)
tree4ac5bf364fe9432c6499c1da80141361b362c97a
parent80bd1289acf006bb9e4bdf858f0fbe1eabd0a4c7 (diff)
packet: fix FlowSpecComponent Len()
We don't need to serialize to get the length of FlowSpecComponent. Also we need to fix FlowSpecComponent()'s serialize bug that it wrongly assumes that the length can be calculated by it's value. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--packet/bgp.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/packet/bgp.go b/packet/bgp.go
index e136c807..1019d74c 100644
--- a/packet/bgp.go
+++ b/packet/bgp.go
@@ -2513,6 +2513,10 @@ type FlowSpecComponentItem struct {
Value int `json:"value"`
}
+func (v *FlowSpecComponentItem) Len() int {
+ return 1 << ((uint32(v.Op) >> 4) & 0x3)
+}
+
func (v *FlowSpecComponentItem) Serialize() ([]byte, error) {
if v.Value < 0 {
return nil, fmt.Errorf("invalid value size(too small): %d", v.Value)
@@ -2605,8 +2609,11 @@ func (p *FlowSpecComponent) Serialize() ([]byte, error) {
}
func (p *FlowSpecComponent) Len() int {
- buf, _ := p.Serialize()
- return len(buf)
+ l := 1
+ for _, item := range p.Items {
+ l += (item.Len() + 1)
+ }
+ return l
}
func (p *FlowSpecComponent) Type() BGPFlowSpecType {