Skip to content

Commit 97e7ed8

Browse files
Merge pull request #96 from cisco-system-traffic-generator/ipv6ns
update and test multicastMacFromIPv6
2 parents a900054 + 4eb0ee6 commit 97e7ed8

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

src/main/java/com/cisco/trex/stateless/IPv6NeighborDiscoveryService.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,24 @@ public EthernetPacket sendNeighborSolicitation(int portIdx, int timeout, String
196196
}
197197
String srcMac = portStatus.getAttr().getLayerConiguration().getL2Configuration().getSrc();
198198
PortVlan vlan = portStatus.getAttr().getVlan();
199-
return sendNeighborSolicitation(vlan, portIdx, timeout, srcMac, null, dstIp);
199+
return sendNeighborSolicitation(vlan, portIdx, timeout, srcMac, null, null, dstIp);
200200
}
201201

202202
public EthernetPacket sendNeighborSolicitation(
203-
PortVlan vlan, int portIdx, int timeout, String srcMac, String srcIp, String dstIp) {
203+
PortVlan vlan,
204+
int portIdx,
205+
int timeout,
206+
String srcMac,
207+
String dstMac,
208+
String srcIp,
209+
String dstIp) {
204210
long endTs = System.currentTimeMillis() + timeout * 1000;
205211

206-
Packet icmpv6NSPkt =
207-
buildICMPV6NSPkt(vlan, srcMac, multicastMacFromIPv6(dstIp).toString(), dstIp, srcIp);
212+
if (dstMac == null) {
213+
dstMac = multicastMacFromIPv6(dstIp).toString();
214+
}
215+
216+
Packet icmpv6NSPkt = buildICMPV6NSPkt(vlan, srcMac, dstMac, dstIp, srcIp);
208217

209218
tRexClient.startStreamsIntermediate(portIdx, Arrays.asList(buildStream(icmpv6NSPkt)));
210219

@@ -616,7 +625,13 @@ public static EthernetPacket buildICMPV6EchoReq(
616625
return buildICMPV6EchoReq(srcIp, srcMacString, dstMacString, dstIp, 0, 0);
617626
}
618627

619-
private static MacAddress multicastMacFromIPv6(String ipV6) {
628+
/**
629+
* Convert to solicitated-node multicast described in RFC 2624 section 7
630+
*
631+
* @param ipV6
632+
* @return
633+
*/
634+
static MacAddress multicastMacFromIPv6(String ipV6) {
620635
String expandedIPv6 = expandIPv6Address(ipV6);
621636
List<Long> ipv6Octets =
622637
Arrays.stream(expandedIPv6.split(":"))
@@ -627,8 +642,7 @@ private static MacAddress multicastMacFromIPv6(String ipV6) {
627642
int preLastIdx = ipv6Octets.size() - 2;
628643
String macAddressStr =
629644
String.format(
630-
"33:33:%02x:%02x:%02x:%02x",
631-
divMod(ipv6Octets.get(preLastIdx), 256)[0],
645+
"33:33:ff:%02x:%02x:%02x",
632646
divMod(ipv6Octets.get(preLastIdx), 256)[1],
633647
divMod(ipv6Octets.get(lastIdx), 256)[0],
634648
divMod(ipv6Octets.get(lastIdx), 256)[1]);

src/main/java/com/cisco/trex/stateless/TRexClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ public String resolveIpv6(
619619

620620
EthernetPacket naPacket =
621621
new IPv6NeighborDiscoveryService(this)
622-
.sendNeighborSolicitation(vlan, portIndex, 5, srcMac, srcIp, dstIp);
622+
.sendNeighborSolicitation(vlan, portIndex, 5, srcMac, null, srcIp, dstIp);
623623
if (naPacket != null) {
624624
return naPacket.getHeader().getSrcAddr().toString();
625625
}

src/test/java/com/cisco/trex/stateless/IPv6NeighborDiscoveryServiceTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static org.junit.Assert.assertEquals;
44

55
import org.junit.Test;
6+
import org.pcap4j.util.MacAddress;
67

78
public class IPv6NeighborDiscoveryServiceTest {
89

@@ -11,4 +12,11 @@ public void generateIPv6AddrFromMACTest() {
1112
String ipV6Address = IPv6NeighborDiscoveryService.generateIPv6AddrFromMAC("10:62:E5:09:A0:64");
1213
assertEquals("fe80::1262:e5ff:fe09:a064", ipV6Address);
1314
}
15+
16+
@Test
17+
public void generateMulticastMacFromIPv6Test() {
18+
MacAddress multicastMac =
19+
IPv6NeighborDiscoveryService.multicastMacFromIPv6("fe80::4a5d:60ff:fee8:658f");
20+
assertEquals("33:33:ff:e8:65:8f", multicastMac.toString());
21+
}
1422
}

0 commit comments

Comments
 (0)