@@ -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 ]);
0 commit comments