I added the SockaddrCAN type to the golang.org/x/sys/unix package, and it
works great.  I create an issue with links the patch and some test code.

https://github.com/golang/go/issues/16188

On Fri, Jun 24, 2016 at 8:57 PM, Elliot Morrison-Reed <ellio...@gmail.com>
wrote:

> SocketCAN has been part of mainline linux since kernel 2.6.25 (so getting
> close to a decade now), and it is pretty much the standard for all CAN bus
> communication on linux.
>
> Thanks for the hint, I will look into adding support in the
> golang.org/x/sys/unix package.
>
> Regards,
> Elliot
>
> On Fri, Jun 24, 2016 at 7:52 PM, Ian Lance Taylor <i...@golang.org> wrote:
>
>> On Fri, Jun 24, 2016 at 8:05 AM,  <ellio...@gmail.com> wrote:
>> >
>> > I am trying to set up an interface from Go to SocketCAN
>> > (https://www.kernel.org/doc/Documentation/networking/can.txt).  This
>> > implements the linux socket interface, however it is a completely
>> separate
>> > socket type from the regular AF_INET or AF_UNIX socket types.
>> >
>> > The sockaddr struct for SocketCAN looks like this:
>> >
>> > struct sockaddr_can {
>> >     sa_family_t can_family;
>> >     int         can_ifindex;
>> >     union {
>> >         /* transport protocol class address info (e.g. ISOTP) */
>> >         struct { canid_t rx_id, tx_id; } tp;
>> >
>> >         /* reserved for future CAN protocols address information */
>> >     } can_addr;
>> > };
>> >
>> >
>> > Since the union only has one possible entry right now, this is easy
>> enough
>> > to write in Go
>> >
>> > type CanID uint32
>> >
>> > type sockaddrCan struct {
>> >    Family  uint16
>> >    IfIndex int32
>> >    TpRxId  CanID
>> >    TpTxId  CanID
>> > }
>> >
>> >
>> > Everything is straight forward so far, but now if I want to pass this to
>> > different syscall functions ( syscall.Bind, syscall.Connect, etc.) I
>> have to
>> > implement the syscall.Sockaddr interface, however looking in the code I
>> see
>> > this:
>> >
>> > type Sockaddr interface {
>> >     sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) //
>> lowercase;
>> > only we can define Sockaddrs
>> > }
>> >
>> >
>> > So, finally the questions:
>> >
>> > Why is this interface private? It says that it is, but provides no
>> > rationale.
>> > Does this mean that I have to reimplement all the functions syscall
>> > functions using raw syscall.Syscall?  Or is there some clever way around
>> > this so I can use the syscall package to make a Sockaddr type that is
>> not
>> > already defined.
>>
>> If this is going to be a standard thing in future Linux kernels, I
>> suggest that you add support for it to the golang.org/x/sys/unix
>> package.
>>
>> I don't actually know the answer to why Sockaddr has a private method.
>> I agree that it doesn't seem strictly necessary.
>>
>> Ian
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to