c - sending ip packet down the wire throws "Invalid argument" -
i implementing trivial icmp ping in sending ip packet down wire giving me "invalid argument".
here's code:
/* create ip packet */ int packet_size = ipv4_hdrlen + (int)sizeof(icmpheader) + (int)[payload length]; char *packet = (char *) malloc (packet_size); if (!packet) { perror("out of memory"); return; } //zero out packet buffer memset (packet, 0, packet_size); //ip header struct ip *iphdr = (struct ip *) packet; iphdr->ip_v = 4; iphdr->ip_hl = 5; iphdr->ip_tos = 0; iphdr->ip_len = htons(packet_size); iphdr->ip_id = (ushort) rand(); iphdr->ip_off = 0; iphdr->ip_ttl = 255; iphdr->ip_p = ipproto_icmp; iphdr->ip_sum = in_cksum((uint16_t *)iphdr, ipv4_hdrlen); int status = 0; char *src_ip = (char *) [@"127.0.0.1" utf8string]; char *dst_ip = (char *) [@"2.3.4.5" utf8string]; // source ipv4 address (32 bits) if ((status = inet_pton (af_inet, src_ip, &(iphdr->ip_src))) != 1) { fprintf (stderr, "inet_pton() failed.\nerror message: %s", strerror (status)); exit (exit_failure); } // destination ipv4 address (32 bits) if ((status = inet_pton (af_inet, dst_ip, &(iphdr->ip_dst))) != 1) { fprintf (stderr, "inet_pton() failed.\nerror message: %s", strerror (status)); exit (exit_failure); } icmppacket = [nsmutabledata datawithlength:sizeof(*icmpptr) + [payload length]]; assert(icmppacket != nil); icmpptr = [icmppacket mutablebytes]; icmpptr->type = kicmptypeechorequest; icmpptr->code = 0; icmpptr->checksum = 0; icmpptr->identifier = osswaphosttobigint16(self.identifier); icmpptr->sequencenumber = osswaphosttobigint16(self.nextsequencenumber); memcpy(&icmpptr[1], [payload bytes], [payload length]); icmpptr->checksum = in_cksum([icmppacket bytes], [icmppacket length]); int on = 1; /* copy icmp , data packet */ memcpy(packet + ipv4_hdrlen, icmpptr, [icmppacket length]); // set flag socket expects provide ipv4 header. if (setsockopt (cfsocketgetnative(self->_socket), ipproto_ip, ip_hdrincl, &on, sizeof (on)) < 0) { perror ("setsockopt() failed set ip_hdrincl "); exit (exit_failure); } /* send packet */ if (self->_socket == null) { bytessent = -1; err = ebadf; } else { bytessent = sendto( cfsocketgetnative(self->_socket), packet, packet_size, 0, (struct sockaddr *) &sin, sizeof (struct sockaddr) ); err = 0; if (bytessent < 0) { err = errno; } }
this extension apple's simple ping: https://developer.apple.com/library/mac/samplecode/simpleping/listings/simpleping_m.html#//apple_ref/doc/uid/dts10000716-simpleping_m-dontlinkelementid_5
ip packet that's being framed looks straight forward reason, it's giving errno 22. not sure else wrong code.
socket created using:
fd = socket(af_inet, sock_dgram, ipproto_icmp);
i cannot use raw sockets building ios app.
thanks
in case encounters same issue, problem it's mentioned in post: raw socket sendto() failure in os x
Comments
Post a Comment