Guest User

Untitled

a guest
Mar 30th, 2014
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. /*
  2.  * Socket setup
  3.  */
  4. static int openSocket(const std::string& iface_name)
  5. {
  6.     const int s = ::socket(PF_CAN, SOCK_RAW, CAN_RAW);
  7.     if (s < 0)
  8.     {
  9.         return s;
  10.     }
  11.     /*
  12.      * Detect the iface index
  13.      */
  14.     auto ifr = ::ifreq();
  15.     std::strncpy(ifr.ifr_name, iface_name.c_str(), IFNAMSIZ);
  16.     if (::ioctl(s, SIOCGIFINDEX, &ifr) < 0)
  17.     {
  18.         return -1;
  19.     }
  20.     if (ifr.ifr_ifindex < 0)
  21.     {
  22.         return -1;
  23.     }
  24.     /*
  25.      * Bind to a CAN iface
  26.      */
  27.     auto addr = ::sockaddr_can();
  28.     addr.can_family = AF_CAN;
  29.     addr.can_ifindex = ifr.ifr_ifindex;
  30.     if (::bind(s, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) < 0)
  31.     {
  32.         return -1;
  33.     }
  34.     /*
  35.      * Configure
  36.      */
  37.     const int on = 1;
  38.     // Timestamping
  39.     if (::setsockopt(s, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on)) < 0)
  40.     {
  41.         return -1;
  42.     }
  43.     // Socket loopback
  44.     if (::setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &on, sizeof(on)) < 0)
  45.     {
  46.         return -1;
  47.     }
  48.     // Non-blocking
  49.     if (::fcntl(s, F_SETFL , O_NONBLOCK) < 0)
  50.     {
  51.         return -1;
  52.     }
  53.     return s;
  54. }
  55.  
  56. /*
  57.  * Here's the problem
  58.  */
  59. int read(uavcan::CanFrame& frame, uavcan::UtcTime& ts_utc, bool& loopback) const
  60. {
  61.     auto iov = ::iovec();
  62.     auto sockcan_frame = ::can_frame();
  63.     iov.iov_base = &sockcan_frame;
  64.     iov.iov_len = sizeof(sockcan_frame);
  65.     auto msg = ::msghdr();
  66.     msg.msg_iov = &iov;
  67.     msg.msg_iovlen = 1;
  68.  
  69.     const int res = ::recvmsg(fd_, &msg, MSG_DONTWAIT);
  70.     if (res <= 0)
  71.     {
  72.         return res;
  73.     }
  74.     // At this point sockcan_frame contains valid data, i.e. generally recvmsg() works OK
  75.  
  76.     for (::cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg != nullptr; cmsg = CMSG_NXTHDR(&msg, cmsg))
  77.     {
  78.         // Problem: no control messages were received (msg.msg_controllen is zero)
  79.         if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SO_TIMESTAMP)
  80.         {
  81.             <...>
  82.         }
  83.     }
  84.     <...>
  85. }
Advertisement
Add Comment
Please, Sign In to add comment