From fe2fb208ee3f873d1b077e6bf3676a3795d77ae8 Mon Sep 17 00:00:00 2001 From: Shashikanth VH Date: Fri, 5 Feb 2016 18:45:07 +0530 Subject: [PATCH] [ONOS-3857] BGP flow specification prefix implementation. Change-Id: I49228f85f8efd5e972092df798a42ffc316d784d --- .../protocol/flowspec/BgpFlowSpecPrefix.java | 139 ++++++++++++++++++ .../flowspec/BgpFlowSpecPrefixTest.java | 44 ++++++ 2 files changed, 183 insertions(+) create mode 100755 protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java create mode 100644 protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java new file mode 100755 index 0000000000..cbf4269ab8 --- /dev/null +++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefix.java @@ -0,0 +1,139 @@ +/* + * Copyright 2016 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.bgpio.protocol.flowspec; + +import java.util.Objects; +import org.onlab.packet.IpPrefix; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.nio.ByteBuffer; + +import com.google.common.base.MoreObjects; + +/** + * Provides BGP flow specification rule index. + */ +public class BgpFlowSpecPrefix implements Comparable { + + private static final Logger log = LoggerFactory.getLogger(BgpFlowSpecPrefix.class); + + private final IpPrefix destinationPrefix; + private final IpPrefix sourcePrefix; + + /** + * Constructor to initialize parameters. + * + * @param destinationPrefix destination prefix + * @param sourcePrefix source prefix + */ + public BgpFlowSpecPrefix(IpPrefix destinationPrefix, IpPrefix sourcePrefix) { + this.destinationPrefix = destinationPrefix; + this.sourcePrefix = sourcePrefix; + } + + @Override + public int hashCode() { + return Objects.hash(destinationPrefix, sourcePrefix); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + if (obj instanceof BgpFlowSpecPrefix) { + BgpFlowSpecPrefix other = (BgpFlowSpecPrefix) obj; + + if (this.destinationPrefix.equals(other.destinationPrefix)) { + return this.sourcePrefix.equals(other.sourcePrefix); + } + return false; + } + return false; + } + + /** + * Returns destination prefix. + * + * @return destination prefix + */ + public IpPrefix destinationPrefix() { + return this.destinationPrefix; + } + + /** + * Returns source prefix. + * + * @return source prefix + */ + public IpPrefix sourcePrefix() { + return this.sourcePrefix; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(getClass()).omitNullValues() + .add("destinationPrefix", destinationPrefix) + .add("sourcePrefix", destinationPrefix) + .toString(); + } + + /** + * Compares this and o object. + * + * @param o object to be compared with this object + * @return which object is greater + */ + public int compareTo(Object o) { + if (this.equals(o)) { + return 0; + } + + if (o instanceof BgpFlowSpecPrefix) { + BgpFlowSpecPrefix that = (BgpFlowSpecPrefix) o; + + if (this.destinationPrefix().prefixLength() == that.destinationPrefix().prefixLength()) { + ByteBuffer value1 = ByteBuffer.wrap(this.destinationPrefix().address().toOctets()); + ByteBuffer value2 = ByteBuffer.wrap(that.destinationPrefix().address().toOctets()); + int cmpVal = value1.compareTo(value2); + if (cmpVal != 0) { + return cmpVal; + } + } else { + if (this.destinationPrefix().prefixLength() > that.destinationPrefix().prefixLength()) { + return 1; + } else if (this.destinationPrefix().prefixLength() < that.destinationPrefix().prefixLength()) { + return -1; + } + } + + if (this.sourcePrefix().prefixLength() == that.sourcePrefix().prefixLength()) { + ByteBuffer value1 = ByteBuffer.wrap(this.sourcePrefix().address().toOctets()); + ByteBuffer value2 = ByteBuffer.wrap(that.sourcePrefix().address().toOctets()); + return value1.compareTo(value2); + } + + if (this.sourcePrefix().prefixLength() > that.sourcePrefix().prefixLength()) { + return 1; + } else if (this.sourcePrefix().prefixLength() < that.sourcePrefix().prefixLength()) { + return -1; + } + } + return 1; + } +} diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java new file mode 100644 index 0000000000..f9d9d89176 --- /dev/null +++ b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2016 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.bgpio.protocol.flowspec; + +import org.junit.Test; + +import org.onlab.packet.IpPrefix; + +import com.google.common.testing.EqualsTester; + +/** + * Test for BgpFsDestinationPrefix flow specification component. + */ +public class BgpFlowSpecPrefixTest { + private IpPrefix destinationPrefix1 = IpPrefix.valueOf("21.21.21.21/16"); + private IpPrefix sourcePrefix1 = IpPrefix.valueOf("11.11.11.11/16"); + private IpPrefix destinationPrefix2 = IpPrefix.valueOf("42.42.42.42/16"); + private IpPrefix sourcePrefix2 = IpPrefix.valueOf("32.32.32.32/16"); + + private final BgpFlowSpecPrefix tlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1); + private final BgpFlowSpecPrefix sameAsTlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1); + private final BgpFlowSpecPrefix tlv2 = new BgpFlowSpecPrefix(destinationPrefix2, sourcePrefix2); + + @Test + public void testEquality() { + new EqualsTester() + .addEqualityGroup(tlv1, sameAsTlv1) + .addEqualityGroup(tlv2) + .testEquals(); + } +}