Network Byte order not reached reading from a sock RAW
From: Mandeep Sandhu <hidden>
Date: 2012-10-13 03:30:19
On Oct 12, 2012 9:36 PM, "Pietro Paolini" [off-list ref] wrote:
Hello, I am struggling with the byte order question on a x86_32 arch, I am doing
some modifications on a program which actually works fine on a MIPS arch.
I do a reading from a RAW socket in this way:
/* Configure socket */
if ((fd = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP)) < 0) {
perror("Error on socket creation, exit");
exit(1);
}
....
if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, (void *)&va,sizeof(va))) { perror("Error on setsockopt, exit");
exit(1);
}
va = 0;
....
....
struct msghdr mhdr;
struct __in_pktinfo *pktinfo = NULL;
...
...
nrd = recvmsg(env->mrouter_fd, &mhdr, 0);
...
ip = (struct iphdr *)iov.iov_base;
When I print the saddr (or daddr) of the received ip packet it is printedas host byte order instead of what I am expecting, the network byte order. I can just use the htonl() family functions for solve the problem but I would like understand if it is the normal behavior or if there is an issues on my code, or if the device driver of my NIC can influence the question. I think you should use ntoh*() functions when accessing data rx'ed from the n/w. Network byte order is big endian and your host is little endian, so you'll have convert it to the right order before accessing. You should use hton*() functions when tx'ing data. CMIIW. HTH, -mandeep
Many thanks, Pietro. _______________________________________________ Kernelnewbies mailing list Kernelnewbies at kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20121013/139594d8/attachment.html