Carmelo Cascone

Various Bmv2 protocol refactorings in preparation of the flow rule

translator (ONOS-4044)

- Added new classes for different match parameters (exact, ternary, lpm,
  valid)
- Divided api package in two sub-packages, model (previously under
  drivers) and runtime (old api package)
- Improved Bmv2ThriftClient caching and table entry handling

Change-Id: I23c174cf3e8f9f6ecddb99c2d09dc531e8f1c73f
Showing 30 changed files with 596 additions and 166 deletions
...@@ -20,10 +20,10 @@ import com.google.common.base.Preconditions; ...@@ -20,10 +20,10 @@ import com.google.common.base.Preconditions;
20 import com.google.common.collect.Lists; 20 import com.google.common.collect.Lists;
21 import com.google.common.collect.Maps; 21 import com.google.common.collect.Maps;
22 import com.google.common.collect.Sets; 22 import com.google.common.collect.Sets;
23 -import org.onosproject.bmv2.api.Bmv2ExtensionSelector; 23 +import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
24 -import org.onosproject.bmv2.api.Bmv2ExtensionTreatment; 24 +import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
25 -import org.onosproject.bmv2.api.Bmv2TableEntry; 25 +import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
26 -import org.onosproject.bmv2.api.Bmv2Exception; 26 +import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
27 import org.onosproject.bmv2.ctl.Bmv2ThriftClient; 27 import org.onosproject.bmv2.ctl.Bmv2ThriftClient;
28 import org.onosproject.net.driver.AbstractHandlerBehaviour; 28 import org.onosproject.net.driver.AbstractHandlerBehaviour;
29 import org.onosproject.net.flow.DefaultFlowEntry; 29 import org.onosproject.net.flow.DefaultFlowEntry;
...@@ -70,7 +70,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -70,7 +70,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
70 Bmv2ThriftClient deviceClient; 70 Bmv2ThriftClient deviceClient;
71 try { 71 try {
72 deviceClient = getDeviceClient(); 72 deviceClient = getDeviceClient();
73 - } catch (Bmv2Exception e) { 73 + } catch (Bmv2RuntimeException e) {
74 return Collections.emptyList(); 74 return Collections.emptyList();
75 } 75 }
76 76
...@@ -107,7 +107,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -107,7 +107,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
107 tableEntryIdsMap.put(rule, entryId); 107 tableEntryIdsMap.put(rule, entryId);
108 deviceEntriesMap.put(rule, new DefaultFlowEntry( 108 deviceEntriesMap.put(rule, new DefaultFlowEntry(
109 rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0)); 109 rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
110 - } catch (Bmv2Exception e) { 110 + } catch (Bmv2RuntimeException e) {
111 log.error("Unable to update flow rule", e); 111 log.error("Unable to update flow rule", e);
112 continue; 112 continue;
113 } 113 }
...@@ -121,7 +121,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -121,7 +121,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
121 tableEntryIdsMap.put(rule, entryId); 121 tableEntryIdsMap.put(rule, entryId);
122 deviceEntriesMap.put(rule, new DefaultFlowEntry( 122 deviceEntriesMap.put(rule, new DefaultFlowEntry(
123 rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0)); 123 rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
124 - } catch (Bmv2Exception e) { 124 + } catch (Bmv2RuntimeException e) {
125 log.error("Unable to add flow rule", e); 125 log.error("Unable to add flow rule", e);
126 continue; 126 continue;
127 } 127 }
...@@ -138,7 +138,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -138,7 +138,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
138 Bmv2ThriftClient deviceClient; 138 Bmv2ThriftClient deviceClient;
139 try { 139 try {
140 deviceClient = getDeviceClient(); 140 deviceClient = getDeviceClient();
141 - } catch (Bmv2Exception e) { 141 + } catch (Bmv2RuntimeException e) {
142 return Collections.emptyList(); 142 return Collections.emptyList();
143 } 143 }
144 144
...@@ -152,7 +152,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -152,7 +152,7 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
152 152
153 try { 153 try {
154 deviceClient.deleteTableEntry(tableName, entryId); 154 deviceClient.deleteTableEntry(tableName, entryId);
155 - } catch (Bmv2Exception e) { 155 + } catch (Bmv2RuntimeException e) {
156 log.error("Unable to delete flow rule", e); 156 log.error("Unable to delete flow rule", e);
157 continue; 157 continue;
158 } 158 }
...@@ -225,10 +225,10 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour ...@@ -225,10 +225,10 @@ public class Bmv2FlowRuleDriver extends AbstractHandlerBehaviour
225 return "table" + String.valueOf(tableId); 225 return "table" + String.valueOf(tableId);
226 } 226 }
227 227
228 - private Bmv2ThriftClient getDeviceClient() throws Bmv2Exception { 228 + private Bmv2ThriftClient getDeviceClient() throws Bmv2RuntimeException {
229 try { 229 try {
230 return Bmv2ThriftClient.of(handler().data().deviceId()); 230 return Bmv2ThriftClient.of(handler().data().deviceId());
231 - } catch (Bmv2Exception e) { 231 + } catch (Bmv2RuntimeException e) {
232 log.error("Failed to connect to Bmv2 device", e); 232 log.error("Failed to connect to Bmv2 device", e);
233 throw e; 233 throw e;
234 } 234 }
......
...@@ -18,7 +18,7 @@ package org.onosproject.drivers.bmv2; ...@@ -18,7 +18,7 @@ package org.onosproject.drivers.bmv2;
18 18
19 import com.google.common.collect.ImmutableList; 19 import com.google.common.collect.ImmutableList;
20 import com.google.common.collect.Lists; 20 import com.google.common.collect.Lists;
21 -import org.onosproject.bmv2.api.Bmv2Exception; 21 +import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
22 import org.onosproject.bmv2.ctl.Bmv2ThriftClient; 22 import org.onosproject.bmv2.ctl.Bmv2ThriftClient;
23 import org.onosproject.net.DefaultAnnotations; 23 import org.onosproject.net.DefaultAnnotations;
24 import org.onosproject.net.PortNumber; 24 import org.onosproject.net.PortNumber;
...@@ -44,7 +44,7 @@ public class Bmv2PortGetterDriver extends AbstractHandlerBehaviour ...@@ -44,7 +44,7 @@ public class Bmv2PortGetterDriver extends AbstractHandlerBehaviour
44 Bmv2ThriftClient deviceClient; 44 Bmv2ThriftClient deviceClient;
45 try { 45 try {
46 deviceClient = Bmv2ThriftClient.of(handler().data().deviceId()); 46 deviceClient = Bmv2ThriftClient.of(handler().data().deviceId());
47 - } catch (Bmv2Exception e) { 47 + } catch (Bmv2RuntimeException e) {
48 log.error("Failed to connect to Bmv2 device", e); 48 log.error("Failed to connect to Bmv2 device", e);
49 return Collections.emptyList(); 49 return Collections.emptyList();
50 } 50 }
...@@ -68,7 +68,7 @@ public class Bmv2PortGetterDriver extends AbstractHandlerBehaviour ...@@ -68,7 +68,7 @@ public class Bmv2PortGetterDriver extends AbstractHandlerBehaviour
68 annotations 68 annotations
69 )); 69 ));
70 }); 70 });
71 - } catch (Bmv2Exception e) { 71 + } catch (Bmv2RuntimeException e) {
72 log.error("Unable to get port description from Bmv2 device", e); 72 log.error("Unable to get port description from Bmv2 device", e);
73 } 73 }
74 74
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.eclipsesource.json.JsonArray; 19 import com.eclipsesource.json.JsonArray;
20 import com.eclipsesource.json.JsonObject; 20 import com.eclipsesource.json.JsonObject;
...@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableList; ...@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableList;
24 import com.google.common.collect.Lists; 24 import com.google.common.collect.Lists;
25 import com.google.common.collect.Maps; 25 import com.google.common.collect.Maps;
26 import com.google.common.collect.Sets; 26 import com.google.common.collect.Sets;
27 +import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
27 28
28 import java.util.List; 29 import java.util.List;
29 import java.util.Map; 30 import java.util.Map;
...@@ -67,6 +68,7 @@ public final class Bmv2Model { ...@@ -67,6 +68,7 @@ public final class Bmv2Model {
67 */ 68 */
68 public static Bmv2Model parse(JsonObject json) { 69 public static Bmv2Model parse(JsonObject json) {
69 checkArgument(json != null, "json cannot be null"); 70 checkArgument(json != null, "json cannot be null");
71 + // TODO: implement caching, no need to parse a json if we already have the model
70 Bmv2Model model = new Bmv2Model(json); 72 Bmv2Model model = new Bmv2Model(json);
71 model.doParse(); 73 model.doParse();
72 return model; 74 return model;
...@@ -335,7 +337,27 @@ public final class Bmv2Model { ...@@ -335,7 +337,27 @@ public final class Bmv2Model {
335 Bmv2ModelField field = new Bmv2ModelField( 337 Bmv2ModelField field = new Bmv2ModelField(
336 header, header.type().field(typeName)); 338 header, header.type().field(typeName));
337 339
338 - String matchType = jKey.asObject().get("match_type").asString(); 340 + String matchTypeStr = jKey.asObject().get("match_type").asString();
341 +
342 + Bmv2MatchParam.Type matchType;
343 +
344 + switch (matchTypeStr) {
345 + case "ternary":
346 + matchType = Bmv2MatchParam.Type.TERNARY;
347 + break;
348 + case "exact":
349 + matchType = Bmv2MatchParam.Type.EXACT;
350 + break;
351 + case "lpm":
352 + matchType = Bmv2MatchParam.Type.LPM;
353 + break;
354 + case "valid":
355 + matchType = Bmv2MatchParam.Type.VALID;
356 + break;
357 + default:
358 + throw new RuntimeException(
359 + "Unable to parse match type: " + matchTypeStr);
360 + }
339 361
340 keys.add(new Bmv2ModelTableKey(matchType, field)); 362 keys.add(new Bmv2ModelTableKey(matchType, field));
341 }); 363 });
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.collect.ImmutableList; 19 import com.google.common.collect.ImmutableList;
20 import com.google.common.collect.Maps; 20 import com.google.common.collect.Maps;
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 20
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 20
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 20
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 import com.google.common.collect.ImmutableList; 20 import com.google.common.collect.ImmutableList;
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import java.util.Objects; 19 import java.util.Objects;
20 20
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 20
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,9 +14,10 @@ ...@@ -14,9 +14,10 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2.model; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.google.common.base.Objects; 19 import com.google.common.base.Objects;
20 +import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
20 21
21 import static com.google.common.base.MoreObjects.toStringHelper; 22 import static com.google.common.base.MoreObjects.toStringHelper;
22 23
...@@ -25,7 +26,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; ...@@ -25,7 +26,7 @@ import static com.google.common.base.MoreObjects.toStringHelper;
25 */ 26 */
26 public final class Bmv2ModelTableKey { 27 public final class Bmv2ModelTableKey {
27 28
28 - private final String matchType; 29 + private final Bmv2MatchParam.Type matchType;
29 private final Bmv2ModelField field; 30 private final Bmv2ModelField field;
30 31
31 /** 32 /**
...@@ -34,7 +35,7 @@ public final class Bmv2ModelTableKey { ...@@ -34,7 +35,7 @@ public final class Bmv2ModelTableKey {
34 * @param matchType match type 35 * @param matchType match type
35 * @param field field instance 36 * @param field field instance
36 */ 37 */
37 - protected Bmv2ModelTableKey(String matchType, Bmv2ModelField field) { 38 + protected Bmv2ModelTableKey(Bmv2MatchParam.Type matchType, Bmv2ModelField field) {
38 this.matchType = matchType; 39 this.matchType = matchType;
39 this.field = field; 40 this.field = field;
40 } 41 }
...@@ -45,7 +46,7 @@ public final class Bmv2ModelTableKey { ...@@ -45,7 +46,7 @@ public final class Bmv2ModelTableKey {
45 * @return a string value 46 * @return a string value
46 * TODO returns enum of match type 47 * TODO returns enum of match type
47 */ 48 */
48 - public String matchType() { 49 + public Bmv2MatchParam.Type matchType() {
49 return matchType; 50 return matchType;
50 } 51 }
51 52
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -17,4 +17,4 @@ ...@@ -17,4 +17,4 @@
17 /** 17 /**
18 * BMv2 configuration model classes. 18 * BMv2 configuration model classes.
19 */ 19 */
20 -package org.onosproject.drivers.bmv2.model;
...\ No newline at end of file ...\ No newline at end of file
20 +package org.onosproject.bmv2.api.model;
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -16,5 +16,10 @@ ...@@ -16,5 +16,10 @@
16 16
17 /** 17 /**
18 * Bmv2 API abstractions. 18 * Bmv2 API abstractions.
19 + * <p>
20 + * Bmv2 APIs are divided in two sub-packages, runtime and model.
21 + * Runtime APIs are used to represent operations that can be performed at runtime
22 + * on a Bmv2 device, while model APIs are used to describe the Bmv2 packet
23 + * processing model.
19 */ 24 */
20 package org.onosproject.bmv2.api; 25 package org.onosproject.bmv2.api;
...\ No newline at end of file ...\ No newline at end of file
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,27 +14,28 @@ ...@@ -14,27 +14,28 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 import com.google.common.base.MoreObjects; 19 import com.google.common.base.MoreObjects;
20 import com.google.common.collect.Lists; 20 import com.google.common.collect.Lists;
21 +import org.onlab.util.ImmutableByteSequence;
21 22
22 -import java.nio.ByteBuffer;
23 import java.util.Collections; 23 import java.util.Collections;
24 import java.util.List; 24 import java.util.List;
25 import java.util.Objects; 25 import java.util.Objects;
26 26
27 import static com.google.common.base.Preconditions.checkNotNull; 27 import static com.google.common.base.Preconditions.checkNotNull;
28 +import static com.google.common.base.Preconditions.checkState;
28 29
29 /** 30 /**
30 - * Bmv2 Action representation. 31 + * Bmv2 action representation.
31 */ 32 */
32 public final class Bmv2Action { 33 public final class Bmv2Action {
33 34
34 private final String name; 35 private final String name;
35 - private final List<ByteBuffer> parameters; 36 + private final List<ImmutableByteSequence> parameters;
36 37
37 - private Bmv2Action(String name, List<ByteBuffer> parameters) { 38 + private Bmv2Action(String name, List<ImmutableByteSequence> parameters) {
38 // hide constructor 39 // hide constructor
39 this.name = name; 40 this.name = name;
40 this.parameters = parameters; 41 this.parameters = parameters;
...@@ -48,7 +49,7 @@ public final class Bmv2Action { ...@@ -48,7 +49,7 @@ public final class Bmv2Action {
48 } 49 }
49 50
50 /** 51 /**
51 - * Get action name. 52 + * Return the name of this action.
52 * 53 *
53 * @return action name 54 * @return action name
54 */ 55 */
...@@ -57,11 +58,12 @@ public final class Bmv2Action { ...@@ -57,11 +58,12 @@ public final class Bmv2Action {
57 } 58 }
58 59
59 /** 60 /**
60 - * Get list of action parameters ordered as per P4 action definition. 61 + * Returns an immutable view of the ordered list of parameters of this
62 + * action.
61 * 63 *
62 - * @return List of action parameters 64 + * @return list of byte sequence
63 */ 65 */
64 - public final List<ByteBuffer> parameters() { 66 + public final List<ImmutableByteSequence> parameters() {
65 return Collections.unmodifiableList(parameters); 67 return Collections.unmodifiableList(parameters);
66 } 68 }
67 69
...@@ -96,8 +98,8 @@ public final class Bmv2Action { ...@@ -96,8 +98,8 @@ public final class Bmv2Action {
96 */ 98 */
97 public static final class Builder { 99 public static final class Builder {
98 100
99 - private String name; 101 + private String name = null;
100 - private List<ByteBuffer> parameters; 102 + private List<ImmutableByteSequence> parameters;
101 103
102 private Builder() { 104 private Builder() {
103 this.parameters = Lists.newArrayList(); 105 this.parameters = Lists.newArrayList();
...@@ -110,7 +112,7 @@ public final class Bmv2Action { ...@@ -110,7 +112,7 @@ public final class Bmv2Action {
110 * @return this 112 * @return this
111 */ 113 */
112 public Builder withName(String actionName) { 114 public Builder withName(String actionName) {
113 - this.name = actionName; 115 + this.name = checkNotNull(actionName);
114 return this; 116 return this;
115 } 117 }
116 118
...@@ -120,8 +122,8 @@ public final class Bmv2Action { ...@@ -120,8 +122,8 @@ public final class Bmv2Action {
120 * @param parameter a ByteBuffer value 122 * @param parameter a ByteBuffer value
121 * @return this 123 * @return this
122 */ 124 */
123 - public Builder addParameter(ByteBuffer parameter) { 125 + public Builder addParameter(ImmutableByteSequence parameter) {
124 - parameters.add(parameter); 126 + parameters.add(checkNotNull(parameter));
125 return this; 127 return this;
126 } 128 }
127 129
...@@ -131,7 +133,7 @@ public final class Bmv2Action { ...@@ -131,7 +133,7 @@ public final class Bmv2Action {
131 * @return a Bmv2 action 133 * @return a Bmv2 action
132 */ 134 */
133 public Bmv2Action build() { 135 public Bmv2Action build() {
134 - checkNotNull(name, "Action name not set"); 136 + checkState(name != null, "action name not set");
135 return new Bmv2Action(name, parameters); 137 return new Bmv2Action(name, parameters);
136 } 138 }
137 } 139 }
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +package org.onosproject.bmv2.api.runtime;
18 +
19 +import com.google.common.base.MoreObjects;
20 +import com.google.common.base.Objects;
21 +import org.onlab.util.ImmutableByteSequence;
22 +
23 +import static com.google.common.base.Preconditions.checkNotNull;
24 +
25 +/**
26 + * Representation of a Bmv2 exact match parameter.
27 + */
28 +public class Bmv2ExactMatchParam implements Bmv2MatchParam {
29 +
30 + private final ImmutableByteSequence value;
31 +
32 + /**
33 + * Creates a new match parameter object that matches exactly on the
34 + * given byte sequence.
35 + *
36 + * @param value a byte sequence value
37 + */
38 + public Bmv2ExactMatchParam(ImmutableByteSequence value) {
39 + this.value = checkNotNull(value, "value cannot be null");
40 + }
41 +
42 + @Override
43 + public Type type() {
44 + return Type.EXACT;
45 + }
46 +
47 + /**
48 + * Return the byte sequence value matched by this parameter.
49 + *
50 + * @return an immutable byte buffer value
51 + */
52 + public ImmutableByteSequence value() {
53 + return this.value;
54 + }
55 +
56 + @Override
57 + public int hashCode() {
58 + return Objects.hashCode(value);
59 + }
60 +
61 + @Override
62 + public boolean equals(Object obj) {
63 + if (this == obj) {
64 + return true;
65 + }
66 + if (obj == null || getClass() != obj.getClass()) {
67 + return false;
68 + }
69 + final Bmv2ExactMatchParam other = (Bmv2ExactMatchParam) obj;
70 + return Objects.equal(this.value, other.value);
71 + }
72 +
73 + @Override
74 + public String toString() {
75 + return MoreObjects.toStringHelper(this)
76 + .add("value", value)
77 + .toString();
78 + }
79 +}
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,13 +14,16 @@ ...@@ -14,13 +14,16 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 import org.onlab.util.KryoNamespace; 19 import org.onlab.util.KryoNamespace;
20 import org.onosproject.net.flow.AbstractExtension; 20 import org.onosproject.net.flow.AbstractExtension;
21 import org.onosproject.net.flow.criteria.ExtensionSelector; 21 import org.onosproject.net.flow.criteria.ExtensionSelector;
22 import org.onosproject.net.flow.criteria.ExtensionSelectorType; 22 import org.onosproject.net.flow.criteria.ExtensionSelectorType;
23 23
24 +/**
25 + * Extension selector for Bmv2 used as a wrapper for a {@link Bmv2MatchKey}.
26 + */
24 public class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector { 27 public class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector {
25 28
26 private final KryoNamespace appKryo = new KryoNamespace.Builder().build(); 29 private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,13 +14,16 @@ ...@@ -14,13 +14,16 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 import org.onlab.util.KryoNamespace; 19 import org.onlab.util.KryoNamespace;
20 import org.onosproject.net.flow.AbstractExtension; 20 import org.onosproject.net.flow.AbstractExtension;
21 import org.onosproject.net.flow.instructions.ExtensionTreatment; 21 import org.onosproject.net.flow.instructions.ExtensionTreatment;
22 import org.onosproject.net.flow.instructions.ExtensionTreatmentType; 22 import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
23 23
24 +/**
25 + * Extension treatment for Bmv2 used as a wrapper for a {@link Bmv2Action}.
26 + */
24 public class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment { 27 public class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment {
25 28
26 private final KryoNamespace appKryo = new KryoNamespace.Builder().build(); 29 private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +package org.onosproject.bmv2.api.runtime;
18 +
19 +import com.google.common.base.MoreObjects;
20 +import com.google.common.base.Objects;
21 +import org.onlab.util.ImmutableByteSequence;
22 +
23 +import static com.google.common.base.Preconditions.checkArgument;
24 +import static com.google.common.base.Preconditions.checkNotNull;
25 +
26 +/**
27 + * Representation of a Bmv2 longest prefix match (LPM) parameter.
28 + */
29 +public class Bmv2LpmMatchParam implements Bmv2MatchParam {
30 +
31 + private final ImmutableByteSequence value;
32 + private final int prefixLength;
33 +
34 + /**
35 + * Creates a new LPM parameter using the given byte sequence value and
36 + * prefix length.
37 + *
38 + * @param value a byte sequence value
39 + * @param prefixLength an integer value
40 + */
41 + public Bmv2LpmMatchParam(ImmutableByteSequence value, int prefixLength) {
42 + checkArgument(prefixLength >= 0, "prefix length cannot be negative");
43 + this.value = checkNotNull(value);
44 + this.prefixLength = prefixLength;
45 + }
46 +
47 + @Override
48 + public Bmv2MatchParam.Type type() {
49 + return Type.LPM;
50 + }
51 +
52 + /**
53 + * Returns the byte sequence value of this parameter.
54 + *
55 + * @return a byte sequence value
56 + */
57 + public ImmutableByteSequence value() {
58 + return this.value;
59 + }
60 +
61 + /**
62 + * Returns the prefix length of this parameter.
63 + *
64 + * @return an integer value
65 + */
66 + public int prefixLength() {
67 + return this.prefixLength;
68 + }
69 +
70 + @Override
71 + public int hashCode() {
72 + return Objects.hashCode(value, prefixLength);
73 + }
74 +
75 + @Override
76 + public boolean equals(Object obj) {
77 + if (this == obj) {
78 + return true;
79 + }
80 + if (obj == null || getClass() != obj.getClass()) {
81 + return false;
82 + }
83 + final Bmv2LpmMatchParam other = (Bmv2LpmMatchParam) obj;
84 + return Objects.equal(this.value, other.value)
85 + && Objects.equal(this.prefixLength, other.prefixLength);
86 + }
87 +
88 + @Override
89 + public String toString() {
90 + return MoreObjects.toStringHelper(this)
91 + .add("value", value)
92 + .add("prefixLength", prefixLength)
93 + .toString();
94 + }
95 +}
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,36 +14,28 @@ ...@@ -14,36 +14,28 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 import com.google.common.base.MoreObjects; 19 import com.google.common.base.MoreObjects;
20 import com.google.common.collect.Lists; 20 import com.google.common.collect.Lists;
21 -import org.p4.bmv2.thrift.BmMatchParam; 21 +import org.onlab.util.ImmutableByteSequence;
22 -import org.p4.bmv2.thrift.BmMatchParamExact; 22 +
23 -import org.p4.bmv2.thrift.BmMatchParamLPM;
24 -import org.p4.bmv2.thrift.BmMatchParamTernary;
25 -import org.p4.bmv2.thrift.BmMatchParamType;
26 -import org.p4.bmv2.thrift.BmMatchParamValid;
27 -
28 -import java.nio.ByteBuffer;
29 -import java.util.Arrays;
30 import java.util.Collections; 23 import java.util.Collections;
31 import java.util.List; 24 import java.util.List;
32 import java.util.Objects; 25 import java.util.Objects;
33 26
27 +import static com.google.common.base.Preconditions.checkArgument;
28 +import static com.google.common.base.Preconditions.checkNotNull;
29 +
34 /** 30 /**
35 * Bmv2 match key representation. 31 * Bmv2 match key representation.
36 */ 32 */
37 public final class Bmv2MatchKey { 33 public final class Bmv2MatchKey {
38 34
39 - private final List<BmMatchParam> matchParams; 35 + private final List<Bmv2MatchParam> matchParams;
40 36
41 - /** 37 + private Bmv2MatchKey(List<Bmv2MatchParam> matchParams) {
42 - * Creates a new match key. 38 + // ban constructor
43 - *
44 - * @param matchParams The ordered list of match parameters
45 - */
46 - private Bmv2MatchKey(List<BmMatchParam> matchParams) {
47 this.matchParams = matchParams; 39 this.matchParams = matchParams;
48 } 40 }
49 41
...@@ -52,11 +44,12 @@ public final class Bmv2MatchKey { ...@@ -52,11 +44,12 @@ public final class Bmv2MatchKey {
52 } 44 }
53 45
54 /** 46 /**
55 - * Returns the match parameters defined for this match key (read-only). 47 + * Returns an immutable view of the ordered list of match parameters of this
48 + * match key.
56 * 49 *
57 - * @return match parameters 50 + * @return list match parameters
58 */ 51 */
59 - public final List<BmMatchParam> bmMatchParams() { 52 + public final List<Bmv2MatchParam> matchParams() {
60 return Collections.unmodifiableList(matchParams); 53 return Collections.unmodifiableList(matchParams);
61 } 54 }
62 55
...@@ -90,77 +83,28 @@ public final class Bmv2MatchKey { ...@@ -90,77 +83,28 @@ public final class Bmv2MatchKey {
90 */ 83 */
91 public static final class Builder { 84 public static final class Builder {
92 85
93 - private List<BmMatchParam> matchParams; 86 + private List<Bmv2MatchParam> matchParams;
94 87
95 private Builder() { 88 private Builder() {
96 this.matchParams = Lists.newArrayList(); 89 this.matchParams = Lists.newArrayList();
97 } 90 }
98 91
99 - /** 92 + public Builder add(Bmv2MatchParam param) {
100 - * Adds an exact match parameter. 93 + this.matchParams.add(checkNotNull(param));
101 - *
102 - * @param key a ByteBuffer value
103 - * @return this
104 - */
105 - public Builder withExact(ByteBuffer key) {
106 - this.matchParams.add(
107 - new BmMatchParam(BmMatchParamType.EXACT)
108 - .setExact(new BmMatchParamExact(key)));
109 - return this;
110 - }
111 -
112 -
113 - /**
114 - * Adds a longest prefix match parameter.
115 - *
116 - * @param key a ByteBuffer value
117 - * @param prefixLength an integer value
118 - * @return this
119 - */
120 - public Builder withLpm(ByteBuffer key, int prefixLength) {
121 - this.matchParams.add(
122 - new BmMatchParam(BmMatchParamType.LPM)
123 - .setLpm(new BmMatchParamLPM(key, prefixLength)));
124 - return this;
125 - }
126 -
127 - /**
128 - * Adds a ternary match parameter.
129 - *
130 - * @param key a ByteBuffer value
131 - * @param mask an ByteBuffer value
132 - * @return this
133 - */
134 - public Builder withTernary(ByteBuffer key, ByteBuffer mask) {
135 - this.matchParams.add(
136 - new BmMatchParam(BmMatchParamType.TERNARY).
137 - setTernary(new BmMatchParamTernary(key, mask)));
138 return this; 94 return this;
139 } 95 }
140 96
141 /** 97 /**
142 * Adds a ternary match parameter where all bits are don't-care. 98 * Adds a ternary match parameter where all bits are don't-care.
143 * 99 *
144 - * @param byteLength an integer value representing the length in byte of the parameter 100 + * @param byteLength length in bytes of the parameter
145 * @return this 101 * @return this
146 */ 102 */
147 public Builder withWildcard(int byteLength) { 103 public Builder withWildcard(int byteLength) {
148 - byte[] zeros = new byte[byteLength]; 104 + checkArgument(byteLength > 0, "length must be a positive integer");
149 - Arrays.fill(zeros, (byte) 0); 105 + return add(new Bmv2TernaryMatchParam(
150 - return this.withTernary(ByteBuffer.wrap(zeros), ByteBuffer.wrap(zeros)); 106 + ImmutableByteSequence.ofZeros(byteLength),
151 - } 107 + ImmutableByteSequence.ofZeros(byteLength)));
152 -
153 - /**
154 - * Adds a valid match parameter.
155 - *
156 - * @param key a boolean value
157 - * @return this
158 - */
159 - public Builder withValid(boolean key) {
160 - this.matchParams.add(
161 - new BmMatchParam(BmMatchParamType.VALID)
162 - .setValid(new BmMatchParamValid(key)));
163 - return this;
164 } 108 }
165 109
166 /** 110 /**
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +package org.onosproject.bmv2.api.runtime;
18 +
19 +/**
20 + * Representation of a Bmv2 match parameter.
21 + */
22 +public interface Bmv2MatchParam {
23 +
24 + /**
25 + * Returns the match type of this parameter.
26 + *
27 + * @return a match type value
28 + */
29 + Type type();
30 +
31 + /**
32 + * Bmv2 match types.
33 + */
34 + enum Type {
35 + /**
36 + * Exact match type.
37 + */
38 + EXACT,
39 + /**
40 + * Ternary match type.
41 + */
42 + TERNARY,
43 + /**
44 + * Longest-prefix match type.
45 + */
46 + LPM,
47 + /**
48 + * Valid match type.
49 + */
50 + VALID;
51 + }
52 +}
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 import com.google.common.base.MoreObjects; 19 import com.google.common.base.MoreObjects;
20 import org.p4.bmv2.thrift.DevMgrPortInfo; 20 import org.p4.bmv2.thrift.DevMgrPortInfo;
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,14 +14,18 @@ ...@@ -14,14 +14,18 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 18
19 /** 19 /**
20 - * General Bmv2 exception. 20 + * General exception of the Bmv2 runtime APIs.
21 */ 21 */
22 -public class Bmv2Exception extends Exception { 22 +public class Bmv2RuntimeException extends Exception {
23 23
24 - public Bmv2Exception(String message, Throwable cause) { 24 + public Bmv2RuntimeException(String message, Throwable cause) {
25 super(message, cause); 25 super(message, cause);
26 } 26 }
27 +
28 + public Bmv2RuntimeException(String message) {
29 + super(message);
30 + }
27 } 31 }
......
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,12 +14,13 @@ ...@@ -14,12 +14,13 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.bmv2.api; 17 +package org.onosproject.bmv2.api.runtime;
18 -
19 -import com.google.common.base.Preconditions;
20 18
21 import java.util.Objects; 19 import java.util.Objects;
22 20
21 +import static com.google.common.base.Preconditions.checkArgument;
22 +import static com.google.common.base.Preconditions.checkNotNull;
23 +
23 /** 24 /**
24 * Bmv2 representation of a table entry. 25 * Bmv2 representation of a table entry.
25 */ 26 */
...@@ -43,6 +44,11 @@ public final class Bmv2TableEntry { ...@@ -43,6 +44,11 @@ public final class Bmv2TableEntry {
43 this.timeout = timeout; 44 this.timeout = timeout;
44 } 45 }
45 46
47 + /**
48 + * Returns a new Bmv2 table entry builder.
49 + *
50 + * @return a new builder.
51 + */
46 public static Builder builder() { 52 public static Builder builder() {
47 return new Builder(); 53 return new Builder();
48 } 54 }
...@@ -159,7 +165,7 @@ public final class Bmv2TableEntry { ...@@ -159,7 +165,7 @@ public final class Bmv2TableEntry {
159 * @return this 165 * @return this
160 */ 166 */
161 public Builder withTableName(String tableName) { 167 public Builder withTableName(String tableName) {
162 - this.tableName = tableName; 168 + this.tableName = checkNotNull(tableName, "table name cannot be null");
163 return this; 169 return this;
164 } 170 }
165 171
...@@ -170,7 +176,7 @@ public final class Bmv2TableEntry { ...@@ -170,7 +176,7 @@ public final class Bmv2TableEntry {
170 * @return this 176 * @return this
171 */ 177 */
172 public Builder withMatchKey(Bmv2MatchKey matchKey) { 178 public Builder withMatchKey(Bmv2MatchKey matchKey) {
173 - this.matchKey = matchKey; 179 + this.matchKey = checkNotNull(matchKey, "match key cannot be null");
174 return this; 180 return this;
175 } 181 }
176 182
...@@ -181,11 +187,12 @@ public final class Bmv2TableEntry { ...@@ -181,11 +187,12 @@ public final class Bmv2TableEntry {
181 * @return this 187 * @return this
182 */ 188 */
183 public Builder withAction(Bmv2Action action) { 189 public Builder withAction(Bmv2Action action) {
184 - this.action = action; 190 + this.action = checkNotNull(action, "action cannot be null");
185 return this; 191 return this;
186 } 192 }
187 193
188 public Builder withPriority(int priority) { 194 public Builder withPriority(int priority) {
195 + checkArgument(priority >= 0, "priority cannot be negative");
189 this.priority = priority; 196 this.priority = priority;
190 return this; 197 return this;
191 } 198 }
...@@ -197,6 +204,7 @@ public final class Bmv2TableEntry { ...@@ -197,6 +204,7 @@ public final class Bmv2TableEntry {
197 * @return this 204 * @return this
198 */ 205 */
199 public Builder withTimeout(double timeout) { 206 public Builder withTimeout(double timeout) {
207 + checkArgument(timeout > 0, "timeout must be a positive non-zero value");
200 this.timeout = timeout; 208 this.timeout = timeout;
201 return this; 209 return this;
202 } 210 }
...@@ -207,10 +215,6 @@ public final class Bmv2TableEntry { ...@@ -207,10 +215,6 @@ public final class Bmv2TableEntry {
207 * @return a new table entry object 215 * @return a new table entry object
208 */ 216 */
209 public Bmv2TableEntry build() { 217 public Bmv2TableEntry build() {
210 - Preconditions.checkNotNull(tableName);
211 - Preconditions.checkNotNull(matchKey);
212 - Preconditions.checkNotNull(action);
213 -
214 return new Bmv2TableEntry(tableName, matchKey, action, priority, 218 return new Bmv2TableEntry(tableName, matchKey, action, priority,
215 timeout); 219 timeout);
216 220
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +package org.onosproject.bmv2.api.runtime;
18 +
19 +import com.google.common.base.MoreObjects;
20 +import com.google.common.base.Objects;
21 +import org.onlab.util.ImmutableByteSequence;
22 +
23 +import static com.google.common.base.Preconditions.checkNotNull;
24 +import static com.google.common.base.Preconditions.checkState;
25 +
26 +/**
27 + * Representation of a Bmv2 ternary match parameter.
28 + */
29 +public class Bmv2TernaryMatchParam implements Bmv2MatchParam {
30 +
31 + private final ImmutableByteSequence value;
32 + private final ImmutableByteSequence mask;
33 +
34 + /**
35 + * Creates a new ternary match parameter using the given byte sequences of
36 + * value and mask.
37 + *
38 + * @param value a byte sequence value
39 + * @param mask a byte sequence value
40 + */
41 + public Bmv2TernaryMatchParam(ImmutableByteSequence value,
42 + ImmutableByteSequence mask) {
43 + this.value = checkNotNull(value, "value cannot be null");
44 + this.mask = checkNotNull(mask, "value cannot be null");
45 + checkState(value.size() == mask.size(),
46 + "value and mask must have equal size");
47 + }
48 +
49 + @Override
50 + public Type type() {
51 + return Type.TERNARY;
52 + }
53 +
54 + /**
55 + * Returns the byte sequence value of by this parameter.
56 + *
57 + * @return a byte sequence value
58 + */
59 + public ImmutableByteSequence value() {
60 + return this.value;
61 + }
62 +
63 + /**
64 + * Returns the byte sequence mask of by this parameter.
65 + *
66 + * @return a byte sequence value
67 + */
68 + public ImmutableByteSequence mask() {
69 + return this.mask;
70 + }
71 +
72 + @Override
73 + public int hashCode() {
74 + return Objects.hashCode(value, mask);
75 + }
76 +
77 + @Override
78 + public boolean equals(Object obj) {
79 + if (this == obj) {
80 + return true;
81 + }
82 + if (obj == null || getClass() != obj.getClass()) {
83 + return false;
84 + }
85 + final Bmv2TernaryMatchParam other = (Bmv2TernaryMatchParam) obj;
86 + return Objects.equal(this.value, other.value)
87 + && Objects.equal(this.mask, other.mask);
88 + }
89 +
90 + @Override
91 + public String toString() {
92 + return MoreObjects.toStringHelper(this)
93 + .add("value", value)
94 + .add("mask", mask)
95 + .toString();
96 + }
97 +}
...\ No newline at end of file ...\ No newline at end of file
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +package org.onosproject.bmv2.api.runtime;
18 +
19 +
20 +import com.google.common.base.MoreObjects;
21 +
22 +import java.util.Objects;
23 +
24 +/**
25 + * Representation of a Bmv2 valid match parameter.
26 + */
27 +public class Bmv2ValidMatchParam implements Bmv2MatchParam {
28 +
29 + private final boolean flag;
30 +
31 + /**
32 + * Creates a new valid match parameter using the given boolean flag.
33 + *
34 + * @param flag a boolean value
35 + */
36 + public Bmv2ValidMatchParam(boolean flag) {
37 + this.flag = flag;
38 + }
39 +
40 + @Override
41 + public Type type() {
42 + return Type.VALID;
43 + }
44 +
45 + /**
46 + * Returns the boolean flag of this parameter.
47 + *
48 + * @return a boolean value
49 + */
50 + public boolean flag() {
51 + return flag;
52 + }
53 +
54 + @Override
55 + public int hashCode() {
56 + return Objects.hashCode(flag);
57 + }
58 +
59 + @Override
60 + public boolean equals(Object obj) {
61 + if (this == obj) {
62 + return true;
63 + }
64 + if (obj == null || getClass() != obj.getClass()) {
65 + return false;
66 + }
67 + final Bmv2ValidMatchParam other = (Bmv2ValidMatchParam) obj;
68 + return this.flag == other.flag;
69 + }
70 +
71 + @Override
72 + public String toString() {
73 + return MoreObjects.toStringHelper(this)
74 + .add("flag", flag)
75 + .toString();
76 + }
77 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
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 + */
16 +
17 +/**
18 + * Bmv2 runtime APIs.
19 + */
20 +package org.onosproject.bmv2.api.runtime;
...\ No newline at end of file ...\ No newline at end of file
1 /* 1 /*
2 - * Copyright 2014-2016 Open Networking Laboratory 2 + * Copyright 2016-present Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -14,17 +14,14 @@ ...@@ -14,17 +14,14 @@
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 16
17 -package org.onosproject.drivers.bmv2; 17 +package org.onosproject.bmv2.api.model;
18 18
19 import com.eclipsesource.json.Json; 19 import com.eclipsesource.json.Json;
20 import com.eclipsesource.json.JsonObject; 20 import com.eclipsesource.json.JsonObject;
21 import com.google.common.testing.EqualsTester; 21 import com.google.common.testing.EqualsTester;
22 import org.junit.Before; 22 import org.junit.Before;
23 import org.junit.Test; 23 import org.junit.Test;
24 -import org.onosproject.drivers.bmv2.model.Bmv2Model; 24 +import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
25 -import org.onosproject.drivers.bmv2.model.Bmv2ModelAction;
26 -import org.onosproject.drivers.bmv2.model.Bmv2ModelHeaderType;
27 -import org.onosproject.drivers.bmv2.model.Bmv2ModelTable;
28 25
29 import java.io.BufferedReader; 26 import java.io.BufferedReader;
30 import java.io.InputStreamReader; 27 import java.io.InputStreamReader;
...@@ -156,7 +153,7 @@ public class Bmv2ModelTest { ...@@ -156,7 +153,7 @@ public class Bmv2ModelTest {
156 153
157 // key match type 154 // key match type
158 assertThat("Incorrect value for table key match type", 155 assertThat("Incorrect value for table key match type",
159 - table0.keys().get(0).matchType(), is(equalTo("ternary"))); 156 + table0.keys().get(0).matchType(), is(equalTo(Bmv2MatchParam.Type.TERNARY)));
160 157
161 // header type 158 // header type
162 assertThat("Incorrect value for table key header type", 159 assertThat("Incorrect value for table key header type",
......
...@@ -21,6 +21,7 @@ import com.google.common.base.Objects; ...@@ -21,6 +21,7 @@ import com.google.common.base.Objects;
21 21
22 import java.nio.ByteBuffer; 22 import java.nio.ByteBuffer;
23 import java.nio.ByteOrder; 23 import java.nio.ByteOrder;
24 +import java.util.Arrays;
24 25
25 import static com.google.common.base.Preconditions.checkArgument; 26 import static com.google.common.base.Preconditions.checkArgument;
26 import static org.apache.commons.lang3.ArrayUtils.reverse; 27 import static org.apache.commons.lang3.ArrayUtils.reverse;
...@@ -62,7 +63,7 @@ public final class ImmutableByteSequence { ...@@ -62,7 +63,7 @@ public final class ImmutableByteSequence {
62 * the passed byte array. 63 * the passed byte array.
63 * 64 *
64 * @param original a byte array value 65 * @param original a byte array value
65 - * @return a new immutable byte buffer 66 + * @return a new immutable byte sequence
66 */ 67 */
67 public static ImmutableByteSequence copyFrom(byte[] original) { 68 public static ImmutableByteSequence copyFrom(byte[] original) {
68 checkArgument(original != null && original.length > 0, 69 checkArgument(original != null && original.length > 0,
...@@ -101,7 +102,7 @@ public final class ImmutableByteSequence { ...@@ -101,7 +102,7 @@ public final class ImmutableByteSequence {
101 * Creates a new byte sequence of 8 bytes containing the given long value. 102 * Creates a new byte sequence of 8 bytes containing the given long value.
102 * 103 *
103 * @param original a long value 104 * @param original a long value
104 - * @return a new immutable byte buffer 105 + * @return a new immutable byte sequence
105 */ 106 */
106 public static ImmutableByteSequence copyFrom(long original) { 107 public static ImmutableByteSequence copyFrom(long original) {
107 return new ImmutableByteSequence( 108 return new ImmutableByteSequence(
...@@ -112,7 +113,7 @@ public final class ImmutableByteSequence { ...@@ -112,7 +113,7 @@ public final class ImmutableByteSequence {
112 * Creates a new byte sequence of 4 bytes containing the given int value. 113 * Creates a new byte sequence of 4 bytes containing the given int value.
113 * 114 *
114 * @param original an int value 115 * @param original an int value
115 - * @return a new immutable byte buffer 116 + * @return a new immutable byte sequence
116 */ 117 */
117 public static ImmutableByteSequence copyFrom(int original) { 118 public static ImmutableByteSequence copyFrom(int original) {
118 return new ImmutableByteSequence( 119 return new ImmutableByteSequence(
...@@ -123,7 +124,7 @@ public final class ImmutableByteSequence { ...@@ -123,7 +124,7 @@ public final class ImmutableByteSequence {
123 * Creates a new byte sequence of 2 bytes containing the given short value. 124 * Creates a new byte sequence of 2 bytes containing the given short value.
124 * 125 *
125 * @param original a short value 126 * @param original a short value
126 - * @return a new immutable byte buffer 127 + * @return a new immutable byte sequence
127 */ 128 */
128 public static ImmutableByteSequence copyFrom(short original) { 129 public static ImmutableByteSequence copyFrom(short original) {
129 return new ImmutableByteSequence( 130 return new ImmutableByteSequence(
...@@ -134,7 +135,7 @@ public final class ImmutableByteSequence { ...@@ -134,7 +135,7 @@ public final class ImmutableByteSequence {
134 * Creates a new byte sequence of 1 byte containing the given value. 135 * Creates a new byte sequence of 1 byte containing the given value.
135 * 136 *
136 * @param original a byte value 137 * @param original a byte value
137 - * @return a new immutable byte buffer 138 + * @return a new immutable byte sequence
138 */ 139 */
139 public static ImmutableByteSequence copyFrom(byte original) { 140 public static ImmutableByteSequence copyFrom(byte original) {
140 return new ImmutableByteSequence( 141 return new ImmutableByteSequence(
...@@ -142,6 +143,30 @@ public final class ImmutableByteSequence { ...@@ -142,6 +143,30 @@ public final class ImmutableByteSequence {
142 } 143 }
143 144
144 /** 145 /**
146 + * Creates a new byte sequence of the given size where alla bits are 0.
147 + *
148 + * @param size number of bytes
149 + * @return a new immutable byte sequence
150 + */
151 + public static ImmutableByteSequence ofZeros(int size) {
152 + byte[] bytes = new byte[size];
153 + Arrays.fill(bytes, (byte) 0);
154 + return new ImmutableByteSequence(ByteBuffer.wrap(bytes));
155 + }
156 +
157 + /**
158 + * Creates a new byte sequence of the given size where alla bits are 1.
159 + *
160 + * @param size number of bytes
161 + * @return a new immutable byte sequence
162 + */
163 + public static ImmutableByteSequence ofOnes(int size) {
164 + byte[] bytes = new byte[size];
165 + Arrays.fill(bytes, (byte) 0xFF);
166 + return new ImmutableByteSequence(ByteBuffer.wrap(bytes));
167 + }
168 +
169 + /**
145 * Returns a view of this sequence as a read-only {@link ByteBuffer}. 170 * Returns a view of this sequence as a read-only {@link ByteBuffer}.
146 * <p> 171 * <p>
147 * The returned buffer will have position 0, while limit and capacity will 172 * The returned buffer will have position 0, while limit and capacity will
......