ONOS-734 Add unit tests for 4 Octets AS numbers in SDN-IP
* Fix a bug in the storing, handling and verification of the AS numbers with 4 octet AS capability is used. * Add an unit test to test the decoding and parsing of supported BGP Capabilities: Multiprotocol Extensions AFI/SAFI, and 4 octet AS. * Minor refactoring of the BGP unit test framework. Change-Id: I474b356bc00369c307ac0c5c214b065c1cc0c52c
Showing
4 changed files
with
154 additions
and
88 deletions
| ... | @@ -101,32 +101,6 @@ final class BgpOpen { | ... | @@ -101,32 +101,6 @@ final class BgpOpen { |
| 101 | 101 | ||
| 102 | // Remote AS number | 102 | // Remote AS number |
| 103 | long remoteAs = message.readUnsignedShort(); | 103 | long remoteAs = message.readUnsignedShort(); |
| 104 | - // | ||
| 105 | - // Verify that the AS number is same for all other BGP Sessions | ||
| 106 | - // NOTE: This check applies only for our use-case where all BGP | ||
| 107 | - // sessions are iBGP. | ||
| 108 | - // | ||
| 109 | - for (BgpSession bs : bgpSession.getBgpSessionManager().getBgpSessions()) { | ||
| 110 | - if ((bs.remoteInfo().asNumber() != 0) && | ||
| 111 | - (remoteAs != bs.remoteInfo().asNumber())) { | ||
| 112 | - log.debug("BGP RX OPEN Error from {}: Bad Peer AS {}. " + | ||
| 113 | - "Expected {}", | ||
| 114 | - bgpSession.remoteInfo().address(), remoteAs, | ||
| 115 | - bs.remoteInfo().asNumber()); | ||
| 116 | - // | ||
| 117 | - // ERROR: Bad Peer AS | ||
| 118 | - // | ||
| 119 | - // Send NOTIFICATION and close the connection | ||
| 120 | - int errorCode = OpenMessageError.ERROR_CODE; | ||
| 121 | - int errorSubcode = OpenMessageError.BAD_PEER_AS; | ||
| 122 | - ChannelBuffer txMessage = | ||
| 123 | - BgpNotification.prepareBgpNotification(errorCode, | ||
| 124 | - errorSubcode, null); | ||
| 125 | - ctx.getChannel().write(txMessage); | ||
| 126 | - bgpSession.closeSession(ctx); | ||
| 127 | - return; | ||
| 128 | - } | ||
| 129 | - } | ||
| 130 | bgpSession.remoteInfo().setAsNumber(remoteAs); | 104 | bgpSession.remoteInfo().setAsNumber(remoteAs); |
| 131 | // | 105 | // |
| 132 | // NOTE: Currently, the local AS number is always set to the remote AS. | 106 | // NOTE: Currently, the local AS number is always set to the remote AS. |
| ... | @@ -194,16 +168,63 @@ final class BgpOpen { | ... | @@ -194,16 +168,63 @@ final class BgpOpen { |
| 194 | return; | 168 | return; |
| 195 | } | 169 | } |
| 196 | 170 | ||
| 171 | + // | ||
| 172 | + // NOTE: Prepare the BGP OPEN message before the original local AS | ||
| 173 | + // is overwritten by the 4-octet AS number | ||
| 174 | + // | ||
| 175 | + ChannelBuffer txOpenMessage = prepareBgpOpen(bgpSession.localInfo()); | ||
| 176 | + | ||
| 177 | + // | ||
| 178 | + // Use the 4-octet AS number in lieu of the "My AS" field | ||
| 179 | + // See RFC 6793, Section 4.1, second paragraph. | ||
| 180 | + // | ||
| 181 | + if (bgpSession.remoteInfo().as4OctetCapability()) { | ||
| 182 | + long as4Number = bgpSession.remoteInfo().as4Number(); | ||
| 183 | + bgpSession.remoteInfo().setAsNumber(as4Number); | ||
| 184 | + bgpSession.localInfo().setAsNumber(as4Number); | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + // | ||
| 188 | + // Verify that the AS number is same for all other BGP Sessions | ||
| 189 | + // NOTE: This check applies only for our use-case where all BGP | ||
| 190 | + // sessions are iBGP. | ||
| 191 | + // | ||
| 192 | + for (BgpSession bs : bgpSession.getBgpSessionManager().getBgpSessions()) { | ||
| 193 | + if ((bs.remoteInfo().asNumber() != 0) && | ||
| 194 | + (bgpSession.remoteInfo().asNumber() != | ||
| 195 | + bs.remoteInfo().asNumber())) { | ||
| 196 | + log.debug("BGP RX OPEN Error from {}: Bad Peer AS {}. " + | ||
| 197 | + "Expected {}", | ||
| 198 | + bgpSession.remoteInfo().address(), | ||
| 199 | + bgpSession.remoteInfo().asNumber(), | ||
| 200 | + bs.remoteInfo().asNumber()); | ||
| 201 | + // | ||
| 202 | + // ERROR: Bad Peer AS | ||
| 203 | + // | ||
| 204 | + // Send NOTIFICATION and close the connection | ||
| 205 | + int errorCode = OpenMessageError.ERROR_CODE; | ||
| 206 | + int errorSubcode = OpenMessageError.BAD_PEER_AS; | ||
| 207 | + ChannelBuffer txMessage = | ||
| 208 | + BgpNotification.prepareBgpNotification(errorCode, | ||
| 209 | + errorSubcode, null); | ||
| 210 | + ctx.getChannel().write(txMessage); | ||
| 211 | + bgpSession.closeSession(ctx); | ||
| 212 | + return; | ||
| 213 | + } | ||
| 214 | + } | ||
| 215 | + | ||
| 197 | log.debug("BGP RX OPEN message from {}: " + | 216 | log.debug("BGP RX OPEN message from {}: " + |
| 198 | "BGPv{} AS {} BGP-ID {} Holdtime {}", | 217 | "BGPv{} AS {} BGP-ID {} Holdtime {}", |
| 199 | - bgpSession.remoteInfo().address(), remoteBgpVersion, | 218 | + bgpSession.remoteInfo().address(), |
| 200 | - remoteAs, remoteBgpId, remoteHoldtime); | 219 | + bgpSession.remoteInfo().bgpVersion(), |
| 220 | + bgpSession.remoteInfo().asNumber(), | ||
| 221 | + bgpSession.remoteInfo().bgpId(), | ||
| 222 | + bgpSession.remoteInfo().holdtime()); | ||
| 201 | 223 | ||
| 202 | // Send my OPEN followed by KEEPALIVE | 224 | // Send my OPEN followed by KEEPALIVE |
| 203 | - ChannelBuffer txMessage = prepareBgpOpen(bgpSession.localInfo()); | 225 | + ctx.getChannel().write(txOpenMessage); |
| 204 | - ctx.getChannel().write(txMessage); | ||
| 205 | // | 226 | // |
| 206 | - txMessage = BgpKeepalive.prepareBgpKeepalive(); | 227 | + ChannelBuffer txMessage = BgpKeepalive.prepareBgpKeepalive(); |
| 207 | ctx.getChannel().write(txMessage); | 228 | ctx.getChannel().write(txMessage); |
| 208 | 229 | ||
| 209 | // Start the KEEPALIVE timer | 230 | // Start the KEEPALIVE timer |
| ... | @@ -219,7 +240,7 @@ final class BgpOpen { | ... | @@ -219,7 +240,7 @@ final class BgpOpen { |
| 219 | * @param localInfo the BGP Session local information to use | 240 | * @param localInfo the BGP Session local information to use |
| 220 | * @return the message to transmit (BGP header included) | 241 | * @return the message to transmit (BGP header included) |
| 221 | */ | 242 | */ |
| 222 | - private static ChannelBuffer prepareBgpOpen(BgpSessionInfo localInfo) { | 243 | + static ChannelBuffer prepareBgpOpen(BgpSessionInfo localInfo) { |
| 223 | ChannelBuffer message = | 244 | ChannelBuffer message = |
| 224 | ChannelBuffers.buffer(BgpConstants.BGP_MESSAGE_MAX_LENGTH); | 245 | ChannelBuffers.buffer(BgpConstants.BGP_MESSAGE_MAX_LENGTH); |
| 225 | 246 | ||
| ... | @@ -360,9 +381,6 @@ final class BgpOpen { | ... | @@ -360,9 +381,6 @@ final class BgpOpen { |
| 360 | 381 | ||
| 361 | bgpSession.remoteInfo().setAs4OctetCapability(); | 382 | bgpSession.remoteInfo().setAs4OctetCapability(); |
| 362 | bgpSession.remoteInfo().setAs4Number(as4Number); | 383 | bgpSession.remoteInfo().setAs4Number(as4Number); |
| 363 | - // Use the 4-octet AS number in lieu of the "My AS" field | ||
| 364 | - // See RFC 6793, Section 4.1, second paragraph. | ||
| 365 | - bgpSession.remoteInfo().setAsNumber(as4Number); | ||
| 366 | 384 | ||
| 367 | // | 385 | // |
| 368 | // Copy remote 4-octet AS Number Capabilities and AS | 386 | // Copy remote 4-octet AS Number Capabilities and AS |
| ... | @@ -371,7 +389,6 @@ final class BgpOpen { | ... | @@ -371,7 +389,6 @@ final class BgpOpen { |
| 371 | // | 389 | // |
| 372 | bgpSession.localInfo().setAs4OctetCapability(); | 390 | bgpSession.localInfo().setAs4OctetCapability(); |
| 373 | bgpSession.localInfo().setAs4Number(as4Number); | 391 | bgpSession.localInfo().setAs4Number(as4Number); |
| 374 | - bgpSession.localInfo().setAsNumber(as4Number); | ||
| 375 | log.debug("BGP RX OPEN Capability: AS4 Number = {}", | 392 | log.debug("BGP RX OPEN Capability: AS4 Number = {}", |
| 376 | as4Number); | 393 | as4Number); |
| 377 | break; | 394 | break; |
| ... | @@ -461,8 +478,8 @@ final class BgpOpen { | ... | @@ -461,8 +478,8 @@ final class BgpOpen { |
| 461 | message.writeByte(Capabilities.TYPE); // Param type | 478 | message.writeByte(Capabilities.TYPE); // Param type |
| 462 | message.writeByte(Capabilities.MIN_LENGTH + | 479 | message.writeByte(Capabilities.MIN_LENGTH + |
| 463 | As4Octet.LENGTH); // Param len | 480 | As4Octet.LENGTH); // Param len |
| 464 | - message.writeByte(As4Octet.CODE); // Capab, code | 481 | + message.writeByte(As4Octet.CODE); // Capab. code |
| 465 | - message.writeByte(As4Octet.LENGTH); // Capab, len | 482 | + message.writeByte(As4Octet.LENGTH); // Capab. len |
| 466 | message.writeInt((int) localInfo.as4Number()); | 483 | message.writeInt((int) localInfo.as4Number()); |
| 467 | } | 484 | } |
| 468 | return message; | 485 | return message; | ... | ... |
| ... | @@ -85,9 +85,10 @@ public class BgpSessionManagerTest { | ... | @@ -85,9 +85,10 @@ public class BgpSessionManagerTest { |
| 85 | private BgpSessionManager bgpSessionManager; | 85 | private BgpSessionManager bgpSessionManager; |
| 86 | 86 | ||
| 87 | // Remote Peer state | 87 | // Remote Peer state |
| 88 | - TestBgpPeer peer1 = new TestBgpPeer(BGP_PEER1_ID); | 88 | + private final Collection<TestBgpPeer> peers = new LinkedList<>(); |
| 89 | - TestBgpPeer peer2 = new TestBgpPeer(BGP_PEER2_ID); | 89 | + TestBgpPeer peer1; |
| 90 | - TestBgpPeer peer3 = new TestBgpPeer(BGP_PEER3_ID); | 90 | + TestBgpPeer peer2; |
| 91 | + TestBgpPeer peer3; | ||
| 91 | 92 | ||
| 92 | // Local BGP per-peer session state | 93 | // Local BGP per-peer session state |
| 93 | BgpSession bgpSession1; | 94 | BgpSession bgpSession1; |
| ... | @@ -238,6 +239,14 @@ public class BgpSessionManagerTest { | ... | @@ -238,6 +239,14 @@ public class BgpSessionManagerTest { |
| 238 | 239 | ||
| 239 | @Before | 240 | @Before |
| 240 | public void setUp() throws Exception { | 241 | public void setUp() throws Exception { |
| 242 | + peer1 = new TestBgpPeer(BGP_PEER1_ID); | ||
| 243 | + peer2 = new TestBgpPeer(BGP_PEER2_ID); | ||
| 244 | + peer3 = new TestBgpPeer(BGP_PEER3_ID); | ||
| 245 | + peers.clear(); | ||
| 246 | + peers.add(peer1); | ||
| 247 | + peers.add(peer2); | ||
| 248 | + peers.add(peer3); | ||
| 249 | + | ||
| 241 | // | 250 | // |
| 242 | // Setup the BGP Session Manager to test, and start listening for BGP | 251 | // Setup the BGP Session Manager to test, and start listening for BGP |
| 243 | // connections. | 252 | // connections. |
| ... | @@ -366,24 +375,14 @@ public class BgpSessionManagerTest { | ... | @@ -366,24 +375,14 @@ public class BgpSessionManagerTest { |
| 366 | // Test the fields from the BGP OPEN message: | 375 | // Test the fields from the BGP OPEN message: |
| 367 | // BGP version, AS number, BGP ID | 376 | // BGP version, AS number, BGP ID |
| 368 | // | 377 | // |
| 369 | - assertThat(peer1.peerFrameDecoder.remoteBgpVersion, | 378 | + for (TestBgpPeer peer : peers) { |
| 370 | - is(BgpConstants.BGP_VERSION)); | 379 | + assertThat(peer.peerFrameDecoder.remoteInfo.bgpVersion(), |
| 371 | - assertThat(peer1.peerFrameDecoder.remoteAs, | 380 | + is(BgpConstants.BGP_VERSION)); |
| 372 | - is(TestBgpPeerChannelHandler.PEER_AS)); | 381 | + assertThat(peer.peerFrameDecoder.remoteInfo.bgpId(), |
| 373 | - assertThat(peer1.peerFrameDecoder.remoteBgpIdentifier, | 382 | + is(IP_LOOPBACK_ID)); |
| 374 | - is(IP_LOOPBACK_ID)); | 383 | + assertThat(peer.peerFrameDecoder.remoteInfo.asNumber(), |
| 375 | - assertThat(peer2.peerFrameDecoder.remoteBgpVersion, | 384 | + is(TestBgpPeerChannelHandler.PEER_AS)); |
| 376 | - is(BgpConstants.BGP_VERSION)); | 385 | + } |
| 377 | - assertThat(peer2.peerFrameDecoder.remoteAs, | ||
| 378 | - is(TestBgpPeerChannelHandler.PEER_AS)); | ||
| 379 | - assertThat(peer2.peerFrameDecoder.remoteBgpIdentifier, | ||
| 380 | - is(IP_LOOPBACK_ID)); | ||
| 381 | - assertThat(peer3.peerFrameDecoder.remoteBgpVersion, | ||
| 382 | - is(BgpConstants.BGP_VERSION)); | ||
| 383 | - assertThat(peer3.peerFrameDecoder.remoteAs, | ||
| 384 | - is(TestBgpPeerChannelHandler.PEER_AS)); | ||
| 385 | - assertThat(peer3.peerFrameDecoder.remoteBgpIdentifier, | ||
| 386 | - is(IP_LOOPBACK_ID)); | ||
| 387 | 386 | ||
| 388 | // | 387 | // |
| 389 | // Test that the BgpSession instances have been created | 388 | // Test that the BgpSession instances have been created |
| ... | @@ -399,6 +398,72 @@ public class BgpSessionManagerTest { | ... | @@ -399,6 +398,72 @@ public class BgpSessionManagerTest { |
| 399 | } | 398 | } |
| 400 | } | 399 | } |
| 401 | 400 | ||
| 401 | + | ||
| 402 | + /** | ||
| 403 | + * Tests that the BGP OPEN with Capability messages have been exchanged, | ||
| 404 | + * followed by KEEPALIVE. | ||
| 405 | + * <p> | ||
| 406 | + * The BGP Peer opens the sessions and transmits OPEN Message, eventually | ||
| 407 | + * followed by KEEPALIVE. The tested BGP listener should respond by | ||
| 408 | + * OPEN Message, followed by KEEPALIVE. | ||
| 409 | + * | ||
| 410 | + * @throws TestUtilsException TestUtils error | ||
| 411 | + */ | ||
| 412 | + @Test | ||
| 413 | + public void testExchangedBgpOpenCapabilityMessages() | ||
| 414 | + throws InterruptedException, TestUtilsException { | ||
| 415 | + // | ||
| 416 | + // Setup the BGP Capabilities for all peers | ||
| 417 | + // | ||
| 418 | + for (TestBgpPeer peer : peers) { | ||
| 419 | + peer.peerChannelHandler.localInfo.setIpv4Unicast(); | ||
| 420 | + peer.peerChannelHandler.localInfo.setIpv4Multicast(); | ||
| 421 | + peer.peerChannelHandler.localInfo.setIpv6Unicast(); | ||
| 422 | + peer.peerChannelHandler.localInfo.setIpv6Multicast(); | ||
| 423 | + peer.peerChannelHandler.localInfo.setAs4OctetCapability(); | ||
| 424 | + peer.peerChannelHandler.localInfo.setAs4Number( | ||
| 425 | + TestBgpPeerChannelHandler.PEER_AS4); | ||
| 426 | + } | ||
| 427 | + | ||
| 428 | + // Initiate the connections | ||
| 429 | + peer1.connect(connectToSocket); | ||
| 430 | + peer2.connect(connectToSocket); | ||
| 431 | + peer3.connect(connectToSocket); | ||
| 432 | + | ||
| 433 | + // | ||
| 434 | + // Test the fields from the BGP OPEN message: | ||
| 435 | + // BGP version, BGP ID | ||
| 436 | + // | ||
| 437 | + for (TestBgpPeer peer : peers) { | ||
| 438 | + assertThat(peer.peerFrameDecoder.remoteInfo.bgpVersion(), | ||
| 439 | + is(BgpConstants.BGP_VERSION)); | ||
| 440 | + assertThat(peer.peerFrameDecoder.remoteInfo.bgpId(), | ||
| 441 | + is(IP_LOOPBACK_ID)); | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | + // | ||
| 445 | + // Test that the BgpSession instances have been created, | ||
| 446 | + // and contain the appropriate BGP session information. | ||
| 447 | + // | ||
| 448 | + assertThat(bgpSessionManager.getMyBgpId(), is(IP_LOOPBACK_ID)); | ||
| 449 | + assertThat(bgpSessionManager.getBgpSessions(), hasSize(3)); | ||
| 450 | + assertThat(bgpSession1, notNullValue()); | ||
| 451 | + assertThat(bgpSession2, notNullValue()); | ||
| 452 | + assertThat(bgpSession3, notNullValue()); | ||
| 453 | + for (BgpSession bgpSession : bgpSessionManager.getBgpSessions()) { | ||
| 454 | + BgpSessionInfo localInfo = bgpSession.localInfo(); | ||
| 455 | + assertThat(localInfo.ipv4Unicast(), is(true)); | ||
| 456 | + assertThat(localInfo.ipv4Multicast(), is(true)); | ||
| 457 | + assertThat(localInfo.ipv6Unicast(), is(true)); | ||
| 458 | + assertThat(localInfo.ipv6Multicast(), is(true)); | ||
| 459 | + assertThat(localInfo.as4OctetCapability(), is(true)); | ||
| 460 | + assertThat(localInfo.asNumber(), | ||
| 461 | + is(TestBgpPeerChannelHandler.PEER_AS4)); | ||
| 462 | + assertThat(localInfo.as4Number(), | ||
| 463 | + is(TestBgpPeerChannelHandler.PEER_AS4)); | ||
| 464 | + } | ||
| 465 | + } | ||
| 466 | + | ||
| 402 | /** | 467 | /** |
| 403 | * Tests that the BGP UPDATE messages have been received and processed. | 468 | * Tests that the BGP UPDATE messages have been received and processed. |
| 404 | */ | 469 | */ | ... | ... |
| ... | @@ -30,8 +30,10 @@ import org.onlab.packet.Ip4Prefix; | ... | @@ -30,8 +30,10 @@ import org.onlab.packet.Ip4Prefix; |
| 30 | */ | 30 | */ |
| 31 | class TestBgpPeerChannelHandler extends SimpleChannelHandler { | 31 | class TestBgpPeerChannelHandler extends SimpleChannelHandler { |
| 32 | static final long PEER_AS = 65001; | 32 | static final long PEER_AS = 65001; |
| 33 | + static final long PEER_AS4 = 0x12345678; | ||
| 33 | static final int PEER_HOLDTIME = 120; // 120 seconds | 34 | static final int PEER_HOLDTIME = 120; // 120 seconds |
| 34 | - final Ip4Address bgpId; // The BGP ID | 35 | + |
| 36 | + final BgpSessionInfo localInfo = new BgpSessionInfo(); | ||
| 35 | ChannelHandlerContext savedCtx; | 37 | ChannelHandlerContext savedCtx; |
| 36 | 38 | ||
| 37 | /** | 39 | /** |
| ... | @@ -40,7 +42,10 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { | ... | @@ -40,7 +42,10 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { |
| 40 | * @param bgpId the BGP ID to use | 42 | * @param bgpId the BGP ID to use |
| 41 | */ | 43 | */ |
| 42 | TestBgpPeerChannelHandler(Ip4Address bgpId) { | 44 | TestBgpPeerChannelHandler(Ip4Address bgpId) { |
| 43 | - this.bgpId = bgpId; | 45 | + this.localInfo.setBgpVersion(BgpConstants.BGP_VERSION); |
| 46 | + this.localInfo.setBgpId(bgpId); | ||
| 47 | + this.localInfo.setAsNumber(PEER_AS); | ||
| 48 | + this.localInfo.setHoldtime(PEER_HOLDTIME); | ||
| 44 | } | 49 | } |
| 45 | 50 | ||
| 46 | /** | 51 | /** |
| ... | @@ -55,7 +60,7 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { | ... | @@ -55,7 +60,7 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { |
| 55 | ChannelStateEvent channelEvent) { | 60 | ChannelStateEvent channelEvent) { |
| 56 | this.savedCtx = ctx; | 61 | this.savedCtx = ctx; |
| 57 | // Prepare and transmit BGP OPEN message | 62 | // Prepare and transmit BGP OPEN message |
| 58 | - ChannelBuffer message = prepareBgpOpen(); | 63 | + ChannelBuffer message = BgpOpen.prepareBgpOpen(localInfo); |
| 59 | ctx.getChannel().write(message); | 64 | ctx.getChannel().write(message); |
| 60 | 65 | ||
| 61 | // Prepare and transmit BGP KEEPALIVE message | 66 | // Prepare and transmit BGP KEEPALIVE message |
| ... | @@ -70,23 +75,6 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { | ... | @@ -70,23 +75,6 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 72 | /** | 77 | /** |
| 73 | - * Prepares BGP OPEN message. | ||
| 74 | - * | ||
| 75 | - * @return the message to transmit (BGP header included) | ||
| 76 | - */ | ||
| 77 | - ChannelBuffer prepareBgpOpen() { | ||
| 78 | - ChannelBuffer message = | ||
| 79 | - ChannelBuffers.buffer(BgpConstants.BGP_MESSAGE_MAX_LENGTH); | ||
| 80 | - message.writeByte(BgpConstants.BGP_VERSION); | ||
| 81 | - message.writeShort((int) PEER_AS); | ||
| 82 | - message.writeShort(PEER_HOLDTIME); | ||
| 83 | - message.writeInt(bgpId.toInt()); | ||
| 84 | - message.writeByte(0); // No Optional Parameters | ||
| 85 | - return BgpMessage.prepareBgpMessage(BgpConstants.BGP_TYPE_OPEN, | ||
| 86 | - message); | ||
| 87 | - } | ||
| 88 | - | ||
| 89 | - /** | ||
| 90 | * Prepares BGP UPDATE message. | 78 | * Prepares BGP UPDATE message. |
| 91 | * | 79 | * |
| 92 | * @param nextHopRouter the next-hop router address for the routes to add | 80 | * @param nextHopRouter the next-hop router address for the routes to add | ... | ... |
| ... | @@ -28,10 +28,7 @@ import org.onlab.packet.Ip4Address; | ... | @@ -28,10 +28,7 @@ import org.onlab.packet.Ip4Address; |
| 28 | * BGP peer session. | 28 | * BGP peer session. |
| 29 | */ | 29 | */ |
| 30 | class TestBgpPeerFrameDecoder extends FrameDecoder { | 30 | class TestBgpPeerFrameDecoder extends FrameDecoder { |
| 31 | - int remoteBgpVersion; // 1 octet | 31 | + final BgpSessionInfo remoteInfo = new BgpSessionInfo(); |
| 32 | - long remoteAs; // 2 octets | ||
| 33 | - long remoteHoldtime; // 2 octets | ||
| 34 | - Ip4Address remoteBgpIdentifier; // 4 octets -> IPv4 address | ||
| 35 | 32 | ||
| 36 | final CountDownLatch receivedOpenMessageLatch = new CountDownLatch(1); | 33 | final CountDownLatch receivedOpenMessageLatch = new CountDownLatch(1); |
| 37 | final CountDownLatch receivedKeepaliveMessageLatch = new CountDownLatch(1); | 34 | final CountDownLatch receivedKeepaliveMessageLatch = new CountDownLatch(1); |
| ... | @@ -141,11 +138,10 @@ class TestBgpPeerFrameDecoder extends FrameDecoder { | ... | @@ -141,11 +138,10 @@ class TestBgpPeerFrameDecoder extends FrameDecoder { |
| 141 | // | 138 | // |
| 142 | // Parse the OPEN message | 139 | // Parse the OPEN message |
| 143 | // | 140 | // |
| 144 | - remoteBgpVersion = message.readUnsignedByte(); | 141 | + remoteInfo.setBgpVersion(message.readUnsignedByte()); |
| 145 | - remoteAs = message.readUnsignedShort(); | 142 | + remoteInfo.setAsNumber(message.readUnsignedShort()); |
| 146 | - remoteHoldtime = message.readUnsignedShort(); | 143 | + remoteInfo.setHoldtime(message.readUnsignedShort()); |
| 147 | - remoteBgpIdentifier = | 144 | + remoteInfo.setBgpId(Ip4Address.valueOf((int) message.readUnsignedInt())); |
| 148 | - Ip4Address.valueOf((int) message.readUnsignedInt()); | ||
| 149 | // Optional Parameters | 145 | // Optional Parameters |
| 150 | int optParamLen = message.readUnsignedByte(); | 146 | int optParamLen = message.readUnsignedByte(); |
| 151 | if (message.readableBytes() < optParamLen) { | 147 | if (message.readableBytes() < optParamLen) { | ... | ... |
-
Please register or login to post a comment