Pingping Lin
Committed by Gerrit Code Review

[ONOS-2939] Let sdn-ip also can parse bird's bgp OPEN message

RFC5492 allows multiple Capability triples per Optional Parameter.
But our code only support parsing 1 Capability triple per Optional Parameter.
It works with Quagga, but failed parsing bird OPEN message.
This patch adds support for multiple Capability triples per Optional Parameter.

Change-Id: Iae6295d608e44676a44ef6a0ae1868d8dcd7648d
...@@ -309,16 +309,25 @@ final class BgpOpen { ...@@ -309,16 +309,25 @@ final class BgpOpen {
309 case BgpConstants.Open.Capabilities.TYPE: 309 case BgpConstants.Open.Capabilities.TYPE:
310 // Optional Parameter Type: Capabilities 310 // Optional Parameter Type: Capabilities
311 if (paramLen < BgpConstants.Open.Capabilities.MIN_LENGTH) { 311 if (paramLen < BgpConstants.Open.Capabilities.MIN_LENGTH) {
312 - // ERROR: Malformed Capability 312 + // ERROR: Malformed Param Type
313 - String errorMsg = "Malformed Capability Type " + paramType; 313 + String errorMsg = "Malformed Capabilities Optional "
314 + + "Parameter Type " + paramType;
315 + throw new BgpMessage.BgpParseException(errorMsg);
316 + }
317 + int paramEnd = message.readerIndex() + paramLen;
318 + // Parse Capabilities
319 + while (message.readerIndex() < paramEnd) {
320 + if (paramEnd - message.readerIndex() <
321 + BgpConstants.Open.Capabilities.MIN_LENGTH) {
322 + String errorMsg = "Malformed Capabilities";
314 throw new BgpMessage.BgpParseException(errorMsg); 323 throw new BgpMessage.BgpParseException(errorMsg);
315 } 324 }
316 - int capabEnd = message.readerIndex() + paramLen;
317 int capabCode = message.readUnsignedByte(); 325 int capabCode = message.readUnsignedByte();
318 int capabLen = message.readUnsignedByte(); 326 int capabLen = message.readUnsignedByte();
319 - if (message.readerIndex() + capabLen > capabEnd) { 327 + if (message.readerIndex() + capabLen > paramEnd) {
320 // ERROR: Malformed Capability 328 // ERROR: Malformed Capability
321 - String errorMsg = "Malformed Capability Type " + paramType; 329 + String errorMsg = "Malformed Capability instance with "
330 + + "code " + capabCode;
322 throw new BgpMessage.BgpParseException(errorMsg); 331 throw new BgpMessage.BgpParseException(errorMsg);
323 } 332 }
324 333
...@@ -395,8 +404,9 @@ final class BgpOpen { ...@@ -395,8 +404,9 @@ final class BgpOpen {
395 break; 404 break;
396 } 405 }
397 406
398 - break;
399 407
408 + }
409 + break;
400 default: 410 default:
401 // Unknown Parameter Type: ignore it 411 // Unknown Parameter Type: ignore it
402 log.debug("BGP RX OPEN Parameter Type = {} Length = {}", 412 log.debug("BGP RX OPEN Parameter Type = {} Length = {}",
......