class RubyCan::CanSocket

Constants

AF_CAN
CAN_RAW
PF_CAN
SIOCGIFINDEX

Public Class Methods

new( can_interface_name ) click to toggle source
Calls superclass method
# File lib/ruby_can/can_socket.rb, line 11
def initialize( can_interface_name )
  
  super(PF_CAN, Socket::SOCK_RAW, CAN_RAW)
  
  # struct ifreq in net/if.h
  if_idx_req = can_interface_name.ljust(16,"\0")+[0].pack("L")
  ioctl(SIOCGIFINDEX, if_idx_req )
  
  if_name,if_index = if_idx_req.unpack("A16L")
  
  # sockaddr_can from linux/can.h
  #struct sockaddr_can {
  #  __kernel_sa_family_t can_family;                                     S
  #  int         can_ifindex;                                             l
  #  union {
  #    /* transport protocol class address information (e.g. ISOTP) */
  #    struct { canid_t rx_id, tx_id; } tp;                               LL
  #
  #    /* reserved for future CAN protocols address information */
  #  } can_addr;
  #};
  # align on 16 byte -> pad with 2 bytes exta                             S
  
  sockaddr_can = [AF_CAN,if_index,0,0,0].pack("SlLLS")
  
  bind(sockaddr_can)
end