[ONOS-3856] BGP flow specification update message encode.
Change-Id: I4286ea636df154f64c5b27f1f55a26fdc257e4f3
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
index 7189ef6..8bead96 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/protocol/ver4/BgpPathAttributes.java
@@ -17,12 +17,14 @@
import java.util.LinkedList;
import java.util.List;
+import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.bgpio.exceptions.BgpParseException;
import org.onosproject.bgpio.types.As4Path;
import org.onosproject.bgpio.types.AsPath;
import org.onosproject.bgpio.types.BgpErrorType;
+import org.onosproject.bgpio.types.BgpExtendedCommunity;
import org.onosproject.bgpio.types.BgpValueType;
import org.onosproject.bgpio.types.LinkStateAttributes;
import org.onosproject.bgpio.types.LocalPref;
@@ -33,6 +35,7 @@
import org.onosproject.bgpio.types.MpUnReachNlri;
import org.onosproject.bgpio.util.UnSupportedAttribute;
import org.onosproject.bgpio.util.Validation;
+import org.onosproject.bgpio.util.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -58,6 +61,7 @@
public static final int LINK_STATE_ATTRIBUTE_TYPE = 29;
public static final int MPREACHNLRI_TYPE = 14;
public static final int MPUNREACHNLRI_TYPE = 15;
+ public static final int EXTENDED_COMMUNITY_TYPE = 16;
private final List<BgpValueType> pathAttribute;
@@ -142,6 +146,9 @@
case LINK_STATE_ATTRIBUTE_TYPE:
pathAttribute = LinkStateAttributes.read(cb);
break;
+ case EXTENDED_COMMUNITY_TYPE:
+ pathAttribute = BgpExtendedCommunity.read(cb);
+ break;
default:
//skip bytes for unsupported attribute types
UnSupportedAttribute.read(cb);
@@ -155,6 +162,81 @@
}
/**
+ * Write path attributes to channelBuffer.
+ *
+ * @param cb channelBuffer
+ * @return object of BgpPathAttributes
+ * @throws BgpParseException while parsing BGP path attributes
+ */
+ public int write(ChannelBuffer cb)
+ throws BgpParseException {
+
+ if (pathAttribute == null) {
+ return 0;
+ }
+ int iLenStartIndex = cb.writerIndex();
+
+ ListIterator<BgpValueType> iterator = pathAttribute.listIterator();
+
+ int pathAttributeIndx = cb.writerIndex();
+ cb.writeShort(0);
+
+ while (iterator.hasNext()) {
+
+ BgpValueType attr = iterator.next();
+
+ switch (attr.getType()) {
+ case Origin.ORIGIN_TYPE:
+ Origin origin = (Origin) attr;
+ origin.write(cb);
+ break;
+ case AsPath.ASPATH_TYPE:
+ AsPath asPath = (AsPath) attr;
+ asPath.write(cb);
+ break;
+ case As4Path.AS4PATH_TYPE:
+ As4Path as4Path = (As4Path) attr;
+ as4Path.write(cb);
+ break;
+ case NextHop.NEXTHOP_TYPE:
+ NextHop nextHop = (NextHop) attr;
+ nextHop.write(cb);
+ break;
+ case Med.MED_TYPE:
+ Med med = (Med) attr;
+ med.write(cb);
+ break;
+ case LocalPref.LOCAL_PREF_TYPE:
+ LocalPref localPref = (LocalPref) attr;
+ localPref.write(cb);
+ break;
+ case Constants.BGP_EXTENDED_COMMUNITY:
+ BgpExtendedCommunity extendedCommunity = (BgpExtendedCommunity) attr;
+ extendedCommunity.write(cb);
+ break;
+ case MpReachNlri.MPREACHNLRI_TYPE:
+ MpReachNlri mpReach = (MpReachNlri) attr;
+ mpReach.write(cb);
+ break;
+ case MpUnReachNlri.MPUNREACHNLRI_TYPE:
+ MpUnReachNlri mpUnReach = (MpUnReachNlri) attr;
+ mpUnReach.write(cb);
+ break;
+ case LINK_STATE_ATTRIBUTE_TYPE:
+ LinkStateAttributes linkState = (LinkStateAttributes) attr;
+ linkState.write(cb);
+ break;
+ default:
+ return cb.writerIndex() - iLenStartIndex;
+ }
+ }
+
+ int pathAttrLen = cb.writerIndex() - pathAttributeIndx;
+ cb.setShort(pathAttributeIndx, (short) (pathAttrLen - 2));
+ return cb.writerIndex() - iLenStartIndex;
+ }
+
+ /**
* Checks mandatory attributes are presents, if not present throws exception.
*
* @param isOrigin say whether origin attribute is present