@@ -24,6 +24,9 @@ const (
24
24
OFPMF13_PKTPS = 0b0010 /* Rate value in packet/sec. */
25
25
OFPMF13_BURST = 0b0100 /* Do burst size. */
26
26
OFPMF13_STATS = 0b1000 /* Collect statistics. */
27
+
28
+ METER_BAND_HEADER_LEN = 12
29
+ METER_BAND_LEN = 16
27
30
)
28
31
29
32
type MeterBandHeader struct {
@@ -35,19 +38,16 @@ type MeterBandHeader struct {
35
38
36
39
func NewMeterBandHeader () * MeterBandHeader {
37
40
return & MeterBandHeader {
38
- Type : OFPMBT13_DROP ,
39
- Length : 16 ,
40
- Rate : 100 ,
41
- BurstSize : 200 ,
41
+ Length : METER_BAND_LEN ,
42
42
}
43
43
}
44
44
45
45
func (m * MeterBandHeader ) Len () (n uint16 ) {
46
- return 12
46
+ return METER_BAND_HEADER_LEN
47
47
}
48
48
49
49
func (m * MeterBandHeader ) MarshalBinary () (data []byte , err error ) {
50
- data = make ([]byte , 12 )
50
+ data = make ([]byte , m . Len () )
51
51
n := 0
52
52
binary .BigEndian .PutUint16 (data [n :], m .Type )
53
53
n += 2
@@ -79,16 +79,19 @@ type MeterBandDrop struct {
79
79
}
80
80
81
81
func (m * MeterBandDrop ) Len () (n uint16 ) {
82
- return m . MeterBandHeader . Len () + 4
82
+ return METER_BAND_LEN
83
83
}
84
84
85
85
func (m * MeterBandDrop ) MarshalBinary () (data []byte , err error ) {
86
- data , err = m .MeterBandHeader .MarshalBinary ()
86
+ data = make ([]byte , m .Len ())
87
+ n := 0
88
+ mbHdrBytes , err := m .MeterBandHeader .MarshalBinary ()
87
89
if err != nil {
88
90
return nil , err
89
91
}
90
- bytes := make ([]byte , 4 )
91
- return append (data , bytes ... ), nil
92
+ copy (data , mbHdrBytes )
93
+ n += METER_BAND_HEADER_LEN
94
+ return
92
95
}
93
96
94
97
func (m * MeterBandDrop ) UnmarshalBinary (data []byte ) error {
@@ -106,17 +109,20 @@ type MeterBandDSCP struct {
106
109
}
107
110
108
111
func (m * MeterBandDSCP ) Len () (n uint16 ) {
109
- return m . MeterBandHeader . Len () + 4
112
+ return METER_BAND_LEN
110
113
}
111
114
112
115
func (m * MeterBandDSCP ) MarshalBinary () (data []byte , err error ) {
113
- data , err = m .MeterBandHeader .MarshalBinary ()
116
+ data = make ([]byte , m .Len ())
117
+ n := 0
118
+ mbHdrBytes , err := m .MeterBandHeader .MarshalBinary ()
114
119
if err != nil {
115
120
return nil , err
116
121
}
117
- bytes := make ([]byte , 4 )
118
- bytes [0 ] = m .PrecLevel
119
- return append (data , bytes ... ), nil
122
+ copy (data , mbHdrBytes )
123
+ n += METER_BAND_HEADER_LEN
124
+ data [n ] = m .PrecLevel
125
+ return
120
126
}
121
127
122
128
func (m * MeterBandDSCP ) UnmarshalBinary (data []byte ) error {
@@ -129,22 +135,25 @@ func (m *MeterBandDSCP) UnmarshalBinary(data []byte) error {
129
135
}
130
136
131
137
type MeterBandExperimenter struct {
132
- MeterBandHeader
133
- Experimenter uint32 /* Experimenter ID which takes the same form as in struct ofp_experimenter_header. */
138
+ MeterBandHeader /* Type: OFPMBT13_EXPERIMENTER. */
139
+ Experimenter uint32 /* Experimenter ID which takes the same form as in struct ofp_experimenter_header. */
134
140
}
135
141
136
142
func (m * MeterBandExperimenter ) Len () (n uint16 ) {
137
- return m . MeterBandHeader . Len () + 4
143
+ return METER_BAND_LEN
138
144
}
139
145
140
146
func (m * MeterBandExperimenter ) MarshalBinary () (data []byte , err error ) {
141
- data , err = m .MeterBandHeader .MarshalBinary ()
147
+ data = make ([]byte , m .Len ())
148
+ n := 0
149
+ mbHdrBytes , err := m .MeterBandHeader .MarshalBinary ()
142
150
if err != nil {
143
151
return nil , err
144
152
}
145
- bytes := make ([]byte , 4 )
146
- binary .BigEndian .PutUint32 (bytes , m .Experimenter )
147
- return append (data , bytes ... ), nil
153
+ copy (data , mbHdrBytes )
154
+ n += METER_BAND_HEADER_LEN
155
+ binary .BigEndian .PutUint32 (data [n :], m .Experimenter )
156
+ return
148
157
}
149
158
150
159
func (m * MeterBandExperimenter ) UnmarshalBinary (data []byte ) error {
@@ -170,10 +179,6 @@ func NewMeterMod() *MeterMod {
170
179
m := new (MeterMod )
171
180
m .Header = NewOfp13Header ()
172
181
m .Header .Type = Type_MeterMod
173
-
174
- m .Command = OFPMC_ADD
175
- m .Flags = OFPMF13_PKTPS
176
- m .MeterId = 1
177
182
m .MeterBands = make ([]util.Message , 0 )
178
183
return m
179
184
}
@@ -199,22 +204,29 @@ func (m *MeterMod) Len() (n uint16) {
199
204
200
205
func (m * MeterMod ) MarshalBinary () (data []byte , err error ) {
201
206
m .Header .Length = m .Len ()
202
- data , err = m .Header .MarshalBinary ()
203
-
204
- bytes := make ([]byte , 8 )
207
+ data = make ([]byte , m .Len ())
205
208
n := 0
206
- binary .BigEndian .PutUint16 (bytes [n :], m .Command )
209
+ hdrBytes , err := m .Header .MarshalBinary ()
210
+ if err != nil {
211
+ return nil , err
212
+ }
213
+ copy (data , hdrBytes )
214
+ n += int (m .Header .Len ())
215
+ binary .BigEndian .PutUint16 (data [n :], m .Command )
207
216
n += 2
208
- binary .BigEndian .PutUint16 (bytes [n :], m .Flags )
217
+ binary .BigEndian .PutUint16 (data [n :], m .Flags )
209
218
n += 2
210
- binary .BigEndian .PutUint32 (bytes [n :], m .MeterId )
219
+ binary .BigEndian .PutUint32 (data [n :], m .MeterId )
211
220
n += 4
212
- data = append (data , bytes ... )
213
221
214
222
for _ , mb := range m .MeterBands {
215
- bytes , err = mb .MarshalBinary ()
216
- data = append (data , bytes ... )
217
- log .Debugf ("Metermod band: %v" , bytes )
223
+ mbBytes , err := mb .MarshalBinary ()
224
+ if err != nil {
225
+ return nil , err
226
+ }
227
+ copy (data [n :], mbBytes )
228
+ n += METER_BAND_LEN
229
+ log .Debugf ("Metermod band: %v" , mbBytes )
218
230
}
219
231
220
232
log .Debugf ("Metermod(%d): %v" , len (data ), data )
0 commit comments