Charles M.C. Chan

Implement NDP-related classes

* Resolve ONOS-511
* Refactor: Move NDP-related classes into org.onlab.packet.ndp package
* Bugfix: payload is not properly set in testSerialize

Change-Id: Idb2dbfbd0297152c0e26ac2d5d5f8dba62824660
......@@ -48,8 +48,8 @@ import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IPacket;
import org.onlab.packet.IPv6;
import org.onlab.packet.NeighborAdvertisement;
import org.onlab.packet.NeighborSolicitation;
import org.onlab.packet.ndp.NeighborAdvertisement;
import org.onlab.packet.ndp.NeighborSolicitation;
import org.onlab.packet.VlanId;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
......
......@@ -18,6 +18,11 @@
package org.onlab.packet;
import org.onlab.packet.ndp.NeighborAdvertisement;
import org.onlab.packet.ndp.NeighborSolicitation;
import org.onlab.packet.ndp.Redirect;
import org.onlab.packet.ndp.RouterAdvertisement;
import org.onlab.packet.ndp.RouterSolicitation;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
......@@ -32,12 +37,16 @@ public class ICMP6 extends BasePacket {
public static final byte ROUTER_ADVERTISEMENT = (byte) 0x86;
public static final byte NEIGHBOR_SOLICITATION = (byte) 0x87;
public static final byte NEIGHBOR_ADVERTISEMENT = (byte) 0x88;
public static final byte REDIRECT = (byte) 0x89;
public static final Map<Byte, Class<? extends IPacket>> PROTOCOL_CLASS_MAP =
new HashMap<>();
static {
ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_SOLICITATION, RouterSolicitation.class);
ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_ADVERTISEMENT, RouterAdvertisement.class);
ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_SOLICITATION, NeighborSolicitation.class);
ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_ADVERTISEMENT, NeighborAdvertisement.class);
ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.REDIRECT, Redirect.class);
}
protected byte icmpType;
......
......@@ -16,13 +16,18 @@
package org.onlab.packet;
package org.onlab.packet.ndp;
import org.onlab.packet.BasePacket;
import org.onlab.packet.Data;
import org.onlab.packet.IPacket;
import org.onlab.packet.Ip6Address;
import java.nio.ByteBuffer;
import java.util.Arrays;
/**
* Implements ICMPv6 Neighbor Solicitation packet format. (RFC 4861)
* Implements ICMPv6 Neighbor Advertisement packet format. (RFC 4861)
*/
public class NeighborAdvertisement extends BasePacket {
public static final byte HEADER_LENGTH = 20; // bytes
......
......@@ -16,7 +16,12 @@
package org.onlab.packet;
package org.onlab.packet.ndp;
import org.onlab.packet.BasePacket;
import org.onlab.packet.Data;
import org.onlab.packet.IPacket;
import org.onlab.packet.Ip6Address;
import java.nio.ByteBuffer;
import java.util.Arrays;
......
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.onlab.packet.BasePacket;
import org.onlab.packet.Data;
import org.onlab.packet.IPacket;
import org.onlab.packet.Ip6Address;
import java.nio.ByteBuffer;
import java.util.Arrays;
/**
* Implements ICMPv6 Redirect packet format. (RFC 4861)
*/
public class Redirect extends BasePacket {
public static final byte HEADER_LENGTH = 36; // bytes
protected byte[] targetAddress = new byte[Ip6Address.BYTE_LENGTH];
protected byte[] destinationAddress = new byte[Ip6Address.BYTE_LENGTH];
/**
* Gets target address.
*
* @return the target IPv6 address
*/
public byte[] getTargetAddress() {
return this.targetAddress;
}
/**
* Sets target address.
*
* @param targetAddress the target IPv6 address to set
* @return this
*/
public Redirect setTargetAddress(final byte[] targetAddress) {
this.targetAddress = Arrays.copyOfRange(targetAddress, 0, Ip6Address.BYTE_LENGTH);
return this;
}
/**
* Gets destination address.
*
* @return the destination IPv6 address
*/
public byte[] getDestinationAddress() {
return this.destinationAddress;
}
/**
* Sets destination address.
*
* @param destinationAddress the destination IPv6 address to set
* @return this
*/
public Redirect setDestinationAddress(final byte[] destinationAddress) {
this.destinationAddress = Arrays.copyOfRange(destinationAddress, 0, Ip6Address.BYTE_LENGTH);
return this;
}
@Override
public byte[] serialize() {
byte[] payloadData = null;
if (this.payload != null) {
this.payload.setParent(this);
payloadData = this.payload.serialize();
}
int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
final byte[] data = new byte[HEADER_LENGTH + payloadLength];
final ByteBuffer bb = ByteBuffer.wrap(data);
bb.putInt(0);
bb.put(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
bb.put(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
if (payloadData != null) {
bb.put(payloadData);
}
return data;
}
@Override
public IPacket deserialize(byte[] data, int offset, int length) {
final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
bb.getInt();
bb.get(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
bb.get(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
this.payload = new Data();
this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
- bb.position());
this.payload.setParent(this);
return this;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 5807;
int result = super.hashCode();
ByteBuffer bb;
bb = ByteBuffer.wrap(this.targetAddress);
for (int i = 0; i < 4; i++) {
result = prime * result + bb.getInt();
}
bb = ByteBuffer.wrap(this.destinationAddress);
for (int i = 0; i < 4; i++) {
result = prime * result + bb.getInt();
}
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof Redirect)) {
return false;
}
final Redirect other = (Redirect) obj;
if (!Arrays.equals(this.targetAddress, other.targetAddress)) {
return false;
}
if (!Arrays.equals(this.destinationAddress, other.destinationAddress)) {
return false;
}
return true;
}
}
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.onlab.packet.BasePacket;
import org.onlab.packet.Data;
import org.onlab.packet.IPacket;
import java.nio.ByteBuffer;
/**
* Implements ICMPv6 Router Advertisement packet format. (RFC 4861)
*/
public class RouterAdvertisement extends BasePacket {
public static final byte HEADER_LENGTH = 12; // bytes
protected byte currentHopLimit;
protected byte mFlag;
protected byte oFlag;
protected short routerLifetime;
protected int reachableTime;
protected int retransmitTimer;
/**
* Gets current hop limit.
*
* @return the current hop limit
*/
public byte getCurrentHopLimit() {
return this.currentHopLimit;
}
/**
* Sets current hop limit.
*
* @param currentHopLimit the current hop limit to set
* @return this
*/
public RouterAdvertisement setCurrentHopLimit(final byte currentHopLimit) {
this.currentHopLimit = currentHopLimit;
return this;
}
/**
* Gets managed address configuration flag.
*
* @return the managed address configuration flag
*/
public byte getMFlag() {
return this.mFlag;
}
/**
* Sets managed address configuration flag.
*
* @param mFlag the managed address configuration flag to set
* @return this
*/
public RouterAdvertisement setMFlag(final byte mFlag) {
this.mFlag = mFlag;
return this;
}
/**
* Gets other configuration flag.
*
* @return the other configuration flag
*/
public byte getOFlag() {
return this.oFlag;
}
/**
* Sets other configuration flag.
*
* @param oFlag the other configuration flag to set
* @return this
*/
public RouterAdvertisement setOFlag(final byte oFlag) {
this.oFlag = oFlag;
return this;
}
/**
* Gets router lifetime.
*
* @return the router lifetime
*/
public short getRouterLifetime() {
return this.routerLifetime;
}
/**
* Sets router lifetime.
*
* @param routerLifetime the router lifetime to set
* @return this
*/
public RouterAdvertisement setRouterLifetime(final short routerLifetime) {
this.routerLifetime = routerLifetime;
return this;
}
/**
* Gets reachable time.
*
* @return the reachable time
*/
public int getReachableTime() {
return this.reachableTime;
}
/**
* Sets reachable time.
*
* @param reachableTime the reachable time to set
* @return this
*/
public RouterAdvertisement setReachableTime(final int reachableTime) {
this.reachableTime = reachableTime;
return this;
}
/**
* Gets retransmission timer.
*
* @return the retransmission timer
*/
public int getRetransmitTimer() {
return this.retransmitTimer;
}
/**
* Sets retransmission timer.
*
* @param retransmitTimer the retransmission timer to set
* @return this
*/
public RouterAdvertisement setRetransmitTimer(final int retransmitTimer) {
this.retransmitTimer = retransmitTimer;
return this;
}
@Override
public byte[] serialize() {
byte[] payloadData = null;
if (this.payload != null) {
this.payload.setParent(this);
payloadData = this.payload.serialize();
}
int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
final byte[] data = new byte[HEADER_LENGTH + payloadLength];
final ByteBuffer bb = ByteBuffer.wrap(data);
bb.put(this.currentHopLimit);
bb.put((byte) ((this.mFlag & 0x1) << 7 | (this.oFlag & 0x1) << 6));
bb.putShort(routerLifetime);
bb.putInt(reachableTime);
bb.putInt(retransmitTimer);
if (payloadData != null) {
bb.put(payloadData);
}
return data;
}
@Override
public IPacket deserialize(byte[] data, int offset, int length) {
final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
int bscratch;
this.currentHopLimit = bb.get();
bscratch = bb.get();
this.mFlag = (byte) ((bscratch >> 7) & 0x1);
this.oFlag = (byte) ((bscratch >> 6) & 0x1);
this.routerLifetime = bb.getShort();
this.reachableTime = bb.getInt();
this.retransmitTimer = bb.getInt();
this.payload = new Data();
this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
- bb.position());
this.payload.setParent(this);
return this;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 5807;
int result = super.hashCode();
result = prime * result + this.currentHopLimit;
result = prime * result + this.mFlag;
result = prime * result + this.oFlag;
result = prime * result + this.routerLifetime;
result = prime * result + this.reachableTime;
result = prime * result + this.retransmitTimer;
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof RouterAdvertisement)) {
return false;
}
final RouterAdvertisement other = (RouterAdvertisement) obj;
if (this.currentHopLimit != other.currentHopLimit) {
return false;
}
if (this.mFlag != other.mFlag) {
return false;
}
if (this.oFlag != other.oFlag) {
return false;
}
if (this.routerLifetime != other.routerLifetime) {
return false;
}
if (this.reachableTime != other.reachableTime) {
return false;
}
if (this.retransmitTimer != other.retransmitTimer) {
return false;
}
return true;
}
}
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.onlab.packet.BasePacket;
import org.onlab.packet.Data;
import org.onlab.packet.IPacket;
import java.nio.ByteBuffer;
/**
* Implements ICMPv6 Router Solicitation packet format. (RFC 4861)
*/
public class RouterSolicitation extends BasePacket {
public static final byte HEADER_LENGTH = 4; // bytes
@Override
public byte[] serialize() {
byte[] payloadData = null;
if (this.payload != null) {
this.payload.setParent(this);
payloadData = this.payload.serialize();
}
int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
final byte[] data = new byte[HEADER_LENGTH + payloadLength];
final ByteBuffer bb = ByteBuffer.wrap(data);
bb.putInt(0);
if (payloadData != null) {
bb.put(payloadData);
}
return data;
}
@Override
public IPacket deserialize(byte[] data, int offset, int length) {
final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
bb.getInt();
this.payload = new Data();
this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
- bb.position());
this.payload.setParent(this);
return this;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return super.hashCode();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
if (!(obj instanceof RouterSolicitation)) {
return false;
}
return true;
}
}
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Utilities for decoding and encoding packets of Neighbor Discovery Protocol
* for IPv6 (RFC 4861).
*/
package org.onlab.packet.ndp;
......@@ -16,13 +16,17 @@
package org.onlab.packet;
package org.onlab.packet.ndp;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.Data;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
/**
* Tests for class {@link NeighborAdvertisement}.
......@@ -61,6 +65,7 @@ public class NeighborAdvertisementTest {
na.setSolicitedFlag((byte) 1);
na.setOverrideFlag((byte) 1);
na.setTargetAddress(TARGET_ADDRESS);
na.setPayload(data);
assertArrayEquals(na.serialize(), bytePacket);
}
......
......@@ -16,15 +16,17 @@
package org.onlab.packet;
package org.onlab.packet.ndp;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.Data;
import static org.junit.Assert.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
/**
* Tests for class {@link org.onlab.packet.NeighborSolicitation}.
* Tests for class {@link NeighborSolicitation}.
*/
public class NeighborSolicitationTest {
private static final byte[] TARGET_ADDRESS = {
......@@ -61,6 +63,7 @@ public class NeighborSolicitationTest {
public void testSerialize() {
NeighborSolicitation ns = new NeighborSolicitation();
ns.setTargetAddress(TARGET_ADDRESS);
ns.setPayload(data);
assertArrayEquals(ns.serialize(), bytePacket);
}
......
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.Data;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
/**
* Tests for class {@link Redirect}.
*/
public class RedirectTest {
private static final byte[] TARGET_ADDRESS = {
(byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
};
private static final byte[] DESTINATION_ADDRESS = {
(byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
(byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
};
private static final byte[] DESTINATION_ADDRESS2 = {
(byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
(byte) 0xe6, (byte) 0xce, (byte) 0x8f, (byte) 0xff, (byte) 0xfe, (byte) 0x54, (byte) 0x37, (byte) 0xc8
};
private static Data data;
private static byte[] bytePacket;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
data = new Data();
data.setData("".getBytes());
byte[] bytePayload = data.serialize();
byte[] byteHeader = {
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
(byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
};
bytePacket = new byte[byteHeader.length + bytePayload.length];
System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
}
/**
* Tests serialize and setters.
*/
@Test
public void testSerialize() {
Redirect rd = new Redirect();
rd.setTargetAddress(TARGET_ADDRESS);
rd.setDestinationAddress(DESTINATION_ADDRESS);
rd.setPayload(data);
assertArrayEquals(rd.serialize(), bytePacket);
}
/**
* Tests deserialize and getters.
*/
@Test
public void testDeserialize() {
Redirect rd = new Redirect();
rd.deserialize(bytePacket, 0, bytePacket.length);
assertArrayEquals(rd.getTargetAddress(), TARGET_ADDRESS);
assertArrayEquals(rd.getDestinationAddress(), DESTINATION_ADDRESS);
}
/**
* Tests comparator.
*/
@Test
public void testEqual() {
Redirect rd1 = new Redirect();
rd1.setTargetAddress(TARGET_ADDRESS);
rd1.setDestinationAddress(DESTINATION_ADDRESS);
Redirect rd2 = new Redirect();
rd2.setTargetAddress(TARGET_ADDRESS);
rd2.setDestinationAddress(DESTINATION_ADDRESS2);
assertTrue(rd1.equals(rd1));
assertFalse(rd1.equals(rd2));
}
}
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.Data;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* Tests for class {@link RouterAdvertisement}.
*/
public class RouterAdvertisementTest {
private static Data data;
private static byte[] bytePacket;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
data = new Data();
data.setData("".getBytes());
byte[] bytePayload = data.serialize();
byte[] byteHeader = {
(byte) 0x03, (byte) 0xc0, (byte) 0x02, (byte) 0x58,
(byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0xe8,
(byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xf4
};
bytePacket = new byte[byteHeader.length + bytePayload.length];
System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
}
/**
* Tests serialize and setters.
*/
@Test
public void testSerialize() {
RouterAdvertisement ra = new RouterAdvertisement();
ra.setCurrentHopLimit((byte) 3);
ra.setMFlag((byte) 1);
ra.setOFlag((byte) 1);
ra.setRouterLifetime((short) 0x258);
ra.setReachableTime(0x3e8);
ra.setRetransmitTimer(0x1f4);
ra.setPayload(data);
assertArrayEquals(ra.serialize(), bytePacket);
}
/**
* Tests deserialize and getters.
*/
@Test
public void testDeserialize() {
RouterAdvertisement ra = new RouterAdvertisement();
ra.deserialize(bytePacket, 0, bytePacket.length);
assertThat(ra.getCurrentHopLimit(), is((byte) 3));
assertThat(ra.getMFlag(), is((byte) 1));
assertThat(ra.getOFlag(), is((byte) 1));
assertThat(ra.getRouterLifetime(), is((short) 0x258));
assertThat(ra.getReachableTime(), is(0x3e8));
assertThat(ra.getRetransmitTimer(), is(0x1f4));
}
/**
* Tests comparator.
*/
@Test
public void testEqual() {
RouterAdvertisement ra1 = new RouterAdvertisement();
ra1.setCurrentHopLimit((byte) 3);
ra1.setMFlag((byte) 1);
ra1.setOFlag((byte) 1);
ra1.setRouterLifetime((short) 0x258);
ra1.setReachableTime(0x3e8);
ra1.setRetransmitTimer(0x1f4);
RouterAdvertisement ra2 = new RouterAdvertisement();
ra2.setCurrentHopLimit((byte) 3);
ra2.setMFlag((byte) 0);
ra2.setOFlag((byte) 0);
ra2.setRouterLifetime((short) 0x1f4);
ra2.setReachableTime(0x3e8);
ra2.setRetransmitTimer(0x1f4);
assertTrue(ra1.equals(ra1));
assertFalse(ra1.equals(ra2));
}
}
/*
* Copyright 2014 Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.packet.ndp;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.Data;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
/**
* Tests for class {@link RouterSolicitation}.
*/
public class RouterSolicitationTest {
private static final byte[] OPTION = {
(byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
};
private static Data data;
private static byte[] bytePacket;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
data = new Data();
data.setData(OPTION);
byte[] bytePayload = data.serialize();
byte[] byteHeader = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
bytePacket = new byte[byteHeader.length + bytePayload.length];
System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
}
/**
* Tests serialize and setters.
*/
@Test
public void testSerialize() {
RouterSolicitation rs = new RouterSolicitation();
rs.setPayload(data);
assertArrayEquals(rs.serialize(), bytePacket);
}
/**
* Tests deserialize and getters.
*/
@Test
public void testDeserialize() {
RouterSolicitation rs = new RouterSolicitation();
rs.deserialize(bytePacket, 0, bytePacket.length);
}
/**
* Tests comparator.
*/
@Test
public void testEqual() {
RouterSolicitation rs1 = new RouterSolicitation();
assertTrue(rs1.equals(rs1));
}
}