Network Byte order not reached reading from a sock RAW

Mandeep Sandhu mandeepsandhu.chd at gmail.com
Mon Oct 15 04:32:54 EDT 2012


On Mon, Oct 15, 2012 at 1:16 PM, Pietro Paolini
<P.Paolini at ext.adbglobal.com> wrote:
> Hello,
> Thanks for your answer, my question is why when I read from the buffer data is already in host byte order and not in network byte order.

I think the kernel n/w stack already translates the TCP/IP fields
(protocol headers) to the correct host order so you don't have to. So
when you rx the packet in the userspace its already in the right
order.

The 'raw' payload in your packet might still be in the n/w byte order
and you will have to convert it using the ntoh*() functions (I'm not
100% sure about this though).

CMIIW, as I haven't touched sockets in a long time! :)

HTH,
-mandeep


> Thanks
> Pietro Paolini.
>
>
> From: Mandeep Sandhu [mailto:mandeepsandhu.chd at gmail.com]
> Sent: sabato 13 ottobre 2012 05:30
> To: Pietro Paolini
> Cc: kernelnewbies at kernelnewbies.org
> Subject: Re: Network Byte order not reached reading from a sock RAW
>
>
> On Oct 12, 2012 9:36 PM, "Pietro Paolini" <P.Paolini at ext.adbglobal.com> 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 printed as 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



More information about the Kernelnewbies mailing list