Committed by
Gerrit Code Review
Fix ProxyArp
Only handle packets that we are explicitly listening for Change-Id: I4f3121bbd94568b420eb1c6d15ba73fbcc8690ef
Showing
1 changed file
with
18 additions
and
12 deletions
... | @@ -23,6 +23,8 @@ import org.apache.felix.scr.annotations.Property; | ... | @@ -23,6 +23,8 @@ import org.apache.felix.scr.annotations.Property; |
23 | import org.apache.felix.scr.annotations.Reference; | 23 | import org.apache.felix.scr.annotations.Reference; |
24 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 24 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
25 | import org.onlab.packet.Ethernet; | 25 | import org.onlab.packet.Ethernet; |
26 | +import org.onlab.packet.ICMP6; | ||
27 | +import org.onlab.packet.IPv6; | ||
26 | import org.onosproject.cfg.ComponentConfigService; | 28 | import org.onosproject.cfg.ComponentConfigService; |
27 | import org.onosproject.core.ApplicationId; | 29 | import org.onosproject.core.ApplicationId; |
28 | import org.onosproject.core.CoreService; | 30 | import org.onosproject.core.CoreService; |
... | @@ -214,31 +216,35 @@ public class ProxyArp { | ... | @@ -214,31 +216,35 @@ public class ProxyArp { |
214 | if (context.isHandled()) { | 216 | if (context.isHandled()) { |
215 | return; | 217 | return; |
216 | } | 218 | } |
217 | - // If IPv6 NDP is disabled, don't handle IPv6 frames. | 219 | + |
218 | InboundPacket pkt = context.inPacket(); | 220 | InboundPacket pkt = context.inPacket(); |
219 | Ethernet ethPkt = pkt.parsed(); | 221 | Ethernet ethPkt = pkt.parsed(); |
220 | if (ethPkt == null) { | 222 | if (ethPkt == null) { |
221 | return; | 223 | return; |
222 | } | 224 | } |
223 | - if (!ipv6NeighborDiscovery && (ethPkt.getEtherType() == TYPE_IPV6)) { | 225 | + |
224 | - return; | 226 | + if (ethPkt.getEtherType() == TYPE_ARP) { |
227 | + //handle the arp packet. | ||
228 | + proxyArpService.handlePacket(context); | ||
229 | + } else if (ipv6NeighborDiscovery && ethPkt.getEtherType() == TYPE_IPV6) { | ||
230 | + IPv6 ipv6Pkt = (IPv6) ethPkt.getPayload(); | ||
231 | + if (ipv6Pkt.getNextHeader() == IPv6.PROTOCOL_ICMP6) { | ||
232 | + ICMP6 icmp6Pkt = (ICMP6) ipv6Pkt.getPayload(); | ||
233 | + if (icmp6Pkt.getIcmpType() == NEIGHBOR_SOLICITATION || | ||
234 | + icmp6Pkt.getIcmpType() == NEIGHBOR_ADVERTISEMENT) { | ||
235 | + // handle ICMPv6 solicitations and advertisements | ||
236 | + proxyArpService.handlePacket(context); | ||
237 | + } | ||
238 | + } | ||
225 | } | 239 | } |
226 | 240 | ||
241 | + // FIXME why were we listening to IPv4 frames at all? | ||
227 | // Do not ARP for multicast packets. Let mfwd handle them. | 242 | // Do not ARP for multicast packets. Let mfwd handle them. |
228 | if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) { | 243 | if (ethPkt.getEtherType() == Ethernet.TYPE_IPV4) { |
229 | if (ethPkt.getDestinationMAC().isMulticast()) { | 244 | if (ethPkt.getDestinationMAC().isMulticast()) { |
230 | return; | 245 | return; |
231 | } | 246 | } |
232 | } | 247 | } |
233 | - | ||
234 | - if (ethPkt.getEtherType() != TYPE_ARP && ethPkt.getEtherType() != TYPE_IPV6) { | ||
235 | - return; | ||
236 | - } | ||
237 | - | ||
238 | - //handle the arp packet. | ||
239 | - proxyArpService.handlePacket(context); | ||
240 | } | 248 | } |
241 | } | 249 | } |
242 | } | 250 | } |
243 | - | ||
244 | - | ... | ... |
-
Please register or login to post a comment