Hello All,
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.
Thanks in advance.
Elliot