@@ -17,6 +17,7 @@ func NewNetem(attrs QdiscAttrs, nattrs NetemQdiscAttrs) *Netem {
1717 var lossCorr , delayCorr , duplicateCorr uint32
1818 var reorderProb , reorderCorr uint32
1919 var corruptProb , corruptCorr uint32
20+ var rate64 uint64
2021
2122 latency := nattrs .Latency
2223 loss := Percentage2u32 (nattrs .Loss )
@@ -57,6 +58,7 @@ func NewNetem(attrs QdiscAttrs, nattrs NetemQdiscAttrs) *Netem {
5758
5859 corruptProb = Percentage2u32 (nattrs .CorruptProb )
5960 corruptCorr = Percentage2u32 (nattrs .CorruptCorr )
61+ rate64 = nattrs .Rate64
6062
6163 return & Netem {
6264 QdiscAttrs : attrs ,
@@ -73,6 +75,7 @@ func NewNetem(attrs QdiscAttrs, nattrs NetemQdiscAttrs) *Netem {
7375 ReorderCorr : reorderCorr ,
7476 CorruptProb : corruptProb ,
7577 CorruptCorr : corruptCorr ,
78+ Rate64 : rate64 ,
7679 }
7780}
7881
@@ -234,6 +237,17 @@ func qdiscPayload(req *nl.NetlinkRequest, qdisc Qdisc) error {
234237 if reorder .Probability > 0 {
235238 options .AddRtAttr (nl .TCA_NETEM_REORDER , reorder .Serialize ())
236239 }
240+ // Rate
241+ if qdisc .Rate64 > 0 {
242+ rate := nl.TcNetemRate {}
243+ if qdisc .Rate64 >= uint64 (1 << 32 ) {
244+ options .AddRtAttr (nl .TCA_NETEM_RATE64 , nl .Uint64Attr (qdisc .Rate64 ))
245+ rate .Rate = ^ uint32 (0 )
246+ } else {
247+ rate .Rate = uint32 (qdisc .Rate64 )
248+ }
249+ options .AddRtAttr (nl .TCA_NETEM_RATE , rate .Serialize ())
250+ }
237251 case * Clsact :
238252 options = nil
239253 case * Ingress :
@@ -601,6 +615,8 @@ func parseNetemData(qdisc Qdisc, value []byte) error {
601615 if err != nil {
602616 return err
603617 }
618+ var rate * nl.TcNetemRate
619+ var rate64 uint64
604620 for _ , datum := range data {
605621 switch datum .Attr .Type {
606622 case nl .TCA_NETEM_CORR :
@@ -616,8 +632,19 @@ func parseNetemData(qdisc Qdisc, value []byte) error {
616632 opt := nl .DeserializeTcNetemReorder (datum .Value )
617633 netem .ReorderProb = opt .Probability
618634 netem .ReorderCorr = opt .Correlation
635+ case nl .TCA_NETEM_RATE :
636+ rate = nl .DeserializeTcNetemRate (datum .Value )
637+ case nl .TCA_NETEM_RATE64 :
638+ rate64 = native .Uint64 (datum .Value )
619639 }
620640 }
641+ if rate != nil {
642+ netem .Rate64 = uint64 (rate .Rate )
643+ if rate64 > 0 {
644+ netem .Rate64 = rate64
645+ }
646+ }
647+
621648 return nil
622649}
623650
0 commit comments