@@ -24,6 +24,9 @@ const (
2424 OFPMF13_PKTPS = 0b0010 /* Rate value in packet/sec. */
2525 OFPMF13_BURST = 0b0100 /* Do burst size. */
2626 OFPMF13_STATS = 0b1000 /* Collect statistics. */
27+
28+ METER_BAND_HEADER_LEN = 12
29+ METER_BAND_LEN = 16
2730)
2831
2932type MeterBandHeader struct {
@@ -35,19 +38,16 @@ type MeterBandHeader struct {
3538
3639func NewMeterBandHeader () * MeterBandHeader {
3740 return & MeterBandHeader {
38- Type : OFPMBT13_DROP ,
39- Length : 16 ,
40- Rate : 100 ,
41- BurstSize : 200 ,
41+ Length : METER_BAND_LEN ,
4242 }
4343}
4444
4545func (m * MeterBandHeader ) Len () (n uint16 ) {
46- return 12
46+ return METER_BAND_HEADER_LEN
4747}
4848
4949func (m * MeterBandHeader ) MarshalBinary () (data []byte , err error ) {
50- data = make ([]byte , 12 )
50+ data = make ([]byte , m . Len () )
5151 n := 0
5252 binary .BigEndian .PutUint16 (data [n :], m .Type )
5353 n += 2
@@ -79,16 +79,19 @@ type MeterBandDrop struct {
7979}
8080
8181func (m * MeterBandDrop ) Len () (n uint16 ) {
82- return m . MeterBandHeader . Len () + 4
82+ return METER_BAND_LEN
8383}
8484
8585func (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 ()
8789 if err != nil {
8890 return nil , err
8991 }
90- bytes := make ([]byte , 4 )
91- return append (data , bytes ... ), nil
92+ copy (data , mbHdrBytes )
93+ n += METER_BAND_HEADER_LEN
94+ return
9295}
9396
9497func (m * MeterBandDrop ) UnmarshalBinary (data []byte ) error {
@@ -106,17 +109,20 @@ type MeterBandDSCP struct {
106109}
107110
108111func (m * MeterBandDSCP ) Len () (n uint16 ) {
109- return m . MeterBandHeader . Len () + 4
112+ return METER_BAND_LEN
110113}
111114
112115func (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 ()
114119 if err != nil {
115120 return nil , err
116121 }
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
120126}
121127
122128func (m * MeterBandDSCP ) UnmarshalBinary (data []byte ) error {
@@ -129,22 +135,25 @@ func (m *MeterBandDSCP) UnmarshalBinary(data []byte) error {
129135}
130136
131137type 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. */
134140}
135141
136142func (m * MeterBandExperimenter ) Len () (n uint16 ) {
137- return m . MeterBandHeader . Len () + 4
143+ return METER_BAND_LEN
138144}
139145
140146func (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 ()
142150 if err != nil {
143151 return nil , err
144152 }
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
148157}
149158
150159func (m * MeterBandExperimenter ) UnmarshalBinary (data []byte ) error {
@@ -170,10 +179,6 @@ func NewMeterMod() *MeterMod {
170179 m := new (MeterMod )
171180 m .Header = NewOfp13Header ()
172181 m .Header .Type = Type_MeterMod
173-
174- m .Command = OFPMC_ADD
175- m .Flags = OFPMF13_PKTPS
176- m .MeterId = 1
177182 m .MeterBands = make ([]util.Message , 0 )
178183 return m
179184}
@@ -199,22 +204,29 @@ func (m *MeterMod) Len() (n uint16) {
199204
200205func (m * MeterMod ) MarshalBinary () (data []byte , err error ) {
201206 m .Header .Length = m .Len ()
202- data , err = m .Header .MarshalBinary ()
203-
204- bytes := make ([]byte , 8 )
207+ data = make ([]byte , m .Len ())
205208 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 )
207216 n += 2
208- binary .BigEndian .PutUint16 (bytes [n :], m .Flags )
217+ binary .BigEndian .PutUint16 (data [n :], m .Flags )
209218 n += 2
210- binary .BigEndian .PutUint32 (bytes [n :], m .MeterId )
219+ binary .BigEndian .PutUint32 (data [n :], m .MeterId )
211220 n += 4
212- data = append (data , bytes ... )
213221
214222 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 )
218230 }
219231
220232 log .Debugf ("Metermod(%d): %v" , len (data ), data )
0 commit comments