blob: 90a8a9b6dcff7e8e1a704ed270319346ad5338d3 [file] [log] [blame]
alshabibc7911792015-07-30 17:55:30 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
alshabibc7911792015-07-30 17:55:30 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.provider.of.meter.impl;
17
alshabib10c810b2015-08-18 16:59:04 -070018import org.onosproject.net.meter.Band;
19import org.onosproject.net.meter.Meter;
20import org.onosproject.net.meter.MeterId;
alshabibc7911792015-07-30 17:55:30 -070021import org.projectfloodlight.openflow.protocol.OFFactory;
22import org.projectfloodlight.openflow.protocol.OFMeterFlags;
23import org.projectfloodlight.openflow.protocol.OFMeterMod;
24import org.projectfloodlight.openflow.protocol.OFMeterModCommand;
cansu.toprak409289d2017-10-27 10:04:05 +030025import org.projectfloodlight.openflow.protocol.OFVersion;
alshabibc7911792015-07-30 17:55:30 -070026import org.projectfloodlight.openflow.protocol.meterband.OFMeterBand;
27import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDrop;
28import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDscpRemark;
29import org.slf4j.Logger;
30
31import java.util.Collection;
Jimmy Jine9b7a022016-08-12 16:56:48 -070032import java.util.EnumSet;
alshabibc7911792015-07-30 17:55:30 -070033import java.util.List;
Sho SHIMIZU45906042016-01-13 23:05:54 -080034import java.util.Objects;
Jimmy Jine9b7a022016-08-12 16:56:48 -070035import java.util.Set;
alshabibc7911792015-07-30 17:55:30 -070036import java.util.stream.Collectors;
37
38import static com.google.common.base.Preconditions.checkArgument;
39import static com.google.common.base.Preconditions.checkNotNull;
40import static org.slf4j.LoggerFactory.getLogger;
41
42/**
43 * Builder for a meter modification.
44 */
45public final class MeterModBuilder {
46
47 private final Logger log = getLogger(getClass());
48
49 private final long xid;
50 private final OFFactory factory;
51 private Meter.Unit unit = Meter.Unit.KB_PER_SEC;
52 private boolean burst = false;
alshabib7bb05012015-08-05 10:15:09 -070053 private Long id;
alshabibc7911792015-07-30 17:55:30 -070054 private Collection<Band> bands;
55
56 public MeterModBuilder(long xid, OFFactory factory) {
57 this.xid = xid;
58 this.factory = factory;
59 }
60
61 public static MeterModBuilder builder(long xid, OFFactory factory) {
62 return new MeterModBuilder(xid, factory);
63 }
64
65 public MeterModBuilder withRateUnit(Meter.Unit unit) {
66 this.unit = unit;
67 return this;
68 }
69
70 public MeterModBuilder burst() {
71 this.burst = true;
72 return this;
73 }
74
75 public MeterModBuilder withId(MeterId meterId) {
76 this.id = meterId.id();
77 return this;
78 }
79
80 public MeterModBuilder withBands(Collection<Band> bands) {
81 this.bands = bands;
82 return this;
83 }
84
85 public OFMeterMod add() {
86 validate();
87 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -070088 builder.setCommand(OFMeterModCommand.ADD);
alshabibc7911792015-07-30 17:55:30 -070089 return builder.build();
90 }
91
92 public OFMeterMod remove() {
93 validate();
94 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -070095 builder.setCommand(OFMeterModCommand.DELETE);
alshabibc7911792015-07-30 17:55:30 -070096 return builder.build();
97 }
98
99 public OFMeterMod modify() {
100 validate();
101 OFMeterMod.Builder builder = builderMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -0700102 builder.setCommand(OFMeterModCommand.MODIFY);
alshabibc7911792015-07-30 17:55:30 -0700103 return builder.build();
104 }
105
106 private OFMeterMod.Builder builderMeterMod() {
107 OFMeterMod.Builder builder = factory.buildMeterMod();
Jimmy Jine9b7a022016-08-12 16:56:48 -0700108 Set<OFMeterFlags> flags = EnumSet.noneOf(OFMeterFlags.class);
alshabibc7911792015-07-30 17:55:30 -0700109 if (burst) {
Jimmy Jine9b7a022016-08-12 16:56:48 -0700110 flags.add(OFMeterFlags.BURST);
alshabibc7911792015-07-30 17:55:30 -0700111 }
112 switch (unit) {
113 case PKTS_PER_SEC:
Jimmy Jine9b7a022016-08-12 16:56:48 -0700114 flags.add(OFMeterFlags.PKTPS);
alshabibc7911792015-07-30 17:55:30 -0700115 break;
116 case KB_PER_SEC:
Jimmy Jine9b7a022016-08-12 16:56:48 -0700117 flags.add(OFMeterFlags.KBPS);
alshabibc7911792015-07-30 17:55:30 -0700118 break;
119 default:
120 log.warn("Unknown unit type {}", unit);
121 }
cansu.toprak409289d2017-10-27 10:04:05 +0300122
123 if (factory.getVersion().getWireVersion() >= OFVersion.OF_14.getWireVersion()) {
124 builder.setBands(buildBands());
125 } else {
126 builder.setMeters(buildBands());
127 }
128
alshabibc7911792015-07-30 17:55:30 -0700129 builder.setFlags(flags)
130 .setMeterId(id)
131 .setXid(xid);
132 return builder;
133 }
134
135 private List<OFMeterBand> buildBands() {
136 return bands.stream().map(b -> {
137 switch (b.type()) {
138 case DROP:
139 OFMeterBandDrop.Builder dropBuilder =
140 factory.meterBands().buildDrop();
141 if (burst) {
142 dropBuilder.setBurstSize(b.burst());
143 }
144 dropBuilder.setRate(b.rate());
145 return dropBuilder.build();
146 case REMARK:
147 OFMeterBandDscpRemark.Builder remarkBand =
148 factory.meterBands().buildDscpRemark();
149 if (burst) {
150 remarkBand.setBurstSize(b.burst());
151 }
152 remarkBand.setRate(b.rate());
153 remarkBand.setPrecLevel(b.dropPrecedence());
154 return remarkBand.build();
155 default:
156 log.warn("Unknown band type {}", b.type());
157 return null;
158 }
Sho SHIMIZU45906042016-01-13 23:05:54 -0800159 }).filter(Objects::nonNull).collect(Collectors.toList());
alshabibc7911792015-07-30 17:55:30 -0700160 }
161
162 private void validate() {
163 checkNotNull(id, "id cannot be null");
164 checkNotNull(bands, "Must have bands");
Jon Hallcbd1b392017-01-18 20:15:44 -0800165 checkArgument(!bands.isEmpty(), "Must have at lease one band");
alshabibc7911792015-07-30 17:55:30 -0700166 }
167}