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; ...@@ -48,8 +48,8 @@ import org.onlab.packet.Ethernet;
48 import org.onlab.packet.IpAddress; 48 import org.onlab.packet.IpAddress;
49 import org.onlab.packet.IPacket; 49 import org.onlab.packet.IPacket;
50 import org.onlab.packet.IPv6; 50 import org.onlab.packet.IPv6;
51 -import org.onlab.packet.NeighborAdvertisement; 51 +import org.onlab.packet.ndp.NeighborAdvertisement;
52 -import org.onlab.packet.NeighborSolicitation; 52 +import org.onlab.packet.ndp.NeighborSolicitation;
53 import org.onlab.packet.VlanId; 53 import org.onlab.packet.VlanId;
54 import org.osgi.service.component.ComponentContext; 54 import org.osgi.service.component.ComponentContext;
55 import org.slf4j.Logger; 55 import org.slf4j.Logger;
......
...@@ -18,6 +18,11 @@ ...@@ -18,6 +18,11 @@
18 18
19 package org.onlab.packet; 19 package org.onlab.packet;
20 20
21 +import org.onlab.packet.ndp.NeighborAdvertisement;
22 +import org.onlab.packet.ndp.NeighborSolicitation;
23 +import org.onlab.packet.ndp.Redirect;
24 +import org.onlab.packet.ndp.RouterAdvertisement;
25 +import org.onlab.packet.ndp.RouterSolicitation;
21 import java.nio.ByteBuffer; 26 import java.nio.ByteBuffer;
22 import java.util.HashMap; 27 import java.util.HashMap;
23 import java.util.Map; 28 import java.util.Map;
...@@ -32,12 +37,16 @@ public class ICMP6 extends BasePacket { ...@@ -32,12 +37,16 @@ public class ICMP6 extends BasePacket {
32 public static final byte ROUTER_ADVERTISEMENT = (byte) 0x86; 37 public static final byte ROUTER_ADVERTISEMENT = (byte) 0x86;
33 public static final byte NEIGHBOR_SOLICITATION = (byte) 0x87; 38 public static final byte NEIGHBOR_SOLICITATION = (byte) 0x87;
34 public static final byte NEIGHBOR_ADVERTISEMENT = (byte) 0x88; 39 public static final byte NEIGHBOR_ADVERTISEMENT = (byte) 0x88;
40 + public static final byte REDIRECT = (byte) 0x89;
35 public static final Map<Byte, Class<? extends IPacket>> PROTOCOL_CLASS_MAP = 41 public static final Map<Byte, Class<? extends IPacket>> PROTOCOL_CLASS_MAP =
36 new HashMap<>(); 42 new HashMap<>();
37 43
38 static { 44 static {
45 + ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_SOLICITATION, RouterSolicitation.class);
46 + ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.ROUTER_ADVERTISEMENT, RouterAdvertisement.class);
39 ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_SOLICITATION, NeighborSolicitation.class); 47 ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_SOLICITATION, NeighborSolicitation.class);
40 ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_ADVERTISEMENT, NeighborAdvertisement.class); 48 ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.NEIGHBOR_ADVERTISEMENT, NeighborAdvertisement.class);
49 + ICMP6.PROTOCOL_CLASS_MAP.put(ICMP6.REDIRECT, Redirect.class);
41 } 50 }
42 51
43 protected byte icmpType; 52 protected byte icmpType;
......
...@@ -16,13 +16,18 @@ ...@@ -16,13 +16,18 @@
16 16
17 17
18 18
19 -package org.onlab.packet; 19 +package org.onlab.packet.ndp;
20 +
21 +import org.onlab.packet.BasePacket;
22 +import org.onlab.packet.Data;
23 +import org.onlab.packet.IPacket;
24 +import org.onlab.packet.Ip6Address;
20 25
21 import java.nio.ByteBuffer; 26 import java.nio.ByteBuffer;
22 import java.util.Arrays; 27 import java.util.Arrays;
23 28
24 /** 29 /**
25 - * Implements ICMPv6 Neighbor Solicitation packet format. (RFC 4861) 30 + * Implements ICMPv6 Neighbor Advertisement packet format. (RFC 4861)
26 */ 31 */
27 public class NeighborAdvertisement extends BasePacket { 32 public class NeighborAdvertisement extends BasePacket {
28 public static final byte HEADER_LENGTH = 20; // bytes 33 public static final byte HEADER_LENGTH = 20; // bytes
......
...@@ -16,7 +16,12 @@ ...@@ -16,7 +16,12 @@
16 16
17 17
18 18
19 -package org.onlab.packet; 19 +package org.onlab.packet.ndp;
20 +
21 +import org.onlab.packet.BasePacket;
22 +import org.onlab.packet.Data;
23 +import org.onlab.packet.IPacket;
24 +import org.onlab.packet.Ip6Address;
20 25
21 import java.nio.ByteBuffer; 26 import java.nio.ByteBuffer;
22 import java.util.Arrays; 27 import java.util.Arrays;
......
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.onlab.packet.BasePacket;
22 +import org.onlab.packet.Data;
23 +import org.onlab.packet.IPacket;
24 +import org.onlab.packet.Ip6Address;
25 +
26 +import java.nio.ByteBuffer;
27 +import java.util.Arrays;
28 +
29 +/**
30 + * Implements ICMPv6 Redirect packet format. (RFC 4861)
31 + */
32 +public class Redirect extends BasePacket {
33 + public static final byte HEADER_LENGTH = 36; // bytes
34 +
35 + protected byte[] targetAddress = new byte[Ip6Address.BYTE_LENGTH];
36 + protected byte[] destinationAddress = new byte[Ip6Address.BYTE_LENGTH];
37 +
38 + /**
39 + * Gets target address.
40 + *
41 + * @return the target IPv6 address
42 + */
43 + public byte[] getTargetAddress() {
44 + return this.targetAddress;
45 + }
46 +
47 + /**
48 + * Sets target address.
49 + *
50 + * @param targetAddress the target IPv6 address to set
51 + * @return this
52 + */
53 + public Redirect setTargetAddress(final byte[] targetAddress) {
54 + this.targetAddress = Arrays.copyOfRange(targetAddress, 0, Ip6Address.BYTE_LENGTH);
55 + return this;
56 + }
57 +
58 + /**
59 + * Gets destination address.
60 + *
61 + * @return the destination IPv6 address
62 + */
63 + public byte[] getDestinationAddress() {
64 + return this.destinationAddress;
65 + }
66 +
67 + /**
68 + * Sets destination address.
69 + *
70 + * @param destinationAddress the destination IPv6 address to set
71 + * @return this
72 + */
73 + public Redirect setDestinationAddress(final byte[] destinationAddress) {
74 + this.destinationAddress = Arrays.copyOfRange(destinationAddress, 0, Ip6Address.BYTE_LENGTH);
75 + return this;
76 + }
77 +
78 + @Override
79 + public byte[] serialize() {
80 + byte[] payloadData = null;
81 + if (this.payload != null) {
82 + this.payload.setParent(this);
83 + payloadData = this.payload.serialize();
84 + }
85 +
86 + int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
87 +
88 + final byte[] data = new byte[HEADER_LENGTH + payloadLength];
89 + final ByteBuffer bb = ByteBuffer.wrap(data);
90 +
91 + bb.putInt(0);
92 + bb.put(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
93 + bb.put(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
94 +
95 + if (payloadData != null) {
96 + bb.put(payloadData);
97 + }
98 +
99 + return data;
100 + }
101 +
102 + @Override
103 + public IPacket deserialize(byte[] data, int offset, int length) {
104 + final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
105 +
106 + bb.getInt();
107 + bb.get(this.targetAddress, 0, Ip6Address.BYTE_LENGTH);
108 + bb.get(this.destinationAddress, 0, Ip6Address.BYTE_LENGTH);
109 +
110 + this.payload = new Data();
111 + this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
112 + - bb.position());
113 + this.payload.setParent(this);
114 +
115 + return this;
116 + }
117 +
118 + /*
119 + * (non-Javadoc)
120 + *
121 + * @see java.lang.Object#hashCode()
122 + */
123 + @Override
124 + public int hashCode() {
125 + final int prime = 5807;
126 + int result = super.hashCode();
127 + ByteBuffer bb;
128 + bb = ByteBuffer.wrap(this.targetAddress);
129 + for (int i = 0; i < 4; i++) {
130 + result = prime * result + bb.getInt();
131 + }
132 + bb = ByteBuffer.wrap(this.destinationAddress);
133 + for (int i = 0; i < 4; i++) {
134 + result = prime * result + bb.getInt();
135 + }
136 + return result;
137 + }
138 +
139 + /*
140 + * (non-Javadoc)
141 + *
142 + * @see java.lang.Object#equals(java.lang.Object)
143 + */
144 + @Override
145 + public boolean equals(final Object obj) {
146 + if (this == obj) {
147 + return true;
148 + }
149 + if (!super.equals(obj)) {
150 + return false;
151 + }
152 + if (!(obj instanceof Redirect)) {
153 + return false;
154 + }
155 + final Redirect other = (Redirect) obj;
156 + if (!Arrays.equals(this.targetAddress, other.targetAddress)) {
157 + return false;
158 + }
159 + if (!Arrays.equals(this.destinationAddress, other.destinationAddress)) {
160 + return false;
161 + }
162 + return true;
163 + }
164 +}
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.onlab.packet.BasePacket;
22 +import org.onlab.packet.Data;
23 +import org.onlab.packet.IPacket;
24 +
25 +import java.nio.ByteBuffer;
26 +
27 +/**
28 + * Implements ICMPv6 Router Advertisement packet format. (RFC 4861)
29 + */
30 +public class RouterAdvertisement extends BasePacket {
31 + public static final byte HEADER_LENGTH = 12; // bytes
32 +
33 + protected byte currentHopLimit;
34 + protected byte mFlag;
35 + protected byte oFlag;
36 + protected short routerLifetime;
37 + protected int reachableTime;
38 + protected int retransmitTimer;
39 +
40 + /**
41 + * Gets current hop limit.
42 + *
43 + * @return the current hop limit
44 + */
45 + public byte getCurrentHopLimit() {
46 + return this.currentHopLimit;
47 + }
48 +
49 + /**
50 + * Sets current hop limit.
51 + *
52 + * @param currentHopLimit the current hop limit to set
53 + * @return this
54 + */
55 + public RouterAdvertisement setCurrentHopLimit(final byte currentHopLimit) {
56 + this.currentHopLimit = currentHopLimit;
57 + return this;
58 + }
59 +
60 + /**
61 + * Gets managed address configuration flag.
62 + *
63 + * @return the managed address configuration flag
64 + */
65 + public byte getMFlag() {
66 + return this.mFlag;
67 + }
68 +
69 + /**
70 + * Sets managed address configuration flag.
71 + *
72 + * @param mFlag the managed address configuration flag to set
73 + * @return this
74 + */
75 + public RouterAdvertisement setMFlag(final byte mFlag) {
76 + this.mFlag = mFlag;
77 + return this;
78 + }
79 +
80 + /**
81 + * Gets other configuration flag.
82 + *
83 + * @return the other configuration flag
84 + */
85 + public byte getOFlag() {
86 + return this.oFlag;
87 + }
88 +
89 + /**
90 + * Sets other configuration flag.
91 + *
92 + * @param oFlag the other configuration flag to set
93 + * @return this
94 + */
95 + public RouterAdvertisement setOFlag(final byte oFlag) {
96 + this.oFlag = oFlag;
97 + return this;
98 + }
99 +
100 + /**
101 + * Gets router lifetime.
102 + *
103 + * @return the router lifetime
104 + */
105 + public short getRouterLifetime() {
106 + return this.routerLifetime;
107 + }
108 +
109 + /**
110 + * Sets router lifetime.
111 + *
112 + * @param routerLifetime the router lifetime to set
113 + * @return this
114 + */
115 + public RouterAdvertisement setRouterLifetime(final short routerLifetime) {
116 + this.routerLifetime = routerLifetime;
117 + return this;
118 + }
119 +
120 + /**
121 + * Gets reachable time.
122 + *
123 + * @return the reachable time
124 + */
125 + public int getReachableTime() {
126 + return this.reachableTime;
127 + }
128 +
129 + /**
130 + * Sets reachable time.
131 + *
132 + * @param reachableTime the reachable time to set
133 + * @return this
134 + */
135 + public RouterAdvertisement setReachableTime(final int reachableTime) {
136 + this.reachableTime = reachableTime;
137 + return this;
138 + }
139 +
140 + /**
141 + * Gets retransmission timer.
142 + *
143 + * @return the retransmission timer
144 + */
145 + public int getRetransmitTimer() {
146 + return this.retransmitTimer;
147 + }
148 +
149 + /**
150 + * Sets retransmission timer.
151 + *
152 + * @param retransmitTimer the retransmission timer to set
153 + * @return this
154 + */
155 + public RouterAdvertisement setRetransmitTimer(final int retransmitTimer) {
156 + this.retransmitTimer = retransmitTimer;
157 + return this;
158 + }
159 +
160 + @Override
161 + public byte[] serialize() {
162 + byte[] payloadData = null;
163 + if (this.payload != null) {
164 + this.payload.setParent(this);
165 + payloadData = this.payload.serialize();
166 + }
167 +
168 + int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
169 +
170 + final byte[] data = new byte[HEADER_LENGTH + payloadLength];
171 + final ByteBuffer bb = ByteBuffer.wrap(data);
172 +
173 + bb.put(this.currentHopLimit);
174 + bb.put((byte) ((this.mFlag & 0x1) << 7 | (this.oFlag & 0x1) << 6));
175 + bb.putShort(routerLifetime);
176 + bb.putInt(reachableTime);
177 + bb.putInt(retransmitTimer);
178 +
179 + if (payloadData != null) {
180 + bb.put(payloadData);
181 + }
182 +
183 + return data;
184 + }
185 +
186 + @Override
187 + public IPacket deserialize(byte[] data, int offset, int length) {
188 + final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
189 + int bscratch;
190 +
191 + this.currentHopLimit = bb.get();
192 + bscratch = bb.get();
193 + this.mFlag = (byte) ((bscratch >> 7) & 0x1);
194 + this.oFlag = (byte) ((bscratch >> 6) & 0x1);
195 + this.routerLifetime = bb.getShort();
196 + this.reachableTime = bb.getInt();
197 + this.retransmitTimer = bb.getInt();
198 +
199 + this.payload = new Data();
200 + this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
201 + - bb.position());
202 + this.payload.setParent(this);
203 +
204 + return this;
205 + }
206 +
207 + /*
208 + * (non-Javadoc)
209 + *
210 + * @see java.lang.Object#hashCode()
211 + */
212 + @Override
213 + public int hashCode() {
214 + final int prime = 5807;
215 + int result = super.hashCode();
216 + result = prime * result + this.currentHopLimit;
217 + result = prime * result + this.mFlag;
218 + result = prime * result + this.oFlag;
219 + result = prime * result + this.routerLifetime;
220 + result = prime * result + this.reachableTime;
221 + result = prime * result + this.retransmitTimer;
222 + return result;
223 + }
224 +
225 + /*
226 + * (non-Javadoc)
227 + *
228 + * @see java.lang.Object#equals(java.lang.Object)
229 + */
230 + @Override
231 + public boolean equals(final Object obj) {
232 + if (this == obj) {
233 + return true;
234 + }
235 + if (!super.equals(obj)) {
236 + return false;
237 + }
238 + if (!(obj instanceof RouterAdvertisement)) {
239 + return false;
240 + }
241 + final RouterAdvertisement other = (RouterAdvertisement) obj;
242 + if (this.currentHopLimit != other.currentHopLimit) {
243 + return false;
244 + }
245 + if (this.mFlag != other.mFlag) {
246 + return false;
247 + }
248 + if (this.oFlag != other.oFlag) {
249 + return false;
250 + }
251 + if (this.routerLifetime != other.routerLifetime) {
252 + return false;
253 + }
254 + if (this.reachableTime != other.reachableTime) {
255 + return false;
256 + }
257 + if (this.retransmitTimer != other.retransmitTimer) {
258 + return false;
259 + }
260 + return true;
261 + }
262 +}
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.onlab.packet.BasePacket;
22 +import org.onlab.packet.Data;
23 +import org.onlab.packet.IPacket;
24 +
25 +import java.nio.ByteBuffer;
26 +
27 +/**
28 + * Implements ICMPv6 Router Solicitation packet format. (RFC 4861)
29 + */
30 +public class RouterSolicitation extends BasePacket {
31 + public static final byte HEADER_LENGTH = 4; // bytes
32 +
33 + @Override
34 + public byte[] serialize() {
35 + byte[] payloadData = null;
36 + if (this.payload != null) {
37 + this.payload.setParent(this);
38 + payloadData = this.payload.serialize();
39 + }
40 +
41 + int payloadLength = payloadData == null ? 0 : (short) payloadData.length;
42 +
43 + final byte[] data = new byte[HEADER_LENGTH + payloadLength];
44 + final ByteBuffer bb = ByteBuffer.wrap(data);
45 +
46 + bb.putInt(0);
47 +
48 + if (payloadData != null) {
49 + bb.put(payloadData);
50 + }
51 +
52 + return data;
53 + }
54 +
55 + @Override
56 + public IPacket deserialize(byte[] data, int offset, int length) {
57 + final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
58 +
59 + bb.getInt();
60 +
61 + this.payload = new Data();
62 + this.payload = this.payload.deserialize(data, bb.position(), bb.limit()
63 + - bb.position());
64 + this.payload.setParent(this);
65 +
66 + return this;
67 + }
68 +
69 + /*
70 + * (non-Javadoc)
71 + *
72 + * @see java.lang.Object#hashCode()
73 + */
74 + @Override
75 + public int hashCode() {
76 + return super.hashCode();
77 + }
78 +
79 + /*
80 + * (non-Javadoc)
81 + *
82 + * @see java.lang.Object#equals(java.lang.Object)
83 + */
84 + @Override
85 + public boolean equals(final Object obj) {
86 + if (this == obj) {
87 + return true;
88 + }
89 + if (!super.equals(obj)) {
90 + return false;
91 + }
92 + if (!(obj instanceof RouterSolicitation)) {
93 + return false;
94 + }
95 + return true;
96 + }
97 +}
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +/**
18 + * Utilities for decoding and encoding packets of Neighbor Discovery Protocol
19 + * for IPv6 (RFC 4861).
20 + */
21 +package org.onlab.packet.ndp;
...@@ -16,13 +16,17 @@ ...@@ -16,13 +16,17 @@
16 16
17 17
18 18
19 -package org.onlab.packet; 19 +package org.onlab.packet.ndp;
20 20
21 import org.junit.BeforeClass; 21 import org.junit.BeforeClass;
22 import org.junit.Test; 22 import org.junit.Test;
23 +import org.onlab.packet.Data;
23 24
24 import static org.hamcrest.Matchers.is; 25 import static org.hamcrest.Matchers.is;
25 -import static org.junit.Assert.*; 26 +import static org.junit.Assert.assertArrayEquals;
27 +import static org.junit.Assert.assertTrue;
28 +import static org.junit.Assert.assertFalse;
29 +import static org.junit.Assert.assertThat;
26 30
27 /** 31 /**
28 * Tests for class {@link NeighborAdvertisement}. 32 * Tests for class {@link NeighborAdvertisement}.
...@@ -61,6 +65,7 @@ public class NeighborAdvertisementTest { ...@@ -61,6 +65,7 @@ public class NeighborAdvertisementTest {
61 na.setSolicitedFlag((byte) 1); 65 na.setSolicitedFlag((byte) 1);
62 na.setOverrideFlag((byte) 1); 66 na.setOverrideFlag((byte) 1);
63 na.setTargetAddress(TARGET_ADDRESS); 67 na.setTargetAddress(TARGET_ADDRESS);
68 + na.setPayload(data);
64 69
65 assertArrayEquals(na.serialize(), bytePacket); 70 assertArrayEquals(na.serialize(), bytePacket);
66 } 71 }
......
...@@ -16,15 +16,17 @@ ...@@ -16,15 +16,17 @@
16 16
17 17
18 18
19 -package org.onlab.packet; 19 +package org.onlab.packet.ndp;
20 20
21 import org.junit.BeforeClass; 21 import org.junit.BeforeClass;
22 import org.junit.Test; 22 import org.junit.Test;
23 +import org.onlab.packet.Data;
23 24
24 -import static org.junit.Assert.*; 25 +import static org.junit.Assert.assertArrayEquals;
25 - 26 +import static org.junit.Assert.assertTrue;
27 +import static org.junit.Assert.assertFalse;
26 /** 28 /**
27 - * Tests for class {@link org.onlab.packet.NeighborSolicitation}. 29 + * Tests for class {@link NeighborSolicitation}.
28 */ 30 */
29 public class NeighborSolicitationTest { 31 public class NeighborSolicitationTest {
30 private static final byte[] TARGET_ADDRESS = { 32 private static final byte[] TARGET_ADDRESS = {
...@@ -61,6 +63,7 @@ public class NeighborSolicitationTest { ...@@ -61,6 +63,7 @@ public class NeighborSolicitationTest {
61 public void testSerialize() { 63 public void testSerialize() {
62 NeighborSolicitation ns = new NeighborSolicitation(); 64 NeighborSolicitation ns = new NeighborSolicitation();
63 ns.setTargetAddress(TARGET_ADDRESS); 65 ns.setTargetAddress(TARGET_ADDRESS);
66 + ns.setPayload(data);
64 67
65 assertArrayEquals(ns.serialize(), bytePacket); 68 assertArrayEquals(ns.serialize(), bytePacket);
66 } 69 }
......
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.junit.BeforeClass;
22 +import org.junit.Test;
23 +import org.onlab.packet.Data;
24 +
25 +import static org.junit.Assert.assertArrayEquals;
26 +import static org.junit.Assert.assertTrue;
27 +import static org.junit.Assert.assertFalse;
28 +
29 +/**
30 + * Tests for class {@link Redirect}.
31 + */
32 +public class RedirectTest {
33 + private static final byte[] TARGET_ADDRESS = {
34 + (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
35 + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
36 + };
37 + private static final byte[] DESTINATION_ADDRESS = {
38 + (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
39 + (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
40 + };
41 + private static final byte[] DESTINATION_ADDRESS2 = {
42 + (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
43 + (byte) 0xe6, (byte) 0xce, (byte) 0x8f, (byte) 0xff, (byte) 0xfe, (byte) 0x54, (byte) 0x37, (byte) 0xc8
44 + };
45 + private static Data data;
46 + private static byte[] bytePacket;
47 +
48 + @BeforeClass
49 + public static void setUpBeforeClass() throws Exception {
50 + data = new Data();
51 + data.setData("".getBytes());
52 +
53 + byte[] bytePayload = data.serialize();
54 + byte[] byteHeader = {
55 + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
56 + (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
57 + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
58 + (byte) 0x20, (byte) 0x01, (byte) 0x0f, (byte) 0x18, (byte) 0x01, (byte) 0x13, (byte) 0x02, (byte) 0x15,
59 + (byte) 0xca, (byte) 0x2a, (byte) 0x14, (byte) 0xff, (byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
60 + };
61 + bytePacket = new byte[byteHeader.length + bytePayload.length];
62 + System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
63 + System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
64 + }
65 +
66 + /**
67 + * Tests serialize and setters.
68 + */
69 + @Test
70 + public void testSerialize() {
71 + Redirect rd = new Redirect();
72 + rd.setTargetAddress(TARGET_ADDRESS);
73 + rd.setDestinationAddress(DESTINATION_ADDRESS);
74 + rd.setPayload(data);
75 +
76 + assertArrayEquals(rd.serialize(), bytePacket);
77 + }
78 +
79 + /**
80 + * Tests deserialize and getters.
81 + */
82 + @Test
83 + public void testDeserialize() {
84 + Redirect rd = new Redirect();
85 + rd.deserialize(bytePacket, 0, bytePacket.length);
86 +
87 + assertArrayEquals(rd.getTargetAddress(), TARGET_ADDRESS);
88 + assertArrayEquals(rd.getDestinationAddress(), DESTINATION_ADDRESS);
89 + }
90 +
91 + /**
92 + * Tests comparator.
93 + */
94 + @Test
95 + public void testEqual() {
96 + Redirect rd1 = new Redirect();
97 + rd1.setTargetAddress(TARGET_ADDRESS);
98 + rd1.setDestinationAddress(DESTINATION_ADDRESS);
99 +
100 + Redirect rd2 = new Redirect();
101 + rd2.setTargetAddress(TARGET_ADDRESS);
102 + rd2.setDestinationAddress(DESTINATION_ADDRESS2);
103 +
104 + assertTrue(rd1.equals(rd1));
105 + assertFalse(rd1.equals(rd2));
106 + }
107 +}
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.junit.BeforeClass;
22 +import org.junit.Test;
23 +import org.onlab.packet.Data;
24 +
25 +import static org.hamcrest.Matchers.is;
26 +import static org.junit.Assert.assertArrayEquals;
27 +import static org.junit.Assert.assertFalse;
28 +import static org.junit.Assert.assertThat;
29 +import static org.junit.Assert.assertTrue;
30 +
31 +/**
32 + * Tests for class {@link RouterAdvertisement}.
33 + */
34 +public class RouterAdvertisementTest {
35 + private static Data data;
36 + private static byte[] bytePacket;
37 +
38 + @BeforeClass
39 + public static void setUpBeforeClass() throws Exception {
40 + data = new Data();
41 + data.setData("".getBytes());
42 +
43 + byte[] bytePayload = data.serialize();
44 + byte[] byteHeader = {
45 + (byte) 0x03, (byte) 0xc0, (byte) 0x02, (byte) 0x58,
46 + (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0xe8,
47 + (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xf4
48 + };
49 + bytePacket = new byte[byteHeader.length + bytePayload.length];
50 + System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
51 + System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
52 + }
53 +
54 + /**
55 + * Tests serialize and setters.
56 + */
57 + @Test
58 + public void testSerialize() {
59 + RouterAdvertisement ra = new RouterAdvertisement();
60 + ra.setCurrentHopLimit((byte) 3);
61 + ra.setMFlag((byte) 1);
62 + ra.setOFlag((byte) 1);
63 + ra.setRouterLifetime((short) 0x258);
64 + ra.setReachableTime(0x3e8);
65 + ra.setRetransmitTimer(0x1f4);
66 + ra.setPayload(data);
67 +
68 + assertArrayEquals(ra.serialize(), bytePacket);
69 + }
70 +
71 + /**
72 + * Tests deserialize and getters.
73 + */
74 + @Test
75 + public void testDeserialize() {
76 + RouterAdvertisement ra = new RouterAdvertisement();
77 + ra.deserialize(bytePacket, 0, bytePacket.length);
78 +
79 + assertThat(ra.getCurrentHopLimit(), is((byte) 3));
80 + assertThat(ra.getMFlag(), is((byte) 1));
81 + assertThat(ra.getOFlag(), is((byte) 1));
82 + assertThat(ra.getRouterLifetime(), is((short) 0x258));
83 + assertThat(ra.getReachableTime(), is(0x3e8));
84 + assertThat(ra.getRetransmitTimer(), is(0x1f4));
85 + }
86 +
87 + /**
88 + * Tests comparator.
89 + */
90 + @Test
91 + public void testEqual() {
92 + RouterAdvertisement ra1 = new RouterAdvertisement();
93 + ra1.setCurrentHopLimit((byte) 3);
94 + ra1.setMFlag((byte) 1);
95 + ra1.setOFlag((byte) 1);
96 + ra1.setRouterLifetime((short) 0x258);
97 + ra1.setReachableTime(0x3e8);
98 + ra1.setRetransmitTimer(0x1f4);
99 +
100 + RouterAdvertisement ra2 = new RouterAdvertisement();
101 + ra2.setCurrentHopLimit((byte) 3);
102 + ra2.setMFlag((byte) 0);
103 + ra2.setOFlag((byte) 0);
104 + ra2.setRouterLifetime((short) 0x1f4);
105 + ra2.setReachableTime(0x3e8);
106 + ra2.setRetransmitTimer(0x1f4);
107 +
108 + assertTrue(ra1.equals(ra1));
109 + assertFalse(ra1.equals(ra2));
110 + }
111 +}
1 +/*
2 + * Copyright 2014 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +
18 +
19 +package org.onlab.packet.ndp;
20 +
21 +import org.junit.BeforeClass;
22 +import org.junit.Test;
23 +import org.onlab.packet.Data;
24 +
25 +import static org.junit.Assert.assertArrayEquals;
26 +import static org.junit.Assert.assertTrue;
27 +
28 +/**
29 + * Tests for class {@link RouterSolicitation}.
30 + */
31 +public class RouterSolicitationTest {
32 + private static final byte[] OPTION = {
33 + (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
34 + };
35 + private static Data data;
36 + private static byte[] bytePacket;
37 +
38 + @BeforeClass
39 + public static void setUpBeforeClass() throws Exception {
40 + data = new Data();
41 + data.setData(OPTION);
42 +
43 + byte[] bytePayload = data.serialize();
44 + byte[] byteHeader = {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
45 + bytePacket = new byte[byteHeader.length + bytePayload.length];
46 + System.arraycopy(byteHeader, 0, bytePacket, 0, byteHeader.length);
47 + System.arraycopy(bytePayload, 0, bytePacket, byteHeader.length, bytePayload.length);
48 + }
49 +
50 + /**
51 + * Tests serialize and setters.
52 + */
53 + @Test
54 + public void testSerialize() {
55 + RouterSolicitation rs = new RouterSolicitation();
56 + rs.setPayload(data);
57 +
58 + assertArrayEquals(rs.serialize(), bytePacket);
59 + }
60 +
61 + /**
62 + * Tests deserialize and getters.
63 + */
64 + @Test
65 + public void testDeserialize() {
66 + RouterSolicitation rs = new RouterSolicitation();
67 + rs.deserialize(bytePacket, 0, bytePacket.length);
68 + }
69 +
70 + /**
71 + * Tests comparator.
72 + */
73 + @Test
74 + public void testEqual() {
75 + RouterSolicitation rs1 = new RouterSolicitation();
76 +
77 + assertTrue(rs1.equals(rs1));
78 + }
79 +}