Committed by
Gerrit Code Review
[ONOS-4241]Codec for wide community and flow spec
Change-Id: I2dfd6b88c4ae14a02d258a2cdc9ee35b9ff08292
Showing
13 changed files
with
257 additions
and
396 deletions
| ... | @@ -19,9 +19,10 @@ import org.jboss.netty.channel.Channel; | ... | @@ -19,9 +19,10 @@ import org.jboss.netty.channel.Channel; |
| 19 | import org.onosproject.bgpio.exceptions.BgpParseException; | 19 | import org.onosproject.bgpio.exceptions.BgpParseException; |
| 20 | import org.onosproject.bgpio.protocol.BgpFactory; | 20 | import org.onosproject.bgpio.protocol.BgpFactory; |
| 21 | import org.onosproject.bgpio.protocol.BgpMessage; | 21 | import org.onosproject.bgpio.protocol.BgpMessage; |
| 22 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecDetails; | 22 | +import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecNlri; |
| 23 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecPrefix; | 23 | +import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecRouteKey; |
| 24 | import org.onosproject.bgpio.types.BgpValueType; | 24 | import org.onosproject.bgpio.types.BgpValueType; |
| 25 | +import org.onosproject.bgpio.types.attr.WideCommunity; | ||
| 25 | 26 | ||
| 26 | /** | 27 | /** |
| 27 | * Represents the peer side of an BGP peer. | 28 | * Represents the peer side of an BGP peer. |
| ... | @@ -124,14 +125,6 @@ public interface BgpPeer { | ... | @@ -124,14 +125,6 @@ public interface BgpPeer { |
| 124 | void buildAdjRibIn(List<BgpValueType> pathAttr) throws BgpParseException; | 125 | void buildAdjRibIn(List<BgpValueType> pathAttr) throws BgpParseException; |
| 125 | 126 | ||
| 126 | /** | 127 | /** |
| 127 | - * Update flow specification RIB for each peer. | ||
| 128 | - * | ||
| 129 | - * @param pathAttr list of Bgp path attributes | ||
| 130 | - * @throws BgpParseException while building flow spec RIB | ||
| 131 | - */ | ||
| 132 | - void buildFlowSpecRib(List<BgpValueType> pathAttr) throws BgpParseException; | ||
| 133 | - | ||
| 134 | - /** | ||
| 135 | * Return the BGP session info. | 128 | * Return the BGP session info. |
| 136 | * | 129 | * |
| 137 | * @return sessionInfo bgp session info | 130 | * @return sessionInfo bgp session info |
| ... | @@ -142,9 +135,10 @@ public interface BgpPeer { | ... | @@ -142,9 +135,10 @@ public interface BgpPeer { |
| 142 | * Updates flow specification rule. | 135 | * Updates flow specification rule. |
| 143 | * | 136 | * |
| 144 | * @param operType operation type add or delete or update | 137 | * @param operType operation type add or delete or update |
| 145 | - * @param prefix prefix for the flow rule | 138 | + * @param routeKey flow route key for the flow rule |
| 146 | * @param flowSpec BGP flow specification components | 139 | * @param flowSpec BGP flow specification components |
| 140 | + * @param wideCommunity for route policy | ||
| 147 | */ | 141 | */ |
| 148 | - void updateFlowSpec(FlowSpecOperation operType, BgpFlowSpecPrefix prefix, | 142 | + void updateFlowSpec(FlowSpecOperation operType, BgpFlowSpecRouteKey routeKey, |
| 149 | - BgpFlowSpecDetails flowSpec); | 143 | + BgpFlowSpecNlri flowSpec, WideCommunity wideCommunity); |
| 150 | } | 144 | } | ... | ... |
| ... | @@ -17,25 +17,44 @@ package org.onosproject.bgpio.protocol.flowspec; | ... | @@ -17,25 +17,44 @@ package org.onosproject.bgpio.protocol.flowspec; |
| 17 | 17 | ||
| 18 | import java.util.Iterator; | 18 | import java.util.Iterator; |
| 19 | import java.util.List; | 19 | import java.util.List; |
| 20 | +import java.util.ListIterator; | ||
| 20 | import java.util.Objects; | 21 | import java.util.Objects; |
| 22 | + | ||
| 23 | +import org.jboss.netty.buffer.ChannelBuffer; | ||
| 24 | +import org.jboss.netty.buffer.ChannelBuffers; | ||
| 25 | +import org.onosproject.bgpio.types.BgpFsDestinationPortNum; | ||
| 26 | +import org.onosproject.bgpio.types.BgpFsDestinationPrefix; | ||
| 27 | +import org.onosproject.bgpio.types.BgpFsDscpValue; | ||
| 28 | +import org.onosproject.bgpio.types.BgpFsFragment; | ||
| 29 | +import org.onosproject.bgpio.types.BgpFsIcmpCode; | ||
| 30 | +import org.onosproject.bgpio.types.BgpFsIcmpType; | ||
| 31 | +import org.onosproject.bgpio.types.BgpFsIpProtocol; | ||
| 32 | +import org.onosproject.bgpio.types.BgpFsPacketLength; | ||
| 33 | +import org.onosproject.bgpio.types.BgpFsPortNum; | ||
| 34 | +import org.onosproject.bgpio.types.BgpFsSourcePortNum; | ||
| 35 | +import org.onosproject.bgpio.types.BgpFsSourcePrefix; | ||
| 36 | +import org.onosproject.bgpio.types.BgpFsTcpFlags; | ||
| 21 | import org.onosproject.bgpio.types.BgpValueType; | 37 | import org.onosproject.bgpio.types.BgpValueType; |
| 22 | import org.onosproject.bgpio.types.RouteDistinguisher; | 38 | import org.onosproject.bgpio.types.RouteDistinguisher; |
| 39 | +import org.onosproject.bgpio.util.Constants; | ||
| 40 | + | ||
| 23 | import com.google.common.base.MoreObjects; | 41 | import com.google.common.base.MoreObjects; |
| 24 | 42 | ||
| 25 | /** | 43 | /** |
| 26 | * This Class stores flow specification components and action. | 44 | * This Class stores flow specification components and action. |
| 27 | */ | 45 | */ |
| 28 | -public class BgpFlowSpecDetails { | 46 | +public class BgpFlowSpecNlri { |
| 29 | private List<BgpValueType> flowSpecComponents; | 47 | private List<BgpValueType> flowSpecComponents; |
| 30 | private List<BgpValueType> fsActionTlv; | 48 | private List<BgpValueType> fsActionTlv; |
| 31 | private RouteDistinguisher routeDistinguisher; | 49 | private RouteDistinguisher routeDistinguisher; |
| 50 | + public static final short FLOW_SPEC_LEN = 240; | ||
| 32 | 51 | ||
| 33 | /** | 52 | /** |
| 34 | * Flow specification details object constructor with the parameter. | 53 | * Flow specification details object constructor with the parameter. |
| 35 | * | 54 | * |
| 36 | * @param flowSpecComponents flow specification components | 55 | * @param flowSpecComponents flow specification components |
| 37 | */ | 56 | */ |
| 38 | - public BgpFlowSpecDetails(List<BgpValueType> flowSpecComponents) { | 57 | + public BgpFlowSpecNlri(List<BgpValueType> flowSpecComponents) { |
| 39 | this.flowSpecComponents = flowSpecComponents; | 58 | this.flowSpecComponents = flowSpecComponents; |
| 40 | } | 59 | } |
| 41 | 60 | ||
| ... | @@ -43,7 +62,7 @@ public class BgpFlowSpecDetails { | ... | @@ -43,7 +62,7 @@ public class BgpFlowSpecDetails { |
| 43 | * Flow specification details object constructor. | 62 | * Flow specification details object constructor. |
| 44 | * | 63 | * |
| 45 | */ | 64 | */ |
| 46 | - public BgpFlowSpecDetails() { | 65 | + public BgpFlowSpecNlri() { |
| 47 | 66 | ||
| 48 | } | 67 | } |
| 49 | 68 | ||
| ... | @@ -112,11 +131,11 @@ public class BgpFlowSpecDetails { | ... | @@ -112,11 +131,11 @@ public class BgpFlowSpecDetails { |
| 112 | return true; | 131 | return true; |
| 113 | } | 132 | } |
| 114 | 133 | ||
| 115 | - if (obj instanceof BgpFlowSpecDetails) { | 134 | + if (obj instanceof BgpFlowSpecNlri) { |
| 116 | int countObjSubTlv = 0; | 135 | int countObjSubTlv = 0; |
| 117 | int countOtherSubTlv = 0; | 136 | int countOtherSubTlv = 0; |
| 118 | boolean isCommonSubTlv = true; | 137 | boolean isCommonSubTlv = true; |
| 119 | - BgpFlowSpecDetails other = (BgpFlowSpecDetails) obj; | 138 | + BgpFlowSpecNlri other = (BgpFlowSpecNlri) obj; |
| 120 | Iterator<BgpValueType> objListIterator = other.flowSpecComponents.iterator(); | 139 | Iterator<BgpValueType> objListIterator = other.flowSpecComponents.iterator(); |
| 121 | countOtherSubTlv = other.flowSpecComponents.size(); | 140 | countOtherSubTlv = other.flowSpecComponents.size(); |
| 122 | countObjSubTlv = flowSpecComponents.size(); | 141 | countObjSubTlv = flowSpecComponents.size(); |
| ... | @@ -138,6 +157,133 @@ public class BgpFlowSpecDetails { | ... | @@ -138,6 +157,133 @@ public class BgpFlowSpecDetails { |
| 138 | return false; | 157 | return false; |
| 139 | } | 158 | } |
| 140 | 159 | ||
| 160 | + /** | ||
| 161 | + * Write flow type to channel buffer. | ||
| 162 | + * | ||
| 163 | + * @param tlv flow type | ||
| 164 | + * @param cb channel buffer | ||
| 165 | + */ | ||
| 166 | + public static void writeFlowType(BgpValueType tlv, ChannelBuffer cb) { | ||
| 167 | + | ||
| 168 | + switch (tlv.getType()) { | ||
| 169 | + case Constants.BGP_FLOWSPEC_DST_PREFIX: | ||
| 170 | + BgpFsDestinationPrefix fsDstPrefix = (BgpFsDestinationPrefix) tlv; | ||
| 171 | + fsDstPrefix.write(cb); | ||
| 172 | + break; | ||
| 173 | + case Constants.BGP_FLOWSPEC_SRC_PREFIX: | ||
| 174 | + BgpFsSourcePrefix fsSrcPrefix = (BgpFsSourcePrefix) tlv; | ||
| 175 | + fsSrcPrefix.write(cb); | ||
| 176 | + break; | ||
| 177 | + case Constants.BGP_FLOWSPEC_IP_PROTO: | ||
| 178 | + BgpFsIpProtocol fsIpProtocol = (BgpFsIpProtocol) tlv; | ||
| 179 | + fsIpProtocol.write(cb); | ||
| 180 | + break; | ||
| 181 | + case Constants.BGP_FLOWSPEC_PORT: | ||
| 182 | + BgpFsPortNum fsPortNum = (BgpFsPortNum) tlv; | ||
| 183 | + fsPortNum.write(cb); | ||
| 184 | + break; | ||
| 185 | + case Constants.BGP_FLOWSPEC_DST_PORT: | ||
| 186 | + BgpFsDestinationPortNum fsDstPortNum = (BgpFsDestinationPortNum) tlv; | ||
| 187 | + fsDstPortNum.write(cb); | ||
| 188 | + break; | ||
| 189 | + case Constants.BGP_FLOWSPEC_SRC_PORT: | ||
| 190 | + BgpFsSourcePortNum fsSrcPortNum = (BgpFsSourcePortNum) tlv; | ||
| 191 | + fsSrcPortNum.write(cb); | ||
| 192 | + break; | ||
| 193 | + case Constants.BGP_FLOWSPEC_ICMP_TP: | ||
| 194 | + BgpFsIcmpType fsIcmpType = (BgpFsIcmpType) tlv; | ||
| 195 | + fsIcmpType.write(cb); | ||
| 196 | + break; | ||
| 197 | + case Constants.BGP_FLOWSPEC_ICMP_CD: | ||
| 198 | + BgpFsIcmpCode fsIcmpCode = (BgpFsIcmpCode) tlv; | ||
| 199 | + fsIcmpCode.write(cb); | ||
| 200 | + break; | ||
| 201 | + case Constants.BGP_FLOWSPEC_TCP_FLAGS: | ||
| 202 | + BgpFsTcpFlags fsTcpFlags = (BgpFsTcpFlags) tlv; | ||
| 203 | + fsTcpFlags.write(cb); | ||
| 204 | + break; | ||
| 205 | + case Constants.BGP_FLOWSPEC_PCK_LEN: | ||
| 206 | + BgpFsPacketLength fsPacketLen = (BgpFsPacketLength) tlv; | ||
| 207 | + fsPacketLen.write(cb); | ||
| 208 | + break; | ||
| 209 | + case Constants.BGP_FLOWSPEC_DSCP: | ||
| 210 | + BgpFsDscpValue fsDscpVal = (BgpFsDscpValue) tlv; | ||
| 211 | + fsDscpVal.write(cb); | ||
| 212 | + break; | ||
| 213 | + case Constants.BGP_FLOWSPEC_FRAGMENT: | ||
| 214 | + BgpFsFragment fsFragment = (BgpFsFragment) tlv; | ||
| 215 | + fsFragment.write(cb); | ||
| 216 | + break; | ||
| 217 | + default: | ||
| 218 | + break; | ||
| 219 | + } | ||
| 220 | + return; | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + /** | ||
| 224 | + * Update buffer with identical flow types. | ||
| 225 | + * | ||
| 226 | + * @param cb channel buffer | ||
| 227 | + */ | ||
| 228 | + public static void updateBufferIdenticalFlowTypes(ChannelBuffer cb, BgpFlowSpecNlri bgpFlowSpecNlri) { | ||
| 229 | + | ||
| 230 | + List<BgpValueType> flowSpec = bgpFlowSpecNlri.flowSpecComponents(); | ||
| 231 | + ListIterator<BgpValueType> listIterator = flowSpec.listIterator(); | ||
| 232 | + | ||
| 233 | + while (listIterator.hasNext()) { | ||
| 234 | + ChannelBuffer flowSpecTmpBuff = ChannelBuffers.dynamicBuffer(); | ||
| 235 | + int tmpBuffStartIndx = flowSpecTmpBuff.writerIndex(); | ||
| 236 | + | ||
| 237 | + BgpValueType tlv = listIterator.next(); | ||
| 238 | + writeFlowType(tlv, flowSpecTmpBuff); | ||
| 239 | + | ||
| 240 | + /* RFC 5575: section 4, If the NLRI length value is smaller than 240 (0xf0 hex), the length | ||
| 241 | + field can be encoded as a single octet. Otherwise, it is encoded as | ||
| 242 | + an extended-length 2-octet values */ | ||
| 243 | + int len = flowSpecTmpBuff.writerIndex() - tmpBuffStartIndx; | ||
| 244 | + if (len >= FLOW_SPEC_LEN) { | ||
| 245 | + cb.writeShort(len); | ||
| 246 | + } else { | ||
| 247 | + cb.writeByte(len); | ||
| 248 | + } | ||
| 249 | + //Copy from bynamic buffer to channel buffer | ||
| 250 | + cb.writeBytes(flowSpecTmpBuff); | ||
| 251 | + } | ||
| 252 | + return; | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + /** | ||
| 256 | + * Update buffer with non-identical flow types. | ||
| 257 | + * | ||
| 258 | + * @param cb channel buffer | ||
| 259 | + */ | ||
| 260 | + public static void updateBufferNonIdenticalFlowTypes(ChannelBuffer cb, BgpFlowSpecNlri bgpFlowSpecNlri) { | ||
| 261 | + ChannelBuffer flowSpecTmpBuff = ChannelBuffers.dynamicBuffer(); | ||
| 262 | + List<BgpValueType> flowSpec = bgpFlowSpecNlri.flowSpecComponents(); | ||
| 263 | + ListIterator<BgpValueType> listIterator = flowSpec.listIterator(); | ||
| 264 | + int tmpBuffStartIndx = flowSpecTmpBuff.writerIndex(); | ||
| 265 | + | ||
| 266 | + flowSpec = bgpFlowSpecNlri.flowSpecComponents(); | ||
| 267 | + listIterator = flowSpec.listIterator(); | ||
| 268 | + | ||
| 269 | + while (listIterator.hasNext()) { | ||
| 270 | + BgpValueType tlv = listIterator.next(); | ||
| 271 | + writeFlowType(tlv, flowSpecTmpBuff); | ||
| 272 | + } | ||
| 273 | + | ||
| 274 | + /* RFC 5575: section 4, If the NLRI length value is smaller than 240 (0xf0 hex), the length | ||
| 275 | + field can be encoded as a single octet. Otherwise, it is encoded as | ||
| 276 | + an extended-length 2-octet values */ | ||
| 277 | + int len = flowSpecTmpBuff.writerIndex() - tmpBuffStartIndx; | ||
| 278 | + if (len >= FLOW_SPEC_LEN) { | ||
| 279 | + cb.writeShort(len); | ||
| 280 | + } else { | ||
| 281 | + cb.writeByte(len); | ||
| 282 | + } | ||
| 283 | + //Copy from bynamic buffer to channel buffer | ||
| 284 | + cb.writeBytes(flowSpecTmpBuff); | ||
| 285 | + } | ||
| 286 | + | ||
| 141 | @Override | 287 | @Override |
| 142 | public String toString() { | 288 | public String toString() { |
| 143 | return MoreObjects.toStringHelper(getClass()) | 289 | return MoreObjects.toStringHelper(getClass()) | ... | ... |
| ... | @@ -17,45 +17,41 @@ | ... | @@ -17,45 +17,41 @@ |
| 17 | package org.onosproject.bgpio.protocol.flowspec; | 17 | package org.onosproject.bgpio.protocol.flowspec; |
| 18 | 18 | ||
| 19 | import java.util.Objects; | 19 | import java.util.Objects; |
| 20 | -import org.onlab.packet.IpPrefix; | ||
| 21 | import org.slf4j.Logger; | 20 | import org.slf4j.Logger; |
| 22 | import org.slf4j.LoggerFactory; | 21 | import org.slf4j.LoggerFactory; |
| 23 | -import java.nio.ByteBuffer; | ||
| 24 | 22 | ||
| 25 | import com.google.common.base.MoreObjects; | 23 | import com.google.common.base.MoreObjects; |
| 26 | 24 | ||
| 27 | /** | 25 | /** |
| 28 | - * Provides BGP flow specification rule index. | 26 | + * Provides BGP flow specification route index. |
| 29 | */ | 27 | */ |
| 30 | -public class BgpFlowSpecPrefix implements Comparable<Object> { | 28 | +public class BgpFlowSpecRouteKey implements Comparable<Object> { |
| 31 | 29 | ||
| 32 | - private static final Logger log = LoggerFactory.getLogger(BgpFlowSpecPrefix.class); | 30 | + private static final Logger log = LoggerFactory.getLogger(BgpFlowSpecRouteKey.class); |
| 33 | 31 | ||
| 34 | - private final IpPrefix destinationPrefix; | 32 | + private final String routeKey; |
| 35 | - private final IpPrefix sourcePrefix; | ||
| 36 | 33 | ||
| 37 | /** | 34 | /** |
| 38 | * Constructor to initialize parameters. | 35 | * Constructor to initialize parameters. |
| 39 | * | 36 | * |
| 40 | - * @param destinationPrefix destination prefix | 37 | + * @param routeKey route key |
| 41 | - * @param sourcePrefix source prefix | ||
| 42 | */ | 38 | */ |
| 43 | - public BgpFlowSpecPrefix(IpPrefix destinationPrefix, IpPrefix sourcePrefix) { | 39 | + public BgpFlowSpecRouteKey(String routeKey) { |
| 44 | - if (destinationPrefix == null) { | 40 | + this.routeKey = routeKey; |
| 45 | - destinationPrefix = IpPrefix.valueOf(0, 0); | 41 | + } |
| 46 | - } | ||
| 47 | - | ||
| 48 | - if (sourcePrefix == null) { | ||
| 49 | - sourcePrefix = IpPrefix.valueOf(0, 0); | ||
| 50 | - } | ||
| 51 | 42 | ||
| 52 | - this.destinationPrefix = destinationPrefix; | 43 | + /** |
| 53 | - this.sourcePrefix = sourcePrefix; | 44 | + * Returns route key. |
| 45 | + * | ||
| 46 | + * @return route key | ||
| 47 | + */ | ||
| 48 | + public String routeKey() { | ||
| 49 | + return this.routeKey; | ||
| 54 | } | 50 | } |
| 55 | 51 | ||
| 56 | @Override | 52 | @Override |
| 57 | public int hashCode() { | 53 | public int hashCode() { |
| 58 | - return Objects.hash(destinationPrefix, sourcePrefix); | 54 | + return Objects.hashCode(routeKey); |
| 59 | } | 55 | } |
| 60 | 56 | ||
| 61 | @Override | 57 | @Override |
| ... | @@ -63,93 +59,33 @@ public class BgpFlowSpecPrefix implements Comparable<Object> { | ... | @@ -63,93 +59,33 @@ public class BgpFlowSpecPrefix implements Comparable<Object> { |
| 63 | if (this == obj) { | 59 | if (this == obj) { |
| 64 | return true; | 60 | return true; |
| 65 | } | 61 | } |
| 66 | - | 62 | + if (obj instanceof BgpFlowSpecRouteKey) { |
| 67 | - if (obj instanceof BgpFlowSpecPrefix) { | 63 | + BgpFlowSpecRouteKey other = (BgpFlowSpecRouteKey) obj; |
| 68 | - BgpFlowSpecPrefix other = (BgpFlowSpecPrefix) obj; | 64 | + return this.routeKey.equals(other.routeKey); |
| 69 | - | ||
| 70 | - if ((this.destinationPrefix != null) && (this.sourcePrefix != null) | ||
| 71 | - && (this.destinationPrefix.equals(other.destinationPrefix))) { | ||
| 72 | - return this.sourcePrefix.equals(other.sourcePrefix); | ||
| 73 | - } else if (this.destinationPrefix != null) { | ||
| 74 | - return this.destinationPrefix.equals(other.destinationPrefix); | ||
| 75 | - } else if (this.sourcePrefix != null) { | ||
| 76 | - return this.sourcePrefix.equals(other.sourcePrefix); | ||
| 77 | - } | ||
| 78 | - return false; | ||
| 79 | } | 65 | } |
| 80 | return false; | 66 | return false; |
| 81 | } | 67 | } |
| 82 | 68 | ||
| 83 | - /** | ||
| 84 | - * Returns destination prefix. | ||
| 85 | - * | ||
| 86 | - * @return destination prefix | ||
| 87 | - */ | ||
| 88 | - public IpPrefix destinationPrefix() { | ||
| 89 | - return this.destinationPrefix; | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - /** | ||
| 93 | - * Returns source prefix. | ||
| 94 | - * | ||
| 95 | - * @return source prefix | ||
| 96 | - */ | ||
| 97 | - public IpPrefix sourcePrefix() { | ||
| 98 | - return this.sourcePrefix; | ||
| 99 | - } | ||
| 100 | - | ||
| 101 | @Override | 69 | @Override |
| 102 | - public String toString() { | ||
| 103 | - return MoreObjects.toStringHelper(getClass()).omitNullValues() | ||
| 104 | - .add("destinationPrefix", destinationPrefix) | ||
| 105 | - .add("sourcePrefix", destinationPrefix) | ||
| 106 | - .toString(); | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - /** | ||
| 110 | - * Compares this and o object. | ||
| 111 | - * | ||
| 112 | - * @param o object to be compared with this object | ||
| 113 | - * @return which object is greater | ||
| 114 | - */ | ||
| 115 | public int compareTo(Object o) { | 70 | public int compareTo(Object o) { |
| 116 | if (this.equals(o)) { | 71 | if (this.equals(o)) { |
| 117 | return 0; | 72 | return 0; |
| 118 | } | 73 | } |
| 119 | 74 | ||
| 120 | - if (o instanceof BgpFlowSpecPrefix) { | 75 | + if (o instanceof BgpFlowSpecRouteKey) { |
| 121 | - BgpFlowSpecPrefix that = (BgpFlowSpecPrefix) o; | 76 | + BgpFlowSpecRouteKey other = (BgpFlowSpecRouteKey) o; |
| 122 | - if (this.destinationPrefix() != null) { | 77 | + if (this.routeKey.compareTo(other.routeKey) != 0) { |
| 123 | - if (this.destinationPrefix().prefixLength() == that.destinationPrefix().prefixLength()) { | 78 | + return this.routeKey.compareTo(other.routeKey); |
| 124 | - ByteBuffer value1 = ByteBuffer.wrap(this.destinationPrefix().address().toOctets()); | ||
| 125 | - ByteBuffer value2 = ByteBuffer.wrap(that.destinationPrefix().address().toOctets()); | ||
| 126 | - int cmpVal = value1.compareTo(value2); | ||
| 127 | - if (cmpVal != 0) { | ||
| 128 | - return cmpVal; | ||
| 129 | - } | ||
| 130 | - } else { | ||
| 131 | - if (this.destinationPrefix().prefixLength() > that.destinationPrefix().prefixLength()) { | ||
| 132 | - return 1; | ||
| 133 | - } else if (this.destinationPrefix().prefixLength() < that.destinationPrefix().prefixLength()) { | ||
| 134 | - return -1; | ||
| 135 | - } | ||
| 136 | - } | ||
| 137 | - } | ||
| 138 | - if (this.sourcePrefix() != null) { | ||
| 139 | - if (this.sourcePrefix().prefixLength() == that.sourcePrefix().prefixLength()) { | ||
| 140 | - ByteBuffer value1 = ByteBuffer.wrap(this.sourcePrefix().address().toOctets()); | ||
| 141 | - ByteBuffer value2 = ByteBuffer.wrap(that.sourcePrefix().address().toOctets()); | ||
| 142 | - return value1.compareTo(value2); | ||
| 143 | - } | ||
| 144 | - | ||
| 145 | - if (this.sourcePrefix().prefixLength() > that.sourcePrefix().prefixLength()) { | ||
| 146 | - return 1; | ||
| 147 | - } else if (this.sourcePrefix().prefixLength() < that.sourcePrefix().prefixLength()) { | ||
| 148 | - return -1; | ||
| 149 | - } | ||
| 150 | } | 79 | } |
| 151 | return 0; | 80 | return 0; |
| 152 | } | 81 | } |
| 153 | return 1; | 82 | return 1; |
| 154 | } | 83 | } |
| 84 | + | ||
| 85 | + @Override | ||
| 86 | + public String toString() { | ||
| 87 | + return MoreObjects.toStringHelper(getClass()).omitNullValues() | ||
| 88 | + .add("routeKey", routeKey) | ||
| 89 | + .toString(); | ||
| 90 | + } | ||
| 155 | } | 91 | } | ... | ... |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
| ... | @@ -64,6 +64,22 @@ public class RpdCapabilityTlv implements BgpValueType { | ... | @@ -64,6 +64,22 @@ public class RpdCapabilityTlv implements BgpValueType { |
| 64 | return sendReceive; | 64 | return sendReceive; |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | + /** | ||
| 68 | + * Returns address family identifier value. | ||
| 69 | + * @return afi address family identifier value | ||
| 70 | + */ | ||
| 71 | + public short getAfi() { | ||
| 72 | + return afi; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + /** | ||
| 76 | + * Returns subsequent address family identifier value. | ||
| 77 | + * @return safi subsequent address family identifier value | ||
| 78 | + */ | ||
| 79 | + public byte getSafi() { | ||
| 80 | + return sAfi; | ||
| 81 | + } | ||
| 82 | + | ||
| 67 | @Override | 83 | @Override |
| 68 | public short getType() { | 84 | public short getType() { |
| 69 | return TYPE; | 85 | return TYPE; | ... | ... |
| ... | @@ -28,23 +28,23 @@ import org.onosproject.bgpio.types.BgpValueType; | ... | @@ -28,23 +28,23 @@ import org.onosproject.bgpio.types.BgpValueType; |
| 28 | import com.google.common.testing.EqualsTester; | 28 | import com.google.common.testing.EqualsTester; |
| 29 | 29 | ||
| 30 | /** | 30 | /** |
| 31 | - * Test for BgpFlowSpecDetails flow specification. | 31 | + * Test for BgpFlowSpecNlri flow specification. |
| 32 | */ | 32 | */ |
| 33 | -public class BgpFlowSpecDetailsTest { | 33 | +public class BgpFlowSpecNlriTest { |
| 34 | 34 | ||
| 35 | List<BgpValueType> flowSpecComponents1 = new LinkedList<>(); | 35 | List<BgpValueType> flowSpecComponents1 = new LinkedList<>(); |
| 36 | private List<BgpFsOperatorValue> operatorValue1 = new ArrayList<>(); | 36 | private List<BgpFsOperatorValue> operatorValue1 = new ArrayList<>(); |
| 37 | - BgpFlowSpecDetails flowSpecDetails1 = new BgpFlowSpecDetails(flowSpecComponents1); | 37 | + BgpFlowSpecNlri flowSpecDetails1 = new BgpFlowSpecNlri(flowSpecComponents1); |
| 38 | BgpFsPortNum portNum1 = new BgpFsPortNum(operatorValue1); | 38 | BgpFsPortNum portNum1 = new BgpFsPortNum(operatorValue1); |
| 39 | 39 | ||
| 40 | List<BgpValueType> flowSpecComponents = new LinkedList<>(); | 40 | List<BgpValueType> flowSpecComponents = new LinkedList<>(); |
| 41 | private List<BgpFsOperatorValue> operatorValue = new ArrayList<>(); | 41 | private List<BgpFsOperatorValue> operatorValue = new ArrayList<>(); |
| 42 | - BgpFlowSpecDetails flowSpecDetails = new BgpFlowSpecDetails(flowSpecComponents); | 42 | + BgpFlowSpecNlri flowSpecDetails = new BgpFlowSpecNlri(flowSpecComponents); |
| 43 | BgpFsPortNum portNum = new BgpFsPortNum(operatorValue); | 43 | BgpFsPortNum portNum = new BgpFsPortNum(operatorValue); |
| 44 | 44 | ||
| 45 | List<BgpValueType> flowSpecComponents2 = new LinkedList<>(); | 45 | List<BgpValueType> flowSpecComponents2 = new LinkedList<>(); |
| 46 | private List<BgpFsOperatorValue> operatorValue2 = new ArrayList<>(); | 46 | private List<BgpFsOperatorValue> operatorValue2 = new ArrayList<>(); |
| 47 | - BgpFlowSpecDetails flowSpecDetails2 = new BgpFlowSpecDetails(flowSpecComponents2); | 47 | + BgpFlowSpecNlri flowSpecDetails2 = new BgpFlowSpecNlri(flowSpecComponents2); |
| 48 | BgpFsPortNum portNum2 = new BgpFsPortNum(operatorValue2); | 48 | BgpFsPortNum portNum2 = new BgpFsPortNum(operatorValue2); |
| 49 | 49 | ||
| 50 | @Test | 50 | @Test | ... | ... |
protocols/bgp/bgpio/src/test/java/org/onosproject/bgpio/protocol/flowspec/BgpFlowSpecPrefixTest.java
| ... | @@ -16,23 +16,18 @@ | ... | @@ -16,23 +16,18 @@ |
| 16 | package org.onosproject.bgpio.protocol.flowspec; | 16 | package org.onosproject.bgpio.protocol.flowspec; |
| 17 | 17 | ||
| 18 | import org.junit.Test; | 18 | import org.junit.Test; |
| 19 | - | ||
| 20 | -import org.onlab.packet.IpPrefix; | ||
| 21 | - | ||
| 22 | import com.google.common.testing.EqualsTester; | 19 | import com.google.common.testing.EqualsTester; |
| 23 | 20 | ||
| 24 | /** | 21 | /** |
| 25 | * Test for BgpFsDestinationPrefix flow specification component. | 22 | * Test for BgpFsDestinationPrefix flow specification component. |
| 26 | */ | 23 | */ |
| 27 | public class BgpFlowSpecPrefixTest { | 24 | public class BgpFlowSpecPrefixTest { |
| 28 | - private IpPrefix destinationPrefix1 = IpPrefix.valueOf("21.21.21.21/16"); | 25 | + private String routeKey1 = "flowRoute1"; |
| 29 | - private IpPrefix sourcePrefix1 = IpPrefix.valueOf("11.11.11.11/16"); | 26 | + private String routeKey2 = "flowRoute2"; |
| 30 | - private IpPrefix destinationPrefix2 = IpPrefix.valueOf("42.42.42.42/16"); | ||
| 31 | - private IpPrefix sourcePrefix2 = IpPrefix.valueOf("32.32.32.32/16"); | ||
| 32 | 27 | ||
| 33 | - private final BgpFlowSpecPrefix tlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1); | 28 | + private final BgpFlowSpecRouteKey tlv1 = new BgpFlowSpecRouteKey(routeKey1); |
| 34 | - private final BgpFlowSpecPrefix sameAsTlv1 = new BgpFlowSpecPrefix(destinationPrefix1, sourcePrefix1); | 29 | + private final BgpFlowSpecRouteKey sameAsTlv1 = new BgpFlowSpecRouteKey(routeKey1); |
| 35 | - private final BgpFlowSpecPrefix tlv2 = new BgpFlowSpecPrefix(destinationPrefix2, sourcePrefix2); | 30 | + private final BgpFlowSpecRouteKey tlv2 = new BgpFlowSpecRouteKey(routeKey2); |
| 36 | 31 | ||
| 37 | @Test | 32 | @Test |
| 38 | public void testEquality() { | 33 | public void testEquality() { | ... | ... |
| 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 | +package org.onosproject.bgpio.protocol.flowspec; | ||
| 17 | + | ||
| 18 | +import org.junit.Test; | ||
| 19 | + | ||
| 20 | +import com.google.common.testing.EqualsTester; | ||
| 21 | + | ||
| 22 | +/** | ||
| 23 | + * Test for BgpFlowSpecRouteKeyTest flow specification component. | ||
| 24 | + */ | ||
| 25 | +public class BgpFlowSpecRouteKeyTest { | ||
| 26 | + private static String routeKey1 = "flowRoute1"; | ||
| 27 | + private static String routeKey2 = "flowRoute2"; | ||
| 28 | + | ||
| 29 | + private final BgpFlowSpecRouteKey tlv1 = new BgpFlowSpecRouteKey(routeKey1); | ||
| 30 | + private final BgpFlowSpecRouteKey sameAsTlv1 = new BgpFlowSpecRouteKey(routeKey1); | ||
| 31 | + private final BgpFlowSpecRouteKey tlv2 = new BgpFlowSpecRouteKey(routeKey2); | ||
| 32 | + | ||
| 33 | + @Test | ||
| 34 | + public void testEquality() { | ||
| 35 | + new EqualsTester() | ||
| 36 | + .addEqualityGroup(tlv1, sameAsTlv1) | ||
| 37 | + .addEqualityGroup(tlv2) | ||
| 38 | + .testEquals(); | ||
| 39 | + } | ||
| 40 | +} |
| ... | @@ -133,29 +133,23 @@ public class BgpControllerImpl implements BgpController { | ... | @@ -133,29 +133,23 @@ public class BgpControllerImpl implements BgpController { |
| 133 | } | 133 | } |
| 134 | Iterator<BgpValueType> listIterator = pathAttr.iterator(); | 134 | Iterator<BgpValueType> listIterator = pathAttr.iterator(); |
| 135 | boolean isLinkstate = false; | 135 | boolean isLinkstate = false; |
| 136 | - boolean isFlowSpec = false; | 136 | + |
| 137 | while (listIterator.hasNext()) { | 137 | while (listIterator.hasNext()) { |
| 138 | BgpValueType attr = listIterator.next(); | 138 | BgpValueType attr = listIterator.next(); |
| 139 | if (attr instanceof MpReachNlri) { | 139 | if (attr instanceof MpReachNlri) { |
| 140 | MpReachNlri mpReach = (MpReachNlri) attr; | 140 | MpReachNlri mpReach = (MpReachNlri) attr; |
| 141 | - if (mpReach.bgpFlowSpecInfo() == null) { | 141 | + if (mpReach.bgpFlowSpecNlri() == null) { |
| 142 | isLinkstate = true; | 142 | isLinkstate = true; |
| 143 | - } else { | ||
| 144 | - isFlowSpec = true; | ||
| 145 | } | 143 | } |
| 146 | } else if (attr instanceof MpUnReachNlri) { | 144 | } else if (attr instanceof MpUnReachNlri) { |
| 147 | MpUnReachNlri mpUnReach = (MpUnReachNlri) attr; | 145 | MpUnReachNlri mpUnReach = (MpUnReachNlri) attr; |
| 148 | - if (mpUnReach.bgpFlowSpecInfo() == null) { | 146 | + if (mpUnReach.bgpFlowSpecNlri() == null) { |
| 149 | isLinkstate = true; | 147 | isLinkstate = true; |
| 150 | - } else { | ||
| 151 | - isFlowSpec = true; | ||
| 152 | } | 148 | } |
| 153 | } | 149 | } |
| 154 | } | 150 | } |
| 155 | if (isLinkstate) { | 151 | if (isLinkstate) { |
| 156 | peer.buildAdjRibIn(pathAttr); | 152 | peer.buildAdjRibIn(pathAttr); |
| 157 | - } else if (isFlowSpec) { | ||
| 158 | - peer.buildFlowSpecRib(pathAttr); | ||
| 159 | } | 153 | } |
| 160 | break; | 154 | break; |
| 161 | default: | 155 | default: | ... | ... |
protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpFlowSpecRib.java
deleted
100755 → 0
| 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.bgp.controller.impl; | ||
| 18 | - | ||
| 19 | -import java.util.Map; | ||
| 20 | -import java.util.TreeMap; | ||
| 21 | - | ||
| 22 | -import org.onosproject.bgpio.types.RouteDistinguisher; | ||
| 23 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecDetails; | ||
| 24 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecPrefix; | ||
| 25 | - | ||
| 26 | -import com.google.common.base.MoreObjects; | ||
| 27 | - | ||
| 28 | -/** | ||
| 29 | - * Implementation of BGP flow specification RIB. | ||
| 30 | - */ | ||
| 31 | -public class BgpFlowSpecRib { | ||
| 32 | - private Map<BgpFlowSpecPrefix, BgpFlowSpecDetails> flowSpecTree = new TreeMap<>(); | ||
| 33 | - private Map<RouteDistinguisher, Map<BgpFlowSpecPrefix, BgpFlowSpecDetails>> vpnFlowSpecTree = new TreeMap<>(); | ||
| 34 | - | ||
| 35 | - /** | ||
| 36 | - * Returns the BGP flow spec info. | ||
| 37 | - * | ||
| 38 | - * @return BGP flow spec tree | ||
| 39 | - */ | ||
| 40 | - public Map<BgpFlowSpecPrefix, BgpFlowSpecDetails> flowSpecTree() { | ||
| 41 | - return flowSpecTree; | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - /** | ||
| 45 | - * Gets VPN flowspec tree. | ||
| 46 | - * | ||
| 47 | - * @return vpn flow spec tree | ||
| 48 | - */ | ||
| 49 | - public Map<RouteDistinguisher, Map<BgpFlowSpecPrefix, BgpFlowSpecDetails>> vpnFlowSpecTree() { | ||
| 50 | - return vpnFlowSpecTree; | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - | ||
| 54 | - /** | ||
| 55 | - * Update BGP flow spec details. | ||
| 56 | - * | ||
| 57 | - * @param prefix prefix Info | ||
| 58 | - * @param flowSpec BGP flow specifications details | ||
| 59 | - */ | ||
| 60 | - public void add(BgpFlowSpecPrefix prefix, BgpFlowSpecDetails flowSpec) { | ||
| 61 | - if (flowSpecTree.containsKey(prefix)) { | ||
| 62 | - flowSpecTree.replace(prefix, flowSpec); | ||
| 63 | - } else { | ||
| 64 | - flowSpecTree.put(prefix, flowSpec); | ||
| 65 | - } | ||
| 66 | - } | ||
| 67 | - | ||
| 68 | - /** | ||
| 69 | - * Removes flow spec. | ||
| 70 | - * | ||
| 71 | - * @param flowSpec BGP flow specification | ||
| 72 | - */ | ||
| 73 | - public void delete(BgpFlowSpecPrefix flowSpec) { | ||
| 74 | - if (flowSpecTree.containsKey(flowSpec)) { | ||
| 75 | - flowSpecTree.remove(flowSpec); | ||
| 76 | - } | ||
| 77 | - } | ||
| 78 | - | ||
| 79 | - /** | ||
| 80 | - * Update BGP flow spec details with routedistinguisher. | ||
| 81 | - * | ||
| 82 | - * @param routeDistinguisher route distinguisher | ||
| 83 | - * @param prefix prefix Info | ||
| 84 | - * @param flowSpec BGP flow specifications details | ||
| 85 | - */ | ||
| 86 | - public void add(RouteDistinguisher routeDistinguisher, BgpFlowSpecPrefix prefix, BgpFlowSpecDetails flowSpec) { | ||
| 87 | - Map<BgpFlowSpecPrefix, BgpFlowSpecDetails> fsTree; | ||
| 88 | - if (!vpnFlowSpecTree.containsKey(routeDistinguisher)) { | ||
| 89 | - | ||
| 90 | - fsTree = new TreeMap<>(); | ||
| 91 | - | ||
| 92 | - vpnFlowSpecTree.put(routeDistinguisher, fsTree); | ||
| 93 | - } else { | ||
| 94 | - fsTree = vpnFlowSpecTree().get(routeDistinguisher); | ||
| 95 | - } | ||
| 96 | - if (fsTree.containsKey(prefix)) { | ||
| 97 | - fsTree.replace(prefix, flowSpec); | ||
| 98 | - } else { | ||
| 99 | - fsTree.put(prefix, flowSpec); | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | - | ||
| 103 | - /** | ||
| 104 | - * Removes flow spec. | ||
| 105 | - * | ||
| 106 | - * @param routeDistinguisher route distinguisher | ||
| 107 | - * @param flowSpecPrefix BGP flow specification prefix | ||
| 108 | - */ | ||
| 109 | - public void delete(RouteDistinguisher routeDistinguisher, BgpFlowSpecPrefix flowSpecPrefix) { | ||
| 110 | - if (vpnFlowSpecTree.containsKey(routeDistinguisher)) { | ||
| 111 | - Map<BgpFlowSpecPrefix, BgpFlowSpecDetails> fsTree = vpnFlowSpecTree().get(routeDistinguisher); | ||
| 112 | - fsTree.remove(flowSpecPrefix); | ||
| 113 | - if (fsTree.size() == 0) { | ||
| 114 | - vpnFlowSpecTree.remove(routeDistinguisher); | ||
| 115 | - } | ||
| 116 | - } | ||
| 117 | - } | ||
| 118 | - | ||
| 119 | - @Override | ||
| 120 | - public String toString() { | ||
| 121 | - return MoreObjects.toStringHelper(getClass()) | ||
| 122 | - .omitNullValues() | ||
| 123 | - .add("flowSpecTree", flowSpecTree) | ||
| 124 | - .add("vpnFlowSpecTree", vpnFlowSpecTree) | ||
| 125 | - .toString(); | ||
| 126 | - } | ||
| 127 | -} |
This diff is collapsed. Click to expand it.
protocols/bgp/ctl/src/test/java/org/onosproject/controller/impl/BgpFlowSpecRibTest.java
deleted
100644 → 0
| 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 | -package org.onosproject.controller.impl; | ||
| 17 | - | ||
| 18 | -import org.junit.Test; | ||
| 19 | -import org.onlab.packet.IpAddress; | ||
| 20 | -import org.onlab.packet.IpPrefix; | ||
| 21 | -import org.onosproject.bgp.controller.impl.BgpFlowSpecRib; | ||
| 22 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecDetails; | ||
| 23 | -import org.onosproject.bgpio.protocol.flowspec.BgpFlowSpecPrefix; | ||
| 24 | -import org.onosproject.bgpio.types.BgpFsOperatorValue; | ||
| 25 | -import org.onosproject.bgpio.types.BgpFsPortNum; | ||
| 26 | -import org.onosproject.bgpio.types.BgpValueType; | ||
| 27 | -import org.onosproject.bgpio.types.RouteDistinguisher; | ||
| 28 | - | ||
| 29 | -import java.util.ArrayList; | ||
| 30 | -import java.util.LinkedList; | ||
| 31 | -import java.util.List; | ||
| 32 | - | ||
| 33 | -import static org.hamcrest.MatcherAssert.assertThat; | ||
| 34 | -import static org.hamcrest.core.Is.is; | ||
| 35 | - | ||
| 36 | -/** | ||
| 37 | - * Test cases for BGP Selection Algorithm. | ||
| 38 | - */ | ||
| 39 | -public class BgpFlowSpecRibTest { | ||
| 40 | - | ||
| 41 | - /** | ||
| 42 | - * Add flow specification to rib. | ||
| 43 | - */ | ||
| 44 | - @Test | ||
| 45 | - public void bgpFlowSpecRibTests1() { | ||
| 46 | - List<BgpValueType> flowSpecComponents = new LinkedList<>(); | ||
| 47 | - List<BgpFsOperatorValue> operatorValue = new ArrayList<>(); | ||
| 48 | - BgpFlowSpecRib rib = new BgpFlowSpecRib(); | ||
| 49 | - | ||
| 50 | - IpPrefix destinationPrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.1"), 32); | ||
| 51 | - IpPrefix sourcePrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.2"), 32); | ||
| 52 | - | ||
| 53 | - BgpFlowSpecPrefix prefix = new BgpFlowSpecPrefix(destinationPrefix, sourcePrefix); | ||
| 54 | - | ||
| 55 | - byte[] port = new byte[] {(byte) 0x1 }; | ||
| 56 | - operatorValue.add(new BgpFsOperatorValue((byte) 0x81, port)); | ||
| 57 | - | ||
| 58 | - BgpFsPortNum portNum = new BgpFsPortNum(operatorValue); | ||
| 59 | - flowSpecComponents.add(portNum); | ||
| 60 | - | ||
| 61 | - BgpFlowSpecDetails flowSpec = new BgpFlowSpecDetails(flowSpecComponents); | ||
| 62 | - | ||
| 63 | - rib.add(prefix, flowSpec); | ||
| 64 | - | ||
| 65 | - boolean isPresent = rib.flowSpecTree().containsKey(prefix); | ||
| 66 | - assertThat(isPresent, is(true)); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - /** | ||
| 70 | - * Add and delete flow specification to rib. | ||
| 71 | - */ | ||
| 72 | - @Test | ||
| 73 | - public void bgpFlowSpecRibTest2() { | ||
| 74 | - List<BgpValueType> flowSpecComponents = new LinkedList<>(); | ||
| 75 | - List<BgpFsOperatorValue> operatorValue = new ArrayList<>(); | ||
| 76 | - BgpFlowSpecRib rib = new BgpFlowSpecRib(); | ||
| 77 | - | ||
| 78 | - IpPrefix destinationPrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.1"), 32); | ||
| 79 | - IpPrefix sourcePrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.2"), 32); | ||
| 80 | - | ||
| 81 | - BgpFlowSpecPrefix prefix = new BgpFlowSpecPrefix(destinationPrefix, sourcePrefix); | ||
| 82 | - byte[] port = new byte[] {(byte) 0x1 }; | ||
| 83 | - operatorValue.add(new BgpFsOperatorValue((byte) 0x81, port)); | ||
| 84 | - | ||
| 85 | - BgpFsPortNum portNum = new BgpFsPortNum(operatorValue); | ||
| 86 | - flowSpecComponents.add(portNum); | ||
| 87 | - | ||
| 88 | - BgpFlowSpecDetails flowSpec = new BgpFlowSpecDetails(flowSpecComponents); | ||
| 89 | - | ||
| 90 | - rib.add(prefix, flowSpec); | ||
| 91 | - | ||
| 92 | - boolean isPresent = rib.flowSpecTree().containsKey(prefix); | ||
| 93 | - assertThat(isPresent, is(true)); | ||
| 94 | - | ||
| 95 | - rib.delete(prefix); | ||
| 96 | - isPresent = rib.flowSpecTree().containsKey(prefix); | ||
| 97 | - assertThat(isPresent, is(false)); | ||
| 98 | - | ||
| 99 | - } | ||
| 100 | - | ||
| 101 | - /** | ||
| 102 | - * Add and delete flow specification with a specific VPN to rib. | ||
| 103 | - */ | ||
| 104 | - @Test | ||
| 105 | - public void bgpFlowSpecRibTest3() { | ||
| 106 | - List<BgpValueType> flowSpecComponents = new LinkedList<>(); | ||
| 107 | - List<BgpFsOperatorValue> operatorValue = new ArrayList<>(); | ||
| 108 | - RouteDistinguisher routeDistinguisher = new RouteDistinguisher(1); | ||
| 109 | - BgpFlowSpecRib rib = new BgpFlowSpecRib(); | ||
| 110 | - | ||
| 111 | - IpPrefix destinationPrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.1"), 32); | ||
| 112 | - IpPrefix sourcePrefix = IpPrefix.valueOf(IpAddress.valueOf("10.0.1.2"), 32); | ||
| 113 | - | ||
| 114 | - BgpFlowSpecPrefix prefix = new BgpFlowSpecPrefix(destinationPrefix, sourcePrefix); | ||
| 115 | - | ||
| 116 | - byte[] port = new byte[] {(byte) 0x1 }; | ||
| 117 | - operatorValue.add(new BgpFsOperatorValue((byte) 0x81, port)); | ||
| 118 | - | ||
| 119 | - BgpFsPortNum portNum = new BgpFsPortNum(operatorValue); | ||
| 120 | - flowSpecComponents.add(portNum); | ||
| 121 | - | ||
| 122 | - BgpFlowSpecDetails flowSpec = new BgpFlowSpecDetails(flowSpecComponents); | ||
| 123 | - | ||
| 124 | - rib.add(routeDistinguisher, prefix, flowSpec); | ||
| 125 | - | ||
| 126 | - boolean isPresent = rib.vpnFlowSpecTree().containsKey(routeDistinguisher); | ||
| 127 | - assertThat(isPresent, is(true)); | ||
| 128 | - | ||
| 129 | - rib.delete(routeDistinguisher, prefix); | ||
| 130 | - isPresent = rib.vpnFlowSpecTree().containsKey(routeDistinguisher); | ||
| 131 | - assertThat(isPresent, is(false)); | ||
| 132 | - } | ||
| 133 | -} |
-
Please register or login to post a comment