*/
package org.opendaylight.bgp.concepts;
+import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import org.opendaylight.protocol.util.Ipv4Util;
import org.opendaylight.protocol.util.Ipv6Util;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.CNextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.EmptyNextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
/**
* Utility class for of CNextHop serialization and parsing.
*/
public final class NextHopUtil {
-
private NextHopUtil() {
- throw new UnsupportedOperationException();
+ // Hidden on purpose
}
/**
* Writes serialized cnextHop IP address as byte value into ByteBuf.
*
- * @param cnextHop next hop to be serialized
+ * @param cnextHop next hop to be serialized
* @param byteAggregator where the next hop will be written
*/
public static void serializeNextHop(final CNextHop cnextHop, final ByteBuf byteAggregator) {
if (cnextHop instanceof Ipv4NextHopCase) {
- byteAggregator.writeBytes(Ipv4Util.bytesForAddress(((Ipv4NextHopCase) cnextHop).getIpv4NextHop().getGlobal()));
+ byteAggregator.writeBytes(Ipv4Util.bytesForAddress(((Ipv4NextHopCase) cnextHop)
+ .getIpv4NextHop().getGlobal()));
} else if (cnextHop instanceof Ipv6NextHopCase) {
final Ipv6NextHop nextHop = ((Ipv6NextHopCase) cnextHop).getIpv6NextHop();
- if (nextHop.getGlobal() == null) {
- throw new IllegalArgumentException("Ipv6 Next Hop is missing Global address.");
- }
+ Preconditions.checkArgument(nextHop.getGlobal() != null,
+ "Ipv6 Next Hop is missing Global address.");
byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getGlobal()));
if (nextHop.getLinkLocal() != null) {
byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getLinkLocal()));
}
+ } else if (!(cnextHop instanceof EmptyNextHopCase)) {
+ throw new IllegalArgumentException("Cannot serialize NEXT_HOP. Class not supported: " + cnextHop);
}
}
*/
public static CNextHop parseNextHop(final ByteBuf buffer) {
switch (buffer.writerIndex()) {
- case Ipv4Util.IP4_LENGTH:
- return new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForByteBuf(buffer)).build()).build();
- case Ipv6Util.IPV6_LENGTH:
- return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
- case Ipv6Util.IPV6_LENGTH * 2:
- return new Ipv6NextHopCaseBuilder().setIpv6NextHop(
- new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForByteBuf(buffer)).setLinkLocal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
- default:
- throw new IllegalArgumentException("Cannot parse NEXT_HOP attribute. Wrong bytes length: " + buffer.writerIndex());
+ case Ipv4Util.IP4_LENGTH:
+ return parseNextHopIpv4(buffer);
+ case Ipv6Util.IPV6_LENGTH:
+ return parseNextHopIpv6(buffer);
+ case Ipv6Util.IPV6_LENGTH * 2:
+ return parseNextHopFullIpv6(buffer);
+ default:
+ throw new IllegalArgumentException("Cannot parse NEXT_HOP attribute. Wrong bytes length: "
+ + buffer.writerIndex());
}
}
+
+ /**
+ * Parses CNextHop IPv4 address from given ByteBuf, which has already been checked for size.
+ *
+ * @param buffer contains byte array representation of CNextHop
+ * @return CNexthop object
+ */
+ public static CNextHop parseNextHopIpv4(final ByteBuf buffer) {
+ return new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
+ .setGlobal(Ipv4Util.addressForByteBuf(buffer)).build()).build();
+ }
+
+ /**
+ * Parses CNextHop IPv6 global address from given ByteBuf, which has already been checked for size.
+ *
+ * @param buffer contains byte array representation of CNextHop
+ * @return CNexthop object
+ */
+ public static CNextHop parseNextHopIpv6(final ByteBuf buffer) {
+ return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder()
+ .setGlobal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
+ }
+
+ /**
+ * Parses CNextHop IPv6 global+local address from given ByteBuf, which has already been checked for size.
+ *
+ * @param buffer contains byte array representation of CNextHop
+ * @return CNexthop object
+ */
+ public static CNextHop parseNextHopFullIpv6(final ByteBuf buffer) {
+ return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder()
+ .setGlobal(Ipv6Util.addressForByteBuf(buffer))
+ .setLinkLocal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
+ }
}