RE: Network Byte order not reached reading from a sock RAW

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.
Thanks 
Pietro Paolini.


From: Mandeep Sandhu [mailto:mandeepsandhu.chd@xxxxxxxxx] 
Sent: sabato 13 ottobre 2012 05:30
To: Pietro Paolini
Cc: kernelnewbies@xxxxxxxxxxxxxxxxx
Subject: Re: Network Byte order not reached reading from a sock RAW


On Oct 12, 2012 9:36 PM, "Pietro Paolini" <P.Paolini@xxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxx
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux