Handle packets that can't be deserialized properly.
Catch BufferUnderflowExceptions that occur while trying to deserialzed Ethernet packet, and account for the fact that packets may not have been deserialized correctly when using InboundPackets. Addresses ONOS-605. Change-Id: Ia7191e62a339125c9c4d3fe0cf63f9c33eb74cb5
Showing
6 changed files
with
46 additions
and
25 deletions
... | @@ -27,6 +27,7 @@ import org.apache.felix.scr.annotations.Modified; | ... | @@ -27,6 +27,7 @@ import org.apache.felix.scr.annotations.Modified; |
27 | import org.apache.felix.scr.annotations.Property; | 27 | import org.apache.felix.scr.annotations.Property; |
28 | import org.apache.felix.scr.annotations.Reference; | 28 | import org.apache.felix.scr.annotations.Reference; |
29 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
30 | +import org.onlab.packet.Ethernet; | ||
30 | import org.onosproject.core.ApplicationId; | 31 | import org.onosproject.core.ApplicationId; |
31 | import org.onosproject.core.CoreService; | 32 | import org.onosproject.core.CoreService; |
32 | import org.onosproject.net.Host; | 33 | import org.onosproject.net.Host; |
... | @@ -46,7 +47,6 @@ import org.onosproject.net.packet.PacketContext; | ... | @@ -46,7 +47,6 @@ import org.onosproject.net.packet.PacketContext; |
46 | import org.onosproject.net.packet.PacketProcessor; | 47 | import org.onosproject.net.packet.PacketProcessor; |
47 | import org.onosproject.net.packet.PacketService; | 48 | import org.onosproject.net.packet.PacketService; |
48 | import org.onosproject.net.topology.TopologyService; | 49 | import org.onosproject.net.topology.TopologyService; |
49 | -import org.onlab.packet.Ethernet; | ||
50 | import org.osgi.service.component.ComponentContext; | 50 | import org.osgi.service.component.ComponentContext; |
51 | import org.slf4j.Logger; | 51 | import org.slf4j.Logger; |
52 | 52 | ||
... | @@ -129,6 +129,10 @@ public class ReactiveForwarding { | ... | @@ -129,6 +129,10 @@ public class ReactiveForwarding { |
129 | InboundPacket pkt = context.inPacket(); | 129 | InboundPacket pkt = context.inPacket(); |
130 | Ethernet ethPkt = pkt.parsed(); | 130 | Ethernet ethPkt = pkt.parsed(); |
131 | 131 | ||
132 | + if (ethPkt == null) { | ||
133 | + return; | ||
134 | + } | ||
135 | + | ||
132 | // Bail if this is deemed to be a control or IPv6 multicast packet. | 136 | // Bail if this is deemed to be a control or IPv6 multicast packet. |
133 | if (isControlPacket(ethPkt) || isIpv6Multicast(ethPkt)) { | 137 | if (isControlPacket(ethPkt) || isIpv6Multicast(ethPkt)) { |
134 | return; | 138 | return; | ... | ... |
... | @@ -15,11 +15,14 @@ | ... | @@ -15,11 +15,14 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.ifwd; | 16 | package org.onosproject.ifwd; |
17 | 17 | ||
18 | +import static org.slf4j.LoggerFactory.getLogger; | ||
19 | + | ||
18 | import org.apache.felix.scr.annotations.Activate; | 20 | import org.apache.felix.scr.annotations.Activate; |
19 | import org.apache.felix.scr.annotations.Component; | 21 | import org.apache.felix.scr.annotations.Component; |
20 | import org.apache.felix.scr.annotations.Deactivate; | 22 | import org.apache.felix.scr.annotations.Deactivate; |
21 | import org.apache.felix.scr.annotations.Reference; | 23 | import org.apache.felix.scr.annotations.Reference; |
22 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 24 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
25 | +import org.onlab.packet.Ethernet; | ||
23 | import org.onosproject.core.ApplicationId; | 26 | import org.onosproject.core.ApplicationId; |
24 | import org.onosproject.core.CoreService; | 27 | import org.onosproject.core.CoreService; |
25 | import org.onosproject.net.Host; | 28 | import org.onosproject.net.Host; |
... | @@ -39,11 +42,8 @@ import org.onosproject.net.packet.PacketContext; | ... | @@ -39,11 +42,8 @@ import org.onosproject.net.packet.PacketContext; |
39 | import org.onosproject.net.packet.PacketProcessor; | 42 | import org.onosproject.net.packet.PacketProcessor; |
40 | import org.onosproject.net.packet.PacketService; | 43 | import org.onosproject.net.packet.PacketService; |
41 | import org.onosproject.net.topology.TopologyService; | 44 | import org.onosproject.net.topology.TopologyService; |
42 | -import org.onlab.packet.Ethernet; | ||
43 | import org.slf4j.Logger; | 45 | import org.slf4j.Logger; |
44 | 46 | ||
45 | -import static org.slf4j.LoggerFactory.getLogger; | ||
46 | - | ||
47 | /** | 47 | /** |
48 | * WORK-IN-PROGRESS: Sample reactive forwarding application using intent framework. | 48 | * WORK-IN-PROGRESS: Sample reactive forwarding application using intent framework. |
49 | */ | 49 | */ |
... | @@ -100,6 +100,10 @@ public class IntentReactiveForwarding { | ... | @@ -100,6 +100,10 @@ public class IntentReactiveForwarding { |
100 | InboundPacket pkt = context.inPacket(); | 100 | InboundPacket pkt = context.inPacket(); |
101 | Ethernet ethPkt = pkt.parsed(); | 101 | Ethernet ethPkt = pkt.parsed(); |
102 | 102 | ||
103 | + if (ethPkt == null) { | ||
104 | + return; | ||
105 | + } | ||
106 | + | ||
103 | HostId srcId = HostId.hostId(ethPkt.getSourceMAC()); | 107 | HostId srcId = HostId.hostId(ethPkt.getSourceMAC()); |
104 | HostId dstId = HostId.hostId(ethPkt.getDestinationMAC()); | 108 | HostId dstId = HostId.hostId(ethPkt.getDestinationMAC()); |
105 | 109 | ... | ... |
... | @@ -31,6 +31,12 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -31,6 +31,12 @@ import org.apache.felix.scr.annotations.Deactivate; |
31 | import org.apache.felix.scr.annotations.Reference; | 31 | import org.apache.felix.scr.annotations.Reference; |
32 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 32 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
33 | import org.apache.felix.scr.annotations.Service; | 33 | import org.apache.felix.scr.annotations.Service; |
34 | +import org.onlab.packet.ARP; | ||
35 | +import org.onlab.packet.Ethernet; | ||
36 | +import org.onlab.packet.Ip4Address; | ||
37 | +import org.onlab.packet.IpAddress; | ||
38 | +import org.onlab.packet.MacAddress; | ||
39 | +import org.onlab.packet.VlanId; | ||
34 | import org.onosproject.core.ApplicationId; | 40 | import org.onosproject.core.ApplicationId; |
35 | import org.onosproject.core.CoreService; | 41 | import org.onosproject.core.CoreService; |
36 | import org.onosproject.net.ConnectPoint; | 42 | import org.onosproject.net.ConnectPoint; |
... | @@ -61,12 +67,6 @@ import org.onosproject.net.packet.InboundPacket; | ... | @@ -61,12 +67,6 @@ import org.onosproject.net.packet.InboundPacket; |
61 | import org.onosproject.net.packet.PacketContext; | 67 | import org.onosproject.net.packet.PacketContext; |
62 | import org.onosproject.net.packet.PacketService; | 68 | import org.onosproject.net.packet.PacketService; |
63 | import org.onosproject.net.proxyarp.ProxyArpService; | 69 | import org.onosproject.net.proxyarp.ProxyArpService; |
64 | -import org.onlab.packet.ARP; | ||
65 | -import org.onlab.packet.Ethernet; | ||
66 | -import org.onlab.packet.Ip4Address; | ||
67 | -import org.onlab.packet.IpAddress; | ||
68 | -import org.onlab.packet.MacAddress; | ||
69 | -import org.onlab.packet.VlanId; | ||
70 | import org.slf4j.Logger; | 70 | import org.slf4j.Logger; |
71 | 71 | ||
72 | import com.google.common.collect.HashMultimap; | 72 | import com.google.common.collect.HashMultimap; |
... | @@ -309,7 +309,7 @@ public class ProxyArpManager implements ProxyArpService { | ... | @@ -309,7 +309,7 @@ public class ProxyArpManager implements ProxyArpService { |
309 | public boolean handleArp(PacketContext context) { | 309 | public boolean handleArp(PacketContext context) { |
310 | InboundPacket pkt = context.inPacket(); | 310 | InboundPacket pkt = context.inPacket(); |
311 | Ethernet ethPkt = pkt.parsed(); | 311 | Ethernet ethPkt = pkt.parsed(); |
312 | - if (ethPkt.getEtherType() == Ethernet.TYPE_ARP) { | 312 | + if (ethPkt != null && ethPkt.getEtherType() == Ethernet.TYPE_ARP) { |
313 | ARP arp = (ARP) ethPkt.getPayload(); | 313 | ARP arp = (ARP) ethPkt.getPayload(); |
314 | if (arp.getOpCode() == ARP.OP_REPLY) { | 314 | if (arp.getOpCode() == ARP.OP_REPLY) { |
315 | forward(ethPkt); | 315 | forward(ethPkt); | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.openflow.controller; | 16 | package org.onosproject.openflow.controller; |
17 | 17 | ||
18 | 18 | ||
19 | +import java.nio.BufferUnderflowException; | ||
19 | import java.util.Collections; | 20 | import java.util.Collections; |
20 | import java.util.concurrent.atomic.AtomicBoolean; | 21 | import java.util.concurrent.atomic.AtomicBoolean; |
21 | 22 | ||
... | @@ -85,8 +86,12 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext | ... | @@ -85,8 +86,12 @@ public final class DefaultOpenFlowPacketContext implements OpenFlowPacketContext |
85 | @Override | 86 | @Override |
86 | public Ethernet parsed() { | 87 | public Ethernet parsed() { |
87 | Ethernet eth = new Ethernet(); | 88 | Ethernet eth = new Ethernet(); |
88 | - eth.deserialize(pktin.getData(), 0, pktin.getTotalLen()); | 89 | + try { |
89 | - return eth; | 90 | + eth.deserialize(pktin.getData(), 0, pktin.getData().length); |
91 | + return eth; | ||
92 | + } catch (BufferUnderflowException e) { | ||
93 | + return null; | ||
94 | + } | ||
90 | } | 95 | } |
91 | 96 | ||
92 | @Override | 97 | @Override | ... | ... |
... | @@ -15,6 +15,11 @@ | ... | @@ -15,6 +15,11 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.provider.host.impl; | 16 | package org.onosproject.provider.host.impl; |
17 | 17 | ||
18 | +import static org.slf4j.LoggerFactory.getLogger; | ||
19 | + | ||
20 | +import java.util.Dictionary; | ||
21 | +import java.util.Set; | ||
22 | + | ||
18 | import org.apache.felix.scr.annotations.Activate; | 23 | import org.apache.felix.scr.annotations.Activate; |
19 | import org.apache.felix.scr.annotations.Component; | 24 | import org.apache.felix.scr.annotations.Component; |
20 | import org.apache.felix.scr.annotations.Deactivate; | 25 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -22,6 +27,10 @@ import org.apache.felix.scr.annotations.Modified; | ... | @@ -22,6 +27,10 @@ import org.apache.felix.scr.annotations.Modified; |
22 | import org.apache.felix.scr.annotations.Property; | 27 | import org.apache.felix.scr.annotations.Property; |
23 | import org.apache.felix.scr.annotations.Reference; | 28 | import org.apache.felix.scr.annotations.Reference; |
24 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
30 | +import org.onlab.packet.ARP; | ||
31 | +import org.onlab.packet.Ethernet; | ||
32 | +import org.onlab.packet.IpAddress; | ||
33 | +import org.onlab.packet.VlanId; | ||
25 | import org.onosproject.core.ApplicationId; | 34 | import org.onosproject.core.ApplicationId; |
26 | import org.onosproject.core.CoreService; | 35 | import org.onosproject.core.CoreService; |
27 | import org.onosproject.net.ConnectPoint; | 36 | import org.onosproject.net.ConnectPoint; |
... | @@ -53,18 +62,9 @@ import org.onosproject.net.provider.AbstractProvider; | ... | @@ -53,18 +62,9 @@ import org.onosproject.net.provider.AbstractProvider; |
53 | import org.onosproject.net.provider.ProviderId; | 62 | import org.onosproject.net.provider.ProviderId; |
54 | import org.onosproject.net.topology.Topology; | 63 | import org.onosproject.net.topology.Topology; |
55 | import org.onosproject.net.topology.TopologyService; | 64 | import org.onosproject.net.topology.TopologyService; |
56 | -import org.onlab.packet.ARP; | ||
57 | -import org.onlab.packet.Ethernet; | ||
58 | -import org.onlab.packet.IpAddress; | ||
59 | -import org.onlab.packet.VlanId; | ||
60 | import org.osgi.service.component.ComponentContext; | 65 | import org.osgi.service.component.ComponentContext; |
61 | import org.slf4j.Logger; | 66 | import org.slf4j.Logger; |
62 | 67 | ||
63 | -import java.util.Dictionary; | ||
64 | -import java.util.Set; | ||
65 | - | ||
66 | -import static org.slf4j.LoggerFactory.getLogger; | ||
67 | - | ||
68 | /** | 68 | /** |
69 | * Provider which uses an OpenFlow controller to detect network | 69 | * Provider which uses an OpenFlow controller to detect network |
70 | * end-station hosts. | 70 | * end-station hosts. |
... | @@ -197,6 +197,10 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid | ... | @@ -197,6 +197,10 @@ public class HostLocationProvider extends AbstractProvider implements HostProvid |
197 | } | 197 | } |
198 | Ethernet eth = context.inPacket().parsed(); | 198 | Ethernet eth = context.inPacket().parsed(); |
199 | 199 | ||
200 | + if (eth == null) { | ||
201 | + return; | ||
202 | + } | ||
203 | + | ||
200 | VlanId vlan = VlanId.vlanId(eth.getVlanID()); | 204 | VlanId vlan = VlanId.vlanId(eth.getVlanID()); |
201 | ConnectPoint heardOn = context.inPacket().receivedFrom(); | 205 | ConnectPoint heardOn = context.inPacket().receivedFrom(); |
202 | 206 | ... | ... |
... | @@ -33,6 +33,9 @@ import java.util.concurrent.atomic.AtomicInteger; | ... | @@ -33,6 +33,9 @@ import java.util.concurrent.atomic.AtomicInteger; |
33 | 33 | ||
34 | import org.jboss.netty.util.Timeout; | 34 | import org.jboss.netty.util.Timeout; |
35 | import org.jboss.netty.util.TimerTask; | 35 | import org.jboss.netty.util.TimerTask; |
36 | +import org.onlab.packet.Ethernet; | ||
37 | +import org.onlab.packet.ONOSLLDP; | ||
38 | +import org.onlab.util.Timer; | ||
36 | import org.onosproject.mastership.MastershipService; | 39 | import org.onosproject.mastership.MastershipService; |
37 | import org.onosproject.net.ConnectPoint; | 40 | import org.onosproject.net.ConnectPoint; |
38 | import org.onosproject.net.Device; | 41 | import org.onosproject.net.Device; |
... | @@ -47,9 +50,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket; | ... | @@ -47,9 +50,6 @@ import org.onosproject.net.packet.DefaultOutboundPacket; |
47 | import org.onosproject.net.packet.OutboundPacket; | 50 | import org.onosproject.net.packet.OutboundPacket; |
48 | import org.onosproject.net.packet.PacketContext; | 51 | import org.onosproject.net.packet.PacketContext; |
49 | import org.onosproject.net.packet.PacketService; | 52 | import org.onosproject.net.packet.PacketService; |
50 | -import org.onlab.packet.Ethernet; | ||
51 | -import org.onlab.packet.ONOSLLDP; | ||
52 | -import org.onlab.util.Timer; | ||
53 | import org.slf4j.Logger; | 53 | import org.slf4j.Logger; |
54 | 54 | ||
55 | // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages | 55 | // TODO: add 'fast discovery' mode: drop LLDPs in destination switch but listen for flow_removed messages |
... | @@ -208,6 +208,10 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -208,6 +208,10 @@ public class LinkDiscovery implements TimerTask { |
208 | */ | 208 | */ |
209 | public boolean handleLLDP(PacketContext context) { | 209 | public boolean handleLLDP(PacketContext context) { |
210 | Ethernet eth = context.inPacket().parsed(); | 210 | Ethernet eth = context.inPacket().parsed(); |
211 | + if (eth == null) { | ||
212 | + return false; | ||
213 | + } | ||
214 | + | ||
211 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); | 215 | ONOSLLDP onoslldp = ONOSLLDP.parseONOSLLDP(eth); |
212 | if (onoslldp != null) { | 216 | if (onoslldp != null) { |
213 | final PortNumber dstPort = | 217 | final PortNumber dstPort = | ... | ... |
-
Please register or login to post a comment