title: Why there are no ICMP ping requests sent when wireshark packet capture is opened?
body: <p><strong>Summary : The sendto api in raw socket reports no error but the ICMP packet is not sent in wireshark packet capture.</strong></p>
  
  <p>I'm new in Raw Socket programming and trying to create a ICMP ping packet from scratch. I successfully created a ping program following this : <a href="https://www.geeksforgeeks.org/ping-in-c/" rel="nofollow noreferrer">https://www.geeksforgeeks.org/ping-in-c/</a> but now I wish to build also the ethernet header myself i.e all the packet headers from scratch. I did write the program following this : <a href="https://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/" rel="nofollow noreferrer">https://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/</a> but when I run it and capture the packet transfer using tcpdump and analyze it using Wireshark I find no ICMP packets sent, although according to my programming logic my packet has been successfully sent(since sendto api doesn't report any error). I'm attaching the code, any help will be really appreciated.</p>
  
  <pre><code>#include &lt;stdio.h&gt; 
  #include &lt;sys/types.h&gt; 
  #include &lt;sys/socket.h&gt; 
  #include &lt;netinet/in.h&gt; 
  #include &lt;arpa/inet.h&gt; 
  #include &lt;netdb.h&gt; 
  #include &lt;unistd.h&gt; 
  #include &lt;string.h&gt; 
  #include &lt;stdlib.h&gt; 
  #include &lt;netinet/ip_icmp.h&gt; 
  #include &lt;time.h&gt; 
  #include &lt;fcntl.h&gt; 
  #include &lt;signal.h&gt; 
  #include &lt;time.h&gt; 
  #include &lt;string.h&gt;
  #include &lt;netinet/if_ether.h&gt; 
  #include &lt;netpacket/packet.h&gt;
  #include &lt;net/ethernet.h&gt;
  #include &lt;net/if.h&gt;
  #include &lt;sys/ioctl.h&gt;
  
  
  #define PING_PKT_S 64 
  #define PORT_NO 0 
  #define PING_SLEEP_RATE 1000000 
  #define RECV_TIMEOUT 1 
  
  int pingloop=1; 
  
  struct ping_pkt 
  {
     struct ethhdr eth; 
     struct ip ip;    
     struct icmphdr hdr; 
     char msg[PING_PKT_S-sizeof(struct icmphdr)]; 
  }g_pckt; 
  
  
  typedef struct ping_ctx{
  int tos;
  int ttl;
  char srcIP[200];
  char dstIP[200];
  int r_sock;
  }ping_ctx;
  
  unsigned short checksum(void *b, int len) 
  {
  unsigned short *buf = b; 
  unsigned int sum=0; 
  unsigned short result; 
  
  for ( sum = 0; len &gt; 1; len -= 2 ) 
      sum += *buf++; 
  if ( len == 1 ) 
      sum += *(unsigned char*)buf; 
  sum = (sum &gt;&gt; 16) + (sum &amp; 0xFFFF); 
  sum += (sum &gt;&gt; 16); 
  result = ~sum; 
  return result; 
  } 
  
    void intHandler(int dummy) 
    { 
  pingloop=0; 
    } 
  
    void fill_ip_h(struct ip *ip, ping_ctx* ctx)
    {
      ip-&gt;ip_src.s_addr = inet_addr(ctx-&gt;srcIP);
      ip-&gt;ip_dst.s_addr = inet_addr(ctx-&gt;dstIP);
      ip-&gt;ip_v = 4;
      ip-&gt;ip_hl = sizeof*ip &gt;&gt; 2;
      ip-&gt;ip_tos = (unsigned char)(ctx-&gt;tos);
      ip-&gt;ip_len = htons(sizeof(g_pckt));
      ip-&gt;ip_id = htons(4321);
      ip-&gt;ip_off = htons(0);
      ip-&gt;ip_ttl = (unsigned char)(ctx-&gt;ttl);
      ip-&gt;ip_p = 1;
      ip-&gt;ip_sum = 0; /* Let kernel fills in */
    }
  
    void fill_icmp_h(struct icmphdr* hdr,int *msg_count)
    {
      hdr-&gt;type = ICMP_ECHO;
      hdr-&gt;un.echo.id = 1; 
      hdr-&gt;un.echo.sequence = (*msg_count)++; 
    }
  
    void fill_data(unsigned char * data)
    {
  memset(data, 'J', PING_PKT_S-sizeof(struct icmphdr));
    }
  
    void fill_eth(struct ethhdr* eth){
  eth-&gt;h_source[0] = 0x08;
  eth-&gt;h_source[1] = 0x00;
  eth-&gt;h_source[2] = 0x27;
  eth-&gt;h_source[3] = 0xe8;
  eth-&gt;h_source[4] = 0xb5;
  eth-&gt;h_source[5] = 0x12;
  eth-&gt;h_dest[0] = 0x08;
  eth-&gt;h_dest[1] = 0x00;
  eth-&gt;h_dest[2] = 0x27;
  eth-&gt;h_dest[3] = 0xe8;
  eth-&gt;h_dest[4] = 0xb5;
  eth-&gt;h_dest[5] = 0x12;
  eth-&gt;h_proto = htons(ETH_P_IP);
    }
  
  void send_ping(ping_ctx* ctx)
  { 
      int  msg_count=0, i, addr_len, pkt_sent=1, 
      msg_received_count=0,on =1; 
      struct sockaddr_ll remote_addr; 
      struct ip *ip = NULL;
      struct icmphdr* icmph = NULL;
      unsigned  char* data = NULL;
      struct ethhdr* eth = NULL;
      struct sockaddr_ll r_addr; 
      struct timespec time_start, time_end, tfs, tfe; 
      long double rtt_msec=0, total_msec=0; 
      struct timeval tv_out;
  
  /*Set params*/ 
  char *to = ctx-&gt;dstIP;
  char *from = ctx-&gt;srcIP;
  int   ping_sockfd = ctx-&gt;r_sock;
  int ttl = ctx-&gt;ttl;
  int tos =ctx-&gt;tos;
  
  /*Timer Settings*/
  tv_out.tv_sec = RECV_TIMEOUT; 
  tv_out.tv_usec = 0; 
  clock_gettime(CLOCK_MONOTONIC, &amp;tfs); 
  
  //GET INTERFACE INDEX FOR INTERFACE enp0s3
  /*struct ifreq ifr;
  size_t if_name_len = strlen(if_name);
  if(if_name_len&lt;sizeof(ifr.ifr_name)){
       memcpy(ifr.ifr_name,if_name,if_name_len);
       ifr.ifr_name[if_name_len]=0;
  }
  else{
       die("Interface name is too long");
  }
  memset(&amp;ifr,0,sizeof(ifr));
  strncpy(ifr.ifr_name,enp0s3,IFNAMSIZ-1);
  int fd = socket(AF_UNIX,SOCK_DGRAM,0);
  if(fd==-1)
       printf("Error opening socket");
  if(ioctl(fd,SIOCGIFINDEX,&amp;ifr)==-1){
       printf("Error getting index name");
  }*/
  //int ifindex = ifr.ifr_ifindex;
  int ifindex = if_nametoindex("enp0s3");
  printf("The interface number is : %d \n",ifindex);
  
  remote_addr.sll_ifindex = ifindex;
  remote_addr.sll_halen = ETH_ALEN;
  remote_addr.sll_addr[0] = 0x08;
  remote_addr.sll_addr[1] = 0x00;
  remote_addr.sll_addr[2] = 0x27;
  remote_addr.sll_addr[3] = 0xe8;
  remote_addr.sll_addr[4] = 0xb5;
  remote_addr.sll_addr[5] = 0x12;
  
  
  
  if(setsockopt(ping_sockfd, SOL_SOCKET, SO_RCVTIMEO, 
              (const char*)&amp;tv_out, sizeof tv_out) &lt; 0)
  {
      printf("Setting socket options failed for SO_RCVTIMEO\n");
      return;
  }
  
  
  /*if(setsockopt(ping_sockfd, IPPROTO_RAW, IP_HDRINCL, &amp;on, sizeof(on)) &lt; 0)
  {
      printf("Setting socket options failed for IP_HDRINCL");
      return;
  }*/
  
  while(pingloop) 
  { 
      pkt_sent=1; 
      memset(&amp;g_pckt, 0, sizeof(g_pckt));
  
      /*ETHERNET Header*/
      eth = (struct ethhdr *)&amp;g_pckt;
      fill_eth(eth);
  
      /*IP Header*/        
      ip = (struct ip *)(eth + 1); 
      fill_ip_h(ip, ctx);
  
      /*ICMP Header*/
      icmph = (struct icmphdr*)(ip + 1);
      fill_icmp_h(icmph, &amp;msg_count); 
  
      /*Data*/
      data = (unsigned char *)(icmph + 1);
      fill_data(data);
  
      /*ICMP Checksum*/
      icmph-&gt;checksum = checksum(icmph, PING_PKT_S);
  
      usleep(PING_SLEEP_RATE); 
  
      /*TX*/ 
      clock_gettime(CLOCK_MONOTONIC, &amp;time_start); 
      if ( sendto(ping_sockfd, &amp;g_pckt, sizeof(g_pckt), 0, 
                  (struct sockaddr*) &amp;remote_addr, 
                  sizeof(remote_addr)) &lt;= 0) 
      { 
          printf("\nPacket Sending Failed!\n"); 
          pkt_sent=0; 
      } 
  
      /*RX*/ 
      /*addr_len=sizeof(r_addr); 
  
      if ( recvfrom(ping_sockfd, icmph, PING_PKT_S, 0, 
                  (struct sockaddr*)&amp;r_addr, &amp;addr_len) &lt;= 0 
              &amp;&amp; msg_count&gt;1) 
      { 
          printf("\nPacket receive failed!\n"); 
      } */
  
      else
      { 
          clock_gettime(CLOCK_MONOTONIC, &amp;time_end); 
  
          double timeElapsed = ((double)(time_end.tv_nsec - 
                      time_start.tv_nsec))/1000000.0; 
          rtt_msec = (time_end.tv_sec- 
                  time_start.tv_sec) * 1000.0 
              + timeElapsed; 
  
          // if packet was not sent, don't receive 
          if(pkt_sent) 
          { 
              if(!(g_pckt.hdr.type ==69 &amp;&amp; g_pckt.hdr.code==0)) 
              { 
                  printf("Error..Packet received with ICMP" 
                          "type %d code %d\n", 
                          g_pckt.hdr.type, g_pckt.hdr.code); 
              } 
              else
              { 
                  printf("%d bytes Received reply from %s: icmp_seq=:%d ttl=%d time=%Lf ms\n",PING_PKT_S, ctx-&gt;dstIP, msg_count, ctx-&gt;ttl, rtt_msec); 
                  msg_received_count++; 
              } 
          } 
      }    
  } 
  clock_gettime(CLOCK_MONOTONIC, &amp;tfe); 
  double timeElapsed = ((double)(tfe.tv_nsec - 
              tfs.tv_nsec))/1000000.0; 
  
  total_msec = (tfe.tv_sec-tfs.tv_sec)*1000.0+ 
      timeElapsed ;
  
  printf("\n%d packets sent, %d packets received, %f percent "
          "packet loss. Total time: %Lf ms.\n\n", 
          msg_count, msg_received_count, 
          ((msg_count - msg_received_count)/msg_count) * 100.0, 
          total_msec); 
  } 
  
  int main(int argc, char *argv[]) 
  { 
  ping_ctx ctx = {0};
  
  if(argc!=3) 
  { 
      printf("sudo ./myping 10.117.157.6 10.39.51.117\n"); 
      return 0; 
  } 
  
  signal(SIGINT, intHandler); 
  ctx.r_sock = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW); 
  if(ctx.r_sock &lt;0) 
  { 
      printf("\nSocket file descriptor not received\n"); 
      return 0; 
  } 
  
  ctx.tos = 0;
  ctx.ttl = 64;
  strncpy(ctx.dstIP, argv[1],strlen(argv[1]));
  strncpy(ctx.srcIP, argv[2],strlen(argv[2]));
  
  send_ping(&amp;ctx); 
  
  return 0; 
  </code></pre>
  
  <p>} </p>
  
  <p>When the packets are captured using tcpdump and the capture is opened in wireshark, no ICMP packet is seen.</p>