[Falcon] link discovery -

- Support for TLV containing cluster fingerprint info
- Config for enabling extra TLV at device level
- Refactored ONOSLLDP constructor for ease of use

Change-Id: I93abe6c0ed8b7e37c80af5920649272faad8856e
This commit is contained in:
Ayaka Koshibe 2015-12-08 12:48:46 -08:00 committed by Gerrit Code Review
parent bd7f878a7c
commit 12c8c08aa1
6 changed files with 233 additions and 40 deletions

View File

@ -66,4 +66,11 @@ interface DiscoveryContext {
* @param key link key * @param key link key
*/ */
void touchLink(LinkKey key); void touchLink(LinkKey key);
/**
* Returns the cluster-wide unique identifier.
*
* @return the cluster identifier
*/
String fingerprint();
} }

View File

@ -0,0 +1,18 @@
package org.onosproject.provider.lldp.impl;
import org.onosproject.net.DeviceId;
import org.onosproject.net.config.basics.BasicFeatureConfig;
/**
* A feature to send and receive probes carrying a cluster-unique fingerprint.
* Note that, as it leverages LinkDiscovery, disabling linkDiscovery will disable
* this function.
*/
public class FingerprintProbeFromDevice extends BasicFeatureConfig<DeviceId> {
protected FingerprintProbeFromDevice() {
// default:disabled
super(false);
}
}

View File

@ -16,6 +16,7 @@
package org.onosproject.provider.lldp.impl; package org.onosproject.provider.lldp.impl;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.jboss.netty.util.Timeout; import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.TimerTask; import org.jboss.netty.util.TimerTask;
import org.onlab.packet.Ethernet; import org.onlab.packet.Ethernet;
@ -59,13 +60,13 @@ class LinkDiscovery implements TimerTask {
private final Device device; private final Device device;
private final DiscoveryContext context; private final DiscoveryContext context;
private final ONOSLLDP lldpPacket;
private final Ethernet ethPacket; private final Ethernet ethPacket;
private final Ethernet bddpEth; private final Ethernet bddpEth;
private Timeout timeout; private Timeout timeout;
private volatile boolean isStopped; private volatile boolean isStopped;
// This LinkDiscovery can handle remote link probes (default false).
private volatile boolean fingerprinted;
// Set of ports to be probed // Set of ports to be probed
private final Set<Long> ports = Sets.newConcurrentHashSet(); private final Set<Long> ports = Sets.newConcurrentHashSet();
@ -81,22 +82,17 @@ class LinkDiscovery implements TimerTask {
this.device = device; this.device = device;
this.context = context; this.context = context;
lldpPacket = new ONOSLLDP();
lldpPacket.setChassisId(device.chassisId());
lldpPacket.setDevice(device.id().toString());
ethPacket = new Ethernet(); ethPacket = new Ethernet();
ethPacket.setEtherType(Ethernet.TYPE_LLDP); ethPacket.setEtherType(Ethernet.TYPE_LLDP);
ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA); ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_NICIRA);
ethPacket.setPayload(this.lldpPacket);
ethPacket.setPad(true); ethPacket.setPad(true);
bddpEth = new Ethernet(); bddpEth = new Ethernet();
bddpEth.setPayload(lldpPacket);
bddpEth.setEtherType(Ethernet.TYPE_BSN); bddpEth.setEtherType(Ethernet.TYPE_BSN);
bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST); bddpEth.setDestinationMACAddress(ONOSLLDP.BDDP_MULTICAST);
bddpEth.setPad(true); bddpEth.setPad(true);
fingerprinted = false;
isStopped = true; isStopped = true;
start(); start();
log.debug("Started discovery manager for switch {}", device.id()); log.debug("Started discovery manager for switch {}", device.id());
@ -220,8 +216,8 @@ class LinkDiscovery implements TimerTask {
if (port == null) { if (port == null) {
return null; return null;
} }
lldpPacket.setPortId(port.intValue()); ONOSLLDP lldp = getLinkProbe(port);
ethPacket.setSourceMACAddress(SRC_MAC); ethPacket.setSourceMACAddress(SRC_MAC).setPayload(lldp);
return new DefaultOutboundPacket(device.id(), return new DefaultOutboundPacket(device.id(),
builder().setOutput(portNumber(port)).build(), builder().setOutput(portNumber(port)).build(),
ByteBuffer.wrap(ethPacket.serialize())); ByteBuffer.wrap(ethPacket.serialize()));
@ -237,13 +233,21 @@ class LinkDiscovery implements TimerTask {
if (port == null) { if (port == null) {
return null; return null;
} }
lldpPacket.setPortId(port.intValue()); ONOSLLDP lldp = getLinkProbe(port);
bddpEth.setSourceMACAddress(SRC_MAC); bddpEth.setSourceMACAddress(SRC_MAC).setPayload(lldp);
return new DefaultOutboundPacket(device.id(), return new DefaultOutboundPacket(device.id(),
builder().setOutput(portNumber(port)).build(), builder().setOutput(portNumber(port)).build(),
ByteBuffer.wrap(bddpEth.serialize())); ByteBuffer.wrap(bddpEth.serialize()));
} }
private ONOSLLDP getLinkProbe(Long port) {
return fingerprinted
? ONOSLLDP.fingerprintedLLDP(device.id().toString(), device.chassisId(),
port.intValue(), context.fingerprint())
: ONOSLLDP.onosLLDP(device.id().toString(), device.chassisId(),
port.intValue());
}
private void sendProbes(Long portNumber) { private void sendProbes(Long portNumber) {
log.trace("Sending probes out to {}@{}", portNumber, device.id()); log.trace("Sending probes out to {}@{}", portNumber, device.id());
OutboundPacket pkt = createOutBoundLldp(portNumber); OutboundPacket pkt = createOutBoundLldp(portNumber);
@ -258,4 +262,11 @@ class LinkDiscovery implements TimerTask {
return ports.contains(portNumber); return ports.contains(portNumber);
} }
protected void enableFingerprint() {
fingerprinted = true;
}
protected void disableFingerprint() {
fingerprinted = false;
}
} }

View File

@ -47,6 +47,7 @@ import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.packet.Ethernet; import org.onlab.packet.Ethernet;
import org.onlab.util.Tools; import org.onlab.util.Tools;
import org.onosproject.cfg.ComponentConfigService; import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.cluster.ClusterMetadataService;
import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.ClusterService;
import org.onosproject.core.ApplicationId; import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService; import org.onosproject.core.CoreService;
@ -133,6 +134,9 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected NetworkConfigRegistry cfgRegistry; protected NetworkConfigRegistry cfgRegistry;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ClusterMetadataService clusterMetadataService;
private LinkProviderService providerService; private LinkProviderService providerService;
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
@ -185,6 +189,7 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
public static final String CONFIG_KEY = "suppression"; public static final String CONFIG_KEY = "suppression";
public static final String FEATURE_NAME = "linkDiscovery"; public static final String FEATURE_NAME = "linkDiscovery";
public static final String FINGERPRINT_FEATURE_NAME = "fingerprint";
private final Set<ConfigFactory<?, ?>> factories = ImmutableSet.of( private final Set<ConfigFactory<?, ?>> factories = ImmutableSet.of(
new ConfigFactory<ApplicationId, SuppressionConfig>(APP_SUBJECT_FACTORY, new ConfigFactory<ApplicationId, SuppressionConfig>(APP_SUBJECT_FACTORY,
@ -208,6 +213,13 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
public LinkDiscoveryFromPort createConfig() { public LinkDiscoveryFromPort createConfig() {
return new LinkDiscoveryFromPort(); return new LinkDiscoveryFromPort();
} }
},
new ConfigFactory<DeviceId, FingerprintProbeFromDevice>(DEVICE_SUBJECT_FACTORY,
FingerprintProbeFromDevice.class, FINGERPRINT_FEATURE_NAME) {
@Override
public FingerprintProbeFromDevice createConfig() {
return new FingerprintProbeFromDevice();
}
} }
); );
@ -385,6 +397,14 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
return isBlacklisted(new ConnectPoint(port.element().id(), port.number())); return isBlacklisted(new ConnectPoint(port.element().id(), port.number()));
} }
private boolean isFingerprinted(DeviceId did) {
FingerprintProbeFromDevice cfg = cfgRegistry.getConfig(did, FingerprintProbeFromDevice.class);
if (cfg == null) {
return false;
}
return cfg.enabled();
}
/** /**
* Updates discovery helper for specified device. * Updates discovery helper for specified device.
* *
@ -405,6 +425,11 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
} }
LinkDiscovery ld = discoverers.computeIfAbsent(device.id(), LinkDiscovery ld = discoverers.computeIfAbsent(device.id(),
did -> new LinkDiscovery(device, context)); did -> new LinkDiscovery(device, context));
if (isFingerprinted(device.id())) {
ld.enableFingerprint();
} else {
ld.disableFingerprint();
}
if (ld.isStopped()) { if (ld.isStopped()) {
ld.start(); ld.start();
} }
@ -715,6 +740,11 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
public void touchLink(LinkKey key) { public void touchLink(LinkKey key) {
linkTimes.put(key, System.currentTimeMillis()); linkTimes.put(key, System.currentTimeMillis());
} }
@Override
public String fingerprint() {
return clusterMetadataService.getClusterMetadata().getName();
}
} }
static final EnumSet<NetworkConfigEvent.Type> CONFIG_CHANGED static final EnumSet<NetworkConfigEvent.Type> CONFIG_CHANGED
@ -760,6 +790,15 @@ public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
} }
} }
} else if (event.configClass() == FingerprintProbeFromDevice.class &&
CONFIG_CHANGED.contains(event.type())) {
if (event.subject() instanceof DeviceId) {
final DeviceId did = (DeviceId) event.subject();
Device device = deviceService.getDevice(did);
updateDevice(device);
}
} else if (event.configClass().equals(SuppressionConfig.class) && } else if (event.configClass().equals(SuppressionConfig.class) &&
(event.type() == NetworkConfigEvent.Type.CONFIG_ADDED || (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) { event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) {

View File

@ -21,14 +21,22 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.onlab.packet.ChassisId; import org.onlab.packet.ChassisId;
import org.onlab.packet.Ethernet; import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.ONOSLLDP; import org.onlab.packet.ONOSLLDP;
import org.onosproject.cfg.ComponentConfigAdapter; import org.onosproject.cfg.ComponentConfigAdapter;
import org.onosproject.cluster.ClusterMetadata;
import org.onosproject.cluster.ClusterMetadataService;
import org.onosproject.cluster.ControllerNode;
import org.onosproject.cluster.DefaultControllerNode;
import org.onosproject.cluster.NodeId; import org.onosproject.cluster.NodeId;
import org.onosproject.cluster.Partition;
import org.onosproject.cluster.RoleInfo; import org.onosproject.cluster.RoleInfo;
import org.onosproject.core.ApplicationId; import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService; import org.onosproject.core.CoreService;
@ -80,7 +88,6 @@ import java.util.concurrent.CompletableFuture;
import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
@ -143,7 +150,7 @@ public class LldpLinkProviderTest {
provider.packetService = packetService; provider.packetService = packetService;
provider.providerRegistry = linkRegistry; provider.providerRegistry = linkRegistry;
provider.masterService = masterService; provider.masterService = masterService;
provider.clusterMetadataService = new TestMetadataService();
provider.activate(null); provider.activate(null);
} }
@ -696,11 +703,9 @@ public class LldpLinkProviderTest {
@Override @Override
public InboundPacket inPacket() { public InboundPacket inPacket() {
ONOSLLDP lldp = new ONOSLLDP(); ONOSLLDP lldp = ONOSLLDP.onosLLDP(deviceService.getDevice(DID1).id().toString(),
lldp.setChassisId(device.chassisId()); device.chassisId(),
lldp.setPortId((int) pd1.number().toLong()); (int) pd1.number().toLong());
lldp.setDevice(deviceService.getDevice(DID1).id().toString());
Ethernet ethPacket = new Ethernet(); Ethernet ethPacket = new Ethernet();
ethPacket.setEtherType(Ethernet.TYPE_LLDP); ethPacket.setEtherType(Ethernet.TYPE_LLDP);
@ -708,8 +713,6 @@ public class LldpLinkProviderTest {
ethPacket.setPayload(lldp); ethPacket.setPayload(lldp);
ethPacket.setPad(true); ethPacket.setPad(true);
ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11"); ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
ConnectPoint cp = new ConnectPoint(device.id(), pd3.number()); ConnectPoint cp = new ConnectPoint(device.id(), pd3.number());
@ -941,4 +944,26 @@ public class LldpLinkProviderTest {
return this; return this;
} }
} }
private final class TestMetadataService implements ClusterMetadataService {
@Override
public ClusterMetadata getClusterMetadata() {
final NodeId nid = new NodeId("test-node");
final IpAddress addr = IpAddress.valueOf(0);
final Partition p = new Partition("test-pt", Sets.newHashSet(nid));
return ClusterMetadata.builder()
.withName("test-cluster")
.withControllerNodes(Sets.newHashSet(new DefaultControllerNode(nid, addr)))
.withPartitions(Sets.newHashSet(p)).build();
}
@Override
public void setClusterMetadata(ClusterMetadata metadata) {
}
@Override
public ControllerNode getLocalNode() {
return null;
}
}
} }

View File

@ -15,14 +15,21 @@
*/ */
package org.onlab.packet; package org.onlab.packet;
import java.util.HashMap;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import static org.onlab.packet.LLDPOrganizationalTLV.OUI_LENGTH;
import static org.onlab.packet.LLDPOrganizationalTLV.SUBTYPE_LENGTH;
/** /**
* ONOS LLDP containing organizational TLV for ONOS device dicovery. * ONOS LLDP containing organizational TLV for ONOS device discovery.
*/ */
public class ONOSLLDP extends LLDP { public class ONOSLLDP extends LLDP {
@ -37,12 +44,16 @@ public class ONOSLLDP extends LLDP {
public static final byte[] BDDP_MULTICAST = {(byte) 0xff, (byte) 0xff, public static final byte[] BDDP_MULTICAST = {(byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
private static final byte NAME_SUBTYPE = 1; protected static final byte NAME_SUBTYPE = 1;
private static final byte DEVICE_SUBTYPE = 2; protected static final byte DEVICE_SUBTYPE = 2;
private static final short NAME_LENGTH = 4; //1 for subtype + 3 for OUI protected static final byte DOMAIN_SUBTYPE = 3;
private static final short DEVICE_LENGTH = 4; //1 for subtype + 3 for OUI
private final LLDPOrganizationalTLV nameTLV = new LLDPOrganizationalTLV(); private static final short NAME_LENGTH = OUI_LENGTH + SUBTYPE_LENGTH;
private final LLDPOrganizationalTLV deviceTLV = new LLDPOrganizationalTLV(); private static final short DEVICE_LENGTH = OUI_LENGTH + SUBTYPE_LENGTH;
private static final short DOMAIN_LENGTH = OUI_LENGTH + SUBTYPE_LENGTH;
private final HashMap<Byte, LLDPOrganizationalTLV> opttlvs =
Maps.<Byte, LLDPOrganizationalTLV>newHashMap();
// TLV constants: type, size and subtype // TLV constants: type, size and subtype
// Organizationally specific TLV also have packet offset and contents of TLV // Organizationally specific TLV also have packet offset and contents of TLV
@ -57,18 +68,24 @@ public class ONOSLLDP extends LLDP {
private static final byte TTL_TLV_TYPE = 3; private static final byte TTL_TLV_TYPE = 3;
private final byte[] ttlValue = new byte[] {0, 0x78}; private final byte[] ttlValue = new byte[] {0, 0x78};
public ONOSLLDP() { // Only needs to be accessed from LinkProbeFactory.
protected ONOSLLDP(byte ... subtype) {
super(); super();
for (byte st : subtype) {
opttlvs.put(st, new LLDPOrganizationalTLV());
}
// guarantee the following (name and device) TLVs exist
opttlvs.putIfAbsent(NAME_SUBTYPE, new LLDPOrganizationalTLV());
opttlvs.putIfAbsent(DEVICE_SUBTYPE, new LLDPOrganizationalTLV());
setName(DEFAULT_NAME); setName(DEFAULT_NAME);
setDevice(DEFAULT_DEVICE); setDevice(DEFAULT_DEVICE);
setOptionalTLVList(Lists.<LLDPTLV>newArrayList(nameTLV, deviceTLV));
setOptionalTLVList(Lists.<LLDPTLV>newArrayList(opttlvs.values()));
setTtl(new LLDPTLV().setType(TTL_TLV_TYPE) setTtl(new LLDPTLV().setType(TTL_TLV_TYPE)
.setLength((short) ttlValue.length) .setLength((short) ttlValue.length)
.setValue(ttlValue)); .setValue(ttlValue));
} }
private ONOSLLDP(LLDP lldp) { private ONOSLLDP(LLDP lldp) {
@ -79,17 +96,31 @@ public class ONOSLLDP extends LLDP {
} }
public void setName(String name) { public void setName(String name) {
nameTLV.setLength((short) (name.length() + NAME_LENGTH)); LLDPOrganizationalTLV nametlv = opttlvs.get(NAME_SUBTYPE);
nameTLV.setInfoString(name); nametlv.setLength((short) (name.length() + NAME_LENGTH));
nameTLV.setSubType(NAME_SUBTYPE); nametlv.setInfoString(name);
nameTLV.setOUI(ONLAB_OUI); nametlv.setSubType(NAME_SUBTYPE);
nametlv.setOUI(ONLAB_OUI);
} }
public void setDevice(String device) { public void setDevice(String device) {
deviceTLV.setInfoString(device); LLDPOrganizationalTLV devicetlv = opttlvs.get(DEVICE_SUBTYPE);
deviceTLV.setLength((short) (device.length() + DEVICE_LENGTH)); devicetlv.setInfoString(device);
deviceTLV.setSubType(DEVICE_SUBTYPE); devicetlv.setLength((short) (device.length() + DEVICE_LENGTH));
deviceTLV.setOUI(ONLAB_OUI); devicetlv.setSubType(DEVICE_SUBTYPE);
devicetlv.setOUI(ONLAB_OUI);
}
public void setDomainInfo(String domainId) {
LLDPOrganizationalTLV domaintlv = opttlvs.get(DOMAIN_SUBTYPE);
if (domaintlv == null) {
// maybe warn people not to set this if remote probes aren't.
return;
}
domaintlv.setInfoString(domainId);
domaintlv.setLength((short) (domainId.length() + DOMAIN_LENGTH));
domaintlv.setSubType(DOMAIN_SUBTYPE);
domaintlv.setOUI(ONLAB_OUI);
} }
public void setChassisId(final ChassisId chassisId) { public void setChassisId(final ChassisId chassisId) {
@ -139,6 +170,24 @@ public class ONOSLLDP extends LLDP {
return null; return null;
} }
/**
* Gets the TLV associated with remote probing. This TLV will be null if
* remote probing is disabled.
*
* @return A TLV containing domain ID, or null.
*/
public LLDPOrganizationalTLV getDomainTLV() {
for (LLDPTLV tlv : this.getOptionalTLVList()) {
if (tlv.getType() == LLDPOrganizationalTLV.ORGANIZATIONAL_TLV_TYPE) {
LLDPOrganizationalTLV orgTLV = (LLDPOrganizationalTLV) tlv;
if (orgTLV.getSubType() == DOMAIN_SUBTYPE) {
return orgTLV;
}
}
}
return null;
}
public String getNameString() { public String getNameString() {
LLDPOrganizationalTLV tlv = getNameTLV(); LLDPOrganizationalTLV tlv = getNameTLV();
if (tlv != null) { if (tlv != null) {
@ -155,6 +204,14 @@ public class ONOSLLDP extends LLDP {
return null; return null;
} }
public String getDomainString() {
LLDPOrganizationalTLV tlv = getDomainTLV();
if (tlv != null) {
return new String(tlv.getInfoString(), StandardCharsets.UTF_8);
}
return null;
}
public Integer getPort() { public Integer getPort() {
ByteBuffer portBB = ByteBuffer.wrap(this.getPortId().getValue()); ByteBuffer portBB = ByteBuffer.wrap(this.getPortId().getValue());
portBB.position(1); portBB.position(1);
@ -177,4 +234,40 @@ public class ONOSLLDP extends LLDP {
} }
return null; return null;
} }
/**
* Creates a link probe for link discovery/verification.
*
* @param deviceId The device ID as a String
* @param chassisId The chassis ID of the device
* @param portNum Port number of port to send probe out of
* @return ONOSLLDP probe message
*/
public static ONOSLLDP onosLLDP(String deviceId, ChassisId chassisId, int portNum) {
ONOSLLDP probe = new ONOSLLDP(NAME_SUBTYPE, DEVICE_SUBTYPE);
probe.setPortId(portNum);
probe.setDevice(deviceId);
probe.setChassisId(chassisId);
return probe;
}
/**
* Creates a link probe carrying a fingerprint unique to the ONOS cluster managing
* link discovery/verification.
*
* @param deviceId The device ID as a String
* @param chassisId The chassis ID of the device
* @param portNum Port number of port to send probe out of
* @param domainId The cluster's fingerprint
* @return ONOSLLDP probe message
*/
public static ONOSLLDP fingerprintedLLDP(
String deviceId, ChassisId chassisId, int portNum, String domainId) {
ONOSLLDP probe = new ONOSLLDP(NAME_SUBTYPE, DEVICE_SUBTYPE, DOMAIN_SUBTYPE);
probe.setPortId(portNum);
probe.setDevice(deviceId);
probe.setChassisId(chassisId);
probe.setDomainInfo(domainId);
return probe;
}
} }