Java tutorial
/* * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.latency.util; import static org.opendaylight.controller.liblldp.LLDPTLV.CUSTOM_TLV_SUB_TYPE_CUSTOM_SEC; import java.math.BigInteger; import org.apache.commons.lang3.StringUtils; import org.opendaylight.controller.liblldp.EtherTypes; import org.opendaylight.controller.liblldp.Ethernet; import org.opendaylight.controller.liblldp.HexEncode; import org.opendaylight.controller.liblldp.LLDP; import org.opendaylight.controller.liblldp.LLDPTLV; import org.opendaylight.controller.liblldp.PacketException; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class LatencyPacketUtil { private static final Logger LOG = LoggerFactory.getLogger(LatencyPacketUtil.class); private static final String OF_URI_PREFIX = "openflow:"; public static byte[] buildLldpFrame(final NodeId nodeId, final NodeConnectorId nodeConnectorId, final MacAddress src, final Long outPortNo, final MacAddress destinationAddress) { // Create discovery pkt LLDP discoveryPkt = new LLDP(); // Create LLDP ChassisID TLV BigInteger dataPathId = dataPathIdFromNodeId(nodeId); byte[] cidValue = LLDPTLV.createChassisIDTLVValue(colonize(bigIntegerToPaddedHex(dataPathId))); LLDPTLV chassisIdTlv = new LLDPTLV(); chassisIdTlv.setType(LLDPTLV.TLVType.ChassisID.getValue()); chassisIdTlv.setType(LLDPTLV.TLVType.ChassisID.getValue()).setLength((short) cidValue.length) .setValue(cidValue); discoveryPkt.setChassisId(chassisIdTlv); // Create LLDP PortID TL String hexString = Long.toHexString(outPortNo); byte[] pidValue = LLDPTLV.createPortIDTLVValue(hexString); LLDPTLV portIdTlv = new LLDPTLV(); portIdTlv.setType(LLDPTLV.TLVType.PortID.getValue()).setLength((short) pidValue.length).setValue(pidValue); portIdTlv.setType(LLDPTLV.TLVType.PortID.getValue()); discoveryPkt.setPortId(portIdTlv); // Create LLDP TTL TLV byte[] ttl = new byte[] { (byte) 0x13, (byte) 0x37 }; LLDPTLV ttlTlv = new LLDPTLV(); ttlTlv.setType(LLDPTLV.TLVType.TTL.getValue()).setLength((short) ttl.length).setValue(ttl); discoveryPkt.setTtl(ttlTlv); // Create LLDP SystemName TLV byte[] snValue = LLDPTLV.createSystemNameTLVValue(nodeId.getValue()); LLDPTLV systemNameTlv = new LLDPTLV(); systemNameTlv.setType(LLDPTLV.TLVType.SystemName.getValue()); systemNameTlv.setType(LLDPTLV.TLVType.SystemName.getValue()).setLength((short) snValue.length) .setValue(snValue); discoveryPkt.setSystemNameId(systemNameTlv); // Create LLDP Custom TLV byte[] customValue = LLDPTLV.createCustomTLVValue(nodeConnectorId.getValue()); LLDPTLV customTlv = new LLDPTLV(); customTlv.setType(LLDPTLV.TLVType.Custom.getValue()).setLength((short) customValue.length) .setValue(customValue); discoveryPkt.addCustomTLV(customTlv); //Create LLDP CustomSec TLV /*byte[] pureValue = new byte[1]; try { pureValue = getValueForLLDPPacketIntegrityEnsuring(nodeConnectorId); byte[] customSecValue = LLDPTLV.createCustomTLVValue(CUSTOM_TLV_SUB_TYPE_CUSTOM_SEC, pureValue); LLDPTLV customSecTlv = new LLDPTLV(); customSecTlv.setType(LLDPTLV.TLVType.Custom.getValue()) .setLength((short)customSecValue.length) .setValue(customSecValue); discoveryPkt.addCustomTLV(customSecTlv); } catch (NoSuchAlgorithmException e1) { LOG.info("LLDP extra authenticator creation failed: {}", e1.getMessage()); LOG.debug("Reason why LLDP extra authenticator creation failed: ", e1); }*/ //Create Latency Test Custom TLV String latency = "latency"; byte[] latencybyte = new byte[1]; latencybyte = latency.getBytes(); byte[] latencyValue = LLDPTLV.createCustomTLVValue(CUSTOM_TLV_SUB_TYPE_CUSTOM_SEC, latencybyte); LLDPTLV latencyTLV = new LLDPTLV(); latencyTLV.setType(LLDPTLV.TLVType.Custom.getValue()).setLength((short) latencyValue.length) .setValue(latencyValue); discoveryPkt.addCustomTLV(latencyTLV); // Create ethernet pkt byte[] sourceMac = HexEncode.bytesFromHexString(src.getValue()); Ethernet ethPkt = new Ethernet(); ethPkt.setSourceMACAddress(sourceMac).setEtherType(EtherTypes.LLDP.shortValue()).setPayload(discoveryPkt); if (destinationAddress == null) { ethPkt.setDestinationMACAddress(LLDP.LLDPMulticastMac); } else { ethPkt.setDestinationMACAddress(HexEncode.bytesFromHexString(destinationAddress.getValue())); } try { return ethPkt.serialize(); } catch (PacketException e) { LOG.warn("Error creating LLDP packet: {}", e.getMessage()); LOG.debug("Error creating LLDP packet.. ", e); } return null; } private static String colonize(final String orig) { return orig.replaceAll("(?<=..)(..)", ":$1"); } private static BigInteger dataPathIdFromNodeId(final NodeId nodeId) { String dpids = nodeId.getValue().replace(OF_URI_PREFIX, ""); return new BigInteger(dpids); } private static String bigIntegerToPaddedHex(final BigInteger dataPathId) { return StringUtils.leftPad(dataPathId.toString(16), 16, "0"); } static byte[] buildLldpFrame(final NodeId nodeId, final NodeConnectorId nodeConnectorId, final MacAddress srcMacAddress, final Long outputPortNo) { return buildLldpFrame(nodeId, nodeConnectorId, srcMacAddress, outputPortNo, null); } }