|
|
@@ -551,6 +551,28 @@ func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
|
return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil
|
|
|
}
|
|
|
|
|
|
+// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets.
|
|
|
+// SockaddrVM provides access to Linux VM sockets: a mechanism that enables
|
|
|
+// bidirectional communication between a hypervisor and its guest virtual
|
|
|
+// machines.
|
|
|
+type SockaddrVM struct {
|
|
|
+ // CID and Port specify a client ID and port address for a VM socket.
|
|
|
+ // Guests have a unique CID, and hosts may have a well-known CID of:
|
|
|
+ // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process.
|
|
|
+ // - VMADDR_CID_HOST: refers to other processes on the host.
|
|
|
+ CID uint32
|
|
|
+ Port uint32
|
|
|
+ raw RawSockaddrVM
|
|
|
+}
|
|
|
+
|
|
|
+func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {
|
|
|
+ sa.raw.Family = AF_VSOCK
|
|
|
+ sa.raw.Port = sa.Port
|
|
|
+ sa.raw.Cid = sa.CID
|
|
|
+
|
|
|
+ return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil
|
|
|
+}
|
|
|
+
|
|
|
func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
|
|
|
switch rsa.Addr.Family {
|
|
|
case AF_NETLINK:
|
|
|
@@ -620,6 +642,14 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
|
|
|
sa.Addr[i] = pp.Addr[i]
|
|
|
}
|
|
|
return sa, nil
|
|
|
+
|
|
|
+ case AF_VSOCK:
|
|
|
+ pp := (*RawSockaddrVM)(unsafe.Pointer(rsa))
|
|
|
+ sa := &SockaddrVM{
|
|
|
+ CID: pp.Cid,
|
|
|
+ Port: pp.Port,
|
|
|
+ }
|
|
|
+ return sa, nil
|
|
|
}
|
|
|
return nil, EAFNOSUPPORT
|
|
|
}
|