Committed by
Gerrit Code Review
[ONOS-4163] Provider side changes to support stateful PCE and PCECC
Change-Id: I0a57ed1d1e505a2e94921fd5f5d92426a105ad12
Showing
20 changed files
with
1404 additions
and
158 deletions
| ... | @@ -52,6 +52,8 @@ import org.onosproject.pcepio.protocol.PcepOpenMsg; | ... | @@ -52,6 +52,8 @@ import org.onosproject.pcepio.protocol.PcepOpenMsg; |
| 52 | import org.onosproject.pcepio.protocol.PcepOpenObject; | 52 | import org.onosproject.pcepio.protocol.PcepOpenObject; |
| 53 | import org.onosproject.pcepio.protocol.PcepType; | 53 | import org.onosproject.pcepio.protocol.PcepType; |
| 54 | import org.onosproject.pcepio.protocol.PcepVersion; | 54 | import org.onosproject.pcepio.protocol.PcepVersion; |
| 55 | +import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv; | ||
| 56 | +import org.onosproject.pcepio.types.NodeAttributesTlv; | ||
| 55 | import org.onosproject.pcepio.types.PceccCapabilityTlv; | 57 | import org.onosproject.pcepio.types.PceccCapabilityTlv; |
| 56 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; | 58 | import org.onosproject.pcepio.types.StatefulPceCapabilityTlv; |
| 57 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; | 59 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; |
| ... | @@ -136,7 +138,7 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -136,7 +138,7 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 136 | @Override | 138 | @Override |
| 137 | void processPcepMessage(PcepChannelHandler h, PcepMessage m) throws IOException, PcepParseException { | 139 | void processPcepMessage(PcepChannelHandler h, PcepMessage m) throws IOException, PcepParseException { |
| 138 | 140 | ||
| 139 | - log.debug("Message received in OPEN WAIT State"); | 141 | + log.info("Message received in OPEN WAIT State"); |
| 140 | 142 | ||
| 141 | //check for open message | 143 | //check for open message |
| 142 | if (m.getType() != PcepType.OPEN) { | 144 | if (m.getType() != PcepType.OPEN) { |
| ... | @@ -166,6 +168,33 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -166,6 +168,33 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 166 | h.deadTime = DEADTIMER_MAXIMUM_VALUE; | 168 | h.deadTime = DEADTIMER_MAXIMUM_VALUE; |
| 167 | } | 169 | } |
| 168 | } | 170 | } |
| 171 | + | ||
| 172 | + LinkedList<PcepValueType> optionalTlvs = pOpenmsg.getPcepOpenObject().getOptionalTlv(); | ||
| 173 | + for (PcepValueType optionalTlv : optionalTlvs) { | ||
| 174 | + if (optionalTlv instanceof NodeAttributesTlv) { | ||
| 175 | + List<PcepValueType> subTlvs = ((NodeAttributesTlv) optionalTlv) | ||
| 176 | + .getllNodeAttributesSubTLVs(); | ||
| 177 | + for (PcepValueType subTlv : subTlvs) { | ||
| 178 | + if (subTlv instanceof IPv4RouterIdOfLocalNodeSubTlv) { | ||
| 179 | + h.thispccId = PccId.pccId(IpAddress | ||
| 180 | + .valueOf(((IPv4RouterIdOfLocalNodeSubTlv) subTlv).getInt())); | ||
| 181 | + break; | ||
| 182 | + } | ||
| 183 | + } | ||
| 184 | + break; | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + if (h.thispccId == null) { | ||
| 189 | + final SocketAddress address = h.channel.getRemoteAddress(); | ||
| 190 | + if (!(address instanceof InetSocketAddress)) { | ||
| 191 | + throw new IOException("Invalid client connection. Pcc is indentifed based on IP"); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + final InetSocketAddress inetAddress = (InetSocketAddress) address; | ||
| 195 | + h.thispccId = PccId.pccId(IpAddress.valueOf(inetAddress.getAddress())); | ||
| 196 | + } | ||
| 197 | + | ||
| 169 | h.sendHandshakeOpenMessage(); | 198 | h.sendHandshakeOpenMessage(); |
| 170 | h.pcepPacketStats.addOutPacket(); | 199 | h.pcepPacketStats.addOutPacket(); |
| 171 | h.setState(KEEPWAIT); | 200 | h.setState(KEEPWAIT); |
| ... | @@ -178,23 +207,16 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { | ... | @@ -178,23 +207,16 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler { |
| 178 | KEEPWAIT(false) { | 207 | KEEPWAIT(false) { |
| 179 | @Override | 208 | @Override |
| 180 | void processPcepMessage(PcepChannelHandler h, PcepMessage m) throws IOException, PcepParseException { | 209 | void processPcepMessage(PcepChannelHandler h, PcepMessage m) throws IOException, PcepParseException { |
| 181 | - log.debug("message received in KEEPWAIT state"); | 210 | + log.info("message received in KEEPWAIT state"); |
| 182 | //check for keep alive message | 211 | //check for keep alive message |
| 183 | if (m.getType() != PcepType.KEEP_ALIVE) { | 212 | if (m.getType() != PcepType.KEEP_ALIVE) { |
| 184 | // When the message type is not keep alive message increment the wrong packet statistics | 213 | // When the message type is not keep alive message increment the wrong packet statistics |
| 185 | h.processUnknownMsg(); | 214 | h.processUnknownMsg(); |
| 186 | - log.debug("message is not KEEPALIVE message"); | 215 | + log.error("message is not KEEPALIVE message"); |
| 187 | } else { | 216 | } else { |
| 188 | // Set the client connected status | 217 | // Set the client connected status |
| 189 | h.pcepPacketStats.addInPacket(); | 218 | h.pcepPacketStats.addInPacket(); |
| 190 | - final SocketAddress address = h.channel.getRemoteAddress(); | ||
| 191 | - if (!(address instanceof InetSocketAddress)) { | ||
| 192 | - throw new IOException("Invalid client connection. Pcc is indentifed based on IP"); | ||
| 193 | - } | ||
| 194 | log.debug("sending keep alive message in KEEPWAIT state"); | 219 | log.debug("sending keep alive message in KEEPWAIT state"); |
| 195 | - | ||
| 196 | - final InetSocketAddress inetAddress = (InetSocketAddress) address; | ||
| 197 | - h.thispccId = PccId.pccId(IpAddress.valueOf(inetAddress.getAddress())); | ||
| 198 | h.pc = h.controller.getPcepClientInstance(h.thispccId, h.sessionId, h.pcepVersion, | 220 | h.pc = h.controller.getPcepClientInstance(h.thispccId, h.sessionId, h.pcepVersion, |
| 199 | h.pcepPacketStats); | 221 | h.pcepPacketStats); |
| 200 | //Get pc instance and set capabilities | 222 | //Get pc instance and set capabilities | ... | ... |
| ... | @@ -25,7 +25,7 @@ import org.onosproject.pcepio.protocol.PcepLspObject; | ... | @@ -25,7 +25,7 @@ import org.onosproject.pcepio.protocol.PcepLspObject; |
| 25 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; | 25 | import org.onosproject.pcepio.types.PcepErrorDetailInfo; |
| 26 | import org.onosproject.pcepio.types.PcepObjectHeader; | 26 | import org.onosproject.pcepio.types.PcepObjectHeader; |
| 27 | import org.onosproject.pcepio.types.PcepValueType; | 27 | import org.onosproject.pcepio.types.PcepValueType; |
| 28 | -import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv; | 28 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 29 | import org.onosproject.pcepio.types.StatefulLspDbVerTlv; | 29 | import org.onosproject.pcepio.types.StatefulLspDbVerTlv; |
| 30 | import org.onosproject.pcepio.types.StatefulLspErrorCodeTlv; | 30 | import org.onosproject.pcepio.types.StatefulLspErrorCodeTlv; |
| 31 | import org.onosproject.pcepio.types.StatefulRsvpErrorSpecTlv; | 31 | import org.onosproject.pcepio.types.StatefulRsvpErrorSpecTlv; |
| ... | @@ -325,8 +325,8 @@ public class PcepLspObjectVer1 implements PcepLspObject { | ... | @@ -325,8 +325,8 @@ public class PcepLspObjectVer1 implements PcepLspObject { |
| 325 | 325 | ||
| 326 | switch (hType) { | 326 | switch (hType) { |
| 327 | 327 | ||
| 328 | - case StatefulIPv4LspIdentidiersTlv.TYPE: | 328 | + case StatefulIPv4LspIdentifiersTlv.TYPE: |
| 329 | - tlv = StatefulIPv4LspIdentidiersTlv.read(cb); | 329 | + tlv = StatefulIPv4LspIdentifiersTlv.read(cb); |
| 330 | break; | 330 | break; |
| 331 | case StatefulLspErrorCodeTlv.TYPE: | 331 | case StatefulLspErrorCodeTlv.TYPE: |
| 332 | iValue = cb.readInt(); | 332 | iValue = cb.readInt(); | ... | ... |
| ... | @@ -45,7 +45,7 @@ public class PathSetupTypeTlv implements PcepValueType { | ... | @@ -45,7 +45,7 @@ public class PathSetupTypeTlv implements PcepValueType { |
| 45 | */ | 45 | */ |
| 46 | protected static final Logger log = LoggerFactory.getLogger(PathSetupTypeTlv.class); | 46 | protected static final Logger log = LoggerFactory.getLogger(PathSetupTypeTlv.class); |
| 47 | 47 | ||
| 48 | - public static final short TYPE = 0; //TODO : need to reassign the value as per RFC | 48 | + public static final short TYPE = 28; |
| 49 | public static final short LENGTH = 4; | 49 | public static final short LENGTH = 4; |
| 50 | 50 | ||
| 51 | private final byte pst; | 51 | private final byte pst; | ... | ... |
| ... | @@ -28,7 +28,7 @@ import com.google.common.base.MoreObjects; | ... | @@ -28,7 +28,7 @@ import com.google.common.base.MoreObjects; |
| 28 | /** | 28 | /** |
| 29 | * Provides StatefulIPv4LspIdentidiersTlv. | 29 | * Provides StatefulIPv4LspIdentidiersTlv. |
| 30 | */ | 30 | */ |
| 31 | -public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | 31 | +public class StatefulIPv4LspIdentifiersTlv implements PcepValueType { |
| 32 | 32 | ||
| 33 | /* IPV4-LSP-IDENTIFIERS TLV format | 33 | /* IPV4-LSP-IDENTIFIERS TLV format |
| 34 | * | 34 | * |
| ... | @@ -50,7 +50,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -50,7 +50,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 50 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 50 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| 51 | 51 | ||
| 52 | */ | 52 | */ |
| 53 | - protected static final Logger log = LoggerFactory.getLogger(StatefulIPv4LspIdentidiersTlv.class); | 53 | + protected static final Logger log = LoggerFactory.getLogger(StatefulIPv4LspIdentifiersTlv.class); |
| 54 | 54 | ||
| 55 | public static final short TYPE = 18; | 55 | public static final short TYPE = 18; |
| 56 | public static final short LENGTH = 16; | 56 | public static final short LENGTH = 16; |
| ... | @@ -70,7 +70,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -70,7 +70,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 70 | * @param extendedTunnelId extended tunnel id | 70 | * @param extendedTunnelId extended tunnel id |
| 71 | * @param ipv4EgressAddress egress ipv4 address | 71 | * @param ipv4EgressAddress egress ipv4 address |
| 72 | */ | 72 | */ |
| 73 | - public StatefulIPv4LspIdentidiersTlv(int ipv4IngressAddress, short lspId, short tunnelId, int extendedTunnelId, | 73 | + public StatefulIPv4LspIdentifiersTlv(int ipv4IngressAddress, short lspId, short tunnelId, int extendedTunnelId, |
| 74 | int ipv4EgressAddress) { | 74 | int ipv4EgressAddress) { |
| 75 | 75 | ||
| 76 | this.ipv4IngressAddress = ipv4IngressAddress; | 76 | this.ipv4IngressAddress = ipv4IngressAddress; |
| ... | @@ -90,9 +90,9 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -90,9 +90,9 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 90 | * @param ipv4EgressAddress egress ipv4 address | 90 | * @param ipv4EgressAddress egress ipv4 address |
| 91 | * @return object of StatefulIPv4LspIdentidiersTlv | 91 | * @return object of StatefulIPv4LspIdentidiersTlv |
| 92 | */ | 92 | */ |
| 93 | - public static StatefulIPv4LspIdentidiersTlv of(int ipv4IngressAddress, short lspId, short tunnelId, | 93 | + public static StatefulIPv4LspIdentifiersTlv of(int ipv4IngressAddress, short lspId, short tunnelId, |
| 94 | int extendedTunnelId, int ipv4EgressAddress) { | 94 | int extendedTunnelId, int ipv4EgressAddress) { |
| 95 | - return new StatefulIPv4LspIdentidiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId, | 95 | + return new StatefulIPv4LspIdentifiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId, |
| 96 | ipv4EgressAddress); | 96 | ipv4EgressAddress); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| ... | @@ -106,6 +106,15 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -106,6 +106,15 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | /** | 108 | /** |
| 109 | + * Returns LSP id. | ||
| 110 | + * | ||
| 111 | + * @return lspId | ||
| 112 | + */ | ||
| 113 | + public short getLspId() { | ||
| 114 | + return this.lspId; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + /** | ||
| 109 | * Returns extendedTunnelId. | 118 | * Returns extendedTunnelId. |
| 110 | * | 119 | * |
| 111 | * @return extendedTunnelId | 120 | * @return extendedTunnelId |
| ... | @@ -157,8 +166,8 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -157,8 +166,8 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 157 | if (this == obj) { | 166 | if (this == obj) { |
| 158 | return true; | 167 | return true; |
| 159 | } | 168 | } |
| 160 | - if (obj instanceof StatefulIPv4LspIdentidiersTlv) { | 169 | + if (obj instanceof StatefulIPv4LspIdentifiersTlv) { |
| 161 | - StatefulIPv4LspIdentidiersTlv other = (StatefulIPv4LspIdentidiersTlv) obj; | 170 | + StatefulIPv4LspIdentifiersTlv other = (StatefulIPv4LspIdentifiersTlv) obj; |
| 162 | return Objects.equals(this.ipv4IngressAddress, other.ipv4IngressAddress) | 171 | return Objects.equals(this.ipv4IngressAddress, other.ipv4IngressAddress) |
| 163 | && Objects.equals(this.lspId, other.lspId) && Objects.equals(this.tunnelId, other.tunnelId) | 172 | && Objects.equals(this.lspId, other.lspId) && Objects.equals(this.tunnelId, other.tunnelId) |
| 164 | && Objects.equals(this.extendedTunnelId, other.extendedTunnelId) | 173 | && Objects.equals(this.extendedTunnelId, other.extendedTunnelId) |
| ... | @@ -193,7 +202,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { | ... | @@ -193,7 +202,7 @@ public class StatefulIPv4LspIdentidiersTlv implements PcepValueType { |
| 193 | short tunnelId = c.readShort(); | 202 | short tunnelId = c.readShort(); |
| 194 | int extendedTunnelId = c.readInt(); | 203 | int extendedTunnelId = c.readInt(); |
| 195 | int ipv4EgressAddress = c.readInt(); | 204 | int ipv4EgressAddress = c.readInt(); |
| 196 | - return new StatefulIPv4LspIdentidiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId, | 205 | + return new StatefulIPv4LspIdentifiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId, |
| 197 | ipv4EgressAddress); | 206 | ipv4EgressAddress); |
| 198 | } | 207 | } |
| 199 | 208 | ... | ... |
| ... | @@ -555,4 +555,40 @@ public class PcepOpenMsgTest { | ... | @@ -555,4 +555,40 @@ public class PcepOpenMsgTest { |
| 555 | assertThat(testOpenMsg, is(openMsg)); | 555 | assertThat(testOpenMsg, is(openMsg)); |
| 556 | 556 | ||
| 557 | } | 557 | } |
| 558 | + | ||
| 559 | + /** | ||
| 560 | + * This test case checks open object with LSR id encoded. | ||
| 561 | + */ | ||
| 562 | + @Test | ||
| 563 | + public void openMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 564 | + | ||
| 565 | + byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x18, // common header | ||
| 566 | + 0x01, 0x10, 0x00, 0x14, // common object header | ||
| 567 | + 0x20, 0x05, 0x1E, 0x01, // OPEN object | ||
| 568 | + (byte) 0xFF, 0x05, 0x00, 0x08, // Node attribute TLV | ||
| 569 | + 0x00, 0x11, 0x00, 0x04, // PCEP-LS-IPv4-ROUTER-ID sub tlv | ||
| 570 | + 0x02, 0x02, 0x02, 0x02 | ||
| 571 | + }; | ||
| 572 | + | ||
| 573 | + byte[] testOpenMsg = {0}; | ||
| 574 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 575 | + buffer.writeBytes(openMsg); | ||
| 576 | + | ||
| 577 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 578 | + PcepMessage message = null; | ||
| 579 | + | ||
| 580 | + message = reader.readFrom(buffer); | ||
| 581 | + | ||
| 582 | + assertThat(message, instanceOf(PcepOpenMsg.class)); | ||
| 583 | + | ||
| 584 | + ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); | ||
| 585 | + message.writeTo(buf); | ||
| 586 | + testOpenMsg = buf.array(); | ||
| 587 | + | ||
| 588 | + int readLen = buf.writerIndex() - 0; | ||
| 589 | + testOpenMsg = new byte[readLen]; | ||
| 590 | + buf.readBytes(testOpenMsg, 0, readLen); | ||
| 591 | + assertThat(testOpenMsg, is(openMsg)); | ||
| 592 | + | ||
| 593 | + } | ||
| 558 | } | 594 | } | ... | ... |
| ... | @@ -184,14 +184,14 @@ public class PcepReportMsgExtTest { | ... | @@ -184,14 +184,14 @@ public class PcepReportMsgExtTest { |
| 184 | 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object | 184 | 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object |
| 185 | 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv | 185 | 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv |
| 186 | 0x07, 0x10, 0x00, 0x14, //ERO object | 186 | 0x07, 0x10, 0x00, 0x14, //ERO object |
| 187 | - 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x04, 0x00, | 187 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x04, 0x00, //ERO IPv4 subobjects |
| 188 | 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x20, 0x04, 0x00, | 188 | 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x20, 0x04, 0x00, |
| 189 | 0x09, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, //LSPA object | 189 | 0x09, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, //LSPA object |
| 190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 191 | 0x05, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //Bandwidth object | 191 | 0x05, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, //Bandwidth object |
| 192 | 0x06, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x20, //Metric object | 192 | 0x06, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x20, //Metric object |
| 193 | 0x08, 0x10, 0x00, 0x34, 0x01, 0x08, 0x11, 0x01, //RRO object | 193 | 0x08, 0x10, 0x00, 0x34, 0x01, 0x08, 0x11, 0x01, //RRO object |
| 194 | - 0x01, 0x01, 0x04, 0x00, 0x01, 0x08, 0x11, 0x01, | 194 | + 0x01, 0x01, 0x04, 0x00, 0x01, 0x08, 0x11, 0x01, //RRO IPv4 subobjects |
| 195 | 0x01, 0x02, 0x04, 0x00, 0x01, 0x08, 0x06, 0x06, | 195 | 0x01, 0x02, 0x04, 0x00, 0x01, 0x08, 0x06, 0x06, |
| 196 | 0x06, 0x06, 0x04, 0x00, 0x01, 0x08, 0x12, 0x01, | 196 | 0x06, 0x06, 0x04, 0x00, 0x01, 0x08, 0x12, 0x01, |
| 197 | 0x01, 0x02, 0x04, 0x00, 0x01, 0x08, 0x12, 0x01, | 197 | 0x01, 0x02, 0x04, 0x00, 0x01, 0x08, 0x12, 0x01, |
| ... | @@ -216,4 +216,83 @@ public class PcepReportMsgExtTest { | ... | @@ -216,4 +216,83 @@ public class PcepReportMsgExtTest { |
| 216 | 216 | ||
| 217 | assertThat(testReportMsg, is(reportMsg)); | 217 | assertThat(testReportMsg, is(reportMsg)); |
| 218 | } | 218 | } |
| 219 | + | ||
| 220 | + /** | ||
| 221 | + * Tests PCRpt msg with Path-Setup-Type TLV as SR. | ||
| 222 | + * | ||
| 223 | + * @throws PcepParseException | ||
| 224 | + * @throws PcepOutOfBoundMessageException | ||
| 225 | + */ | ||
| 226 | + @Test | ||
| 227 | + public void reportMessageTest43() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 228 | + | ||
| 229 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x3C, | ||
| 230 | + 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object | ||
| 231 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 232 | + 0x00, 0x00, 0x00, 0x01, | ||
| 233 | + 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object | ||
| 234 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv | ||
| 235 | + 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 236 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x04, 0x00, //ERO IPv4 subobjects | ||
| 237 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x20, 0x04, 0x00, | ||
| 238 | + }; | ||
| 239 | + | ||
| 240 | + byte[] testReportMsg = {0}; | ||
| 241 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 242 | + buffer.writeBytes(reportMsg); | ||
| 243 | + | ||
| 244 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 245 | + PcepMessage message = null; | ||
| 246 | + | ||
| 247 | + message = reader.readFrom(buffer); | ||
| 248 | + assertThat(message, instanceOf(PcepReportMsg.class)); | ||
| 249 | + ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); | ||
| 250 | + message.writeTo(buf); | ||
| 251 | + | ||
| 252 | + int readLen = buf.writerIndex(); | ||
| 253 | + testReportMsg = new byte[readLen]; | ||
| 254 | + buf.readBytes(testReportMsg, 0, readLen); | ||
| 255 | + | ||
| 256 | + assertThat(testReportMsg, is(reportMsg)); | ||
| 257 | + } | ||
| 258 | + | ||
| 259 | + /** | ||
| 260 | + * Tests PCRpt msg with Path-Setup-Type TLV as "without SR and without signalling". | ||
| 261 | + * | ||
| 262 | + * @throws PcepParseException | ||
| 263 | + * @throws PcepOutOfBoundMessageException | ||
| 264 | + */ | ||
| 265 | + @Test | ||
| 266 | + public void reportMessageTest44() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 267 | + | ||
| 268 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x3C, | ||
| 269 | + 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object | ||
| 270 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 271 | + 0x00, 0x00, 0x00, 0x02, | ||
| 272 | + 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object | ||
| 273 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv | ||
| 274 | + 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 275 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x04, 0x00, //ERO IPv4 subobjects | ||
| 276 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x20, 0x04, 0x00, | ||
| 277 | + }; | ||
| 278 | + | ||
| 279 | + byte[] testReportMsg = {0}; | ||
| 280 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 281 | + buffer.writeBytes(reportMsg); | ||
| 282 | + | ||
| 283 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 284 | + PcepMessage message = null; | ||
| 285 | + | ||
| 286 | + message = reader.readFrom(buffer); | ||
| 287 | + assertThat(message, instanceOf(PcepReportMsg.class)); | ||
| 288 | + ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); | ||
| 289 | + message.writeTo(buf); | ||
| 290 | + | ||
| 291 | + int readLen = buf.writerIndex(); | ||
| 292 | + testReportMsg = new byte[readLen]; | ||
| 293 | + buf.readBytes(testReportMsg, 0, readLen); | ||
| 294 | + | ||
| 295 | + assertThat(testReportMsg, is(reportMsg)); | ||
| 296 | + } | ||
| 297 | + | ||
| 219 | } | 298 | } | ... | ... |
| ... | @@ -18,7 +18,10 @@ package org.onosproject.pcepio.types; | ... | @@ -18,7 +18,10 @@ package org.onosproject.pcepio.types; |
| 18 | import com.google.common.testing.EqualsTester; | 18 | import com.google.common.testing.EqualsTester; |
| 19 | import org.junit.Test; | 19 | import org.junit.Test; |
| 20 | 20 | ||
| 21 | -public class StatefulIPv4LspIdentidiersTlvTest { | 21 | +/** |
| 22 | + * Tests class StatefulIPv4LspIdentifiersTlv. | ||
| 23 | + */ | ||
| 24 | +public class StatefulIPv4LspIdentifiersTlvTest { | ||
| 22 | 25 | ||
| 23 | private final int ipv4IngressAddress = 1; | 26 | private final int ipv4IngressAddress = 1; |
| 24 | private final short lspId = 1; | 27 | private final short lspId = 1; |
| ... | @@ -26,7 +29,7 @@ public class StatefulIPv4LspIdentidiersTlvTest { | ... | @@ -26,7 +29,7 @@ public class StatefulIPv4LspIdentidiersTlvTest { |
| 26 | private final int extendedTunnelId = 1; | 29 | private final int extendedTunnelId = 1; |
| 27 | private final int ipv4EgressAddress = 1; | 30 | private final int ipv4EgressAddress = 1; |
| 28 | 31 | ||
| 29 | - private final StatefulIPv4LspIdentidiersTlv tlv1 = StatefulIPv4LspIdentidiersTlv.of(ipv4IngressAddress, lspId, | 32 | + private final StatefulIPv4LspIdentifiersTlv tlv1 = StatefulIPv4LspIdentifiersTlv.of(ipv4IngressAddress, lspId, |
| 30 | tunnelId, extendedTunnelId, ipv4EgressAddress); | 33 | tunnelId, extendedTunnelId, ipv4EgressAddress); |
| 31 | 34 | ||
| 32 | private final int ipv4IngressAddress1 = 1; | 35 | private final int ipv4IngressAddress1 = 1; |
| ... | @@ -35,7 +38,7 @@ public class StatefulIPv4LspIdentidiersTlvTest { | ... | @@ -35,7 +38,7 @@ public class StatefulIPv4LspIdentidiersTlvTest { |
| 35 | private final int extendedTunnelId1 = 1; | 38 | private final int extendedTunnelId1 = 1; |
| 36 | private final int ipv4EgressAddress1 = 1; | 39 | private final int ipv4EgressAddress1 = 1; |
| 37 | 40 | ||
| 38 | - private final StatefulIPv4LspIdentidiersTlv tlv2 = StatefulIPv4LspIdentidiersTlv.of(ipv4IngressAddress1, lspId1, | 41 | + private final StatefulIPv4LspIdentifiersTlv tlv2 = StatefulIPv4LspIdentifiersTlv.of(ipv4IngressAddress1, lspId1, |
| 39 | tunnelId1, extendedTunnelId1, ipv4EgressAddress1); | 42 | tunnelId1, extendedTunnelId1, ipv4EgressAddress1); |
| 40 | 43 | ||
| 41 | private final int ipv4IngressAddress2 = 2; | 44 | private final int ipv4IngressAddress2 = 2; |
| ... | @@ -44,9 +47,12 @@ public class StatefulIPv4LspIdentidiersTlvTest { | ... | @@ -44,9 +47,12 @@ public class StatefulIPv4LspIdentidiersTlvTest { |
| 44 | private final int extendedTunnelId2 = 2; | 47 | private final int extendedTunnelId2 = 2; |
| 45 | private final int ipv4EgressAddress2 = 2; | 48 | private final int ipv4EgressAddress2 = 2; |
| 46 | 49 | ||
| 47 | - private final StatefulIPv4LspIdentidiersTlv tlv3 = StatefulIPv4LspIdentidiersTlv.of(ipv4IngressAddress2, lspId2, | 50 | + private final StatefulIPv4LspIdentifiersTlv tlv3 = StatefulIPv4LspIdentifiersTlv.of(ipv4IngressAddress2, lspId2, |
| 48 | tunnelId2, extendedTunnelId2, ipv4EgressAddress2); | 51 | tunnelId2, extendedTunnelId2, ipv4EgressAddress2); |
| 49 | 52 | ||
| 53 | + /** | ||
| 54 | + * Tests equality of objects of class StatefulIPv4LspIdentifiersTlv. | ||
| 55 | + */ | ||
| 50 | @Test | 56 | @Test |
| 51 | public void basics() { | 57 | public void basics() { |
| 52 | new EqualsTester().addEqualityGroup(tlv1, tlv2).addEqualityGroup(tlv3).testEquals(); | 58 | new EqualsTester().addEqualityGroup(tlv1, tlv2).addEqualityGroup(tlv3).testEquals(); | ... | ... |
providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/LspType.java
0 → 100644
| 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.provider.pcep.tunnel.impl; | ||
| 18 | + | ||
| 19 | +/** | ||
| 20 | + * Representation of LSP type. | ||
| 21 | + */ | ||
| 22 | +public enum LspType { | ||
| 23 | + /** | ||
| 24 | + * Signifies that path is created via signaling mode. | ||
| 25 | + */ | ||
| 26 | + WITH_SIGNALLING(0), | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * Signifies that path is created via SR mode. | ||
| 30 | + */ | ||
| 31 | + SR_WITHOUT_SIGNALLING(1), | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * Signifies that path is created via without signaling and without SR mode. | ||
| 35 | + */ | ||
| 36 | + WITHOUT_SIGNALLING_AND_WITHOUT_SR(2); | ||
| 37 | + | ||
| 38 | + int value; | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Assign val with the value as the LSP type. | ||
| 42 | + * | ||
| 43 | + * @param val LSP type | ||
| 44 | + */ | ||
| 45 | + LspType(int val) { | ||
| 46 | + value = val; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Returns value of LSP type. | ||
| 51 | + * | ||
| 52 | + * @return LSP type | ||
| 53 | + */ | ||
| 54 | + public byte type() { | ||
| 55 | + return (byte) value; | ||
| 56 | + } | ||
| 57 | +} |
| 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.provider.pcep.tunnel.impl; | ||
| 17 | + | ||
| 18 | +/** | ||
| 19 | + * Collection of keys for annotation for PCEP tunnels. | ||
| 20 | + */ | ||
| 21 | +public final class PcepAnnotationKeys { | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * Prohibits instantiation. | ||
| 25 | + */ | ||
| 26 | + private PcepAnnotationKeys() { | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + /** | ||
| 30 | + * Annotation key for bandwidth. | ||
| 31 | + * The value for this key is interpreted as Mbps. | ||
| 32 | + */ | ||
| 33 | + public static final String BANDWIDTH = "bandwidth"; | ||
| 34 | + | ||
| 35 | + /** | ||
| 36 | + * Annotation key for the LSP signaling type. | ||
| 37 | + */ | ||
| 38 | + public static final String LSP_SIG_TYPE = "lspSigType"; | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Annotation key for the PCC tunnel id. | ||
| 42 | + */ | ||
| 43 | + public static final String PCC_TUNNEL_ID = "PccTunnelId"; | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * Annotation key for the LSP id assigned per tunnel per session. | ||
| 47 | + */ | ||
| 48 | + public static final String PLSP_ID = "PLspId"; | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Annotation key for the LSP id assigned per tunnel. | ||
| 52 | + */ | ||
| 53 | + public static final String LOCAL_LSP_ID = "localLspId"; | ||
| 54 | +} |
providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepLspStatus.java
0 → 100644
| 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.provider.pcep.tunnel.impl; | ||
| 17 | + | ||
| 18 | +import org.onosproject.incubator.net.tunnel.Tunnel.State; | ||
| 19 | + | ||
| 20 | +/** | ||
| 21 | + * Representation of the PCEP LSP state. | ||
| 22 | + */ | ||
| 23 | +public enum PcepLspStatus { | ||
| 24 | + | ||
| 25 | + /** | ||
| 26 | + * Signifies that the LSP is not active. | ||
| 27 | + */ | ||
| 28 | + DOWN, | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * Signifies that the LSP is signalled. | ||
| 32 | + */ | ||
| 33 | + UP, | ||
| 34 | + | ||
| 35 | + /** | ||
| 36 | + * Signifies that the LSP is up and carrying traffic. | ||
| 37 | + */ | ||
| 38 | + ACTIVE, | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * Signifies that the LSP is being torn down, resources are being released. | ||
| 42 | + */ | ||
| 43 | + GOING_DOWN, | ||
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * Signifies that the LSP is being signalled. | ||
| 47 | + */ | ||
| 48 | + GOING_UP; | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Returns the applicable PCEP LSP status corresponding to ONOS tunnel state. | ||
| 52 | + * | ||
| 53 | + * @param tunnelState ONOS tunnel state | ||
| 54 | + */ | ||
| 55 | + public static PcepLspStatus getLspStatusFromTunnelStatus(State tunnelState) { | ||
| 56 | + | ||
| 57 | + switch (tunnelState) { | ||
| 58 | + | ||
| 59 | + case INIT: | ||
| 60 | + return PcepLspStatus.DOWN; | ||
| 61 | + | ||
| 62 | + case ESTABLISHED: | ||
| 63 | + return PcepLspStatus.GOING_UP; | ||
| 64 | + | ||
| 65 | + case ACTIVE: | ||
| 66 | + return PcepLspStatus.UP; | ||
| 67 | + | ||
| 68 | + case FAILED: // fall through | ||
| 69 | + case INACTIVE: // LSP is administratively down. | ||
| 70 | + default: | ||
| 71 | + return PcepLspStatus.DOWN; | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + /** | ||
| 76 | + * Returns the applicable ONOS tunnel state corresponding to PCEP LSP status. | ||
| 77 | + * | ||
| 78 | + * @param lspState PCEP LSP status | ||
| 79 | + */ | ||
| 80 | + public static State getTunnelStatusFromLspStatus(PcepLspStatus lspState) { | ||
| 81 | + | ||
| 82 | + switch (lspState) { | ||
| 83 | + | ||
| 84 | + case DOWN: | ||
| 85 | + return State.FAILED; | ||
| 86 | + | ||
| 87 | + case UP: // fall through | ||
| 88 | + case ACTIVE: | ||
| 89 | + return State.ACTIVE; | ||
| 90 | + | ||
| 91 | + case GOING_DOWN: | ||
| 92 | + return State.FAILED; | ||
| 93 | + | ||
| 94 | + case GOING_UP: | ||
| 95 | + return State.ESTABLISHED; | ||
| 96 | + | ||
| 97 | + default: | ||
| 98 | + return State.FAILED; | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | +} |
| ... | @@ -20,7 +20,7 @@ import java.util.Objects; | ... | @@ -20,7 +20,7 @@ import java.util.Objects; |
| 20 | import org.onosproject.incubator.net.tunnel.Tunnel; | 20 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 21 | import org.onosproject.net.ElementId; | 21 | import org.onosproject.net.ElementId; |
| 22 | import org.onosproject.net.Path; | 22 | import org.onosproject.net.Path; |
| 23 | -import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv; | 23 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 24 | 24 | ||
| 25 | import com.google.common.base.MoreObjects; | 25 | import com.google.common.base.MoreObjects; |
| 26 | 26 | ||
| ... | @@ -43,7 +43,7 @@ public class PcepTunnelData { | ... | @@ -43,7 +43,7 @@ public class PcepTunnelData { |
| 43 | private short tunnelId; | 43 | private short tunnelId; |
| 44 | private int extTunnelId; | 44 | private int extTunnelId; |
| 45 | private short lspId; | 45 | private short lspId; |
| 46 | - private StatefulIPv4LspIdentidiersTlv statefulIpv4IndentifierTlv; | 46 | + private StatefulIPv4LspIdentifiersTlv statefulIpv4IndentifierTlv; |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * Default constructor. | 49 | * Default constructor. |
| ... | @@ -203,7 +203,7 @@ public class PcepTunnelData { | ... | @@ -203,7 +203,7 @@ public class PcepTunnelData { |
| 203 | * Sets statefulIpv4Identifiers tlv. | 203 | * Sets statefulIpv4Identifiers tlv. |
| 204 | * @param value statefulIpv4Identifiers tlv | 204 | * @param value statefulIpv4Identifiers tlv |
| 205 | */ | 205 | */ |
| 206 | - public void setStatefulIpv4IndentifierTlv(StatefulIPv4LspIdentidiersTlv value) { | 206 | + public void setStatefulIpv4IndentifierTlv(StatefulIPv4LspIdentifiersTlv value) { |
| 207 | this.statefulIpv4IndentifierTlv = value; | 207 | this.statefulIpv4IndentifierTlv = value; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| ... | @@ -329,7 +329,7 @@ public class PcepTunnelData { | ... | @@ -329,7 +329,7 @@ public class PcepTunnelData { |
| 329 | * | 329 | * |
| 330 | * @return statefulIpv4Indentifier tlv | 330 | * @return statefulIpv4Indentifier tlv |
| 331 | */ | 331 | */ |
| 332 | - public StatefulIPv4LspIdentidiersTlv statefulIpv4IndentifierTlv() { | 332 | + public StatefulIPv4LspIdentifiersTlv statefulIpv4IndentifierTlv() { |
| 333 | return this.statefulIpv4IndentifierTlv; | 333 | return this.statefulIpv4IndentifierTlv; |
| 334 | } | 334 | } |
| 335 | 335 | ... | ... |
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | package org.onosproject.provider.pcep.tunnel.impl; | 16 | package org.onosproject.provider.pcep.tunnel.impl; |
| 17 | 17 | ||
| 18 | import com.google.common.collect.Maps; | 18 | import com.google.common.collect.Maps; |
| 19 | + | ||
| 19 | import org.apache.felix.scr.annotations.Activate; | 20 | import org.apache.felix.scr.annotations.Activate; |
| 20 | import org.apache.felix.scr.annotations.Component; | 21 | import org.apache.felix.scr.annotations.Component; |
| 21 | import org.apache.felix.scr.annotations.Deactivate; | 22 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -34,6 +35,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -34,6 +35,7 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 34 | import org.onosproject.incubator.net.tunnel.OpticalLogicId; | 35 | import org.onosproject.incubator.net.tunnel.OpticalLogicId; |
| 35 | import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint; | 36 | import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint; |
| 36 | import org.onosproject.incubator.net.tunnel.Tunnel; | 37 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 38 | +import org.onosproject.incubator.net.tunnel.Tunnel.State; | ||
| 37 | import org.onosproject.incubator.net.tunnel.TunnelDescription; | 39 | import org.onosproject.incubator.net.tunnel.TunnelDescription; |
| 38 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | 40 | import org.onosproject.incubator.net.tunnel.TunnelEndPoint; |
| 39 | import org.onosproject.incubator.net.tunnel.TunnelId; | 41 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| ... | @@ -45,6 +47,7 @@ import org.onosproject.incubator.net.tunnel.TunnelService; | ... | @@ -45,6 +47,7 @@ import org.onosproject.incubator.net.tunnel.TunnelService; |
| 45 | import org.onosproject.incubator.net.tunnel.TunnelStatistics; | 47 | import org.onosproject.incubator.net.tunnel.TunnelStatistics; |
| 46 | import org.onosproject.net.ConnectPoint; | 48 | import org.onosproject.net.ConnectPoint; |
| 47 | import org.onosproject.net.DefaultAnnotations; | 49 | import org.onosproject.net.DefaultAnnotations; |
| 50 | +import org.onosproject.net.DefaultAnnotations.Builder; | ||
| 48 | import org.onosproject.net.DefaultLink; | 51 | import org.onosproject.net.DefaultLink; |
| 49 | import org.onosproject.net.DefaultPath; | 52 | import org.onosproject.net.DefaultPath; |
| 50 | import org.onosproject.net.DeviceId; | 53 | import org.onosproject.net.DeviceId; |
| ... | @@ -81,20 +84,21 @@ import org.onosproject.pcepio.protocol.PcepLspObject; | ... | @@ -81,20 +84,21 @@ import org.onosproject.pcepio.protocol.PcepLspObject; |
| 81 | import org.onosproject.pcepio.protocol.PcepMessage; | 84 | import org.onosproject.pcepio.protocol.PcepMessage; |
| 82 | import org.onosproject.pcepio.protocol.PcepMsgPath; | 85 | import org.onosproject.pcepio.protocol.PcepMsgPath; |
| 83 | import org.onosproject.pcepio.protocol.PcepReportMsg; | 86 | import org.onosproject.pcepio.protocol.PcepReportMsg; |
| 84 | -import org.onosproject.pcepio.protocol.PcepRroObject; | ||
| 85 | import org.onosproject.pcepio.protocol.PcepSrpObject; | 87 | import org.onosproject.pcepio.protocol.PcepSrpObject; |
| 86 | import org.onosproject.pcepio.protocol.PcepStateReport; | 88 | import org.onosproject.pcepio.protocol.PcepStateReport; |
| 87 | import org.onosproject.pcepio.protocol.PcepUpdateMsg; | 89 | import org.onosproject.pcepio.protocol.PcepUpdateMsg; |
| 88 | import org.onosproject.pcepio.protocol.PcepUpdateRequest; | 90 | import org.onosproject.pcepio.protocol.PcepUpdateRequest; |
| 89 | import org.onosproject.pcepio.types.IPv4SubObject; | 91 | import org.onosproject.pcepio.types.IPv4SubObject; |
| 92 | +import org.onosproject.pcepio.types.PathSetupTypeTlv; | ||
| 90 | import org.onosproject.pcepio.types.PcepValueType; | 93 | import org.onosproject.pcepio.types.PcepValueType; |
| 91 | -import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv; | 94 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 92 | import org.onosproject.pcepio.types.SymbolicPathNameTlv; | 95 | import org.onosproject.pcepio.types.SymbolicPathNameTlv; |
| 93 | import org.osgi.service.component.ComponentContext; | 96 | import org.osgi.service.component.ComponentContext; |
| 94 | import org.osgi.service.component.annotations.Modified; | 97 | import org.osgi.service.component.annotations.Modified; |
| 95 | import org.slf4j.Logger; | 98 | import org.slf4j.Logger; |
| 96 | 99 | ||
| 97 | import java.util.ArrayList; | 100 | import java.util.ArrayList; |
| 101 | +import java.util.Collection; | ||
| 98 | import java.util.Collections; | 102 | import java.util.Collections; |
| 99 | import java.util.Dictionary; | 103 | import java.util.Dictionary; |
| 100 | import java.util.HashMap; | 104 | import java.util.HashMap; |
| ... | @@ -106,10 +110,21 @@ import java.util.Optional; | ... | @@ -106,10 +110,21 @@ import java.util.Optional; |
| 106 | import static com.google.common.base.Preconditions.checkNotNull; | 110 | import static com.google.common.base.Preconditions.checkNotNull; |
| 107 | import static com.google.common.base.Strings.isNullOrEmpty; | 111 | import static com.google.common.base.Strings.isNullOrEmpty; |
| 108 | import static org.onlab.util.Tools.get; | 112 | import static org.onlab.util.Tools.get; |
| 113 | +import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS; | ||
| 109 | import static org.onosproject.net.DefaultAnnotations.EMPTY; | 114 | import static org.onosproject.net.DefaultAnnotations.EMPTY; |
| 110 | import static org.onosproject.net.DeviceId.deviceId; | 115 | import static org.onosproject.net.DeviceId.deviceId; |
| 111 | import static org.onosproject.net.PortNumber.portNumber; | 116 | import static org.onosproject.net.PortNumber.portNumber; |
| 112 | import static org.onosproject.pcep.api.PcepDpid.uri; | 117 | import static org.onosproject.pcep.api.PcepDpid.uri; |
| 118 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | ||
| 119 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH; | ||
| 120 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID; | ||
| 121 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 122 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; | ||
| 123 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; | ||
| 124 | +import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE; | ||
| 125 | +import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE; | ||
| 126 | +import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT; | ||
| 127 | +import static org.onosproject.provider.pcep.tunnel.impl.RequestType.UPDATE; | ||
| 113 | import static org.slf4j.LoggerFactory.getLogger; | 128 | import static org.slf4j.LoggerFactory.getLogger; |
| 114 | 129 | ||
| 115 | /** | 130 | /** |
| ... | @@ -215,7 +230,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -215,7 +230,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 215 | 230 | ||
| 216 | @Override | 231 | @Override |
| 217 | public void setupTunnel(Tunnel tunnel, Path path) { | 232 | public void setupTunnel(Tunnel tunnel, Path path) { |
| 218 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 233 | + if (tunnel.type() != MPLS) { |
| 219 | log.error("Tunnel Type MPLS is only supported"); | 234 | log.error("Tunnel Type MPLS is only supported"); |
| 220 | return; | 235 | return; |
| 221 | } | 236 | } |
| ... | @@ -244,7 +259,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -244,7 +259,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 244 | @Override | 259 | @Override |
| 245 | public void setupTunnel(ElementId srcElement, Tunnel tunnel, Path path) { | 260 | public void setupTunnel(ElementId srcElement, Tunnel tunnel, Path path) { |
| 246 | 261 | ||
| 247 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 262 | + if (tunnel.annotations().value(PLSP_ID) != null) { |
| 263 | + updateTunnel(tunnel, path); | ||
| 264 | + return; | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + if (tunnel.type() != MPLS) { | ||
| 248 | log.error("Tunnel Type MPLS is only supported"); | 268 | log.error("Tunnel Type MPLS is only supported"); |
| 249 | return; | 269 | return; |
| 250 | } | 270 | } |
| ... | @@ -276,7 +296,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -276,7 +296,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 276 | @Override | 296 | @Override |
| 277 | public void releaseTunnel(Tunnel tunnel) { | 297 | public void releaseTunnel(Tunnel tunnel) { |
| 278 | 298 | ||
| 279 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 299 | + if (tunnel.type() != MPLS) { |
| 280 | log.error("Tunnel Type MPLS is only supported"); | 300 | log.error("Tunnel Type MPLS is only supported"); |
| 281 | return; | 301 | return; |
| 282 | } | 302 | } |
| ... | @@ -302,7 +322,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -302,7 +322,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 302 | 322 | ||
| 303 | @Override | 323 | @Override |
| 304 | public void releaseTunnel(ElementId srcElement, Tunnel tunnel) { | 324 | public void releaseTunnel(ElementId srcElement, Tunnel tunnel) { |
| 305 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 325 | + if (tunnel.type() != MPLS) { |
| 306 | log.error("Tunnel Type MPLS is only supported"); | 326 | log.error("Tunnel Type MPLS is only supported"); |
| 307 | return; | 327 | return; |
| 308 | } | 328 | } |
| ... | @@ -333,7 +353,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -333,7 +353,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 333 | 353 | ||
| 334 | @Override | 354 | @Override |
| 335 | public void updateTunnel(Tunnel tunnel, Path path) { | 355 | public void updateTunnel(Tunnel tunnel, Path path) { |
| 336 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 356 | + if (tunnel.type() != MPLS) { |
| 337 | log.error("Tunnel Type MPLS is only supported"); | 357 | log.error("Tunnel Type MPLS is only supported"); |
| 338 | return; | 358 | return; |
| 339 | } | 359 | } |
| ... | @@ -360,7 +380,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -360,7 +380,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 360 | @Override | 380 | @Override |
| 361 | public void updateTunnel(ElementId srcElement, Tunnel tunnel, Path path) { | 381 | public void updateTunnel(ElementId srcElement, Tunnel tunnel, Path path) { |
| 362 | 382 | ||
| 363 | - if (tunnel.type() != Tunnel.Type.MPLS) { | 383 | + if (tunnel.type() != MPLS) { |
| 364 | log.error("Tunnel Type MPLS is only supported"); | 384 | log.error("Tunnel Type MPLS is only supported"); |
| 365 | return; | 385 | return; |
| 366 | } | 386 | } |
| ... | @@ -391,13 +411,26 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -391,13 +411,26 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 391 | 411 | ||
| 392 | @Override | 412 | @Override |
| 393 | public TunnelId tunnelAdded(TunnelDescription tunnel) { | 413 | public TunnelId tunnelAdded(TunnelDescription tunnel) { |
| 394 | - if (tunnel.type() == Tunnel.Type.MPLS) { | 414 | + return handleTunnelAdded(tunnel, null); |
| 415 | + } | ||
| 416 | + | ||
| 417 | + public TunnelId tunnelAdded(TunnelDescription tunnel, State tunnelState) { | ||
| 418 | + return handleTunnelAdded(tunnel, tunnelState); | ||
| 419 | + } | ||
| 420 | + | ||
| 421 | + private TunnelId handleTunnelAdded(TunnelDescription tunnel, State tunnelState) { | ||
| 422 | + | ||
| 423 | + if (tunnel.type() == MPLS) { | ||
| 395 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); | 424 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); |
| 396 | - return service.tunnelAdded(tunnel); | 425 | + |
| 426 | + if (tunnelState == null) { | ||
| 427 | + return service.tunnelAdded(tunnel); | ||
| 428 | + } else { | ||
| 429 | + return service.tunnelAdded(tunnel, tunnelState); | ||
| 430 | + } | ||
| 397 | } | 431 | } |
| 398 | 432 | ||
| 399 | - long bandwidth = Long | 433 | + long bandwidth = Long.parseLong(tunnel.annotations().value(BANDWIDTH)); |
| 400 | - .parseLong(tunnel.annotations().value("bandwidth")); | ||
| 401 | 434 | ||
| 402 | if (bandwidth < MIN_BANDWIDTH || bandwidth > MAX_BANDWIDTH) { | 435 | if (bandwidth < MIN_BANDWIDTH || bandwidth > MAX_BANDWIDTH) { |
| 403 | error("Update failed, invalid bandwidth."); | 436 | error("Update failed, invalid bandwidth."); |
| ... | @@ -437,7 +470,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -437,7 +470,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 437 | 470 | ||
| 438 | @Override | 471 | @Override |
| 439 | public void tunnelRemoved(TunnelDescription tunnel) { | 472 | public void tunnelRemoved(TunnelDescription tunnel) { |
| 440 | - if (tunnel.type() == Tunnel.Type.MPLS) { | 473 | + if (tunnel.type() == MPLS) { |
| 441 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); | 474 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); |
| 442 | service.tunnelRemoved(tunnel); | 475 | service.tunnelRemoved(tunnel); |
| 443 | } | 476 | } |
| ... | @@ -460,9 +493,23 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -460,9 +493,23 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 460 | 493 | ||
| 461 | @Override | 494 | @Override |
| 462 | public void tunnelUpdated(TunnelDescription tunnel) { | 495 | public void tunnelUpdated(TunnelDescription tunnel) { |
| 463 | - if (tunnel.type() == Tunnel.Type.MPLS) { | 496 | + handleTunnelUpdate(tunnel, null); |
| 497 | + } | ||
| 498 | + | ||
| 499 | + public void tunnelUpdated(TunnelDescription tunnel, State tunnelState) { | ||
| 500 | + handleTunnelUpdate(tunnel, tunnelState); | ||
| 501 | + } | ||
| 502 | + | ||
| 503 | + private void handleTunnelUpdate(TunnelDescription tunnel, State tunnelState) { | ||
| 504 | + if (tunnel.type() == MPLS) { | ||
| 464 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); | 505 | pcepTunnelApiMapper.removeFromCoreTunnelRequestQueue(tunnel.id()); |
| 465 | - service.tunnelUpdated(tunnel); | 506 | + |
| 507 | + if (tunnelState == null) { | ||
| 508 | + service.tunnelUpdated(tunnel); | ||
| 509 | + } else { | ||
| 510 | + service.tunnelUpdated(tunnel, tunnelState); | ||
| 511 | + } | ||
| 512 | + return; | ||
| 466 | } | 513 | } |
| 467 | 514 | ||
| 468 | Tunnel tunnelOld = tunnelQueryById(tunnel.id()); | 515 | Tunnel tunnelOld = tunnelQueryById(tunnel.id()); |
| ... | @@ -724,15 +771,31 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -724,15 +771,31 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 724 | return null; | 771 | return null; |
| 725 | } | 772 | } |
| 726 | 773 | ||
| 727 | - //build SRP object | ||
| 728 | - PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(false).build(); | ||
| 729 | - | ||
| 730 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); | 774 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); |
| 775 | + | ||
| 776 | + // set PathSetupTypeTlv of SRP object | ||
| 777 | + tlv = new PathSetupTypeTlv(LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)).type()); | ||
| 778 | + llOptionalTlv.add(tlv); | ||
| 779 | + | ||
| 780 | + // build SRP object | ||
| 781 | + PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(false) | ||
| 782 | + .setOptionalTlv(llOptionalTlv).build(); | ||
| 783 | + | ||
| 784 | + llOptionalTlv = new LinkedList<PcepValueType>(); | ||
| 731 | LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = new LinkedList<PcInitiatedLspRequest>(); | 785 | LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = new LinkedList<PcInitiatedLspRequest>(); |
| 786 | + | ||
| 732 | // set LSP identifiers TLV | 787 | // set LSP identifiers TLV |
| 733 | - tlv = new StatefulIPv4LspIdentidiersTlv((((IpTunnelEndPoint) tunnel.src()).ip().getIp4Address().toInt()), | 788 | + short localLspId = 0; |
| 734 | - (short) 0, (short) 0, 0, | 789 | + if (LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)) != WITH_SIGNALLING) { |
| 735 | - (((IpTunnelEndPoint) tunnel.dst()).ip().getIp4Address().toInt())); | 790 | + String localLspIdString = tunnel.annotations().value(LOCAL_LSP_ID); |
| 791 | + if (localLspIdString != null) { | ||
| 792 | + localLspId = Short.valueOf(localLspIdString); | ||
| 793 | + } | ||
| 794 | + } | ||
| 795 | + | ||
| 796 | + tlv = new StatefulIPv4LspIdentifiersTlv((((IpTunnelEndPoint) tunnel.src()).ip().getIp4Address().toInt()), | ||
| 797 | + localLspId, (short) 0, 0, (((IpTunnelEndPoint) tunnel.dst()).ip() | ||
| 798 | + .getIp4Address().toInt())); | ||
| 736 | llOptionalTlv.add(tlv); | 799 | llOptionalTlv.add(tlv); |
| 737 | //set SymbolicPathNameTlv of LSP object | 800 | //set SymbolicPathNameTlv of LSP object |
| 738 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); | 801 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); |
| ... | @@ -752,8 +815,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -752,8 +815,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 752 | PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build(); | 815 | PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build(); |
| 753 | 816 | ||
| 754 | int iBandwidth = DEFAULT_BANDWIDTH_VALUE; | 817 | int iBandwidth = DEFAULT_BANDWIDTH_VALUE; |
| 755 | - if (tunnel.annotations().value("bandwidth") != null) { | 818 | + if (tunnel.annotations().value(BANDWIDTH) != null) { |
| 756 | - iBandwidth = Integer.parseInt(tunnel.annotations().value("bandwidth")); | 819 | + iBandwidth = Integer.parseInt(tunnel.annotations().value(BANDWIDTH)); |
| 757 | } | 820 | } |
| 758 | // build bandwidth object | 821 | // build bandwidth object |
| 759 | PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build(); | 822 | PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build(); |
| ... | @@ -777,7 +840,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -777,7 +840,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 777 | private void pcepSetupTunnel(Tunnel tunnel, Path path, PcepClient pc) { | 840 | private void pcepSetupTunnel(Tunnel tunnel, Path path, PcepClient pc) { |
| 778 | try { | 841 | try { |
| 779 | int srpId = SrpIdGenerators.create(); | 842 | int srpId = SrpIdGenerators.create(); |
| 780 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.CREATE); | 843 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, CREATE); |
| 781 | 844 | ||
| 782 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); | 845 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); |
| 783 | 846 | ||
| ... | @@ -809,12 +872,11 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -809,12 +872,11 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 809 | */ | 872 | */ |
| 810 | private void pcepReleaseTunnel(Tunnel tunnel, PcepClient pc) { | 873 | private void pcepReleaseTunnel(Tunnel tunnel, PcepClient pc) { |
| 811 | try { | 874 | try { |
| 812 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, RequestType.DELETE); | 875 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, DELETE); |
| 813 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); | 876 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); |
| 814 | int srpId = SrpIdGenerators.create(); | 877 | int srpId = SrpIdGenerators.create(); |
| 815 | TunnelId tunnelId = tunnel.tunnelId(); | 878 | TunnelId tunnelId = tunnel.tunnelId(); |
| 816 | int plspId = 0; | 879 | int plspId = 0; |
| 817 | - StatefulIPv4LspIdentidiersTlv statefulIpv4IndentifierTlv = null; | ||
| 818 | 880 | ||
| 819 | if (!(pcepTunnelApiMapper.checkFromTunnelDBQueue(tunnelId))) { | 881 | if (!(pcepTunnelApiMapper.checkFromTunnelDBQueue(tunnelId))) { |
| 820 | log.error("Tunnel doesnot exists. Tunnel id {}" + tunnelId.toString()); | 882 | log.error("Tunnel doesnot exists. Tunnel id {}" + tunnelId.toString()); |
| ... | @@ -822,24 +884,23 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -822,24 +884,23 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 822 | } else { | 884 | } else { |
| 823 | PcepTunnelData pcepTunnelDbData = pcepTunnelApiMapper.getDataFromTunnelDBQueue(tunnelId); | 885 | PcepTunnelData pcepTunnelDbData = pcepTunnelApiMapper.getDataFromTunnelDBQueue(tunnelId); |
| 824 | plspId = pcepTunnelDbData.plspId(); | 886 | plspId = pcepTunnelDbData.plspId(); |
| 825 | - statefulIpv4IndentifierTlv = pcepTunnelDbData.statefulIpv4IndentifierTlv(); | ||
| 826 | } | 887 | } |
| 827 | - // build srp object | ||
| 828 | - PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(true).build(); | ||
| 829 | 888 | ||
| 830 | PcepValueType tlv; | 889 | PcepValueType tlv; |
| 831 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); | 890 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); |
| 832 | - LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = new LinkedList<PcInitiatedLspRequest>(); | ||
| 833 | 891 | ||
| 834 | - if (statefulIpv4IndentifierTlv != null) { | 892 | + // set PathSetupTypeTlv of SRP object |
| 835 | - tlv = statefulIpv4IndentifierTlv; | 893 | + tlv = new PathSetupTypeTlv(LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)) |
| 836 | - } else { | 894 | + .type()); |
| 837 | - tlv = new StatefulIPv4LspIdentidiersTlv(( | ||
| 838 | - ((IpTunnelEndPoint) tunnel.src()).ip().getIp4Address().toInt()), | ||
| 839 | - (short) 0, (short) 0, 0, | ||
| 840 | - (((IpTunnelEndPoint) tunnel.dst()).ip().getIp4Address().toInt())); | ||
| 841 | - } | ||
| 842 | llOptionalTlv.add(tlv); | 895 | llOptionalTlv.add(tlv); |
| 896 | + | ||
| 897 | + // build SRP object | ||
| 898 | + PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(true) | ||
| 899 | + .setOptionalTlv(llOptionalTlv).build(); | ||
| 900 | + | ||
| 901 | + llOptionalTlv = new LinkedList<PcepValueType>(); | ||
| 902 | + LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList = new LinkedList<PcInitiatedLspRequest>(); | ||
| 903 | + | ||
| 843 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); | 904 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); |
| 844 | llOptionalTlv.add(tlv); | 905 | llOptionalTlv.add(tlv); |
| 845 | // build lsp object, set r flag as false to delete the tunnel | 906 | // build lsp object, set r flag as false to delete the tunnel |
| ... | @@ -871,7 +932,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -871,7 +932,7 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 871 | */ | 932 | */ |
| 872 | private void pcepUpdateTunnel(Tunnel tunnel, Path path, PcepClient pc) { | 933 | private void pcepUpdateTunnel(Tunnel tunnel, Path path, PcepClient pc) { |
| 873 | try { | 934 | try { |
| 874 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); | 935 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, UPDATE); |
| 875 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); | 936 | pcepTunnelApiMapper.addToCoreTunnelRequestQueue(pcepTunnelData); |
| 876 | int srpId = SrpIdGenerators.create(); | 937 | int srpId = SrpIdGenerators.create(); |
| 877 | TunnelId tunnelId = tunnel.tunnelId(); | 938 | TunnelId tunnelId = tunnel.tunnelId(); |
| ... | @@ -882,8 +943,16 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -882,8 +943,16 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 882 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); | 943 | LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>(); |
| 883 | LinkedList<PcepUpdateRequest> llUpdateRequestList = new LinkedList<PcepUpdateRequest>(); | 944 | LinkedList<PcepUpdateRequest> llUpdateRequestList = new LinkedList<PcepUpdateRequest>(); |
| 884 | 945 | ||
| 885 | - //build SRP object | 946 | + // set PathSetupTypeTlv of SRP object |
| 886 | - PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(false).build(); | 947 | + LspType lspSigType = LspType.valueOf(tunnel.annotations().value(LSP_SIG_TYPE)); |
| 948 | + tlv = new PathSetupTypeTlv(lspSigType.type()); | ||
| 949 | + llOptionalTlv.add(tlv); | ||
| 950 | + | ||
| 951 | + // build SRP object | ||
| 952 | + PcepSrpObject srpobj = pc.factory().buildSrpObject().setSrpID(srpId).setRFlag(false) | ||
| 953 | + .setOptionalTlv(llOptionalTlv).build(); | ||
| 954 | + | ||
| 955 | + llOptionalTlv = new LinkedList<PcepValueType>(); | ||
| 887 | 956 | ||
| 888 | if (!(pcepTunnelApiMapper.checkFromTunnelDBQueue(tunnelId))) { | 957 | if (!(pcepTunnelApiMapper.checkFromTunnelDBQueue(tunnelId))) { |
| 889 | log.error("Tunnel doesnot exists in DB"); | 958 | log.error("Tunnel doesnot exists in DB"); |
| ... | @@ -893,10 +962,26 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -893,10 +962,26 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 893 | plspId = pcepTunnelDBData.plspId(); | 962 | plspId = pcepTunnelDBData.plspId(); |
| 894 | } | 963 | } |
| 895 | 964 | ||
| 896 | - tlv = new StatefulIPv4LspIdentidiersTlv((((IpTunnelEndPoint) tunnel.src()).ip().getIp4Address().toInt()), | 965 | + if (lspSigType != WITH_SIGNALLING) { |
| 897 | - (short) 0, (short) 0, 0, | 966 | + String localLspIdString = tunnel.annotations().value(LOCAL_LSP_ID); |
| 898 | - (((IpTunnelEndPoint) tunnel.dst()).ip().getIp4Address().toInt())); | 967 | + String pccTunnelIdString = tunnel.annotations().value(PCC_TUNNEL_ID); |
| 899 | - llOptionalTlv.add(tlv); | 968 | + short localLspId = 0; |
| 969 | + short pccTunnelId = 0; | ||
| 970 | + | ||
| 971 | + if (localLspIdString != null) { | ||
| 972 | + localLspId = Short.valueOf(localLspIdString); | ||
| 973 | + } | ||
| 974 | + | ||
| 975 | + if (pccTunnelIdString != null) { | ||
| 976 | + pccTunnelId = Short.valueOf(pccTunnelIdString); | ||
| 977 | + } | ||
| 978 | + | ||
| 979 | + tlv = new StatefulIPv4LspIdentifiersTlv((((IpTunnelEndPoint) tunnel.src()) | ||
| 980 | + .ip().getIp4Address().toInt()), | ||
| 981 | + localLspId, pccTunnelId, 0, (((IpTunnelEndPoint) tunnel.dst()).ip() | ||
| 982 | + .getIp4Address().toInt())); | ||
| 983 | + llOptionalTlv.add(tlv); | ||
| 984 | + } | ||
| 900 | 985 | ||
| 901 | if (tunnel.tunnelName().value() != null) { | 986 | if (tunnel.tunnelName().value() != null) { |
| 902 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); | 987 | tlv = new SymbolicPathNameTlv(tunnel.tunnelName().value().getBytes()); |
| ... | @@ -910,8 +995,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -910,8 +995,8 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 910 | PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build(); | 995 | PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build(); |
| 911 | 996 | ||
| 912 | int iBandwidth = DEFAULT_BANDWIDTH_VALUE; | 997 | int iBandwidth = DEFAULT_BANDWIDTH_VALUE; |
| 913 | - if (tunnel.annotations().value("bandwidth") != null) { | 998 | + if (tunnel.annotations().value(BANDWIDTH) != null) { |
| 914 | - iBandwidth = Integer.parseInt(tunnel.annotations().value("bandwidth")); | 999 | + iBandwidth = Integer.parseInt(tunnel.annotations().value(BANDWIDTH)); |
| 915 | } | 1000 | } |
| 916 | // build bandwidth object | 1001 | // build bandwidth object |
| 917 | PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build(); | 1002 | PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build(); |
| ... | @@ -1005,14 +1090,15 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1005,14 +1090,15 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1005 | // Check the sync status | 1090 | // Check the sync status |
| 1006 | if (lspObj.getSFlag()) { | 1091 | if (lspObj.getSFlag()) { |
| 1007 | handleSyncReport(stateRpt); | 1092 | handleSyncReport(stateRpt); |
| 1093 | + continue; | ||
| 1008 | } else if (!pcepClientController.getClient(pccId).isSyncComplete()) { | 1094 | } else if (!pcepClientController.getClient(pccId).isSyncComplete()) { |
| 1009 | // sync is done | 1095 | // sync is done |
| 1010 | pcepClientController.getClient(pccId).setIsSyncComplete(true); | 1096 | pcepClientController.getClient(pccId).setIsSyncComplete(true); |
| 1097 | + continue; | ||
| 1011 | } | 1098 | } |
| 1012 | - continue; | ||
| 1013 | } | 1099 | } |
| 1014 | 1100 | ||
| 1015 | - handleReportMessage(srpId, lspObj); | 1101 | + handleReportMessage(srpId, lspObj, stateRpt); |
| 1016 | } | 1102 | } |
| 1017 | break; | 1103 | break; |
| 1018 | 1104 | ||
| ... | @@ -1027,13 +1113,18 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1027,13 +1113,18 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1027 | /** | 1113 | /** |
| 1028 | * Handles report message for setup/update/delete tunnel request. | 1114 | * Handles report message for setup/update/delete tunnel request. |
| 1029 | * | 1115 | * |
| 1030 | - * @param srpId unique identifier for pcep message | 1116 | + * @param srpId unique identifier for PCEP message |
| 1031 | - * @param lspObj lsp object | 1117 | + * @param lspObj LSP object |
| 1118 | + * @param stateRpt parsed PCEP report msg. | ||
| 1032 | */ | 1119 | */ |
| 1033 | - private void handleReportMessage(int srpId, PcepLspObject lspObj) { | 1120 | + private void handleReportMessage(int srpId, PcepLspObject lspObj, PcepStateReport stateRpt) { |
| 1034 | ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); | 1121 | ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); |
| 1035 | PcepTunnelData pcepTunnelData = pcepTunnelApiMapper.getDataFromTunnelRequestQueue(srpId); | 1122 | PcepTunnelData pcepTunnelData = pcepTunnelApiMapper.getDataFromTunnelRequestQueue(srpId); |
| 1036 | - SparseAnnotations annotations = (SparseAnnotations) pcepTunnelData.tunnel().annotations(); | 1123 | + |
| 1124 | + if (pcepTunnelData == null) { | ||
| 1125 | + handleRptWithoutSrpId(stateRpt); | ||
| 1126 | + return; | ||
| 1127 | + } | ||
| 1037 | 1128 | ||
| 1038 | // store the values required from report message | 1129 | // store the values required from report message |
| 1039 | pcepTunnelData.setPlspId(lspObj.getPlspId()); | 1130 | pcepTunnelData.setPlspId(lspObj.getPlspId()); |
| ... | @@ -1041,12 +1132,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1041,12 +1132,12 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1041 | pcepTunnelData.setLspOFlag(lspObj.getOFlag()); | 1132 | pcepTunnelData.setLspOFlag(lspObj.getOFlag()); |
| 1042 | pcepTunnelData.setLspDFlag(lspObj.getDFlag()); | 1133 | pcepTunnelData.setLspDFlag(lspObj.getDFlag()); |
| 1043 | 1134 | ||
| 1044 | - StatefulIPv4LspIdentidiersTlv ipv4LspTlv = null; | 1135 | + StatefulIPv4LspIdentifiersTlv ipv4LspTlv = null; |
| 1045 | ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); | 1136 | ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); |
| 1046 | while (listTlvIterator.hasNext()) { | 1137 | while (listTlvIterator.hasNext()) { |
| 1047 | PcepValueType tlv = listTlvIterator.next(); | 1138 | PcepValueType tlv = listTlvIterator.next(); |
| 1048 | - if (tlv.getType() == StatefulIPv4LspIdentidiersTlv.TYPE) { | 1139 | + if (tlv.getType() == StatefulIPv4LspIdentifiersTlv.TYPE) { |
| 1049 | - ipv4LspTlv = (StatefulIPv4LspIdentidiersTlv) tlv; | 1140 | + ipv4LspTlv = (StatefulIPv4LspIdentifiersTlv) tlv; |
| 1050 | break; | 1141 | break; |
| 1051 | } | 1142 | } |
| 1052 | } | 1143 | } |
| ... | @@ -1056,38 +1147,113 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1056,38 +1147,113 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1056 | 1147 | ||
| 1057 | Path path = pcepTunnelData.path(); | 1148 | Path path = pcepTunnelData.path(); |
| 1058 | Tunnel tunnel = pcepTunnelData.tunnel(); | 1149 | Tunnel tunnel = pcepTunnelData.tunnel(); |
| 1150 | + Builder annotationBuilder = DefaultAnnotations.builder(); | ||
| 1151 | + annotationBuilder.putAll(pcepTunnelData.tunnel().annotations()); | ||
| 1152 | + | ||
| 1153 | + // PCRpt in response to PCInitate msg will carry PLSP id allocated by PCC. | ||
| 1154 | + if (tunnel.annotations().value(PLSP_ID) == null) { | ||
| 1155 | + annotationBuilder.set(PLSP_ID, String.valueOf(lspObj.getPlspId())); | ||
| 1156 | + } | ||
| 1157 | + | ||
| 1158 | + // Signalled LSPs will carry local LSP id allocated by signalling protocol(PCC). | ||
| 1159 | + if (tunnel.annotations().value(LOCAL_LSP_ID) == null) { | ||
| 1160 | + annotationBuilder.set(LOCAL_LSP_ID, String.valueOf(ipv4LspTlv.getLspId())); | ||
| 1161 | + } | ||
| 1162 | + | ||
| 1163 | + SparseAnnotations annotations = annotationBuilder.build(); | ||
| 1059 | DefaultTunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), tunnel.src(), | 1164 | DefaultTunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), tunnel.src(), |
| 1060 | tunnel.dst(), tunnel.type(), tunnel.groupId(), | 1165 | tunnel.dst(), tunnel.type(), tunnel.groupId(), |
| 1061 | providerId, tunnel.tunnelName(), path, | 1166 | providerId, tunnel.tunnelName(), path, |
| 1062 | annotations); | 1167 | annotations); |
| 1063 | 1168 | ||
| 1064 | - if (RequestType.CREATE == pcepTunnelData.requestType()) { | 1169 | + if (CREATE == pcepTunnelData.requestType()) { |
| 1065 | - log.debug("Report received for create request"); | ||
| 1066 | - | ||
| 1067 | pcepTunnelApiMapper.handleCreateTunnelRequestQueue(srpId, pcepTunnelData); | 1170 | pcepTunnelApiMapper.handleCreateTunnelRequestQueue(srpId, pcepTunnelData); |
| 1068 | - if (0 == lspObj.getOFlag()) { | 1171 | + } else if (DELETE == pcepTunnelData.requestType()) { |
| 1069 | - log.warn("The tunnel is in down state"); | ||
| 1070 | - } | ||
| 1071 | - tunnelAdded(td); | ||
| 1072 | - } | ||
| 1073 | - if (RequestType.DELETE == pcepTunnelData.requestType()) { | ||
| 1074 | - log.debug("Report received for delete request"); | ||
| 1075 | pcepTunnelApiMapper.handleRemoveFromTunnelRequestQueue(srpId, pcepTunnelData); | 1172 | pcepTunnelApiMapper.handleRemoveFromTunnelRequestQueue(srpId, pcepTunnelData); |
| 1076 | - tunnelRemoved(td); | 1173 | + } else if (UPDATE == pcepTunnelData.requestType()) { |
| 1077 | - } | ||
| 1078 | - | ||
| 1079 | - if (RequestType.UPDATE == pcepTunnelData.requestType()) { | ||
| 1080 | - log.debug("Report received for update request"); | ||
| 1081 | pcepTunnelData.setRptFlag(true); | 1174 | pcepTunnelData.setRptFlag(true); |
| 1082 | pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 1175 | pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 1083 | pcepTunnelApiMapper.handleUpdateTunnelRequestQueue(srpId, pcepTunnelData); | 1176 | pcepTunnelApiMapper.handleUpdateTunnelRequestQueue(srpId, pcepTunnelData); |
| 1177 | + } | ||
| 1178 | + | ||
| 1179 | + if (lspObj.getRFlag()) { | ||
| 1180 | + tunnelRemoved(td); | ||
| 1181 | + } else { | ||
| 1182 | + State tunnelState = PcepLspStatus | ||
| 1183 | + .getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); | ||
| 1184 | + tunnelUpdated(td, tunnelState); | ||
| 1185 | + } | ||
| 1186 | + } | ||
| 1187 | + | ||
| 1188 | + /** | ||
| 1189 | + * Handles asynchronous report messages from PCC when LSPDB sync is not in progress. | ||
| 1190 | + * | ||
| 1191 | + * @param stateRpt parsed PCEP report msg. | ||
| 1192 | + */ | ||
| 1193 | + private void handleRptWithoutSrpId(PcepStateReport stateRpt) { | ||
| 1194 | + ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); | ||
| 1195 | + StatefulIPv4LspIdentifiersTlv ipv4LspTlv = null; | ||
| 1084 | 1196 | ||
| 1085 | - if (0 == lspObj.getOFlag()) { | 1197 | + PcepLspObject lspObj = stateRpt.getLspObject(); |
| 1086 | - log.warn("The tunnel is in down state"); | 1198 | + ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator(); |
| 1199 | + | ||
| 1200 | + while (listTlvIterator.hasNext()) { | ||
| 1201 | + PcepValueType tlv = listTlvIterator.next(); | ||
| 1202 | + if (tlv.getType() == StatefulIPv4LspIdentifiersTlv.TYPE) { | ||
| 1203 | + ipv4LspTlv = (StatefulIPv4LspIdentifiersTlv) tlv; | ||
| 1204 | + break; | ||
| 1205 | + } | ||
| 1206 | + } | ||
| 1207 | + | ||
| 1208 | + checkNotNull(ipv4LspTlv); | ||
| 1209 | + | ||
| 1210 | + IpTunnelEndPoint tunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(ipv4LspTlv | ||
| 1211 | + .getIpv4IngressAddress())); | ||
| 1212 | + IpTunnelEndPoint tunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(ipv4LspTlv | ||
| 1213 | + .getIpv4EgressAddress())); | ||
| 1214 | + | ||
| 1215 | + Collection<Tunnel> tunnelQueryResult = tunnelService.queryTunnel(tunnelEndPointSrc, tunnelEndPointDst); | ||
| 1216 | + | ||
| 1217 | + Tunnel tunnel = null; | ||
| 1218 | + // Asynchronous status change message from PCC for LSP reported earlier. | ||
| 1219 | + for (Tunnel tunnelObj : tunnelQueryResult) { | ||
| 1220 | + if ((tunnelObj.annotations().value(PLSP_ID) == null) | ||
| 1221 | + || (tunnelObj.annotations().value(LOCAL_LSP_ID) == null)) { | ||
| 1222 | + /* | ||
| 1223 | + * Can skip this tunnel as this is one for which PCE has | ||
| 1224 | + * sent PCInit/PCUpd msg and waiting for a PCRpt. | ||
| 1225 | + */ | ||
| 1226 | + continue; | ||
| 1227 | + } | ||
| 1228 | + | ||
| 1229 | + if ((Integer.valueOf(tunnelObj.annotations().value(PLSP_ID)) == lspObj.getPlspId()) | ||
| 1230 | + && (Integer.valueOf(tunnelObj.annotations().value(LOCAL_LSP_ID)) | ||
| 1231 | + == ipv4LspTlv.getLspId())) { | ||
| 1232 | + tunnel = tunnelObj; | ||
| 1233 | + break; | ||
| 1087 | } | 1234 | } |
| 1088 | - if (!(pcepTunnelApiMapper.checkFromTunnelRequestQueue(srpId))) { | 1235 | + } |
| 1089 | - tunnelUpdated(td); | 1236 | + |
| 1237 | + // Status report for a new LSP when LSPDB sync was already completed sometime. | ||
| 1238 | + // No need to add the tunnel if msg is for remove but store doesn't have an entry. | ||
| 1239 | + if (tunnel == null) { | ||
| 1240 | + if (!lspObj.getRFlag()) { | ||
| 1241 | + handleSyncReport(stateRpt); | ||
| 1090 | } | 1242 | } |
| 1243 | + return; | ||
| 1244 | + } | ||
| 1245 | + | ||
| 1246 | + DefaultTunnelDescription td = new DefaultTunnelDescription(tunnel.tunnelId(), tunnel.src(), | ||
| 1247 | + tunnel.dst(), tunnel.type(), tunnel.groupId(), | ||
| 1248 | + providerId, tunnel.tunnelName(), tunnel.path(), | ||
| 1249 | + (SparseAnnotations) tunnel.annotations()); | ||
| 1250 | + | ||
| 1251 | + if (lspObj.getRFlag()) { | ||
| 1252 | + tunnelRemoved(td); // This will happen only for PCC initiated tunnels. | ||
| 1253 | + } else { | ||
| 1254 | + State tunnelState = PcepLspStatus | ||
| 1255 | + .getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); | ||
| 1256 | + tunnelUpdated(td, tunnelState); | ||
| 1091 | } | 1257 | } |
| 1092 | } | 1258 | } |
| 1093 | 1259 | ||
| ... | @@ -1100,9 +1266,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1100,9 +1266,9 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1100 | PcepLspObject lspObj = stateRpt.getLspObject(); | 1266 | PcepLspObject lspObj = stateRpt.getLspObject(); |
| 1101 | PcepStateReport.PcepMsgPath msgPath = stateRpt.getMsgPath(); | 1267 | PcepStateReport.PcepMsgPath msgPath = stateRpt.getMsgPath(); |
| 1102 | checkNotNull(msgPath); | 1268 | checkNotNull(msgPath); |
| 1103 | - PcepRroObject rroObj = msgPath.getRroObject(); | 1269 | + PcepEroObject eroObj = msgPath.getEroObject(); |
| 1104 | - if (rroObj == null) { | 1270 | + if (eroObj == null) { |
| 1105 | - log.debug("RRO object is null in sate report"); | 1271 | + log.debug("ERO object is null in sate report"); |
| 1106 | return; | 1272 | return; |
| 1107 | } | 1273 | } |
| 1108 | int bandwidth = 0; | 1274 | int bandwidth = 0; |
| ... | @@ -1118,20 +1284,44 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1118,20 +1284,44 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1118 | bandwidth = msgPath.getBandwidthObject().getBandwidth(); | 1284 | bandwidth = msgPath.getBandwidthObject().getBandwidth(); |
| 1119 | } | 1285 | } |
| 1120 | 1286 | ||
| 1121 | - buildAndStorePcepTunnelData(lspObj, rroObj, bandwidth); | 1287 | + // To carry PST TLV, SRP object can be present with value 0 even |
| 1288 | + // when PCRpt is | ||
| 1289 | + // not in response to any action from PCE. | ||
| 1290 | + PcepSrpObject srpObj = stateRpt.getSrpObject(); | ||
| 1291 | + LspType lspType = WITH_SIGNALLING; | ||
| 1292 | + | ||
| 1293 | + if (null != srpObj) { | ||
| 1294 | + LinkedList<PcepValueType> llOptionalTlv = srpObj.getOptionalTlv(); | ||
| 1295 | + ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator(); | ||
| 1296 | + | ||
| 1297 | + while (listIterator.hasNext()) { | ||
| 1298 | + PcepValueType tlv = listIterator.next(); | ||
| 1299 | + | ||
| 1300 | + switch (tlv.getType()) { | ||
| 1301 | + case PathSetupTypeTlv.TYPE: | ||
| 1302 | + lspType = LspType.values()[Integer.valueOf(((PathSetupTypeTlv) tlv).getPst())]; | ||
| 1303 | + break; | ||
| 1304 | + | ||
| 1305 | + default: | ||
| 1306 | + break; | ||
| 1307 | + } | ||
| 1308 | + } | ||
| 1309 | + } | ||
| 1310 | + | ||
| 1311 | + buildAndStorePcepTunnelData(lspObj, eroObj, bandwidth, lspType); | ||
| 1122 | } | 1312 | } |
| 1123 | 1313 | ||
| 1124 | /** | 1314 | /** |
| 1125 | - * To build Path in network from RRO object. | 1315 | + * To build Path in network from ERO object. |
| 1126 | * | 1316 | * |
| 1127 | - * @param rroObj rro object | 1317 | + * @param eroObj ERO object |
| 1128 | * @param providerId provider id | 1318 | * @param providerId provider id |
| 1129 | * @return path object | 1319 | * @return path object |
| 1130 | */ | 1320 | */ |
| 1131 | - private Path buildPathFromRroObj(PcepRroObject rroObj, ProviderId providerId) { | 1321 | + private Path buildPathFromEroObj(PcepEroObject eroObj, ProviderId providerId) { |
| 1132 | - checkNotNull(rroObj); | 1322 | + checkNotNull(eroObj); |
| 1133 | List<Link> links = new ArrayList<Link>(); | 1323 | List<Link> links = new ArrayList<Link>(); |
| 1134 | - LinkedList<PcepValueType> llSubObj = rroObj.getSubObjects(); | 1324 | + LinkedList<PcepValueType> llSubObj = eroObj.getSubObjects(); |
| 1135 | if (0 == llSubObj.size()) { | 1325 | if (0 == llSubObj.size()) { |
| 1136 | log.error("RRO in report message does not have hop information"); | 1326 | log.error("RRO in report message does not have hop information"); |
| 1137 | } | 1327 | } |
| ... | @@ -1172,27 +1362,29 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1172,27 +1362,29 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1172 | } | 1362 | } |
| 1173 | 1363 | ||
| 1174 | /** | 1364 | /** |
| 1175 | - * To build pcepTunnelData and informs core about the pcc reported tunnel. | 1365 | + * To build pcepTunnelData and informs core about the PCC reported |
| 1366 | + * tunnel. | ||
| 1176 | * | 1367 | * |
| 1177 | - * @param lspObj pcep lsp object | 1368 | + * @param lspObj PCEP LSP object |
| 1178 | - * @param rroObj pcep rro object | 1369 | + * @param eroObj PCEP ERO object |
| 1179 | * @param bandwidth bandwidth of tunnel | 1370 | * @param bandwidth bandwidth of tunnel |
| 1371 | + * @param lspType path setup type/signaling type of the LSP. | ||
| 1180 | */ | 1372 | */ |
| 1181 | - private void buildAndStorePcepTunnelData(PcepLspObject lspObj, PcepRroObject rroObj, | 1373 | + private void buildAndStorePcepTunnelData(PcepLspObject lspObj, PcepEroObject eroObj, int bandwidth, |
| 1182 | - int bandwidth) { | 1374 | + LspType lspType) { |
| 1183 | 1375 | ||
| 1184 | ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); | 1376 | ProviderId providerId = new ProviderId("pcep", PROVIDER_ID); |
| 1185 | 1377 | ||
| 1186 | // StatefulIPv4LspIdentidiersTlv in LSP object will have the source and destination address. | 1378 | // StatefulIPv4LspIdentidiersTlv in LSP object will have the source and destination address. |
| 1187 | - StatefulIPv4LspIdentidiersTlv lspIdenTlv = null; | 1379 | + StatefulIPv4LspIdentifiersTlv lspIdenTlv = null; |
| 1188 | SymbolicPathNameTlv pathNameTlv = null; | 1380 | SymbolicPathNameTlv pathNameTlv = null; |
| 1189 | LinkedList<PcepValueType> llOptionalTlv = lspObj.getOptionalTlv(); | 1381 | LinkedList<PcepValueType> llOptionalTlv = lspObj.getOptionalTlv(); |
| 1190 | ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator(); | 1382 | ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator(); |
| 1191 | while (listIterator.hasNext()) { | 1383 | while (listIterator.hasNext()) { |
| 1192 | PcepValueType tlv = listIterator.next(); | 1384 | PcepValueType tlv = listIterator.next(); |
| 1193 | switch (tlv.getType()) { | 1385 | switch (tlv.getType()) { |
| 1194 | - case StatefulIPv4LspIdentidiersTlv.TYPE: | 1386 | + case StatefulIPv4LspIdentifiersTlv.TYPE: |
| 1195 | - lspIdenTlv = (StatefulIPv4LspIdentidiersTlv) tlv; | 1387 | + lspIdenTlv = (StatefulIPv4LspIdentifiersTlv) tlv; |
| 1196 | break; | 1388 | break; |
| 1197 | case SymbolicPathNameTlv.TYPE: | 1389 | case SymbolicPathNameTlv.TYPE: |
| 1198 | pathNameTlv = (SymbolicPathNameTlv) tlv; | 1390 | pathNameTlv = (SymbolicPathNameTlv) tlv; |
| ... | @@ -1207,24 +1399,28 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1207,24 +1399,28 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1207 | IpTunnelEndPoint tunnelEndPointDst; | 1399 | IpTunnelEndPoint tunnelEndPointDst; |
| 1208 | tunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(lspIdenTlv.getIpv4EgressAddress())); | 1400 | tunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(lspIdenTlv.getIpv4EgressAddress())); |
| 1209 | 1401 | ||
| 1210 | - Path path = buildPathFromRroObj(rroObj, providerId); | 1402 | + Path path = buildPathFromEroObj(eroObj, providerId); |
| 1211 | 1403 | ||
| 1212 | SparseAnnotations annotations = DefaultAnnotations.builder() | 1404 | SparseAnnotations annotations = DefaultAnnotations.builder() |
| 1213 | - .set("bandwidth", (new Integer(bandwidth)).toString()) | 1405 | + .set(BANDWIDTH, (new Integer(bandwidth)).toString()) |
| 1214 | - .build(); | 1406 | + .set(LSP_SIG_TYPE, lspType.name()) |
| 1407 | + .set(PCC_TUNNEL_ID, String.valueOf(lspIdenTlv.getTunnelId())) | ||
| 1408 | + .set(PLSP_ID, String.valueOf(lspObj.getPlspId())) | ||
| 1409 | + .set(LOCAL_LSP_ID, String.valueOf(lspIdenTlv.getLspId())).build(); | ||
| 1215 | 1410 | ||
| 1216 | DefaultTunnelDescription td = new DefaultTunnelDescription(null, tunnelEndPointSrc, | 1411 | DefaultTunnelDescription td = new DefaultTunnelDescription(null, tunnelEndPointSrc, |
| 1217 | - tunnelEndPointDst, Tunnel.Type.MPLS, | 1412 | + tunnelEndPointDst, MPLS, |
| 1218 | new DefaultGroupId(0), providerId, | 1413 | new DefaultGroupId(0), providerId, |
| 1219 | TunnelName.tunnelName(pathNameTlv.toString()), | 1414 | TunnelName.tunnelName(pathNameTlv.toString()), |
| 1220 | path, annotations); | 1415 | path, annotations); |
| 1221 | - TunnelId tId = tunnelAdded(td); | 1416 | + State tunnelState = PcepLspStatus.getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]); |
| 1417 | + TunnelId tId = tunnelAdded(td, tunnelState); | ||
| 1222 | 1418 | ||
| 1223 | - Tunnel tunnel = new DefaultTunnel(providerId, tunnelEndPointSrc, tunnelEndPointDst, Tunnel.Type.MPLS, | 1419 | + Tunnel tunnel = new DefaultTunnel(providerId, tunnelEndPointSrc, tunnelEndPointDst, MPLS, |
| 1224 | new DefaultGroupId(0), tId, | 1420 | new DefaultGroupId(0), tId, |
| 1225 | TunnelName.tunnelName(pathNameTlv.toString()), path, annotations); | 1421 | TunnelName.tunnelName(pathNameTlv.toString()), path, annotations); |
| 1226 | 1422 | ||
| 1227 | - PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.LSP_STATE_RPT); | 1423 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, LSP_STATE_RPT); |
| 1228 | pcepTunnelData.setStatefulIpv4IndentifierTlv(lspIdenTlv); | 1424 | pcepTunnelData.setStatefulIpv4IndentifierTlv(lspIdenTlv); |
| 1229 | pcepTunnelApiMapper.addPccTunnelDB(pcepTunnelData); | 1425 | pcepTunnelApiMapper.addPccTunnelDB(pcepTunnelData); |
| 1230 | pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 1426 | pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| ... | @@ -1240,8 +1436,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid | ... | @@ -1240,8 +1436,6 @@ public class PcepTunnelProvider extends AbstractProvider implements TunnelProvid |
| 1240 | // TODO | 1436 | // TODO |
| 1241 | } | 1437 | } |
| 1242 | 1438 | ||
| 1243 | - | ||
| 1244 | - | ||
| 1245 | @Override | 1439 | @Override |
| 1246 | public void handlePcepTunnelStatistics(PcepTunnelStatistics pcepTunnelStatistics) { | 1440 | public void handlePcepTunnelStatistics(PcepTunnelStatistics pcepTunnelStatistics) { |
| 1247 | TunnelId id = getTunnelId(String.valueOf(pcepTunnelStatistics.id())); | 1441 | TunnelId id = getTunnelId(String.valueOf(pcepTunnelStatistics.id())); | ... | ... |
providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepClientAdapter.java
| ... | @@ -42,6 +42,7 @@ public class PcepClientAdapter implements PcepClient { | ... | @@ -42,6 +42,7 @@ public class PcepClientAdapter implements PcepClient { |
| 42 | private ClientCapability capability; | 42 | private ClientCapability capability; |
| 43 | 43 | ||
| 44 | private PcepVersion pcepVersion; | 44 | private PcepVersion pcepVersion; |
| 45 | + private boolean syncCompleted; | ||
| 45 | 46 | ||
| 46 | /** | 47 | /** |
| 47 | * Initialize instance with specified parameters. | 48 | * Initialize instance with specified parameters. |
| ... | @@ -109,11 +110,12 @@ public class PcepClientAdapter implements PcepClient { | ... | @@ -109,11 +110,12 @@ public class PcepClientAdapter implements PcepClient { |
| 109 | 110 | ||
| 110 | @Override | 111 | @Override |
| 111 | public final boolean isSyncComplete() { | 112 | public final boolean isSyncComplete() { |
| 112 | - return false; | 113 | + return syncCompleted; |
| 113 | } | 114 | } |
| 114 | 115 | ||
| 115 | @Override | 116 | @Override |
| 116 | public final void setIsSyncComplete(boolean value) { | 117 | public final void setIsSyncComplete(boolean value) { |
| 118 | + syncCompleted = value; | ||
| 117 | } | 119 | } |
| 118 | 120 | ||
| 119 | @Override | 121 | @Override | ... | ... |
| ... | @@ -73,6 +73,9 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -73,6 +73,9 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 73 | 73 | ||
| 74 | @Override | 74 | @Override |
| 75 | public PcepClient getClient(PccId pccId) { | 75 | public PcepClient getClient(PccId pccId) { |
| 76 | + if (null != connectedClients.get(pccId)) { | ||
| 77 | + return connectedClients.get(pccId); | ||
| 78 | + } | ||
| 76 | PcepClientAdapter pc = new PcepClientAdapter(); | 79 | PcepClientAdapter pc = new PcepClientAdapter(); |
| 77 | if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) | 80 | if (pccId.ipAddress().equals(IpAddress.valueOf(0xC010103)) |
| 78 | || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { | 81 | || pccId.ipAddress().equals(IpAddress.valueOf(0xB6024E22))) { |
| ... | @@ -81,6 +84,7 @@ public class PcepClientControllerAdapter implements PcepClientController { | ... | @@ -81,6 +84,7 @@ public class PcepClientControllerAdapter implements PcepClientController { |
| 81 | pc.setCapability(new ClientCapability(true, true, true)); | 84 | pc.setCapability(new ClientCapability(true, true, true)); |
| 82 | } | 85 | } |
| 83 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); | 86 | pc.init(PccId.pccId(pccId.ipAddress()), PcepVersion.PCEP_1); |
| 87 | + connectedClients.put(pccId, pc); | ||
| 84 | return pc; | 88 | return pc; |
| 85 | } | 89 | } |
| 86 | 90 | ... | ... |
| ... | @@ -20,6 +20,10 @@ import static org.hamcrest.Matchers.nullValue; | ... | @@ -20,6 +20,10 @@ import static org.hamcrest.Matchers.nullValue; |
| 20 | import static org.hamcrest.core.Is.is; | 20 | import static org.hamcrest.core.Is.is; |
| 21 | import static org.hamcrest.core.IsNot.not; | 21 | import static org.hamcrest.core.IsNot.not; |
| 22 | import static org.onosproject.net.DefaultAnnotations.EMPTY; | 22 | import static org.onosproject.net.DefaultAnnotations.EMPTY; |
| 23 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | ||
| 24 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; | ||
| 25 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | ||
| 26 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 23 | 27 | ||
| 24 | import java.io.IOException; | 28 | import java.io.IOException; |
| 25 | import java.util.ArrayList; | 29 | import java.util.ArrayList; |
| ... | @@ -36,7 +40,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -36,7 +40,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 36 | import org.onosproject.incubator.net.tunnel.Tunnel; | 40 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 37 | import org.onosproject.incubator.net.tunnel.TunnelId; | 41 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 38 | import org.onosproject.incubator.net.tunnel.TunnelName; | 42 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 43 | +import org.onosproject.net.Annotations; | ||
| 39 | import org.onosproject.net.ConnectPoint; | 44 | import org.onosproject.net.ConnectPoint; |
| 45 | +import org.onosproject.net.DefaultAnnotations; | ||
| 40 | import org.onosproject.net.DefaultLink; | 46 | import org.onosproject.net.DefaultLink; |
| 41 | import org.onosproject.net.DefaultPath; | 47 | import org.onosproject.net.DefaultPath; |
| 42 | import org.onosproject.net.IpElementId; | 48 | import org.onosproject.net.IpElementId; |
| ... | @@ -44,7 +50,7 @@ import org.onosproject.net.Link; | ... | @@ -44,7 +50,7 @@ import org.onosproject.net.Link; |
| 44 | import org.onosproject.net.Path; | 50 | import org.onosproject.net.Path; |
| 45 | import org.onosproject.net.PortNumber; | 51 | import org.onosproject.net.PortNumber; |
| 46 | import org.onosproject.net.provider.ProviderId; | 52 | import org.onosproject.net.provider.ProviderId; |
| 47 | -import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv; | 53 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 48 | 54 | ||
| 49 | /** | 55 | /** |
| 50 | * Test for PCEP release tunnel. | 56 | * Test for PCEP release tunnel. |
| ... | @@ -77,7 +83,7 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -77,7 +83,7 @@ public class PcepReleaseTunnelProviderTest { |
| 77 | public void testCasePcepReleaseTunnel() { | 83 | public void testCasePcepReleaseTunnel() { |
| 78 | Tunnel tunnel; | 84 | Tunnel tunnel; |
| 79 | Path path; | 85 | Path path; |
| 80 | - List<Link> links = new ArrayList<Link>(); | 86 | + List<Link> links = new ArrayList<>(); |
| 81 | 87 | ||
| 82 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 88 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 83 | 89 | ||
| ... | @@ -103,14 +109,18 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -103,14 +109,18 @@ public class PcepReleaseTunnelProviderTest { |
| 103 | 109 | ||
| 104 | path = new DefaultPath(pid, links, 20, EMPTY); | 110 | path = new DefaultPath(pid, links, 20, EMPTY); |
| 105 | 111 | ||
| 112 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 113 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 114 | + .build(); | ||
| 115 | + | ||
| 106 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 116 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 107 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 117 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 108 | - path, EMPTY); | 118 | + path, annotations); |
| 109 | 119 | ||
| 110 | // for releasing tunnel tunnel should exist in db | 120 | // for releasing tunnel tunnel should exist in db |
| 111 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); | 121 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); |
| 112 | pcepTunnelData.setPlspId(1); | 122 | pcepTunnelData.setPlspId(1); |
| 113 | - StatefulIPv4LspIdentidiersTlv tlv = new StatefulIPv4LspIdentidiersTlv(0, (short) 1, (short) 2, 3, 4); | 123 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); |
| 114 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | 124 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); |
| 115 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 125 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 116 | 126 | ||
| ... | @@ -127,7 +137,7 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -127,7 +137,7 @@ public class PcepReleaseTunnelProviderTest { |
| 127 | public void testCasePcepReleaseTunnel2() { | 137 | public void testCasePcepReleaseTunnel2() { |
| 128 | Tunnel tunnel; | 138 | Tunnel tunnel; |
| 129 | Path path; | 139 | Path path; |
| 130 | - List<Link> links = new ArrayList<Link>(); | 140 | + List<Link> links = new ArrayList<>(); |
| 131 | 141 | ||
| 132 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 142 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 133 | 143 | ||
| ... | @@ -153,14 +163,18 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -153,14 +163,18 @@ public class PcepReleaseTunnelProviderTest { |
| 153 | 163 | ||
| 154 | path = new DefaultPath(pid, links, 20, EMPTY); | 164 | path = new DefaultPath(pid, links, 20, EMPTY); |
| 155 | 165 | ||
| 166 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 167 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 168 | + .build(); | ||
| 169 | + | ||
| 156 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 170 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 157 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 171 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 158 | - path, EMPTY); | 172 | + path, annotations); |
| 159 | 173 | ||
| 160 | // for releasing tunnel tunnel should exist in db | 174 | // for releasing tunnel tunnel should exist in db |
| 161 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); | 175 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); |
| 162 | pcepTunnelData.setPlspId(1); | 176 | pcepTunnelData.setPlspId(1); |
| 163 | - StatefulIPv4LspIdentidiersTlv tlv = new StatefulIPv4LspIdentidiersTlv(0, (short) 1, (short) 2, 3, 4); | 177 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); |
| 164 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | 178 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); |
| 165 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 179 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 166 | 180 | ||
| ... | @@ -170,6 +184,114 @@ public class PcepReleaseTunnelProviderTest { | ... | @@ -170,6 +184,114 @@ public class PcepReleaseTunnelProviderTest { |
| 170 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 184 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| 171 | } | 185 | } |
| 172 | 186 | ||
| 187 | + /** | ||
| 188 | + * Tests releasing SR based tunnel. | ||
| 189 | + */ | ||
| 190 | + @Test | ||
| 191 | + public void testCasePcepReleaseSrTunnel() { | ||
| 192 | + Tunnel tunnel; | ||
| 193 | + Path path; | ||
| 194 | + List<Link> links = new ArrayList<>(); | ||
| 195 | + | ||
| 196 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 197 | + | ||
| 198 | + IpAddress srcIp = IpAddress.valueOf(0xB6024E20); | ||
| 199 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 200 | + | ||
| 201 | + IpAddress dstIp = IpAddress.valueOf(0xB6024E21); | ||
| 202 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 203 | + | ||
| 204 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 205 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 206 | + | ||
| 207 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 208 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 209 | + | ||
| 210 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 211 | + | ||
| 212 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 213 | + | ||
| 214 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 215 | + .type(Link.Type.DIRECT).build(); | ||
| 216 | + links.add(link); | ||
| 217 | + | ||
| 218 | + path = new DefaultPath(pid, links, 20, EMPTY); | ||
| 219 | + | ||
| 220 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 221 | + .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) | ||
| 222 | + .build(); | ||
| 223 | + | ||
| 224 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 225 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 226 | + path, annotations); | ||
| 227 | + | ||
| 228 | + // for releasing tunnel tunnel should exist in db | ||
| 229 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); | ||
| 230 | + pcepTunnelData.setPlspId(1); | ||
| 231 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); | ||
| 232 | + pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | ||
| 233 | + tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 234 | + | ||
| 235 | + tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | ||
| 236 | + | ||
| 237 | + tunnelProvider.releaseTunnel(tunnel); | ||
| 238 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + /** | ||
| 242 | + * Tests releasing tunnel without SR and without signalling. | ||
| 243 | + */ | ||
| 244 | + @Test | ||
| 245 | + public void testCasePcepReleaseTunnelWithoutSigSr() { | ||
| 246 | + Tunnel tunnel; | ||
| 247 | + Path path; | ||
| 248 | + List<Link> links = new ArrayList<>(); | ||
| 249 | + | ||
| 250 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 251 | + | ||
| 252 | + IpAddress srcIp = IpAddress.valueOf(0xB6024E20); | ||
| 253 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 254 | + | ||
| 255 | + IpAddress dstIp = IpAddress.valueOf(0xB6024E21); | ||
| 256 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 257 | + | ||
| 258 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 259 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 260 | + | ||
| 261 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 262 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 263 | + | ||
| 264 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 265 | + | ||
| 266 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 267 | + | ||
| 268 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 269 | + .type(Link.Type.DIRECT).build(); | ||
| 270 | + links.add(link); | ||
| 271 | + | ||
| 272 | + path = new DefaultPath(pid, links, 20, EMPTY); | ||
| 273 | + | ||
| 274 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 275 | + .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | ||
| 276 | + .build(); | ||
| 277 | + | ||
| 278 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 279 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 280 | + path, annotations); | ||
| 281 | + | ||
| 282 | + // for releasing tunnel tunnel should exist in db | ||
| 283 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.DELETE); | ||
| 284 | + pcepTunnelData.setPlspId(1); | ||
| 285 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); | ||
| 286 | + pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | ||
| 287 | + tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 288 | + | ||
| 289 | + tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | ||
| 290 | + | ||
| 291 | + tunnelProvider.releaseTunnel(tunnel); | ||
| 292 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 293 | + } | ||
| 294 | + | ||
| 173 | @After | 295 | @After |
| 174 | public void tearDown() throws IOException { | 296 | public void tearDown() throws IOException { |
| 175 | tunnelProvider.deactivate(); | 297 | tunnelProvider.deactivate(); | ... | ... |
| ... | @@ -20,6 +20,10 @@ import static org.hamcrest.MatcherAssert.assertThat; | ... | @@ -20,6 +20,10 @@ import static org.hamcrest.MatcherAssert.assertThat; |
| 20 | import static org.hamcrest.core.Is.is; | 20 | import static org.hamcrest.core.Is.is; |
| 21 | import static org.hamcrest.core.IsNot.not; | 21 | import static org.hamcrest.core.IsNot.not; |
| 22 | import static org.hamcrest.Matchers.nullValue; | 22 | import static org.hamcrest.Matchers.nullValue; |
| 23 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | ||
| 24 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; | ||
| 25 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | ||
| 26 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 23 | 27 | ||
| 24 | import java.io.IOException; | 28 | import java.io.IOException; |
| 25 | import java.util.ArrayList; | 29 | import java.util.ArrayList; |
| ... | @@ -36,7 +40,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -36,7 +40,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 36 | import org.onosproject.incubator.net.tunnel.Tunnel; | 40 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 37 | import org.onosproject.incubator.net.tunnel.TunnelId; | 41 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 38 | import org.onosproject.incubator.net.tunnel.TunnelName; | 42 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 43 | +import org.onosproject.net.Annotations; | ||
| 39 | import org.onosproject.net.ConnectPoint; | 44 | import org.onosproject.net.ConnectPoint; |
| 45 | +import org.onosproject.net.DefaultAnnotations; | ||
| 40 | import org.onosproject.net.DefaultLink; | 46 | import org.onosproject.net.DefaultLink; |
| 41 | import org.onosproject.net.DefaultPath; | 47 | import org.onosproject.net.DefaultPath; |
| 42 | import org.onosproject.net.IpElementId; | 48 | import org.onosproject.net.IpElementId; |
| ... | @@ -75,7 +81,7 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -75,7 +81,7 @@ public class PcepSetupTunnelProviderTest { |
| 75 | Tunnel tunnel; | 81 | Tunnel tunnel; |
| 76 | Path path; | 82 | Path path; |
| 77 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 83 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 78 | - List<Link> links = new ArrayList<Link>(); | 84 | + List<Link> links = new ArrayList<>(); |
| 79 | IpAddress srcIp = IpAddress.valueOf(0xC010101); | 85 | IpAddress srcIp = IpAddress.valueOf(0xC010101); |
| 80 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 86 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 81 | 87 | ||
| ... | @@ -98,9 +104,13 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -98,9 +104,13 @@ public class PcepSetupTunnelProviderTest { |
| 98 | 104 | ||
| 99 | path = new DefaultPath(pid, links, 10, EMPTY); | 105 | path = new DefaultPath(pid, links, 10, EMPTY); |
| 100 | 106 | ||
| 107 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 108 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 109 | + .build(); | ||
| 110 | + | ||
| 101 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 111 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 102 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 112 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 103 | - path, EMPTY); | 113 | + path, annotations); |
| 104 | 114 | ||
| 105 | tunnelProvider.setupTunnel(tunnel, path); | 115 | tunnelProvider.setupTunnel(tunnel, path); |
| 106 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | 116 | assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); |
| ... | @@ -114,7 +124,7 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -114,7 +124,7 @@ public class PcepSetupTunnelProviderTest { |
| 114 | Tunnel tunnel; | 124 | Tunnel tunnel; |
| 115 | Path path; | 125 | Path path; |
| 116 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 126 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 117 | - List<Link> links = new ArrayList<Link>(); | 127 | + List<Link> links = new ArrayList<>(); |
| 118 | IpAddress srcIp = IpAddress.valueOf(0xC010103); | 128 | IpAddress srcIp = IpAddress.valueOf(0xC010103); |
| 119 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 129 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 120 | 130 | ||
| ... | @@ -137,14 +147,104 @@ public class PcepSetupTunnelProviderTest { | ... | @@ -137,14 +147,104 @@ public class PcepSetupTunnelProviderTest { |
| 137 | 147 | ||
| 138 | path = new DefaultPath(pid, links, 10, EMPTY); | 148 | path = new DefaultPath(pid, links, 10, EMPTY); |
| 139 | 149 | ||
| 150 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 151 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 152 | + .build(); | ||
| 153 | + | ||
| 140 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 154 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 141 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 155 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 142 | - path, EMPTY); | 156 | + path, annotations); |
| 143 | 157 | ||
| 144 | tunnelProvider.setupTunnel(tunnel, path); | 158 | tunnelProvider.setupTunnel(tunnel, path); |
| 145 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 159 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| 146 | } | 160 | } |
| 147 | 161 | ||
| 162 | + /** | ||
| 163 | + * Sends PCInitiate msg to setup a SR based tunnel. | ||
| 164 | + */ | ||
| 165 | + @Test | ||
| 166 | + public void testCasePcepSetupSrTunnel() { | ||
| 167 | + Tunnel tunnel; | ||
| 168 | + Path path; | ||
| 169 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 170 | + List<Link> links = new ArrayList<>(); | ||
| 171 | + IpAddress srcIp = IpAddress.valueOf(0xC010101); | ||
| 172 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 173 | + | ||
| 174 | + IpAddress dstIp = IpAddress.valueOf(0xC010102); | ||
| 175 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 176 | + | ||
| 177 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 178 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 179 | + | ||
| 180 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 181 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 182 | + | ||
| 183 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 184 | + | ||
| 185 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 186 | + | ||
| 187 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 188 | + .type(Link.Type.DIRECT).build(); | ||
| 189 | + links.add(link); | ||
| 190 | + | ||
| 191 | + path = new DefaultPath(pid, links, 10, EMPTY); | ||
| 192 | + | ||
| 193 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 194 | + .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) | ||
| 195 | + .build(); | ||
| 196 | + | ||
| 197 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 198 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 199 | + path, annotations); | ||
| 200 | + | ||
| 201 | + tunnelProvider.setupTunnel(tunnel, path); | ||
| 202 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + /** | ||
| 206 | + * Sends PCInitiate msg to setup a tunnel without signalling and without SR. | ||
| 207 | + */ | ||
| 208 | + @Test | ||
| 209 | + public void testCasePcepSetupTunnelWithoutSigSr() { | ||
| 210 | + Tunnel tunnel; | ||
| 211 | + Path path; | ||
| 212 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 213 | + List<Link> links = new ArrayList<>(); | ||
| 214 | + IpAddress srcIp = IpAddress.valueOf(0xC010101); | ||
| 215 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 216 | + | ||
| 217 | + IpAddress dstIp = IpAddress.valueOf(0xC010102); | ||
| 218 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 219 | + | ||
| 220 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 221 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 222 | + | ||
| 223 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 224 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 225 | + | ||
| 226 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 227 | + | ||
| 228 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 229 | + | ||
| 230 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 231 | + .type(Link.Type.DIRECT).build(); | ||
| 232 | + links.add(link); | ||
| 233 | + | ||
| 234 | + path = new DefaultPath(pid, links, 10, EMPTY); | ||
| 235 | + | ||
| 236 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 237 | + .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | ||
| 238 | + .build(); | ||
| 239 | + | ||
| 240 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 241 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 242 | + path, annotations); | ||
| 243 | + | ||
| 244 | + tunnelProvider.setupTunnel(tunnel, path); | ||
| 245 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 246 | + } | ||
| 247 | + | ||
| 148 | @After | 248 | @After |
| 149 | public void tearDown() throws IOException { | 249 | public void tearDown() throws IOException { |
| 150 | tunnelProvider.deactivate(); | 250 | tunnelProvider.deactivate(); | ... | ... |
| 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.provider.pcep.tunnel.impl; | ||
| 17 | + | ||
| 18 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
| 19 | +import static org.hamcrest.core.Is.is; | ||
| 20 | +import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS; | ||
| 21 | +import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT; | ||
| 22 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH; | ||
| 23 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID; | ||
| 24 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 25 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; | ||
| 26 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; | ||
| 27 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | ||
| 28 | + | ||
| 29 | +import java.io.IOException; | ||
| 30 | +import java.util.Collection; | ||
| 31 | +import java.util.Collections; | ||
| 32 | +import java.util.HashMap; | ||
| 33 | +import java.util.HashSet; | ||
| 34 | + | ||
| 35 | +import org.jboss.netty.buffer.ChannelBuffer; | ||
| 36 | +import org.jboss.netty.buffer.ChannelBuffers; | ||
| 37 | +import org.junit.After; | ||
| 38 | +import org.junit.Before; | ||
| 39 | +import org.junit.Test; | ||
| 40 | +import org.onlab.packet.IpAddress; | ||
| 41 | +import org.onosproject.cfg.ComponentConfigAdapter; | ||
| 42 | +import org.onosproject.core.ApplicationId; | ||
| 43 | +import org.onosproject.incubator.net.tunnel.DefaultTunnel; | ||
| 44 | +import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ||
| 45 | +import org.onosproject.incubator.net.tunnel.Tunnel; | ||
| 46 | +import org.onosproject.incubator.net.tunnel.TunnelDescription; | ||
| 47 | +import org.onosproject.incubator.net.tunnel.TunnelEndPoint; | ||
| 48 | +import org.onosproject.incubator.net.tunnel.TunnelId; | ||
| 49 | +import org.onosproject.incubator.net.tunnel.TunnelName; | ||
| 50 | +import org.onosproject.incubator.net.tunnel.TunnelProvider; | ||
| 51 | +import org.onosproject.incubator.net.tunnel.TunnelProviderService; | ||
| 52 | +import org.onosproject.incubator.net.tunnel.Tunnel.State; | ||
| 53 | +import org.onosproject.net.DefaultAnnotations; | ||
| 54 | +import org.onosproject.net.ElementId; | ||
| 55 | +import org.onosproject.net.Path; | ||
| 56 | +import org.onosproject.net.SparseAnnotations; | ||
| 57 | +import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException; | ||
| 58 | +import org.onosproject.pcepio.exceptions.PcepParseException; | ||
| 59 | +import org.onosproject.pcepio.protocol.PcepFactories; | ||
| 60 | +import org.onosproject.pcepio.protocol.PcepMessage; | ||
| 61 | +import org.onosproject.pcepio.protocol.PcepMessageReader; | ||
| 62 | +import org.onosproject.pcep.controller.ClientCapability; | ||
| 63 | +import org.onosproject.pcep.controller.PccId; | ||
| 64 | + | ||
| 65 | +import com.google.common.collect.ImmutableSet; | ||
| 66 | + | ||
| 67 | +/** | ||
| 68 | + * Tests handling of PCEP report message. | ||
| 69 | + */ | ||
| 70 | +public class PcepTunnelAddedTest { | ||
| 71 | + | ||
| 72 | + static final String PROVIDER_ID = "org.onosproject.provider.tunnel.pcep"; | ||
| 73 | + PcepTunnelProvider tunnelProvider = new PcepTunnelProvider(); | ||
| 74 | + private final MockTunnelProviderRegistryAdapter registry = new MockTunnelProviderRegistryAdapter(); | ||
| 75 | + private final PcepClientControllerAdapter controller = new PcepClientControllerAdapter(); | ||
| 76 | + private final PcepControllerAdapter ctl = new PcepControllerAdapter(); | ||
| 77 | + private final PcepTunnelApiMapper pcepTunnelAPIMapper = new PcepTunnelApiMapper(); | ||
| 78 | + private final MockTunnelServiceAdapter tunnelService = new MockTunnelServiceAdapter(); | ||
| 79 | + | ||
| 80 | + private class MockTunnelProviderRegistryAdapter extends TunnelProviderRegistryAdapter { | ||
| 81 | + public long tunnelIdCounter; | ||
| 82 | + | ||
| 83 | + @Override | ||
| 84 | + public TunnelProviderService register(TunnelProvider provider) { | ||
| 85 | + this.provider = provider; | ||
| 86 | + return new TestProviderService(); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + private class TestProviderService implements TunnelProviderService { | ||
| 90 | + | ||
| 91 | + @Override | ||
| 92 | + public TunnelProvider provider() { | ||
| 93 | + return null; | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + @Override | ||
| 97 | + public TunnelId tunnelAdded(TunnelDescription tunnel) { | ||
| 98 | + return TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); | ||
| 99 | + } | ||
| 100 | + | ||
| 101 | + @Override | ||
| 102 | + public TunnelId tunnelAdded(TunnelDescription tunnel, State state) { | ||
| 103 | + return TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + @Override | ||
| 107 | + public void tunnelRemoved(TunnelDescription tunnel) { | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + @Override | ||
| 111 | + public void tunnelUpdated(TunnelDescription tunnel) { | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + @Override | ||
| 115 | + public void tunnelUpdated(TunnelDescription tunnel, State state) { | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + @Override | ||
| 119 | + public Tunnel tunnelQueryById(TunnelId tunnelId) { | ||
| 120 | + return null; | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + private class MockTunnelServiceAdapter extends TunnelServiceAdapter { | ||
| 126 | + private HashMap<TunnelId, Tunnel> tunnelIdAsKeyStore = new HashMap<>(); | ||
| 127 | + private int tunnelIdCounter = 0; | ||
| 128 | + | ||
| 129 | + @Override | ||
| 130 | + public TunnelId setupTunnel(ApplicationId producerId, ElementId srcElementId, Tunnel tunnel, Path path) { | ||
| 131 | + TunnelId tunnelId = TunnelId.valueOf(String.valueOf(++tunnelIdCounter)); | ||
| 132 | + tunnelIdAsKeyStore.put(tunnelId, tunnel); | ||
| 133 | + return tunnelId; | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + @Override | ||
| 137 | + public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) { | ||
| 138 | + Collection<Tunnel> result = new HashSet<>(); | ||
| 139 | + Tunnel tunnel = null; | ||
| 140 | + for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) { | ||
| 141 | + tunnel = tunnelIdAsKeyStore.get(tunnelId); | ||
| 142 | + | ||
| 143 | + if ((null != tunnel) && (src.equals(tunnel.src())) && (dst.equals(tunnel.dst()))) { | ||
| 144 | + result.add(tunnel); | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + return result.isEmpty() ? Collections.emptySet() : ImmutableSet.copyOf(result); | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + @Override | ||
| 152 | + public Collection<Tunnel> queryAllTunnels() { | ||
| 153 | + Collection<Tunnel> result = new HashSet<>(); | ||
| 154 | + | ||
| 155 | + for (TunnelId tunnelId : tunnelIdAsKeyStore.keySet()) { | ||
| 156 | + result.add(tunnelIdAsKeyStore.get(tunnelId)); | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + return result.isEmpty() ? Collections.emptySet() : ImmutableSet.copyOf(result); | ||
| 160 | + | ||
| 161 | + } | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + @Before | ||
| 165 | + public void preSetup() { | ||
| 166 | + tunnelProvider.tunnelProviderRegistry = registry; | ||
| 167 | + tunnelProvider.pcepClientController = controller; | ||
| 168 | + tunnelProvider.controller = ctl; | ||
| 169 | + tunnelProvider.pcepTunnelApiMapper = pcepTunnelAPIMapper; | ||
| 170 | + tunnelProvider.cfgService = new ComponentConfigAdapter(); | ||
| 171 | + tunnelProvider.tunnelService = tunnelService; | ||
| 172 | + tunnelProvider.service = registry.register(tunnelProvider); | ||
| 173 | + tunnelProvider.activate(); | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + /** | ||
| 177 | + * Tests PCRpt msg with sync flag set. | ||
| 178 | + */ | ||
| 179 | + @Test | ||
| 180 | + public void tunnelProviderAddedTest1() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 181 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | ||
| 182 | + 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object | ||
| 183 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 184 | + 0x00, 0x00, 0x00, 0x02, | ||
| 185 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03, //LSP object | ||
| 186 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path tlv | ||
| 187 | + 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 188 | + 0x01, 0x01, 0x01, 0x01, | ||
| 189 | + 0x00, 0x01, 0x00, 0x01, | ||
| 190 | + 0x01, 0x01, 0x01, 0x01, | ||
| 191 | + 0x05, 0x05, 0x05, 0x05, | ||
| 192 | + | ||
| 193 | + 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 194 | + 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | ||
| 195 | + 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | ||
| 196 | + | ||
| 197 | + 0x08, 0x10, 0x00, 0x34, //RRO object | ||
| 198 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | ||
| 199 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 200 | + 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | ||
| 201 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 202 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 203 | + 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 204 | + }; | ||
| 205 | + | ||
| 206 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 207 | + buffer.writeBytes(reportMsg); | ||
| 208 | + | ||
| 209 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 210 | + PcepMessage message = reader.readFrom(buffer); | ||
| 211 | + controller.processClientMessage(PccId.pccId(IpAddress.valueOf("1.1.1.1")), message); | ||
| 212 | + | ||
| 213 | + assertThat(registry.tunnelIdCounter, is((long) 1)); | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + /** | ||
| 217 | + * Tests updating an existing tunnel on receiving asynchronous PCRpt msg, | ||
| 218 | + * i.e. without any SRP id. | ||
| 219 | + */ | ||
| 220 | + @Test | ||
| 221 | + public void tunnelProviderAddedTest2() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 222 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x50, | ||
| 223 | + 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 224 | + 0x00, 0x00, 0x00, 0x00, | ||
| 225 | + 0x00, 0x00, 0x00, 0x00, | ||
| 226 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 227 | + 0x00, 0x00, 0x00, 0x02, | ||
| 228 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, //LSP object | ||
| 229 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //symbolic path TLV | ||
| 230 | + 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 231 | + 0x4e, 0x1f, 0x04, 0x00, | ||
| 232 | + 0x00, 0x01, 0x00, 0x01, | ||
| 233 | + 0x4e, 0x1f, 0x04, 0x00, | ||
| 234 | + 0x4e, 0x20, 0x04, 0x00, | ||
| 235 | + 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 236 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x04, 0x00, // ERO IPv4 sub objects | ||
| 237 | + 0x01, 0x08, (byte) 0xb6, 0x02, 0x4e, 0x20, 0x04, 0x00, | ||
| 238 | + }; | ||
| 239 | + | ||
| 240 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 241 | + buffer.writeBytes(reportMsg); | ||
| 242 | + | ||
| 243 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 244 | + PcepMessage message = reader.readFrom(buffer); | ||
| 245 | + | ||
| 246 | + // create an existing tunnel. | ||
| 247 | + IpTunnelEndPoint tunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(0x4e1f0400)); | ||
| 248 | + IpTunnelEndPoint tunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(0x4e200400)); | ||
| 249 | + | ||
| 250 | + SparseAnnotations annotations = DefaultAnnotations.builder() | ||
| 251 | + .set(BANDWIDTH, (new Integer(1)).toString()) | ||
| 252 | + .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | ||
| 253 | + .set(PCC_TUNNEL_ID, String.valueOf(1)) | ||
| 254 | + .set(PLSP_ID, String.valueOf(1)) | ||
| 255 | + .set(LOCAL_LSP_ID, String.valueOf(1)).build(); | ||
| 256 | + | ||
| 257 | + Tunnel tunnel = new DefaultTunnel(null, tunnelEndPointSrc, tunnelEndPointDst, MPLS, INIT, null, null, | ||
| 258 | + TunnelName.tunnelName("T123"), null, annotations); | ||
| 259 | + tunnelService.setupTunnel(null, null, tunnel, null); | ||
| 260 | + | ||
| 261 | + PccId pccId = PccId.pccId(IpAddress.valueOf(0x4e1f0400)); | ||
| 262 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | ||
| 263 | + controller.getClient(pccId).setIsSyncComplete(true); | ||
| 264 | + | ||
| 265 | + // Process update message. | ||
| 266 | + controller.processClientMessage(pccId, message); | ||
| 267 | + assertThat(tunnelService.queryAllTunnels().size(), is(1)); | ||
| 268 | + } | ||
| 269 | + | ||
| 270 | + /** | ||
| 271 | + * Tests adding a new tunnel on receiving asynchronous PCRpt msg, | ||
| 272 | + * i.e. without any SRP id. | ||
| 273 | + */ | ||
| 274 | + @Test | ||
| 275 | + public void tunnelProviderAddedTest3() throws PcepParseException, PcepOutOfBoundMessageException { | ||
| 276 | + byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x84, | ||
| 277 | + 0x21, 0x10, 0x00, 0x14, //SRP object | ||
| 278 | + 0x00, 0x00, 0x00, 0x00, | ||
| 279 | + 0x00, 0x00, 0x00, 0x00, | ||
| 280 | + 0x00, 0x1c, 0x00, 0x04, // PATH-SETUP-TYPE TLV | ||
| 281 | + 0x00, 0x00, 0x00, 0x02, | ||
| 282 | + 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x19, // LSP object | ||
| 283 | + 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, // symbolic path TLV | ||
| 284 | + 0x00, 0x12, 0x00, 0x10, // IPv4-LSP-IDENTIFIER-TLV | ||
| 285 | + 0x01, 0x01, 0x01, 0x01, | ||
| 286 | + 0x00, 0x01, 0x00, 0x01, | ||
| 287 | + 0x01, 0x01, 0x01, 0x01, | ||
| 288 | + 0x05, 0x05, 0x05, 0x05, | ||
| 289 | + | ||
| 290 | + 0x07, 0x10, 0x00, 0x14, //ERO object | ||
| 291 | + 0x01, 0x08, (byte) 0x01, 0x01, 0x01, 0x01, 0x04, 0x00, // ERO IPv4 sub objects | ||
| 292 | + 0x01, 0x08, (byte) 0x05, 0x05, 0x05, 0x05, 0x04, 0x00, | ||
| 293 | + | ||
| 294 | + 0x08, 0x10, 0x00, 0x34, //RRO object | ||
| 295 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x01, 0x04, 0x00, // RRO IPv4 sub objects | ||
| 296 | + 0x01, 0x08, 0x11, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 297 | + 0x01, 0x08, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, | ||
| 298 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x02, 0x04, 0x00, | ||
| 299 | + 0x01, 0x08, 0x12, 0x01, 0x01, 0x01, 0x04, 0x00, | ||
| 300 | + 0x01, 0x08, 0x05, 0x05, 0x05, 0x05, 0x04, 0x00 | ||
| 301 | + }; | ||
| 302 | + | ||
| 303 | + ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(); | ||
| 304 | + buffer.writeBytes(reportMsg); | ||
| 305 | + | ||
| 306 | + PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader(); | ||
| 307 | + PcepMessage message = reader.readFrom(buffer); | ||
| 308 | + | ||
| 309 | + PccId pccId = PccId.pccId(IpAddress.valueOf("1.1.1.1")); | ||
| 310 | + controller.getClient(pccId).setIsSyncComplete(true); | ||
| 311 | + controller.getClient(pccId).setCapability(new ClientCapability(true, true, true)); | ||
| 312 | + controller.processClientMessage(pccId, message); | ||
| 313 | + | ||
| 314 | + assertThat(registry.tunnelIdCounter, is((long) 1)); | ||
| 315 | + } | ||
| 316 | + | ||
| 317 | + @After | ||
| 318 | + public void tearDown() throws IOException { | ||
| 319 | + tunnelProvider.deactivate(); | ||
| 320 | + tunnelProvider.controller = null; | ||
| 321 | + tunnelProvider.pcepClientController = null; | ||
| 322 | + tunnelProvider.tunnelProviderRegistry = null; | ||
| 323 | + | ||
| 324 | + tunnelProvider.pcepTunnelApiMapper = null; | ||
| 325 | + tunnelProvider.cfgService = null; | ||
| 326 | + tunnelProvider.tunnelService = null; | ||
| 327 | + tunnelProvider.service = null; | ||
| 328 | + } | ||
| 329 | +} |
| ... | @@ -15,7 +15,12 @@ | ... | @@ -15,7 +15,12 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.provider.pcep.tunnel.impl; | 16 | package org.onosproject.provider.pcep.tunnel.impl; |
| 17 | 17 | ||
| 18 | +import static org.hamcrest.MatcherAssert.assertThat; | ||
| 19 | +import static org.hamcrest.Matchers.nullValue; | ||
| 20 | +import static org.hamcrest.core.IsNot.not; | ||
| 18 | import static org.onosproject.net.DefaultAnnotations.EMPTY; | 21 | import static org.onosproject.net.DefaultAnnotations.EMPTY; |
| 22 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | ||
| 23 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 19 | 24 | ||
| 20 | import java.io.IOException; | 25 | import java.io.IOException; |
| 21 | import java.util.ArrayList; | 26 | import java.util.ArrayList; |
| ... | @@ -30,7 +35,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -30,7 +35,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 30 | import org.onosproject.incubator.net.tunnel.Tunnel; | 35 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 31 | import org.onosproject.incubator.net.tunnel.TunnelId; | 36 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 32 | import org.onosproject.incubator.net.tunnel.TunnelName; | 37 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 38 | +import org.onosproject.net.Annotations; | ||
| 33 | import org.onosproject.net.ConnectPoint; | 39 | import org.onosproject.net.ConnectPoint; |
| 40 | +import org.onosproject.net.DefaultAnnotations; | ||
| 34 | import org.onosproject.net.DefaultLink; | 41 | import org.onosproject.net.DefaultLink; |
| 35 | import org.onosproject.net.DefaultPath; | 42 | import org.onosproject.net.DefaultPath; |
| 36 | import org.onosproject.net.IpElementId; | 43 | import org.onosproject.net.IpElementId; |
| ... | @@ -62,7 +69,7 @@ public class PcepTunnelProviderTest { | ... | @@ -62,7 +69,7 @@ public class PcepTunnelProviderTest { |
| 62 | Tunnel tunnel; | 69 | Tunnel tunnel; |
| 63 | Path path; | 70 | Path path; |
| 64 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 71 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 65 | - List<Link> links = new ArrayList<Link>(); | 72 | + List<Link> links = new ArrayList<>(); |
| 66 | IpAddress srcIp = IpAddress.valueOf(0xC010101); | 73 | IpAddress srcIp = IpAddress.valueOf(0xC010101); |
| 67 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 74 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 68 | 75 | ||
| ... | @@ -85,11 +92,17 @@ public class PcepTunnelProviderTest { | ... | @@ -85,11 +92,17 @@ public class PcepTunnelProviderTest { |
| 85 | 92 | ||
| 86 | path = new DefaultPath(pid, links, 10, EMPTY); | 93 | path = new DefaultPath(pid, links, 10, EMPTY); |
| 87 | 94 | ||
| 95 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 96 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 97 | + .build(); | ||
| 98 | + | ||
| 88 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 99 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 89 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 100 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 90 | - path, EMPTY); | 101 | + path, annotations); |
| 91 | 102 | ||
| 92 | tunnelProvider.setupTunnel(tunnel, path); | 103 | tunnelProvider.setupTunnel(tunnel, path); |
| 104 | + | ||
| 105 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 93 | } | 106 | } |
| 94 | 107 | ||
| 95 | @After | 108 | @After |
| ... | @@ -99,4 +112,4 @@ public class PcepTunnelProviderTest { | ... | @@ -99,4 +112,4 @@ public class PcepTunnelProviderTest { |
| 99 | tunnelProvider.pcepClientController = null; | 112 | tunnelProvider.pcepClientController = null; |
| 100 | tunnelProvider.tunnelProviderRegistry = null; | 113 | tunnelProvider.tunnelProviderRegistry = null; |
| 101 | } | 114 | } |
| 102 | -} | 115 | +} |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -20,6 +20,7 @@ import static org.hamcrest.Matchers.nullValue; | ... | @@ -20,6 +20,7 @@ import static org.hamcrest.Matchers.nullValue; |
| 20 | import static org.hamcrest.core.Is.is; | 20 | import static org.hamcrest.core.Is.is; |
| 21 | import static org.hamcrest.core.IsNot.not; | 21 | import static org.hamcrest.core.IsNot.not; |
| 22 | import static org.onosproject.net.DefaultAnnotations.EMPTY; | 22 | import static org.onosproject.net.DefaultAnnotations.EMPTY; |
| 23 | +import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; | ||
| 23 | 24 | ||
| 24 | import java.io.IOException; | 25 | import java.io.IOException; |
| 25 | import java.util.ArrayList; | 26 | import java.util.ArrayList; |
| ... | @@ -36,7 +37,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; | ... | @@ -36,7 +37,9 @@ import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; |
| 36 | import org.onosproject.incubator.net.tunnel.Tunnel; | 37 | import org.onosproject.incubator.net.tunnel.Tunnel; |
| 37 | import org.onosproject.incubator.net.tunnel.TunnelId; | 38 | import org.onosproject.incubator.net.tunnel.TunnelId; |
| 38 | import org.onosproject.incubator.net.tunnel.TunnelName; | 39 | import org.onosproject.incubator.net.tunnel.TunnelName; |
| 40 | +import org.onosproject.net.Annotations; | ||
| 39 | import org.onosproject.net.ConnectPoint; | 41 | import org.onosproject.net.ConnectPoint; |
| 42 | +import org.onosproject.net.DefaultAnnotations; | ||
| 40 | import org.onosproject.net.DefaultLink; | 43 | import org.onosproject.net.DefaultLink; |
| 41 | import org.onosproject.net.DefaultPath; | 44 | import org.onosproject.net.DefaultPath; |
| 42 | import org.onosproject.net.IpElementId; | 45 | import org.onosproject.net.IpElementId; |
| ... | @@ -44,8 +47,11 @@ import org.onosproject.net.Link; | ... | @@ -44,8 +47,11 @@ import org.onosproject.net.Link; |
| 44 | import org.onosproject.net.Path; | 47 | import org.onosproject.net.Path; |
| 45 | import org.onosproject.net.PortNumber; | 48 | import org.onosproject.net.PortNumber; |
| 46 | import org.onosproject.net.provider.ProviderId; | 49 | import org.onosproject.net.provider.ProviderId; |
| 47 | -import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv; | 50 | +import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; |
| 48 | 51 | ||
| 52 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; | ||
| 53 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; | ||
| 54 | +import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; | ||
| 49 | /** | 55 | /** |
| 50 | * Test for PCEP update tunnel. | 56 | * Test for PCEP update tunnel. |
| 51 | */ | 57 | */ |
| ... | @@ -78,7 +84,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -78,7 +84,7 @@ public class PcepUpdateTunnelProviderTest { |
| 78 | Tunnel tunnel; | 84 | Tunnel tunnel; |
| 79 | Path path; | 85 | Path path; |
| 80 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 86 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 81 | - List<Link> links = new ArrayList<Link>(); | 87 | + List<Link> links = new ArrayList<>(); |
| 82 | IpAddress srcIp = IpAddress.valueOf(0xD010101); | 88 | IpAddress srcIp = IpAddress.valueOf(0xD010101); |
| 83 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 89 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 84 | 90 | ||
| ... | @@ -101,14 +107,18 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -101,14 +107,18 @@ public class PcepUpdateTunnelProviderTest { |
| 101 | 107 | ||
| 102 | path = new DefaultPath(pid, links, 20, EMPTY); | 108 | path = new DefaultPath(pid, links, 20, EMPTY); |
| 103 | 109 | ||
| 110 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 111 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 112 | + .build(); | ||
| 113 | + | ||
| 104 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 114 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 105 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 115 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 106 | - path, EMPTY); | 116 | + path, annotations); |
| 107 | 117 | ||
| 108 | // for updating tunnel tunnel should exist in db | 118 | // for updating tunnel tunnel should exist in db |
| 109 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); | 119 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); |
| 110 | pcepTunnelData.setPlspId(1); | 120 | pcepTunnelData.setPlspId(1); |
| 111 | - StatefulIPv4LspIdentidiersTlv tlv = new StatefulIPv4LspIdentidiersTlv(0, (short) 1, (short) 2, 3, 4); | 121 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); |
| 112 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | 122 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); |
| 113 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 123 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 114 | 124 | ||
| ... | @@ -126,7 +136,7 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -126,7 +136,7 @@ public class PcepUpdateTunnelProviderTest { |
| 126 | Tunnel tunnel; | 136 | Tunnel tunnel; |
| 127 | Path path; | 137 | Path path; |
| 128 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | 138 | ProviderId pid = new ProviderId("pcep", PROVIDER_ID); |
| 129 | - List<Link> links = new ArrayList<Link>(); | 139 | + List<Link> links = new ArrayList<>(); |
| 130 | IpAddress srcIp = IpAddress.valueOf(0xC010103); | 140 | IpAddress srcIp = IpAddress.valueOf(0xC010103); |
| 131 | IpElementId srcElementId = IpElementId.ipElement(srcIp); | 141 | IpElementId srcElementId = IpElementId.ipElement(srcIp); |
| 132 | 142 | ||
| ... | @@ -149,14 +159,18 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -149,14 +159,18 @@ public class PcepUpdateTunnelProviderTest { |
| 149 | 159 | ||
| 150 | path = new DefaultPath(pid, links, 20, EMPTY); | 160 | path = new DefaultPath(pid, links, 20, EMPTY); |
| 151 | 161 | ||
| 162 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 163 | + .set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) | ||
| 164 | + .build(); | ||
| 165 | + | ||
| 152 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | 166 | tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, |
| 153 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | 167 | new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), |
| 154 | - path, EMPTY); | 168 | + path, annotations); |
| 155 | 169 | ||
| 156 | // for updating tunnel tunnel should exist in db | 170 | // for updating tunnel tunnel should exist in db |
| 157 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); | 171 | PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); |
| 158 | pcepTunnelData.setPlspId(1); | 172 | pcepTunnelData.setPlspId(1); |
| 159 | - StatefulIPv4LspIdentidiersTlv tlv = new StatefulIPv4LspIdentidiersTlv(0, (short) 1, (short) 2, 3, 4); | 173 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); |
| 160 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | 174 | pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); |
| 161 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | 175 | tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); |
| 162 | 176 | ||
| ... | @@ -166,6 +180,110 @@ public class PcepUpdateTunnelProviderTest { | ... | @@ -166,6 +180,110 @@ public class PcepUpdateTunnelProviderTest { |
| 166 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); | 180 | assertThat(tunnelProvider.pcepTunnelApiMapper.checkFromTunnelRequestQueue(1), is(false)); |
| 167 | } | 181 | } |
| 168 | 182 | ||
| 183 | + /** | ||
| 184 | + * Sends update message to PCC for SR based tunnel. | ||
| 185 | + */ | ||
| 186 | + @Test | ||
| 187 | + public void testCasePcepUpdateSrTunnel() { | ||
| 188 | + Tunnel tunnel; | ||
| 189 | + Path path; | ||
| 190 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 191 | + List<Link> links = new ArrayList<>(); | ||
| 192 | + IpAddress srcIp = IpAddress.valueOf(0xD010101); | ||
| 193 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 194 | + | ||
| 195 | + IpAddress dstIp = IpAddress.valueOf(0xD010102); | ||
| 196 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 197 | + | ||
| 198 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 199 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 200 | + | ||
| 201 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 202 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 203 | + | ||
| 204 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 205 | + | ||
| 206 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 207 | + | ||
| 208 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 209 | + .type(Link.Type.DIRECT).build(); | ||
| 210 | + links.add(link); | ||
| 211 | + | ||
| 212 | + path = new DefaultPath(pid, links, 20, EMPTY); | ||
| 213 | + | ||
| 214 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 215 | + .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) | ||
| 216 | + .build(); | ||
| 217 | + | ||
| 218 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 219 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 220 | + path, annotations); | ||
| 221 | + | ||
| 222 | + // for updating tunnel tunnel should exist in db | ||
| 223 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); | ||
| 224 | + pcepTunnelData.setPlspId(1); | ||
| 225 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); | ||
| 226 | + pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | ||
| 227 | + tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 228 | + | ||
| 229 | + tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | ||
| 230 | + | ||
| 231 | + tunnelProvider.updateTunnel(tunnel, path); | ||
| 232 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + /** | ||
| 236 | + * Sends update message to PCC for tunnel without signalling and without SR. | ||
| 237 | + */ | ||
| 238 | + @Test | ||
| 239 | + public void testCasePcepUpdateTunnelWithoutSigSr() { | ||
| 240 | + Tunnel tunnel; | ||
| 241 | + Path path; | ||
| 242 | + ProviderId pid = new ProviderId("pcep", PROVIDER_ID); | ||
| 243 | + List<Link> links = new ArrayList<>(); | ||
| 244 | + IpAddress srcIp = IpAddress.valueOf(0xD010101); | ||
| 245 | + IpElementId srcElementId = IpElementId.ipElement(srcIp); | ||
| 246 | + | ||
| 247 | + IpAddress dstIp = IpAddress.valueOf(0xD010102); | ||
| 248 | + IpElementId dstElementId = IpElementId.ipElement(dstIp); | ||
| 249 | + | ||
| 250 | + IpTunnelEndPoint ipTunnelEndPointSrc; | ||
| 251 | + ipTunnelEndPointSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); | ||
| 252 | + | ||
| 253 | + IpTunnelEndPoint ipTunnelEndPointDst; | ||
| 254 | + ipTunnelEndPointDst = IpTunnelEndPoint.ipTunnelPoint(dstIp); | ||
| 255 | + | ||
| 256 | + ConnectPoint src = new ConnectPoint(srcElementId, PortNumber.portNumber(10023)); | ||
| 257 | + | ||
| 258 | + ConnectPoint dst = new ConnectPoint(dstElementId, PortNumber.portNumber(10023)); | ||
| 259 | + | ||
| 260 | + Link link = DefaultLink.builder().providerId(pid).src(src).dst(dst) | ||
| 261 | + .type(Link.Type.DIRECT).build(); | ||
| 262 | + links.add(link); | ||
| 263 | + | ||
| 264 | + path = new DefaultPath(pid, links, 20, EMPTY); | ||
| 265 | + | ||
| 266 | + Annotations annotations = DefaultAnnotations.builder() | ||
| 267 | + .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) | ||
| 268 | + .build(); | ||
| 269 | + | ||
| 270 | + tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, | ||
| 271 | + new DefaultGroupId(0), TunnelId.valueOf("1"), TunnelName.tunnelName("T123"), | ||
| 272 | + path, annotations); | ||
| 273 | + | ||
| 274 | + // for updating tunnel tunnel should exist in db | ||
| 275 | + PcepTunnelData pcepTunnelData = new PcepTunnelData(tunnel, path, RequestType.UPDATE); | ||
| 276 | + pcepTunnelData.setPlspId(1); | ||
| 277 | + StatefulIPv4LspIdentifiersTlv tlv = new StatefulIPv4LspIdentifiersTlv(0, (short) 1, (short) 2, 3, 4); | ||
| 278 | + pcepTunnelData.setStatefulIpv4IndentifierTlv(tlv); | ||
| 279 | + tunnelProvider.pcepTunnelApiMapper.addToTunnelIdMap(pcepTunnelData); | ||
| 280 | + | ||
| 281 | + tunnelProvider.pcepTunnelApiMapper.handleCreateTunnelRequestQueue(1, pcepTunnelData); | ||
| 282 | + | ||
| 283 | + tunnelProvider.updateTunnel(tunnel, path); | ||
| 284 | + assertThat(tunnelProvider.pcepTunnelApiMapper, not(nullValue())); | ||
| 285 | + } | ||
| 286 | + | ||
| 169 | @After | 287 | @After |
| 170 | public void tearDown() throws IOException { | 288 | public void tearDown() throws IOException { |
| 171 | tunnelProvider.deactivate(); | 289 | tunnelProvider.deactivate(); | ... | ... |
| ... | @@ -94,17 +94,17 @@ public class TunnelServiceAdapter implements TunnelService { | ... | @@ -94,17 +94,17 @@ public class TunnelServiceAdapter implements TunnelService { |
| 94 | 94 | ||
| 95 | @Override | 95 | @Override |
| 96 | public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) { | 96 | public Collection<TunnelSubscription> queryTunnelSubscription(ApplicationId consumerId) { |
| 97 | - return null; | 97 | + return Collections.emptySet(); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | @Override | 100 | @Override |
| 101 | public Collection<Tunnel> queryTunnel(Tunnel.Type type) { | 101 | public Collection<Tunnel> queryTunnel(Tunnel.Type type) { |
| 102 | - return null; | 102 | + return Collections.emptySet(); |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | @Override | 105 | @Override |
| 106 | public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) { | 106 | public Collection<Tunnel> queryTunnel(TunnelEndPoint src, TunnelEndPoint dst) { |
| 107 | - return null; | 107 | + return Collections.emptySet(); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | @Override | 110 | @Override | ... | ... |
-
Please register or login to post a comment