Carmelo Cascone
Committed by Thomas Vachuska

Polished BMv2 protocol module

- Improved and fixed typos in javadocs
- Added missing beta API annotations
- Refactored the default interpreter implementation

Change-Id: Ibfb21d31415d8f25cc67307f8bea2871951c9a8f
Showing 29 changed files with 129 additions and 71 deletions
...@@ -18,6 +18,7 @@ package org.onosproject.bmv2.api.context; ...@@ -18,6 +18,7 @@ package org.onosproject.bmv2.api.context;
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;
21 +import com.google.common.annotations.Beta;
21 import com.google.common.base.MoreObjects; 22 import com.google.common.base.MoreObjects;
22 import com.google.common.base.Objects; 23 import com.google.common.base.Objects;
23 import com.google.common.collect.ImmutableList; 24 import com.google.common.collect.ImmutableList;
...@@ -36,6 +37,7 @@ import static com.google.common.base.Preconditions.checkArgument; ...@@ -36,6 +37,7 @@ import static com.google.common.base.Preconditions.checkArgument;
36 /** 37 /**
37 * Default implementation of a BMv2 configuration backed by a JSON object. 38 * Default implementation of a BMv2 configuration backed by a JSON object.
38 */ 39 */
40 +@Beta
39 public final class Bmv2DefaultConfiguration implements Bmv2Configuration { 41 public final class Bmv2DefaultConfiguration implements Bmv2Configuration {
40 42
41 private final JsonObject json; 43 private final JsonObject json;
......
...@@ -37,9 +37,9 @@ public interface Bmv2FlowRuleTranslator { ...@@ -37,9 +37,9 @@ public interface Bmv2FlowRuleTranslator {
37 * <li> action: is built using the context interpreter 37 * <li> action: is built using the context interpreter
38 * {@link Bmv2Interpreter#mapTreatment(org.onosproject.net.flow.TrafficTreatment, Bmv2Configuration) 38 * {@link Bmv2Interpreter#mapTreatment(org.onosproject.net.flow.TrafficTreatment, Bmv2Configuration)
39 * treatment mapping function} or the flow rule 39 * treatment mapping function} or the flow rule
40 - * {@link org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment} extension treatment} (if any). 40 + * {@link org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment extension treatment} (if any).
41 - * <li> timeout: if the table supports timeout, use the same as the flow rule, otherwise none (i.e. permanent 41 + * <li> timeout: if the table supports timeout, use the same as the flow rule, otherwise none (i.e. returns a
42 - * entry). 42 + * permanent entry).
43 * </ul> 43 * </ul>
44 * 44 *
45 * @param rule a flow rule 45 * @param rule a flow rule
......
...@@ -16,10 +16,13 @@ ...@@ -16,10 +16,13 @@
16 16
17 package org.onosproject.bmv2.api.context; 17 package org.onosproject.bmv2.api.context;
18 18
19 +import com.google.common.annotations.Beta;
20 +
19 /** 21 /**
20 * BMv2 flow rule translator exception. 22 * BMv2 flow rule translator exception.
21 */ 23 */
22 -public class Bmv2FlowRuleTranslatorException extends Exception { 24 +@Beta
25 +public final class Bmv2FlowRuleTranslatorException extends Exception {
23 26
24 public Bmv2FlowRuleTranslatorException(String msg) { 27 public Bmv2FlowRuleTranslatorException(String msg) {
25 super(msg); 28 super(msg);
......
...@@ -16,10 +16,13 @@ ...@@ -16,10 +16,13 @@
16 16
17 package org.onosproject.bmv2.api.context; 17 package org.onosproject.bmv2.api.context;
18 18
19 +import com.google.common.annotations.Beta;
20 +
19 /** 21 /**
20 * A BMv2 interpreter exception. 22 * A BMv2 interpreter exception.
21 */ 23 */
22 -public class Bmv2InterpreterException extends Exception { 24 +@Beta
25 +public final class Bmv2InterpreterException extends Exception {
23 26
24 public Bmv2InterpreterException(String message) { 27 public Bmv2InterpreterException(String message) {
25 super(message); 28 super(message);
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.collect.Lists; 21 import com.google.common.collect.Lists;
21 import org.onlab.util.ImmutableByteSequence; 22 import org.onlab.util.ImmutableByteSequence;
...@@ -30,6 +31,7 @@ import static com.google.common.base.Preconditions.checkState; ...@@ -30,6 +31,7 @@ import static com.google.common.base.Preconditions.checkState;
30 /** 31 /**
31 * An action of a BMv2 match-action table entry. 32 * An action of a BMv2 match-action table entry.
32 */ 33 */
34 +@Beta
33 public final class Bmv2Action { 35 public final class Bmv2Action {
34 36
35 private final String name; 37 private final String name;
...@@ -58,8 +60,7 @@ public final class Bmv2Action { ...@@ -58,8 +60,7 @@ public final class Bmv2Action {
58 } 60 }
59 61
60 /** 62 /**
61 - * Returns an immutable view of the ordered list of parameters of this 63 + * Returns an immutable view of the list of parameters of this action.
62 - * action.
63 * 64 *
64 * @return list of byte sequence 65 * @return list of byte sequence
65 */ 66 */
...@@ -106,7 +107,7 @@ public final class Bmv2Action { ...@@ -106,7 +107,7 @@ public final class Bmv2Action {
106 } 107 }
107 108
108 /** 109 /**
109 - * Set the action name. 110 + * Sets the action name.
110 * 111 *
111 * @param actionName a string value 112 * @param actionName a string value
112 * @return this 113 * @return this
...@@ -117,7 +118,7 @@ public final class Bmv2Action { ...@@ -117,7 +118,7 @@ public final class Bmv2Action {
117 } 118 }
118 119
119 /** 120 /**
120 - * Add a parameter at the end of the parameters list. 121 + * Adds a parameter at the end of the parameters list.
121 * 122 *
122 * @param parameter a ByteBuffer value 123 * @param parameter a ByteBuffer value
123 * @return this 124 * @return this
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.Objects; 20 import com.google.common.base.Objects;
20 import org.onosproject.net.DeviceId; 21 import org.onosproject.net.DeviceId;
21 22
...@@ -27,8 +28,9 @@ import java.util.regex.Pattern; ...@@ -27,8 +28,9 @@ import java.util.regex.Pattern;
27 import static com.google.common.base.Preconditions.checkNotNull; 28 import static com.google.common.base.Preconditions.checkNotNull;
28 29
29 /** 30 /**
30 - * Representation of a BMv2 device. 31 + * A BMv2 device.
31 */ 32 */
33 +@Beta
32 public final class Bmv2Device { 34 public final class Bmv2Device {
33 35
34 public static final String N_A = "n/a"; 36 public static final String N_A = "n/a";
...@@ -47,9 +49,9 @@ public final class Bmv2Device { ...@@ -47,9 +49,9 @@ public final class Bmv2Device {
47 /** 49 /**
48 * Creates a new BMv2 device object. 50 * Creates a new BMv2 device object.
49 * 51 *
50 - * @param thriftServerHost the hostname / IP address of the Thrift runtime server running on the device 52 + * @param thriftServerHost the hostname or IP address of the Thrift RPC server running on the device
51 - * @param thriftServerPort the port of the Thrift runtime server running on the device 53 + * @param thriftServerPort the listening port used by the device Thrift RPC server
52 - * @param internalDeviceId the internal device ID number 54 + * @param internalDeviceId the internal numeric device ID
53 */ 55 */
54 public Bmv2Device(String thriftServerHost, int thriftServerPort, int internalDeviceId) { 56 public Bmv2Device(String thriftServerHost, int thriftServerPort, int internalDeviceId) {
55 this.thriftServerHost = checkNotNull(thriftServerHost, "host cannot be null"); 57 this.thriftServerHost = checkNotNull(thriftServerHost, "host cannot be null");
...@@ -68,7 +70,7 @@ public final class Bmv2Device { ...@@ -68,7 +70,7 @@ public final class Bmv2Device {
68 } 70 }
69 71
70 /** 72 /**
71 - * Returns the hostname (or IP address) of the Thrift runtime server running on the device. 73 + * Returns the hostname or IP address of the Thrift RPC server running on the device.
72 * 74 *
73 * @return a string value 75 * @return a string value
74 */ 76 */
...@@ -77,7 +79,7 @@ public final class Bmv2Device { ...@@ -77,7 +79,7 @@ public final class Bmv2Device {
77 } 79 }
78 80
79 /** 81 /**
80 - * Returns the port of the Thrift runtime server running on the device. 82 + * Returns the listening port of the Thrift RPC server running on the device.
81 * 83 *
82 * @return an integer value 84 * @return an integer value
83 */ 85 */
...@@ -102,7 +104,6 @@ public final class Bmv2Device { ...@@ -102,7 +104,6 @@ public final class Bmv2Device {
102 */ 104 */
103 public DeviceId asDeviceId() { 105 public DeviceId asDeviceId() {
104 try { 106 try {
105 - // TODO: include internalDeviceId number in the deviceId URI
106 return DeviceId.deviceId(new URI(SCHEME, this.thriftServerHost + ":" + this.thriftServerPort, 107 return DeviceId.deviceId(new URI(SCHEME, this.thriftServerHost + ":" + this.thriftServerPort,
107 String.valueOf(this.internalDeviceId))); 108 String.valueOf(this.internalDeviceId)));
108 } catch (URISyntaxException e) { 109 } catch (URISyntaxException e) {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.apache.commons.lang3.tuple.Pair; 20 import org.apache.commons.lang3.tuple.Pair;
20 import org.onlab.util.ImmutableByteSequence; 21 import org.onlab.util.ImmutableByteSequence;
21 import org.onosproject.net.DeviceId; 22 import org.onosproject.net.DeviceId;
...@@ -26,6 +27,7 @@ import java.util.List; ...@@ -26,6 +27,7 @@ import java.util.List;
26 /** 27 /**
27 * An agent to control a BMv2 device. 28 * An agent to control a BMv2 device.
28 */ 29 */
30 +@Beta
29 public interface Bmv2DeviceAgent { 31 public interface Bmv2DeviceAgent {
30 32
31 /** 33 /**
...@@ -43,20 +45,20 @@ public interface Bmv2DeviceAgent { ...@@ -43,20 +45,20 @@ public interface Bmv2DeviceAgent {
43 boolean ping(); 45 boolean ping();
44 46
45 /** 47 /**
46 - * Adds a new table entry. 48 + * Adds a new table entry. If successful returns a table-specific identifier of the installed entry.
47 * 49 *
48 - * @param entry a table entry value 50 + * @param entry a table entry
49 - * @return table-specific entry ID 51 + * @return a long value
50 * @throws Bmv2RuntimeException if any error occurs 52 * @throws Bmv2RuntimeException if any error occurs
51 */ 53 */
52 long addTableEntry(Bmv2TableEntry entry) throws Bmv2RuntimeException; 54 long addTableEntry(Bmv2TableEntry entry) throws Bmv2RuntimeException;
53 55
54 /** 56 /**
55 - * Modifies an existing table entry by updating its action. 57 + * Modifies an existing entry at by updating its action.
56 * 58 *
57 - * @param tableName string value of table name 59 + * @param tableName a string value
58 - * @param entryId long value of entry ID 60 + * @param entryId a long value
59 - * @param action an action value 61 + * @param action an action
60 * @throws Bmv2RuntimeException if any error occurs 62 * @throws Bmv2RuntimeException if any error occurs
61 */ 63 */
62 void modifyTableEntry(String tableName, long entryId, Bmv2Action action) throws Bmv2RuntimeException; 64 void modifyTableEntry(String tableName, long entryId, Bmv2Action action) throws Bmv2RuntimeException;
...@@ -64,16 +66,16 @@ public interface Bmv2DeviceAgent { ...@@ -64,16 +66,16 @@ public interface Bmv2DeviceAgent {
64 /** 66 /**
65 * Deletes currently installed entry. 67 * Deletes currently installed entry.
66 * 68 *
67 - * @param tableName string value of table name 69 + * @param tableName a string value
68 - * @param entryId long value of entry ID 70 + * @param entryId a long value
69 * @throws Bmv2RuntimeException if any error occurs 71 * @throws Bmv2RuntimeException if any error occurs
70 */ 72 */
71 void deleteTableEntry(String tableName, long entryId) throws Bmv2RuntimeException; 73 void deleteTableEntry(String tableName, long entryId) throws Bmv2RuntimeException;
72 74
73 /** 75 /**
74 - * Sets table default action. 76 + * Sets a default action for the given table.
75 * 77 *
76 - * @param tableName string value of table name 78 + * @param tableName a string value
77 * @param action an action value 79 * @param action an action value
78 * @throws Bmv2RuntimeException if any error occurs 80 * @throws Bmv2RuntimeException if any error occurs
79 */ 81 */
...@@ -97,7 +99,7 @@ public interface Bmv2DeviceAgent { ...@@ -97,7 +99,7 @@ public interface Bmv2DeviceAgent {
97 List<Bmv2ParsedTableEntry> getTableEntries(String tableName) throws Bmv2RuntimeException; 99 List<Bmv2ParsedTableEntry> getTableEntries(String tableName) throws Bmv2RuntimeException;
98 100
99 /** 101 /**
100 - * Requests the device to transmit a given byte sequence over the given port. 102 + * Requests the device to transmit a given packet over the given port.
101 * 103 *
102 * @param portNumber a port number 104 * @param portNumber a port number
103 * @param packet a byte sequence 105 * @param packet a byte sequence
...@@ -106,7 +108,7 @@ public interface Bmv2DeviceAgent { ...@@ -106,7 +108,7 @@ public interface Bmv2DeviceAgent {
106 void transmitPacket(int portNumber, ImmutableByteSequence packet) throws Bmv2RuntimeException; 108 void transmitPacket(int portNumber, ImmutableByteSequence packet) throws Bmv2RuntimeException;
107 109
108 /** 110 /**
109 - * Resets the state of the switch (e.g. delete all entries, etc.). 111 + * Resets the state of the switch.
110 * 112 *
111 * @throws Bmv2RuntimeException if any error occurs 113 * @throws Bmv2RuntimeException if any error occurs
112 */ 114 */
...@@ -121,7 +123,7 @@ public interface Bmv2DeviceAgent { ...@@ -121,7 +123,7 @@ public interface Bmv2DeviceAgent {
121 String dumpJsonConfig() throws Bmv2RuntimeException; 123 String dumpJsonConfig() throws Bmv2RuntimeException;
122 124
123 /** 125 /**
124 - * Returns the md5 sum of the JSON-formatted model configuration currently used to process packets. 126 + * Returns the MD5 sum of the JSON-formatted configuration currently used to process packets.
125 * 127 *
126 * @return a string value 128 * @return a string value
127 * @throws Bmv2RuntimeException if any error occurs 129 * @throws Bmv2RuntimeException if any error occurs
...@@ -139,7 +141,7 @@ public interface Bmv2DeviceAgent { ...@@ -139,7 +141,7 @@ public interface Bmv2DeviceAgent {
139 Pair<Long, Long> readTableEntryCounter(String tableName, long entryId) throws Bmv2RuntimeException; 141 Pair<Long, Long> readTableEntryCounter(String tableName, long entryId) throws Bmv2RuntimeException;
140 142
141 /** 143 /**
142 - * Returns the counter values for a given counter and index. 144 + * Returns the values of a given counter instance.
143 * 145 *
144 * @param counterName a counter name 146 * @param counterName a counter name
145 * @param index an integer value 147 * @param index an integer value
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onlab.util.ImmutableByteSequence; 22 import org.onlab.util.ImmutableByteSequence;
...@@ -23,8 +24,9 @@ import org.onlab.util.ImmutableByteSequence; ...@@ -23,8 +24,9 @@ import org.onlab.util.ImmutableByteSequence;
23 import static com.google.common.base.Preconditions.checkNotNull; 24 import static com.google.common.base.Preconditions.checkNotNull;
24 25
25 /** 26 /**
26 - * Representation of a BMv2 exact match parameter. 27 + * A BMv2 exact match parameter.
27 */ 28 */
29 +@Beta
28 public final class Bmv2ExactMatchParam implements Bmv2MatchParam { 30 public final class Bmv2ExactMatchParam implements Bmv2MatchParam {
29 31
30 private final ImmutableByteSequence value; 32 private final ImmutableByteSequence value;
...@@ -45,7 +47,7 @@ public final class Bmv2ExactMatchParam implements Bmv2MatchParam { ...@@ -45,7 +47,7 @@ public final class Bmv2ExactMatchParam implements Bmv2MatchParam {
45 } 47 }
46 48
47 /** 49 /**
48 - * Return the byte sequence value matched by this parameter. 50 + * Return the byte sequence matched by this parameter.
49 * 51 *
50 * @return an immutable byte buffer value 52 * @return an immutable byte buffer value
51 */ 53 */
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onlab.util.KryoNamespace; 22 import org.onlab.util.KryoNamespace;
...@@ -31,6 +32,7 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -31,6 +32,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
31 /** 32 /**
32 * Extension selector for BMv2 used as a wrapper for multiple BMv2 match parameters. 33 * Extension selector for BMv2 used as a wrapper for multiple BMv2 match parameters.
33 */ 34 */
35 +@Beta
34 public final class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector { 36 public final class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector {
35 37
36 private final KryoNamespace appKryo = new KryoNamespace.Builder() 38 private final KryoNamespace appKryo = new KryoNamespace.Builder()
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onlab.util.KryoNamespace; 22 import org.onlab.util.KryoNamespace;
...@@ -28,16 +29,27 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten ...@@ -28,16 +29,27 @@ import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.Exten
28 /** 29 /**
29 * Extension treatment for BMv2 used as a wrapper for a {@link Bmv2Action}. 30 * Extension treatment for BMv2 used as a wrapper for a {@link Bmv2Action}.
30 */ 31 */
32 +@Beta
31 public final class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment { 33 public final class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment {
32 34
33 private final KryoNamespace appKryo = new KryoNamespace.Builder().build(); 35 private final KryoNamespace appKryo = new KryoNamespace.Builder().build();
34 private Bmv2Action action; 36 private Bmv2Action action;
35 37
38 + /**
39 + * Creates a new extension treatment for the given BMv2 action.
40 + *
41 + * @param action an action
42 + */
36 public Bmv2ExtensionTreatment(Bmv2Action action) { 43 public Bmv2ExtensionTreatment(Bmv2Action action) {
37 this.action = action; 44 this.action = action;
38 } 45 }
39 46
40 - public Bmv2Action getAction() { 47 + /**
48 + * Returns the action contained by this extension selector.
49 + *
50 + * @return an action
51 + */
52 + public Bmv2Action action() {
41 return action; 53 return action;
42 } 54 }
43 55
......
...@@ -16,15 +16,17 @@ ...@@ -16,15 +16,17 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.Objects; 20 import com.google.common.base.Objects;
20 import org.onosproject.net.flow.FlowRule; 21 import org.onosproject.net.flow.FlowRule;
21 22
22 import java.util.Date; 23 import java.util.Date;
23 24
24 /** 25 /**
25 - * A wrapper class for a ONOS flow rule installed on a BMv2 device. 26 + * A wrapper for a ONOS flow rule installed on a BMv2 device.
26 */ 27 */
27 -public class Bmv2FlowRuleWrapper { 28 +@Beta
29 +public final class Bmv2FlowRuleWrapper {
28 30
29 private final FlowRule rule; 31 private final FlowRule rule;
30 private final long entryId; 32 private final long entryId;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onlab.util.ImmutableByteSequence; 22 import org.onlab.util.ImmutableByteSequence;
...@@ -24,8 +25,9 @@ import static com.google.common.base.Preconditions.checkArgument; ...@@ -24,8 +25,9 @@ import static com.google.common.base.Preconditions.checkArgument;
24 import static com.google.common.base.Preconditions.checkNotNull; 25 import static com.google.common.base.Preconditions.checkNotNull;
25 26
26 /** 27 /**
27 - * Representation of a BMv2 longest prefix match (LPM) parameter. 28 + * A BMv2 longest prefix match (LPM) parameter.
28 */ 29 */
30 +@Beta
29 public final class Bmv2LpmMatchParam implements Bmv2MatchParam { 31 public final class Bmv2LpmMatchParam implements Bmv2MatchParam {
30 32
31 private final ImmutableByteSequence value; 33 private final ImmutableByteSequence value;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.collect.Lists; 21 import com.google.common.collect.Lists;
21 import org.onlab.util.ImmutableByteSequence; 22 import org.onlab.util.ImmutableByteSequence;
...@@ -30,6 +31,7 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -30,6 +31,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
30 /** 31 /**
31 * A match key of a BMv2 match-action table entry. 32 * A match key of a BMv2 match-action table entry.
32 */ 33 */
34 +@Beta
33 public final class Bmv2MatchKey { 35 public final class Bmv2MatchKey {
34 36
35 private final List<Bmv2MatchParam> matchParams; 37 private final List<Bmv2MatchParam> matchParams;
......
...@@ -16,9 +16,12 @@ ...@@ -16,9 +16,12 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
20 +
19 /** 21 /**
20 * Representation of a BMv2 match parameter. 22 * Representation of a BMv2 match parameter.
21 */ 23 */
24 +@Beta
22 public interface Bmv2MatchParam { 25 public interface Bmv2MatchParam {
23 26
24 /** 27 /**
......
...@@ -16,12 +16,14 @@ ...@@ -16,12 +16,14 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 22
22 /** 23 /**
23 * Representation of a table entry installed on a BMv2 device. 24 * Representation of a table entry installed on a BMv2 device.
24 */ 25 */
26 +@Beta
25 public final class Bmv2ParsedTableEntry { 27 public final class Bmv2ParsedTableEntry {
26 private final long entryId; 28 private final long entryId;
27 private final Bmv2MatchKey matchKey; 29 private final Bmv2MatchKey matchKey;
......
...@@ -16,12 +16,14 @@ ...@@ -16,12 +16,14 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 22
22 /** 23 /**
23 * Information of a port of a BMv2 device. 24 * Information of a port of a BMv2 device.
24 */ 25 */
26 +@Beta
25 public final class Bmv2PortInfo { 27 public final class Bmv2PortInfo {
26 28
27 private final String ifaceName; 29 private final String ifaceName;
......
...@@ -16,9 +16,12 @@ ...@@ -16,9 +16,12 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
20 +
19 /** 21 /**
20 * General exception of the BMv2 runtime APIs. 22 * General exception of the BMv2 runtime APIs.
21 */ 23 */
24 +@Beta
22 public final class Bmv2RuntimeException extends Exception { 25 public final class Bmv2RuntimeException extends Exception {
23 26
24 private final Code code; 27 private final Code code;
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
20 +
19 import java.util.Objects; 21 import java.util.Objects;
20 22
21 import static com.google.common.base.Preconditions.checkArgument; 23 import static com.google.common.base.Preconditions.checkArgument;
...@@ -24,6 +26,7 @@ import static com.google.common.base.Preconditions.checkNotNull; ...@@ -24,6 +26,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
24 /** 26 /**
25 * An entry of a match-action table in a BMv2 device. 27 * An entry of a match-action table in a BMv2 device.
26 */ 28 */
29 +@Beta
27 public final class Bmv2TableEntry { 30 public final class Bmv2TableEntry {
28 31
29 private static final int NO_PRIORITY_VALUE = -1; 32 private static final int NO_PRIORITY_VALUE = -1;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onosproject.net.DeviceId; 22 import org.onosproject.net.DeviceId;
...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId; ...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId;
23 /** 24 /**
24 * A reference to a table entry installed on a BMv2 device. 25 * A reference to a table entry installed on a BMv2 device.
25 */ 26 */
27 +@Beta
26 public final class Bmv2TableEntryReference { 28 public final class Bmv2TableEntryReference {
27 29
28 30
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 +import com.google.common.annotations.Beta;
19 import com.google.common.base.MoreObjects; 20 import com.google.common.base.MoreObjects;
20 import com.google.common.base.Objects; 21 import com.google.common.base.Objects;
21 import org.onlab.util.ImmutableByteSequence; 22 import org.onlab.util.ImmutableByteSequence;
...@@ -26,6 +27,7 @@ import static com.google.common.base.Preconditions.checkState; ...@@ -26,6 +27,7 @@ import static com.google.common.base.Preconditions.checkState;
26 /** 27 /**
27 * Representation of a BMv2 ternary match parameter. 28 * Representation of a BMv2 ternary match parameter.
28 */ 29 */
30 +@Beta
29 public final class Bmv2TernaryMatchParam implements Bmv2MatchParam { 31 public final class Bmv2TernaryMatchParam implements Bmv2MatchParam {
30 32
31 private final ImmutableByteSequence value; 33 private final ImmutableByteSequence value;
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
17 package org.onosproject.bmv2.api.runtime; 17 package org.onosproject.bmv2.api.runtime;
18 18
19 19
20 +import com.google.common.annotations.Beta;
20 import com.google.common.base.MoreObjects; 21 import com.google.common.base.MoreObjects;
21 22
22 import java.util.Objects; 23 import java.util.Objects;
...@@ -24,6 +25,7 @@ import java.util.Objects; ...@@ -24,6 +25,7 @@ import java.util.Objects;
24 /** 25 /**
25 * Representation of a BMv2 valid match parameter. 26 * Representation of a BMv2 valid match parameter.
26 */ 27 */
28 +@Beta
27 public final class Bmv2ValidMatchParam implements Bmv2MatchParam { 29 public final class Bmv2ValidMatchParam implements Bmv2MatchParam {
28 30
29 private final boolean flag; 31 private final boolean flag;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.service; 17 package org.onosproject.bmv2.api.service;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent; 20 import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
20 import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException; 21 import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
21 import org.onosproject.net.DeviceId; 22 import org.onosproject.net.DeviceId;
...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId; ...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId;
23 /** 24 /**
24 * A controller of BMv2 devices. 25 * A controller of BMv2 devices.
25 */ 26 */
27 +@Beta
26 public interface Bmv2Controller { 28 public interface Bmv2Controller {
27 29
28 /** 30 /**
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.service; 17 package org.onosproject.bmv2.api.service;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.onosproject.bmv2.api.context.Bmv2DeviceContext; 20 import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
20 import org.onosproject.bmv2.api.context.Bmv2Interpreter; 21 import org.onosproject.bmv2.api.context.Bmv2Interpreter;
21 import org.onosproject.net.DeviceId; 22 import org.onosproject.net.DeviceId;
...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId; ...@@ -23,6 +24,7 @@ import org.onosproject.net.DeviceId;
23 /** 24 /**
24 * A service for managing BMv2 device contexts. 25 * A service for managing BMv2 device contexts.
25 */ 26 */
27 +@Beta
26 public interface Bmv2DeviceContextService { 28 public interface Bmv2DeviceContextService {
27 29
28 /** 30 /**
......
...@@ -16,11 +16,13 @@ ...@@ -16,11 +16,13 @@
16 16
17 package org.onosproject.bmv2.api.service; 17 package org.onosproject.bmv2.api.service;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.onosproject.bmv2.api.runtime.Bmv2Device; 20 import org.onosproject.bmv2.api.runtime.Bmv2Device;
20 21
21 /** 22 /**
22 * A listener of BMv2 device events. 23 * A listener of BMv2 device events.
23 */ 24 */
25 +@Beta
24 public interface Bmv2DeviceListener { 26 public interface Bmv2DeviceListener {
25 27
26 /** 28 /**
......
...@@ -16,12 +16,14 @@ ...@@ -16,12 +16,14 @@
16 16
17 package org.onosproject.bmv2.api.service; 17 package org.onosproject.bmv2.api.service;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.onlab.util.ImmutableByteSequence; 20 import org.onlab.util.ImmutableByteSequence;
20 import org.onosproject.bmv2.api.runtime.Bmv2Device; 21 import org.onosproject.bmv2.api.runtime.Bmv2Device;
21 22
22 /** 23 /**
23 * A listener of BMv2 packet events. 24 * A listener of BMv2 packet events.
24 */ 25 */
26 +@Beta
25 public interface Bmv2PacketListener { 27 public interface Bmv2PacketListener {
26 28
27 /** 29 /**
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
17 package org.onosproject.bmv2.api.service; 17 package org.onosproject.bmv2.api.service;
18 18
19 19
20 +import com.google.common.annotations.Beta;
20 import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator; 21 import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
21 import org.onosproject.bmv2.api.runtime.Bmv2FlowRuleWrapper; 22 import org.onosproject.bmv2.api.runtime.Bmv2FlowRuleWrapper;
22 import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference; 23 import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference;
...@@ -24,6 +25,7 @@ import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference; ...@@ -24,6 +25,7 @@ import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference;
24 /** 25 /**
25 * A service for managing BMv2 table entries. 26 * A service for managing BMv2 table entries.
26 */ 27 */
28 +@Beta
27 public interface Bmv2TableEntryService { 29 public interface Bmv2TableEntryService {
28 30
29 /** 31 /**
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.bmv2.api.utils; 17 package org.onosproject.bmv2.api.utils;
18 18
19 +import com.google.common.annotations.Beta;
19 import org.onlab.util.HexString; 20 import org.onlab.util.HexString;
20 import org.onlab.util.ImmutableByteSequence; 21 import org.onlab.util.ImmutableByteSequence;
21 22
...@@ -25,8 +26,9 @@ import static com.google.common.base.Preconditions.checkArgument; ...@@ -25,8 +26,9 @@ import static com.google.common.base.Preconditions.checkArgument;
25 import static com.google.common.base.Preconditions.checkNotNull; 26 import static com.google.common.base.Preconditions.checkNotNull;
26 27
27 /** 28 /**
28 - * Collection of util methods to deal with flow rule translation. 29 + * Collection of utility methods to deal with flow rule translation.
29 */ 30 */
31 +@Beta
30 public final class Bmv2TranslatorUtils { 32 public final class Bmv2TranslatorUtils {
31 33
32 private Bmv2TranslatorUtils() { 34 private Bmv2TranslatorUtils() {
......
...@@ -22,11 +22,14 @@ import org.onosproject.bmv2.api.context.Bmv2Configuration; ...@@ -22,11 +22,14 @@ import org.onosproject.bmv2.api.context.Bmv2Configuration;
22 import org.onosproject.bmv2.api.context.Bmv2Interpreter; 22 import org.onosproject.bmv2.api.context.Bmv2Interpreter;
23 import org.onosproject.bmv2.api.context.Bmv2InterpreterException; 23 import org.onosproject.bmv2.api.context.Bmv2InterpreterException;
24 import org.onosproject.bmv2.api.runtime.Bmv2Action; 24 import org.onosproject.bmv2.api.runtime.Bmv2Action;
25 -import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils; 25 +import org.onosproject.net.PortNumber;
26 import org.onosproject.net.flow.TrafficTreatment; 26 import org.onosproject.net.flow.TrafficTreatment;
27 import org.onosproject.net.flow.criteria.Criterion; 27 import org.onosproject.net.flow.criteria.Criterion;
28 import org.onosproject.net.flow.instructions.Instruction; 28 import org.onosproject.net.flow.instructions.Instruction;
29 29
30 +import static org.onlab.util.ImmutableByteSequence.copyFrom;
31 +import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.ByteSequenceFitException;
32 +import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
30 import static org.onosproject.net.PortNumber.CONTROLLER; 33 import static org.onosproject.net.PortNumber.CONTROLLER;
31 import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction; 34 import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
32 35
...@@ -37,10 +40,10 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter { ...@@ -37,10 +40,10 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter {
37 40
38 public static final String TABLE0 = "table0"; 41 public static final String TABLE0 = "table0";
39 public static final String SEND_TO_CPU = "send_to_cpu"; 42 public static final String SEND_TO_CPU = "send_to_cpu";
43 + public static final String PORT = "port";
40 public static final String DROP = "_drop"; 44 public static final String DROP = "_drop";
41 public static final String SET_EGRESS_PORT = "set_egress_port"; 45 public static final String SET_EGRESS_PORT = "set_egress_port";
42 46
43 - // Lazily populate field map.
44 private static final ImmutableBiMap<Criterion.Type, String> CRITERION_MAP = ImmutableBiMap.of( 47 private static final ImmutableBiMap<Criterion.Type, String> CRITERION_MAP = ImmutableBiMap.of(
45 Criterion.Type.IN_PORT, "standard_metadata.ingress_port", 48 Criterion.Type.IN_PORT, "standard_metadata.ingress_port",
46 Criterion.Type.ETH_DST, "ethernet.dstAddr", 49 Criterion.Type.ETH_DST, "ethernet.dstAddr",
...@@ -64,10 +67,9 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter { ...@@ -64,10 +67,9 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter {
64 public Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration) 67 public Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration)
65 throws Bmv2InterpreterException { 68 throws Bmv2InterpreterException {
66 69
67 -
68 if (treatment.allInstructions().size() == 0) { 70 if (treatment.allInstructions().size() == 0) {
69 // No instructions means drop for us. 71 // No instructions means drop for us.
70 - return Bmv2Action.builder().withName(DROP).build(); 72 + return actionWithName(DROP);
71 } else if (treatment.allInstructions().size() > 1) { 73 } else if (treatment.allInstructions().size() > 1) {
72 // Otherwise, we understand treatments with only 1 instruction. 74 // Otherwise, we understand treatments with only 1 instruction.
73 throw new Bmv2InterpreterException("Treatment has multiple instructions"); 75 throw new Bmv2InterpreterException("Treatment has multiple instructions");
...@@ -78,47 +80,38 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter { ...@@ -78,47 +80,38 @@ public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter {
78 switch (instruction.type()) { 80 switch (instruction.type()) {
79 case OUTPUT: 81 case OUTPUT:
80 OutputInstruction outInstruction = (OutputInstruction) instruction; 82 OutputInstruction outInstruction = (OutputInstruction) instruction;
81 - if (outInstruction.port() == CONTROLLER) { 83 + PortNumber port = outInstruction.port();
82 - return Bmv2Action.builder().withName(SEND_TO_CPU).build(); 84 + if (!port.isLogical()) {
85 + return buildEgressAction(port, configuration);
86 + } else if (port.equals(CONTROLLER)) {
87 + return actionWithName(SEND_TO_CPU);
83 } else { 88 } else {
84 - return buildEgressAction(outInstruction, configuration); 89 + throw new Bmv2InterpreterException("Egress on logical port not supported: " + port);
85 } 90 }
86 case NOACTION: 91 case NOACTION:
87 - return Bmv2Action.builder().withName(DROP).build(); 92 + return actionWithName(DROP);
88 default: 93 default:
89 throw new Bmv2InterpreterException("Instruction type not supported: " + instruction.type().name()); 94 throw new Bmv2InterpreterException("Instruction type not supported: " + instruction.type().name());
90 } 95 }
91 } 96 }
92 97
93 - 98 + private Bmv2Action buildEgressAction(PortNumber port, Bmv2Configuration configuration)
94 - /**
95 - * Builds an egress action equivalent to the given output instruction for the given configuration.
96 - *
97 - * @param instruction an output instruction
98 - * @param configuration a configuration
99 - * @return a BMv2 action
100 - * @throws Bmv2InterpreterException if the instruction cannot be translated to a BMv2 action
101 - */
102 - private Bmv2Action buildEgressAction(OutputInstruction instruction, Bmv2Configuration configuration)
103 throws Bmv2InterpreterException { 99 throws Bmv2InterpreterException {
104 100
105 - Bmv2Action.Builder actionBuilder = Bmv2Action.builder(); 101 + int portBitWidth = configuration.action(SET_EGRESS_PORT).runtimeData(PORT).bitWidth();
106 -
107 - actionBuilder.withName(SET_EGRESS_PORT);
108 102
109 - if (instruction.port().isLogical()) {
110 - throw new Bmv2InterpreterException("Output on logic port not supported: " + instruction);
111 - }
112 -
113 - // Get the byte sequence for the out port with the right length
114 - long portNumber = instruction.port().toLong();
115 - int bitWidth = configuration.action(SET_EGRESS_PORT).runtimeData("port").bitWidth();
116 try { 103 try {
117 - ImmutableByteSequence outPort = Bmv2TranslatorUtils.fitByteSequence( 104 + ImmutableByteSequence portBs = fitByteSequence(copyFrom(port.toLong()), portBitWidth);
118 - ImmutableByteSequence.copyFrom(portNumber), bitWidth); 105 + return Bmv2Action.builder()
119 - return Bmv2Action.builder().withName(SET_EGRESS_PORT).addParameter(outPort).build(); 106 + .withName(SET_EGRESS_PORT)
120 - } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) { 107 + .addParameter(portBs)
108 + .build();
109 + } catch (ByteSequenceFitException e) {
121 throw new Bmv2InterpreterException(e.getMessage()); 110 throw new Bmv2InterpreterException(e.getMessage());
122 } 111 }
123 } 112 }
113 +
114 + private Bmv2Action actionWithName(String name) {
115 + return Bmv2Action.builder().withName(name).build();
116 + }
124 } 117 }
......
...@@ -241,7 +241,7 @@ public class Bmv2FlowRuleTranslatorImpl implements Bmv2FlowRuleTranslator { ...@@ -241,7 +241,7 @@ public class Bmv2FlowRuleTranslatorImpl implements Bmv2FlowRuleTranslator {
241 241
242 if (extTreatment.type() == ExtensionTreatmentTypes.BMV2_ACTION.type()) { 242 if (extTreatment.type() == ExtensionTreatmentTypes.BMV2_ACTION.type()) {
243 if (extTreatment instanceof Bmv2ExtensionTreatment) { 243 if (extTreatment instanceof Bmv2ExtensionTreatment) {
244 - return ((Bmv2ExtensionTreatment) extTreatment).getAction(); 244 + return ((Bmv2ExtensionTreatment) extTreatment).action();
245 } else { 245 } else {
246 throw new Bmv2FlowRuleTranslatorException("Unable to decode treatment extension: " + extTreatment); 246 throw new Bmv2FlowRuleTranslatorException("Unable to decode treatment extension: " + extTreatment);
247 } 247 }
......