Fix a bug when serliazing ICMPv6 packets and the IPv6 packet contains
hop-by-hop options. This fixes ONOS-1201 Change-Id: I736f96268695dd7e74c99631f25273d1b34d8a6c
Showing
1 changed file
with
24 additions
and
4 deletions
| ... | @@ -18,6 +18,7 @@ | ... | @@ -18,6 +18,7 @@ |
| 18 | 18 | ||
| 19 | package org.onlab.packet; | 19 | package org.onlab.packet; |
| 20 | 20 | ||
| 21 | +import org.onlab.packet.ipv6.IExtensionHeader; | ||
| 21 | import org.onlab.packet.ndp.NeighborAdvertisement; | 22 | import org.onlab.packet.ndp.NeighborAdvertisement; |
| 22 | import org.onlab.packet.ndp.NeighborSolicitation; | 23 | import org.onlab.packet.ndp.NeighborSolicitation; |
| 23 | import org.onlab.packet.ndp.Redirect; | 24 | import org.onlab.packet.ndp.Redirect; |
| ... | @@ -53,6 +54,8 @@ public class ICMP6 extends BasePacket { | ... | @@ -53,6 +54,8 @@ public class ICMP6 extends BasePacket { |
| 53 | protected byte icmpCode; | 54 | protected byte icmpCode; |
| 54 | protected short checksum; | 55 | protected short checksum; |
| 55 | 56 | ||
| 57 | + private static final byte[] ZERO_ADDRESS = new byte[Ip6Address.BYTE_LENGTH]; | ||
| 58 | + | ||
| 56 | /** | 59 | /** |
| 57 | * Gets ICMP6 type. | 60 | * Gets ICMP6 type. |
| 58 | * | 61 | * |
| ... | @@ -138,8 +141,21 @@ public class ICMP6 extends BasePacket { | ... | @@ -138,8 +141,21 @@ public class ICMP6 extends BasePacket { |
| 138 | // Creating IPv6 Pseudo Header for checksum calculation according | 141 | // Creating IPv6 Pseudo Header for checksum calculation according |
| 139 | // to RFC 4443 and RFC 2460 | 142 | // to RFC 4443 and RFC 2460 |
| 140 | // | 143 | // |
| 141 | - bbChecksum.put(((IPv6) this.parent).getSourceAddress()); | 144 | + IPv6 ipv6Parent = null; |
| 142 | - bbChecksum.put(((IPv6) this.parent).getDestinationAddress()); | 145 | + for (IPacket p = this.parent; p != null; p = p.getParent()) { |
| 146 | + if (p instanceof IPv6) { | ||
| 147 | + ipv6Parent = (IPv6) p; | ||
| 148 | + break; | ||
| 149 | + } | ||
| 150 | + } | ||
| 151 | + if (ipv6Parent != null) { | ||
| 152 | + bbChecksum.put(((IPv6) ipv6Parent).getSourceAddress()); | ||
| 153 | + bbChecksum.put(((IPv6) ipv6Parent).getDestinationAddress()); | ||
| 154 | + } else { | ||
| 155 | + // NOTE: IPv6 source and destination addresses unknown. Use zeroes. | ||
| 156 | + bbChecksum.put(ZERO_ADDRESS); | ||
| 157 | + bbChecksum.put(ZERO_ADDRESS); | ||
| 158 | + } | ||
| 143 | bbChecksum.putInt(HEADER_LENGTH + payloadLength); | 159 | bbChecksum.putInt(HEADER_LENGTH + payloadLength); |
| 144 | bbChecksum.put((byte) 0); | 160 | bbChecksum.put((byte) 0); |
| 145 | bbChecksum.put((byte) 0); | 161 | bbChecksum.put((byte) 0); |
| ... | @@ -158,8 +174,12 @@ public class ICMP6 extends BasePacket { | ... | @@ -158,8 +174,12 @@ public class ICMP6 extends BasePacket { |
| 158 | bbChecksum.put(payloadData); | 174 | bbChecksum.put(payloadData); |
| 159 | } | 175 | } |
| 160 | 176 | ||
| 161 | - if (this.parent != null && this.parent instanceof IPv6) { | 177 | + if (this.parent != null) { |
| 162 | - ((IPv6) this.parent).setNextHeader(IPv6.PROTOCOL_ICMP6); | 178 | + if (this.parent instanceof IPv6) { |
| 179 | + ((IPv6) this.parent).setNextHeader(IPv6.PROTOCOL_ICMP6); | ||
| 180 | + } else if (this.parent instanceof IExtensionHeader) { | ||
| 181 | + ((IExtensionHeader) this.parent).setNextHeader(IPv6.PROTOCOL_ICMP6); | ||
| 182 | + } | ||
| 163 | } | 183 | } |
| 164 | 184 | ||
| 165 | // compute checksum if needed | 185 | // compute checksum if needed | ... | ... |
-
Please register or login to post a comment