> 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.
I had a written a Realtek ethernet card driver long time back (its been almost 6yrs since) for my own curiosity. So my memory right now is sketchy! :) You can start off by gong through the n/w device driver for some card (eg: drivers/net/8139too.c) and work your way up the stack (next you can look at net/ipv4/ip_input.c). The basic idea is that when a packet is rx'ed by the n/w device, it creates a sk_buff (socket buffer) and passes this up the stack where it's processed by the various protocol layers (IP, TCP etc). Though I'm not certain if the n/w device driver populates the various skb fields in the n/w or host byte order. Only inspecting the code will tell. HTH, -mandeep > > > Many thanks, > Pietro. > > > -----Original Message----- > From: Mandeep Sandhu [mailto:[email protected]] > Sent: lunedì 15 ottobre 2012 10:33 > To: Pietro Paolini > Cc: [email protected] > Subject: Re: Network Byte order not reached reading from a sock RAW > > On Mon, Oct 15, 2012 at 1:16 PM, Pietro Paolini <[email protected]> > 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:[email protected]] >> Sent: sabato 13 ottobre 2012 05:30 >> To: Pietro Paolini >> Cc: [email protected] >> Subject: Re: Network Byte order not reached reading from a sock RAW >> >> >> On Oct 12, 2012 9:36 PM, "Pietro Paolini" <[email protected]> >> 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 >>> [email protected] >>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies _______________________________________________ Kernelnewbies mailing list [email protected] http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
