Network Byte order not reached reading from a sock RAW

Pietro Paolini P.Paolini at ext.adbglobal.com
Tue Oct 16 09:12:52 EDT 2012


>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.

Hello,

Could you provide the piece(s) of code where kernel does this type of operation ?
Of course just suggest me some file where search, I am really curios and I would like understand better this question but at the same time I am unable to find the files where look for.


Many thanks,
Pietro.


-----Original Message-----
From: Mandeep Sandhu [mailto:mandeepsandhu.chd at gmail.com] 
Sent: lunedì 15 ottobre 2012 10:33
To: Pietro Paolini
Cc: kernelnewbies at kernelnewbies.org
Subject: Re: Network Byte order not reached reading from a sock RAW

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.


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