OpenFlow message processing for new loxi

Depends-On: Id69c8597eb4564653c56cdc90f2dcec50afbdd25

Change-Id: Ib14fbadd3debf98ce1d56343179f8e7929f8ade8
This commit is contained in:
Jimmy Jin 2016-08-12 16:56:48 -07:00 committed by Thomas Vachuska
parent 239f09e2f9
commit e9b7a02ff9
20 changed files with 131 additions and 55 deletions

View File

@ -34,9 +34,19 @@ public interface FlowRule {
* Used to check reason parameter in flows.
*/
enum FlowRemoveReason {
NO_REASON,
IDLE_TIMEOUT,
HARD_TIMEOUT;
HARD_TIMEOUT,
DELETE,
GROUP_DELETE,
METER_DELETE,
EVICTION,
NO_REASON;
/**
* Covert short to enum.
* @return reason in enum
* @param reason remove reason in integer
*/
public static FlowRemoveReason parseShort(short reason) {
switch (reason) {
case -1 :
@ -45,6 +55,14 @@ public interface FlowRule {
return IDLE_TIMEOUT;
case 1:
return HARD_TIMEOUT;
case 2 :
return DELETE;
case 3:
return GROUP_DELETE;
case 4:
return METER_DELETE;
case 5:
return EVICTION;
default :
return NO_REASON;
}

View File

@ -249,7 +249,8 @@ public final class KryoNamespaces {
.register(new ImmutableListSerializer(),
ImmutableList.class,
ImmutableList.of(1).getClass(),
ImmutableList.of(1, 2).getClass())
ImmutableList.of(1, 2).getClass(),
ImmutableList.of(1, 2, 3).subList(1, 3).getClass())
.register(new ImmutableSetSerializer(),
ImmutableSet.class,
ImmutableSet.of().getClass(),

View File

@ -20,7 +20,7 @@
<feature>onos-api</feature>
<bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
<bundle>mvn:org.onosproject/openflowj/0.9.7.onos</bundle>
<bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
<bundle>mvn:${project.groupId}/onos-of-api/${project.version}</bundle>
</feature>

View File

@ -61,7 +61,6 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>

View File

@ -20,8 +20,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.onosproject.drivers.optical.OpticalAdjacencyLinkService;
import org.onosproject.net.ConnectPoint;
import org.onosproject.net.Annotations;
@ -203,7 +203,7 @@ public class OplinkHandshakerUtil {
// |---------------------------------------------------------------------------|
// | Header (2 bytes) | ID (4 BITS) | MAC (6 bytes) | Port (4 bytes) | Unused |
// |---------------------------------------------------------------------------|
ChannelBuffer buffer = ChannelBuffers.buffer(OPSPEC_BYTES);
ByteBuf buffer = Unpooled.buffer(OPSPEC_BYTES);
otn.getOpspec().write32Bytes(buffer);
long mac = buffer.getLong(OPSPEC_MAC_POS) << OPSPEC_ID_BITS >>> OPSPEC_MAC_BIT_OFF;
int port = (int) (buffer.getLong(OPSPEC_PORT_POS) << OPSPEC_ID_BITS >>> OPSPEC_PORT_BIT_OFF);

View File

@ -23,7 +23,7 @@
<bundle>mvn:commons-lang/commons-lang/2.6</bundle>
<bundle>mvn:org.apache.commons/commons-lang3/3.5</bundle>
<bundle>mvn:commons-configuration/commons-configuration/1.10</bundle>
<bundle>mvn:com.google.guava/guava/19.0</bundle>
<bundle>mvn:com.google.guava/guava/20.0</bundle>
<bundle>mvn:io.netty/netty/3.10.5.Final</bundle>
<bundle>mvn:io.netty/netty-common/4.1.5.Final</bundle>
<bundle>mvn:io.netty/netty-buffer/4.1.5.Final</bundle>

View File

@ -1,4 +1,4 @@
# ***** This file was auto-generated at Mon, 15 May 2017 21:06:23 GMT. Do not edit this file manually. *****
# ***** This file was auto-generated at Thu, 18 May 2017 21:45:37 GMT. Do not edit this file manually. *****
# ***** Use onos-lib-gen *****
pass_thru_pom(
@ -23,6 +23,7 @@ osgi_feature_group(
':objenesis',
':guava',
':netty',
':netty-buffer',
':netty-common',
':minimal-json',
':kryo',
@ -311,19 +312,19 @@ remote_jar (
remote_jar (
name = 'guava',
out = 'guava-19.0.jar',
url = 'mvn:com.google.guava:guava:jar:19.0',
sha1 = '6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9',
maven_coords = 'com.google.guava:guava:19.0',
out = 'guava-20.0.jar',
url = 'mvn:com.google.guava:guava:jar:20.0',
sha1 = '89507701249388e1ed5ddcf8c41f4ce1be7831ef',
maven_coords = 'com.google.guava:guava:20.0',
visibility = [ 'PUBLIC' ],
)
remote_jar (
name = 'guava-testlib',
out = 'guava-testlib-19.0.jar',
url = 'mvn:com.google.guava:guava-testlib:jar:19.0',
sha1 = 'ce5b880b206de3f76d364988a6308c68c726f74a',
maven_coords = 'com.google.guava:guava-testlib:jar:NON-OSGI:19.0',
out = 'guava-testlib-20.0.jar',
url = 'mvn:com.google.guava:guava-testlib:jar:20.0',
sha1 = 'e3666edd0d7b10ddfa5242b998efd831e4b264ff',
maven_coords = 'com.google.guava:guava-testlib:jar:NON-OSGI:20.0',
visibility = [ 'PUBLIC' ],
)
@ -860,10 +861,10 @@ remote_jar (
remote_jar (
name = 'openflowj',
out = 'openflowj-0.9.8.onos.jar',
url = 'mvn:org.onosproject:openflowj:jar:0.9.8.onos',
sha1 = '4dc85deb24584eee18ef103d10a01c20d2f657bc',
maven_coords = 'org.onosproject:openflowj:0.9.8.onos',
out = 'openflowj-3.2.0.onos.jar',
url = 'mvn:org.onosproject:openflowj:jar:3.2.0.onos',
sha1 = 'b890ecb2901912b9c7ededd1d1028fea73aa5db4',
maven_coords = 'org.onosproject:openflowj:3.2.0.onos',
visibility = [ 'PUBLIC' ],
)
@ -1278,4 +1279,3 @@ remote_jar (
maven_coords = 'org.apache.sshd:sshd-core:1.4.0',
visibility = [ 'PUBLIC' ],
)

View File

@ -12,6 +12,7 @@
"objenesis",
"guava",
"netty",
"netty-buffer",
"netty-common",
"minimal-json",
"kryo",
@ -111,8 +112,8 @@
"ganymed-ssh2": "mvn:ch.ethz.ganymed:ganymed-ssh2:262",
"gmetric4j": "mvn:info.ganglia.gmetric4j:gmetric4j:1.0.10",
"gson": "mvn:com.google.code.gson:gson:jar:2.6.2",
"guava": "mvn:com.google.guava:guava:19.0",
"guava-testlib": "mvn:com.google.guava:guava-testlib:19.0",
"guava": "mvn:com.google.guava:guava:20.0",
"guava-testlib": "mvn:com.google.guava:guava-testlib:20.0",
"hamcrest-all": "mvn:org.hamcrest:hamcrest-all:1.3",
"hk2-api": "mvn:org.glassfish.hk2:hk2-api:2.5.0-b32",
"hk2-locator": "mvn:org.glassfish.hk2:hk2-locator:2.5.0-b32",
@ -172,7 +173,7 @@
"catalyst-netty": "mvn:io.atomix.catalyst:catalyst-netty:1.2.1",
"catalyst-transport": "mvn:io.atomix.catalyst:catalyst-transport:1.2.1",
"objenesis": "mvn:org.objenesis:objenesis:2.2",
"openflowj": "mvn:org.onosproject:openflowj:0.9.8.onos",
"openflowj": "mvn:org.onosproject:openflowj:3.2.0.onos",
"org.apache.felix.scr": "mvn:org.apache.felix:org.apache.felix.scr:1.8.2",
"org.apache.felix.scr.annotations": "mvn:org.apache.felix:org.apache.felix.scr.annotations:1.9.12",
"org.apache.karaf.features.core": "mvn:org.apache.karaf.features:org.apache.karaf.features.core:3.0.8",

View File

@ -38,7 +38,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<onos-build-conf.version>1.11.0-SNAPSHOT</onos-build-conf.version>
<netty4.version>4.1.5.Final</netty4.version>
<openflowj.version>0.9.8.onos</openflowj.version>
<openflowj.version>3.2.0.onos-SNAPSHOT</openflowj.version>
<onos-maven-plugin.version>1.10</onos-maven-plugin.version>
<osgi.version>5.0.0</osgi.version>
<karaf.version>3.0.8</karaf.version>
@ -46,7 +46,7 @@
<jetty.version>9.2.21.v20170120</jetty.version>
<jackson.version>2.8.6</jackson.version>
<slf4j.version>1.7.21</slf4j.version>
<guava.version>19.0</guava.version>
<guava.version>20.0</guava.version>
<commons.io.version>2.4</commons.io.version>
<!-- TODO argLine was originally added maven-surfire-plugin configuration
to fix locale errors for non-US developers. However, it breaks

View File

@ -15,12 +15,15 @@
*/
package org.onosproject.openflow.controller;
import org.jboss.netty.buffer.ChannelBuffer;
import io.netty.buffer.ByteBuf;
import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFType;
import org.projectfloodlight.openflow.protocol.OFVersion;
import com.google.common.hash.PrimitiveSink;
import java.util.Arrays;
/**
* Used to support for the third party privacy flow rule.
* it implements OFMessage interface to use exist adapter API.
@ -61,10 +64,20 @@ public class ThirdPartyMessage implements OFMessage {
}
@Override
public void writeTo(ChannelBuffer channelBuffer) {
public void writeTo(ByteBuf byteBuf) {
// Do nothing here for now.
}
@Override
public boolean equalsIgnoreXid(Object obj) {
return Arrays.equals(payLoad, ((ThirdPartyMessage) obj).payLoad());
}
@Override
public int hashCodeIgnoreXid() {
return payLoad.hashCode();
}
@Override
public Builder createBuilder() {
// Do nothing here for now.

View File

@ -17,6 +17,8 @@
package org.onosproject.openflow.controller.impl;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
@ -47,7 +49,15 @@ public class OFMessageDecoder extends FrameDecoder {
// a list of the parsed messages to the controller.
// The performance *may or may not* not be as good as before.
OFMessageReader<OFMessage> reader = OFFactories.getGenericReader();
OFMessage message = reader.readFrom(buffer);
//toByteBuffer is optimized to avoid copying.
ByteBuf byteBuf = Unpooled.wrappedBuffer(buffer.toByteBuffer());
OFMessage message = reader.readFrom(byteBuf);
if (message != null) {
//set buffer's read index, as it has not been changed.
buffer.readerIndex(buffer.readerIndex() + byteBuf.readerIndex());
}
return message;
}

View File

@ -18,6 +18,8 @@ package org.onosproject.openflow.controller.impl;
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
@ -46,13 +48,16 @@ public class OFMessageEncoder extends OneToOneEncoder {
size += ofm.getLengthU();
}*/
ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
ByteBuf bb = Unpooled.buffer();
for (OFMessage ofm : msglist) {
if (ofm != null) {
ofm.writeTo(buf);
ofm.writeTo(bb);
}
}
ChannelBuffer buf = ChannelBuffers.wrappedBuffer(bb.nioBuffer());
return buf;
}

View File

@ -17,7 +17,7 @@ package org.onosproject.openflow;
import java.util.Set;
import org.jboss.netty.buffer.ChannelBuffer;
import io.netty.buffer.ByteBuf;
import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags;
import org.projectfloodlight.openflow.protocol.OFStatsType;
@ -81,10 +81,22 @@ public class OFDescStatsReplyAdapter implements OFDescStatsReply {
}
@Override
public void writeTo(ChannelBuffer channelBuffer) {
public void writeTo(ByteBuf byteBuf) {
}
@Override
public boolean equalsIgnoreXid(Object obj) {
// Do nothing here for now
return true;
}
@Override
public int hashCodeIgnoreXid() {
// Do nothing here for now
return 0;
}
@Override
public Builder createBuilder() {
return null;

View File

@ -15,7 +15,7 @@
*/
package org.onosproject.openflow;
import org.jboss.netty.buffer.ChannelBuffer;
import io.netty.buffer.ByteBuf;
import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFType;
import org.projectfloodlight.openflow.protocol.OFVersion;
@ -50,7 +50,19 @@ public class OfMessageAdapter implements OFMessage {
}
@Override
public void writeTo(ChannelBuffer channelBuffer) { }
public void writeTo(ByteBuf byteBuf) { }
@Override
public boolean equalsIgnoreXid(Object obj) {
// Do nothing here for now
return true;
}
@Override
public int hashCodeIgnoreXid() {
// Do nothing here for now
return 0;
}
@Override
public Builder createBuilder() {

View File

@ -18,6 +18,7 @@ package org.onosproject.openflow.controller.impl;
import java.nio.charset.StandardCharsets;
import java.util.List;
import io.netty.buffer.ByteBuf;
import org.jboss.netty.buffer.ChannelBuffer;
import org.junit.Test;
import org.onosproject.openflow.OfMessageAdapter;
@ -45,9 +46,9 @@ public class OFMessageEncoderTest {
}
@Override
public void writeTo(ChannelBuffer channelBuffer) {
public void writeTo(ByteBuf byteBuf) {
String message = "message" + Integer.toString(id) + " ";
channelBuffer.writeBytes(message.getBytes(StandardCharsets.UTF_8));
byteBuf.writeBytes(message.getBytes(StandardCharsets.UTF_8));
}
}

View File

@ -18,7 +18,7 @@
<feature name="${project.artifactId}" version="${project.version}"
description="${project.description}">
<feature>onos-api</feature>
<bundle>mvn:org.onosproject/openflowj/0.9.7.onos</bundle>
<bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
<bundle>mvn:${project.groupId}/onos-of-api/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-of-ctl/${project.version}</bundle>

View File

@ -110,6 +110,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Dictionary;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -364,12 +365,14 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr
OFPortMod.Builder pmb = sw.factory().buildPortMod();
OFPort port = OFPort.of((int) portNumber.toLong());
pmb.setPortNo(port);
if (enable) {
pmb.setConfig(0x0); // port_down bit 0
} else {
pmb.setConfig(0x1); // port_down bit 1
Set<OFPortConfig> portConfig = EnumSet.noneOf(OFPortConfig.class);
if (!enable) {
portConfig.add(OFPortConfig.PORT_DOWN);
}
pmb.setMask(0x1);
pmb.setConfig(portConfig);
Set<OFPortConfig> portMask = EnumSet.noneOf(OFPortConfig.class);
portMask.add(OFPortConfig.PORT_DOWN);
pmb.setMask(portMask);
pmb.setAdvertise(0x0);
for (OFPortDesc pd : sw.getPorts()) {
if (pd.getPortNo().equals(port)) {

View File

@ -208,7 +208,7 @@ public class FlowEntryBuilder {
.withPriority(removed.getPriority())
.withIdleTimeout(removed.getIdleTimeout())
.withCookie(removed.getCookie().getValue())
.withReason(FlowRule.FlowRemoveReason.parseShort(removed.getReason()));
.withReason(FlowRule.FlowRemoveReason.parseShort((short) removed.getReason().ordinal()));
if (removed.getVersion() != OFVersion.OF_10) {
builder.forTable(removed.getTableId().getValue());

View File

@ -28,8 +28,10 @@ import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDscpRemark;
import org.slf4j.Logger;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkArgument;
@ -82,37 +84,36 @@ public final class MeterModBuilder {
public OFMeterMod add() {
validate();
OFMeterMod.Builder builder = builderMeterMod();
builder.setCommand(OFMeterModCommand.ADD.ordinal());
builder.setCommand(OFMeterModCommand.ADD);
return builder.build();
}
public OFMeterMod remove() {
validate();
OFMeterMod.Builder builder = builderMeterMod();
builder.setCommand(OFMeterModCommand.DELETE.ordinal());
builder.setCommand(OFMeterModCommand.DELETE);
return builder.build();
}
public OFMeterMod modify() {
validate();
OFMeterMod.Builder builder = builderMeterMod();
builder.setCommand(OFMeterModCommand.MODIFY.ordinal());
builder.setCommand(OFMeterModCommand.MODIFY);
return builder.build();
}
private OFMeterMod.Builder builderMeterMod() {
OFMeterMod.Builder builder = factory.buildMeterMod();
int flags = 0;
Set<OFMeterFlags> flags = EnumSet.noneOf(OFMeterFlags.class);
if (burst) {
// covering loxi short comings.
flags |= 1 << OFMeterFlags.BURST.ordinal();
flags.add(OFMeterFlags.BURST);
}
switch (unit) {
case PKTS_PER_SEC:
flags |= 1 << OFMeterFlags.PKTPS.ordinal();
flags.add(OFMeterFlags.PKTPS);
break;
case KB_PER_SEC:
flags |= 1 << OFMeterFlags.KBPS.ordinal();
flags.add(OFMeterFlags.KBPS);
break;
default:
log.warn("Unknown unit type {}", unit);

View File

@ -54,7 +54,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
<version>20.0</version>
</dependency>
<dependency>