>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....@gmail.com] Sent: lunedì 15 ottobre 2012 10:33 To: Pietro Paolini Cc: kernelnewbies@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.paol...@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....@gmail.com] > Sent: sabato 13 ottobre 2012 05:30 > To: Pietro Paolini > Cc: kernelnewbies@kernelnewbies.org > Subject: Re: Network Byte order not reached reading from a sock RAW > > > On Oct 12, 2012 9:36 PM, "Pietro Paolini" <p.paol...@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@kernelnewbies.org >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies _______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies