How to send Ping6 request using Java library (JpCap)
I would like to monitor the ipv6 devices using ping6 request. Please let me know is there any open source library is available to send and receive Ping6 request. I tried with JpCap but couldn't succeed and I got the below error message 

 

> **java.io.IOException: only IPv4 packet
> is supported**
>         at jpcap.JpcapSender.nativeSendPacket(Native
> Method)
>         at jpcap.JpcapSender.sendPacket(JpcapSender.java:93)
>         at Ping6.sendPing6Request(Ping6.java:131)
>         at Ping6.main(Ping6.java:40)

Please help me how to solve this problem. Is there any way I can send Ping6 using JpCap,

Your thoughts are highly appreciated.

**-R.Ravikumar**
 

    /**
     *  $Id:$
     *
     * This class is used to send the ping6 request to the agent.
     * 
     *  To get these details we are using JpCap open sourec tool.
     *
     */ 
    
    import jpcap.*;
    import jpcap.packet.*;
    
    import java.net.*;
    import java.util.*;
    
    
    /**
     * Ping6.java
     * @author R.Ravikumar 
     * @version 1.0 (Dec 13, 2010).
     *
     */
    
    public class Ping6 implements PacketReceiver
    {
    
     private static Ping6 ping6 = null;
    
     byte[] gatewayMac = null;
     JpcapCaptor captor = null;
     InetAddress intfNIC = null;
     Map<String,byte[]> ipVsMac = null;
            jpcap.NetworkInterface nic = null;
    
     public static void main(String args[])
     {
      Ping6 p6 = Ping6.getInstance();
      p6.sendPing6Request(); 
     } 
    
     public synchronized static Ping6 getInstance()
     {
      if( ping6 == null)
      {
       ping6 = new Ping6();
      }
      return ping6;
     }
    
     private Ping6()
     {
      //Default Constructor.
      initialize(); 
     }
    
     private void initialize()
     {
      DefaultGatewayDetails gateway = new DefaultGatewayDetails();
      gatewayMac = gateway.getgatewayMacAddress();
      ipVsMac = gateway.getIpVsMacDetails();
      startCapture();
     }
    
     public boolean startCapture()
     {
      try
      {
      jpcap.NetworkInterface[] nicList =JpcapCaptor.getDeviceList();
             
      networkLoop :
       for(jpcap.NetworkInterface machineNIC : nicList)
       {
        for(NetworkInterfaceAddress intfAddr : machineNIC.addresses)
        {
         intfNIC = intfAddr.address;
         if( intfNIC instanceof Inet6Address)
         {
          nic = machineNIC;
          break networkLoop;
         }
        }
       }
       if( nic == null)
       {
         System.err.println("Unable to find the local network interface.");
         return false;
       }
    
       captor=JpcapCaptor.openDevice(nic,2000,false,0);
      /* PacketReceiver receiver = new PacketReceiver();
              receiver.captor = captor;
       receiver.start(); */
      }
      catch(Exception ex)
      {
       ex.printStackTrace();
       return false;
      }
      return true;
     }
    
     public void sendPing6Request()
     {
      try
      {
       //create icmp version6 packet.
       ICMPPacket icmp=new ICMPPacket(); 
       icmp.type = ICMPPacket.IPPROTO_IPv6; 
       icmp.seq=100; 
       icmp.id=0; 
       icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
       icmp.data="data".getBytes(); 
       
       EthernetPacket ether=new EthernetPacket();
       ether.frametype=EthernetPacket.ETHERTYPE_IP;
       ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
       ether.dst_mac=gatewayMac;
       icmp.datalink=ether;
       
       //create top layer IPv4 packet 
       IPPacket ipPacket = new IPPacket(); 
       ipPacket.setIPv4Parameter(0,false,false,false,0,false,false,false, 
         0,2697,128,IPPacket.IPPROTO_IPv6, 
         InetAddress.getByName("rravikumar"),InetAddress.getByName("192.168.118.2")); 
       ipPacket.datalink = ether; 
       icmp.ippacket = ipPacket;

                         or
                         /*
                           //create icmp version6 packet.
       ICMPPacket icmp=new ICMPPacket(); 
       icmp.type = ICMPPacket.IPPROTO_IPv6; 
       icmp.seq=100; 
       icmp.id=0; 
       icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
       icmp.data="data".getBytes(); 
       
       EthernetPacket ether=new EthernetPacket();
       ether.frametype=EthernetPacket.ETHERTYPE_IP;
       ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
       ether.dst_mac=gatewayMac;
       icmp.datalink=ether;
                          */ 

    
       JpcapSender sender=JpcapSender.openDevice(nic);
       sender.sendPacket(icmp);
      }
      catch(Exception exp)
      {
       exp.printStackTrace();
      } 
     }
    
     public void receivePacket(Packet packet) 
     {
      if(packet instanceof ICMPPacket)
      {
      /* ICMPPacket icmpPacket = (ICMPPacket) packet;
       if( (externalIp.equals(icmpPacket.src_ip) && intfIpList.contains(icmpPacket.dst_ip)) ||
         (externalIp.equals(icmpPacket.dst_ip) && intfIpList.contains(icmpPacket.src_ip))) 
       {
        DatalinkPacket datalink = icmpPacket.datalink;
        if(datalink instanceof EthernetPacket)
        {
         if(externalIp.equals(icmpPacket.src_ip))
         {
              gatewayMac = ((EthernetPacket) datalink).src_mac;
         }
         else
         {
          gatewayMac = ((EthernetPacket) datalink).dst_mac;
         }
        }
       } */
      }
     }
    
    }

 

 My implementation is given below,

How to send Ping6 request using Java library (JpCap)
===

I would like to monitor the ipv6 devices using ping6 request. Please let me know is there any open source library is available to send and receive Ping6 request. I tried with JpCap but couldn't succeed and I got the below error message 

 

> **java.io.IOException: only IPv4 packet
> is supported**
>         at jpcap.JpcapSender.nativeSendPacket(Native
> Method)
>         at jpcap.JpcapSender.sendPacket(JpcapSender.java:93)
>         at Ping6.sendPing6Request(Ping6.java:131)
>         at Ping6.main(Ping6.java:40)

Please help me how to solve this problem. Is there any way I can send Ping6 using JpCap,

Your thoughts are highly appreciated.

**-R.Ravikumar**
 

    /**
     *  $Id:$
     *
     * This class is used to send the ping6 request to the agent.
     * 
     *  To get these details we are using JpCap open sourec tool.
     *
     */ 
    
    import jpcap.*;
    import jpcap.packet.*;
    
    import java.net.*;
    import java.util.*;
    
    
    /**
     * Ping6.java
     * @author R.Ravikumar 
     * @version 1.0 (Dec 13, 2010).
     *
     */
    
    public class Ping6 implements PacketReceiver
    {
    
     private static Ping6 ping6 = null;
    
     byte[] gatewayMac = null;
     JpcapCaptor captor = null;
     InetAddress intfNIC = null;
     Map<String,byte[]> ipVsMac = null;
            jpcap.NetworkInterface nic = null;
    
     public static void main(String args[])
     {
      Ping6 p6 = Ping6.getInstance();
      p6.sendPing6Request(); 
     } 
    
     public synchronized static Ping6 getInstance()
     {
      if( ping6 == null)
      {
       ping6 = new Ping6();
      }
      return ping6;
     }
    
     private Ping6()
     {
      //Default Constructor.
      initialize(); 
     }
    
     private void initialize()
     {
      DefaultGatewayDetails gateway = new DefaultGatewayDetails();
      gatewayMac = gateway.getgatewayMacAddress();
      ipVsMac = gateway.getIpVsMacDetails();
      startCapture();
     }
    
     public boolean startCapture()
     {
      try
      {
      jpcap.NetworkInterface[] nicList =JpcapCaptor.getDeviceList();
             
      networkLoop :
       for(jpcap.NetworkInterface machineNIC : nicList)
       {
        for(NetworkInterfaceAddress intfAddr : machineNIC.addresses)
        {
         intfNIC = intfAddr.address;
         if( intfNIC instanceof Inet6Address)
         {
          nic = machineNIC;
          break networkLoop;
         }
        }
       }
       if( nic == null)
       {
         System.err.println("Unable to find the local network interface.");
         return false;
       }
    
       captor=JpcapCaptor.openDevice(nic,2000,false,0);
      /* PacketReceiver receiver = new PacketReceiver();
              receiver.captor = captor;
       receiver.start(); */
      }
      catch(Exception ex)
      {
       ex.printStackTrace();
       return false;
      }
      return true;
     }
    
     public void sendPing6Request()
     {
      try
      {
       //create icmp version6 packet.
       ICMPPacket icmp=new ICMPPacket(); 
       icmp.type = ICMPPacket.IPPROTO_IPv6; 
       icmp.seq=100; 
       icmp.id=0; 
       icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
       icmp.data="data".getBytes(); 
       
       EthernetPacket ether=new EthernetPacket();
       ether.frametype=EthernetPacket.ETHERTYPE_IP;
       ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
       ether.dst_mac=gatewayMac;
       icmp.datalink=ether;
       
       //create top layer IPv4 packet 
       IPPacket ipPacket = new IPPacket(); 
       ipPacket.setIPv4Parameter(0,false,false,false,0,false,false,false, 
         0,2697,128,IPPacket.IPPROTO_IPv6, 
         InetAddress.getByName("rravikumar"),InetAddress.getByName("192.168.118.2")); 
       ipPacket.datalink = ether; 
       icmp.ippacket = ipPacket;

                         or
                         /*
                           //create icmp version6 packet.
       ICMPPacket icmp=new ICMPPacket(); 
       icmp.type = ICMPPacket.IPPROTO_IPv6; 
       icmp.seq=100; 
       icmp.id=0; 
       icmp.setIPv6Parameter(0, 0, IPPacket.IPPROTO_IPv6_ICMP, 1, intfNIC, InetAddress.getByName("fe80::3d07:7d5e:f831:e76a")); 
       icmp.data="data".getBytes(); 
       
       EthernetPacket ether=new EthernetPacket();
       ether.frametype=EthernetPacket.ETHERTYPE_IP;
       ether.src_mac= ipVsMac.get(intfNIC.getHostAddress()); 
       ether.dst_mac=gatewayMac;
       icmp.datalink=ether;
                          */ 

    
       JpcapSender sender=JpcapSender.openDevice(nic);
       sender.sendPacket(icmp);
      }
      catch(Exception exp)
      {
       exp.printStackTrace();
      } 
     }
    
     public void receivePacket(Packet packet) 
     {
      if(packet instanceof ICMPPacket)
      {
      /* ICMPPacket icmpPacket = (ICMPPacket) packet;
       if( (externalIp.equals(icmpPacket.src_ip) && intfIpList.contains(icmpPacket.dst_ip)) ||
         (externalIp.equals(icmpPacket.dst_ip) && intfIpList.contains(icmpPacket.src_ip))) 
       {
        DatalinkPacket datalink = icmpPacket.datalink;
        if(datalink instanceof EthernetPacket)
        {
         if(externalIp.equals(icmpPacket.src_ip))
         {
              gatewayMac = ((EthernetPacket) datalink).src_mac;
         }
         else
         {
          gatewayMac = ((EthernetPacket) datalink).dst_mac;
         }
        }
       } */
      }
     }
    
    }

 

 My implementation is given below,
