Showing
6 changed files
with
36 additions
and
25 deletions
... | @@ -80,4 +80,9 @@ public final class DefaultPacketContext implements PacketContext { | ... | @@ -80,4 +80,9 @@ public final class DefaultPacketContext implements PacketContext { |
80 | return pktin.getInPort().getPortNumber(); | 80 | return pktin.getInPort().getPortNumber(); |
81 | } | 81 | } |
82 | 82 | ||
83 | + @Override | ||
84 | + public byte[] unparsed() { | ||
85 | + return pktin.getData().clone(); | ||
86 | + } | ||
87 | + | ||
83 | } | 88 | } | ... | ... |
... | @@ -44,6 +44,12 @@ public interface PacketContext { | ... | @@ -44,6 +44,12 @@ public interface PacketContext { |
44 | public Ethernet parsed(); | 44 | public Ethernet parsed(); |
45 | 45 | ||
46 | /** | 46 | /** |
47 | + * Provide an unparsed copy of the data. | ||
48 | + * @return the unparsed form of the payload. | ||
49 | + */ | ||
50 | + public byte[] unparsed(); | ||
51 | + | ||
52 | + /** | ||
47 | * Provide the dpid of the switch where the packet in arrived. | 53 | * Provide the dpid of the switch where the packet in arrived. |
48 | * @return the dpid of the switch. | 54 | * @return the dpid of the switch. |
49 | */ | 55 | */ | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -21,9 +21,9 @@ import java.util.Collections; | ... | @@ -21,9 +21,9 @@ import java.util.Collections; |
21 | import java.util.HashMap; | 21 | import java.util.HashMap; |
22 | import java.util.HashSet; | 22 | import java.util.HashSet; |
23 | import java.util.Iterator; | 23 | import java.util.Iterator; |
24 | -import java.util.List; | ||
25 | import java.util.Map; | 24 | import java.util.Map; |
26 | import java.util.Set; | 25 | import java.util.Set; |
26 | +import java.util.concurrent.ConcurrentHashMap; | ||
27 | import java.util.concurrent.TimeUnit; | 27 | import java.util.concurrent.TimeUnit; |
28 | import java.util.concurrent.atomic.AtomicInteger; | 28 | import java.util.concurrent.atomic.AtomicInteger; |
29 | 29 | ||
... | @@ -85,6 +85,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -85,6 +85,7 @@ public class LinkDiscovery implements TimerTask { |
85 | private final boolean useBDDP; | 85 | private final boolean useBDDP; |
86 | private final OpenFlowController ctrl; | 86 | private final OpenFlowController ctrl; |
87 | private final LinkProviderService linkProvider; | 87 | private final LinkProviderService linkProvider; |
88 | + private final Map<Integer, OFPortDesc> ports; | ||
88 | 89 | ||
89 | /** | 90 | /** |
90 | * Instantiates discovery manager for the given physical switch. Creates a | 91 | * Instantiates discovery manager for the given physical switch. Creates a |
... | @@ -103,6 +104,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -103,6 +104,7 @@ public class LinkDiscovery implements TimerTask { |
103 | this.linkProvider = providerService; | 104 | this.linkProvider = providerService; |
104 | this.slowPorts = Collections.synchronizedSet(new HashSet<Integer>()); | 105 | this.slowPorts = Collections.synchronizedSet(new HashSet<Integer>()); |
105 | this.fastPorts = Collections.synchronizedSet(new HashSet<Integer>()); | 106 | this.fastPorts = Collections.synchronizedSet(new HashSet<Integer>()); |
107 | + this.ports = new ConcurrentHashMap<>(); | ||
106 | this.portProbeCount = new HashMap<Integer, AtomicInteger>(); | 108 | this.portProbeCount = new HashMap<Integer, AtomicInteger>(); |
107 | this.lldpPacket = new ONLabLddp(); | 109 | this.lldpPacket = new ONLabLddp(); |
108 | this.lldpPacket.setSwitch(this.sw.getId()); | 110 | this.lldpPacket.setSwitch(this.sw.getId()); |
... | @@ -140,7 +142,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -140,7 +142,7 @@ public class LinkDiscovery implements TimerTask { |
140 | */ | 142 | */ |
141 | public void addPort(final OFPortDesc port) { | 143 | public void addPort(final OFPortDesc port) { |
142 | // Ignore ports that are not on this switch, or already booted. */ | 144 | // Ignore ports that are not on this switch, or already booted. */ |
143 | - | 145 | + this.ports.put(port.getPortNo().getPortNumber(), port); |
144 | synchronized (this) { | 146 | synchronized (this) { |
145 | this.log.debug("sending init probe to port {}", | 147 | this.log.debug("sending init probe to port {}", |
146 | port.getPortNo().getPortNumber()); | 148 | port.getPortNo().getPortNumber()); |
... | @@ -274,12 +276,10 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -274,12 +276,10 @@ public class LinkDiscovery implements TimerTask { |
274 | * Handles an incoming LLDP packet. Creates link in topology and sends ACK | 276 | * Handles an incoming LLDP packet. Creates link in topology and sends ACK |
275 | * to port where LLDP originated. | 277 | * to port where LLDP originated. |
276 | */ | 278 | */ |
277 | - @SuppressWarnings("rawtypes") | 279 | + public void handleLLDP(final byte[] pkt, Integer inPort) { |
278 | - public void handleLLDP(final Ethernet eth, Integer inPort) { | ||
279 | - | ||
280 | - final byte[] pkt = eth.serialize(); | ||
281 | 280 | ||
282 | - if (ONLabLddp.isOVXLLDP(pkt)) { | 281 | + short ethType = ONLabLddp.isOVXLLDP(pkt); |
282 | + if (ethType == Ethernet.TYPE_LLDP || ethType == Ethernet.TYPE_BSN) { | ||
283 | final Integer dstPort = inPort; | 283 | final Integer dstPort = inPort; |
284 | final DPIDandPort dp = ONLabLddp.parseLLDP(pkt); | 284 | final DPIDandPort dp = ONLabLddp.parseLLDP(pkt); |
285 | final OpenFlowSwitch srcSwitch = ctrl.getSwitch(new Dpid(dp.getDpid())); | 285 | final OpenFlowSwitch srcSwitch = ctrl.getSwitch(new Dpid(dp.getDpid())); |
... | @@ -296,7 +296,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -296,7 +296,7 @@ public class LinkDiscovery implements TimerTask { |
296 | DeviceId.deviceId("of:" + Long.toHexString(sw.getId())), | 296 | DeviceId.deviceId("of:" + Long.toHexString(sw.getId())), |
297 | PortNumber.portNumber(dstPort)); | 297 | PortNumber.portNumber(dstPort)); |
298 | LinkDescription ld; | 298 | LinkDescription ld; |
299 | - if (eth.getEtherType() == Ethernet.TYPE_BSN) { | 299 | + if (ethType == Ethernet.TYPE_BSN) { |
300 | ld = new DefaultLinkDescription(src, dst, Type.INDIRECT); | 300 | ld = new DefaultLinkDescription(src, dst, Type.INDIRECT); |
301 | } else { | 301 | } else { |
302 | ld = new DefaultLinkDescription(src, dst, Type.DIRECT); | 302 | ld = new DefaultLinkDescription(src, dst, Type.DIRECT); |
... | @@ -307,13 +307,8 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -307,13 +307,8 @@ public class LinkDiscovery implements TimerTask { |
307 | } | 307 | } |
308 | } | 308 | } |
309 | 309 | ||
310 | - private OFPortDesc findPort(List<OFPortDesc> ports, Integer inPort) { | 310 | + private OFPortDesc findPort(Integer inPort) { |
311 | - for (OFPortDesc p : ports) { | 311 | + return ports.get(inPort); |
312 | - if (p.getPortNo().getPortNumber() == inPort) { | ||
313 | - return p; | ||
314 | - } | ||
315 | - } | ||
316 | - return null; | ||
317 | } | 312 | } |
318 | 313 | ||
319 | /** | 314 | /** |
... | @@ -333,7 +328,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -333,7 +328,7 @@ public class LinkDiscovery implements TimerTask { |
333 | final Integer portNumber = fastIterator.next(); | 328 | final Integer portNumber = fastIterator.next(); |
334 | final int probeCount = this.portProbeCount.get(portNumber) | 329 | final int probeCount = this.portProbeCount.get(portNumber) |
335 | .getAndIncrement(); | 330 | .getAndIncrement(); |
336 | - OFPortDesc port = findPort(this.sw.getPorts(), portNumber); | 331 | + OFPortDesc port = findPort(portNumber); |
337 | if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) { | 332 | if (probeCount < LinkDiscovery.MAX_PROBE_COUNT) { |
338 | this.log.debug("sending fast probe to port"); | 333 | this.log.debug("sending fast probe to port"); |
339 | 334 | ||
... | @@ -368,7 +363,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -368,7 +363,7 @@ public class LinkDiscovery implements TimerTask { |
368 | if (this.slowIterator.hasNext()) { | 363 | if (this.slowIterator.hasNext()) { |
369 | final int portNumber = this.slowIterator.next(); | 364 | final int portNumber = this.slowIterator.next(); |
370 | this.log.debug("sending slow probe to port {}", portNumber); | 365 | this.log.debug("sending slow probe to port {}", portNumber); |
371 | - OFPortDesc port = findPort(this.sw.getPorts(), portNumber); | 366 | + OFPortDesc port = findPort(portNumber); |
372 | 367 | ||
373 | OFPacketOut pkt = this.createLLDPPacketOut(port); | 368 | OFPacketOut pkt = this.createLLDPPacketOut(port); |
374 | this.sendMsg(pkt); | 369 | this.sendMsg(pkt); | ... | ... |
... | @@ -87,7 +87,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid | ... | @@ -87,7 +87,7 @@ public class OpenFlowLinkProvider extends AbstractProvider implements LinkProvid |
87 | if (ld == null) { | 87 | if (ld == null) { |
88 | return; | 88 | return; |
89 | } | 89 | } |
90 | - ld.handleLLDP(pktCtx.parsed(), | 90 | + ld.handleLLDP(pktCtx.unparsed(), |
91 | pktCtx.inPort()); | 91 | pktCtx.inPort()); |
92 | 92 | ||
93 | } | 93 | } | ... | ... |
... | @@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory; | ... | @@ -30,7 +30,6 @@ import org.slf4j.LoggerFactory; |
30 | * Refer to IEEE Std 802.1ABTM-2009 for more information. | 30 | * Refer to IEEE Std 802.1ABTM-2009 for more information. |
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | -@SuppressWarnings("rawtypes") | ||
34 | public class ONLabLddp extends LLDP { | 33 | public class ONLabLddp extends LLDP { |
35 | 34 | ||
36 | private static final Logger log = LoggerFactory.getLogger(ONLabLddp.class); | 35 | private static final Logger log = LoggerFactory.getLogger(ONLabLddp.class); |
... | @@ -308,28 +307,34 @@ public class ONLabLddp extends LLDP { | ... | @@ -308,28 +307,34 @@ public class ONLabLddp extends LLDP { |
308 | * @param packet | 307 | * @param packet |
309 | * @return | 308 | * @return |
310 | */ | 309 | */ |
311 | - public static boolean isOVXLLDP(byte[] packet) { | 310 | + public static short isOVXLLDP(byte[] packet) { |
312 | if (packet.length < OVX_LLDP_SIZE) { | 311 | if (packet.length < OVX_LLDP_SIZE) { |
313 | - return false; | 312 | + return -1; |
314 | } | 313 | } |
315 | 314 | ||
316 | // Extra offset due to VLAN tag | 315 | // Extra offset due to VLAN tag |
317 | final ByteBuffer bb = ByteBuffer.wrap(packet); | 316 | final ByteBuffer bb = ByteBuffer.wrap(packet); |
318 | int offset = 0; | 317 | int offset = 0; |
319 | - if (bb.getShort(ETHERTYPE_OFFSET) != Ethernet.TYPE_LLDP | 318 | + short ethType = bb.getShort(ETHERTYPE_OFFSET); |
320 | - && bb.getShort(ETHERTYPE_OFFSET) != Ethernet.TYPE_BSN) { | 319 | + if (ethType != Ethernet.TYPE_LLDP |
320 | + && ethType != Ethernet.TYPE_BSN) { | ||
321 | offset = 4; | 321 | offset = 4; |
322 | + ethType = bb.getShort(ETHERTYPE_OFFSET + offset); | ||
323 | + if (ethType != Ethernet.TYPE_LLDP | ||
324 | + && ethType != Ethernet.TYPE_BSN) { | ||
325 | + return -1; | ||
326 | + } | ||
322 | } | 327 | } |
323 | 328 | ||
324 | // Compare packet's organizationally specific TLVs to the expected | 329 | // Compare packet's organizationally specific TLVs to the expected |
325 | // values | 330 | // values |
326 | for (int i = 0; i < OUI_TLV.length; i++) { | 331 | for (int i = 0; i < OUI_TLV.length; i++) { |
327 | if (packet[NAME_TLV_OFFSET + offset + i] != OUI_TLV[i]) { | 332 | if (packet[NAME_TLV_OFFSET + offset + i] != OUI_TLV[i]) { |
328 | - return false; | 333 | + return -1; |
329 | } | 334 | } |
330 | } | 335 | } |
331 | 336 | ||
332 | - return true; | 337 | + return ethType; |
333 | } | 338 | } |
334 | 339 | ||
335 | /** | 340 | /** | ... | ... |
-
Please register or login to post a comment