diff --git a/vsock-only/Makefile b/vsock-only/Makefile index 5d92e9b..7d315e8 100644 --- a/vsock-only/Makefile +++ b/vsock-only/Makefile @@ -42,8 +42,11 @@ AUTOCONF_DIR := $(SRCROOT)/shared/autoconf INCLUDE += -I$(SRCROOT)/shared endif - +ifdef KVERSION +VM_UNAME = $(KVERSION) +else VM_UNAME = $(shell uname -r) +endif # Header directory for the running kernel ifdef LINUXINCLUDE diff --git a/vsock-only/Makefile.kernel b/vsock-only/Makefile.kernel index 5218df2..374cc1f 100644 --- a/vsock-only/Makefile.kernel +++ b/vsock-only/Makefile.kernel @@ -25,7 +25,7 @@ INCLUDE += -I$(SRCROOT)/include INCLUDE += -I$(SRCROOT)/linux INCLUDE += -I$(SRCROOT)/common -EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) +EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE) EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/netcreate_num_params.c, -DVMW_NETCREATE_KERNARG, ) diff --git a/vsock-only/linux/af_vsock.c b/vsock-only/linux/af_vsock.c index bde1497..9f8f843 100644 --- a/vsock-only/linux/af_vsock.c +++ b/vsock-only/linux/af_vsock.c @@ -113,6 +113,9 @@ asmlinkage __attribute__((weak)) long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg); #endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 99) +#include +#endif #include "compat_cred.h" #include "compat_module.h" @@ -213,7 +216,11 @@ struct sockaddr *addr, int addrLen, int flags); static int VSockVmciStreamConnect(struct socket *sock, struct sockaddr *addr, int addrLen, int flags); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags); +#else +static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags, bool kern); +#endif static int VSockVmciGetname(struct socket *sock, struct sockaddr *addr, int *addrLen, int peer); static unsigned int VSockVmciPoll(struct file *file, @@ -233,13 +240,29 @@ static int VSockVmciStreamSetsockopt(struct socket *sock, int level, int optname static int VSockVmciStreamGetsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user * optlen); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) static int VSockVmciDgramSendmsg(struct kiocb *kiocb, +#else +static int VSockVmciDgramSendmsg( +#endif struct socket *sock, struct msghdr *msg, size_t len); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) static int VSockVmciDgramRecvmsg(struct kiocb *kiocb, struct socket *sock, +#else +static int VSockVmciDgramRecvmsg(struct socket *sock, +#endif struct msghdr *msg, size_t len, int flags); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) static int VSockVmciStreamSendmsg(struct kiocb *kiocb, +#else +static int VSockVmciStreamSendmsg( +#endif struct socket *sock, struct msghdr *msg, size_t len); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) static int VSockVmciStreamRecvmsg(struct kiocb *kiocb, struct socket *sock, +#else +static int VSockVmciStreamRecvmsg(struct socket *sock, +#endif struct msghdr *msg, size_t len, int flags); static int VSockVmciCreate( @@ -2872,11 +2895,18 @@ __VSockVmciCreate(struct net *net, // IN: Network namespace * From 2.6.9 to until 2.6.12 sk_alloc() used a cache in * the protocol structure, but you still had to specify the size and cache * yourself. - * Most recently (in 2.6.24), sk_alloc() was changed to expect the + * In 2.6.24, sk_alloc() was changed to expect the * network namespace, and the option to zero the sock was dropped. * + * In 4.2, another parameter was added to sk_alloc() allowing you to specify + * whether or not the socket is to be a kernel socket. Previously, we passed + * 1 to this new parameter, but following Gentoo's lead + * ( https://github.com/gentoo/vmware/blob/master/app-emulation/vmware-modules/files/308-4.02-01-sk_alloc.patch#L19 ) + * we have switched to passing 0. */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99) + sk = sk_alloc(net, vsockVmciFamilyOps.family, priority, &vsockVmciProto, 0); +#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12) sk = sk_alloc(vsockVmciFamilyOps.family, priority, vsockVmciProto.slab_obj_size, vsockVmciProto.slab); #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) @@ -3825,7 +3855,12 @@ static int VSockVmciAccept(struct socket *sock, // IN struct socket *newsock, // IN/OUT +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0) int flags) // IN +#else + int flags, // IN + bool kern) +#endif { struct sock *listener; int err; @@ -4260,7 +4295,11 @@ VSockVmciShutdown(struct socket *sock, // IN */ static int +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED +#else +VSockVmciDgramSendmsg( +#endif struct socket *sock, // IN: socket to send on struct msghdr *msg, // IN: message to send size_t len) // IN: length of message @@ -4352,7 +4391,11 @@ VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED goto out; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) memcpy_fromiovec(VMCI_DG_PAYLOAD(dg), msg->msg_iov, len); +#else + memcpy_from_msg(VMCI_DG_PAYLOAD(dg), msg, len); +#endif dg->dst = VMCI_MAKE_HANDLE(remoteAddr->svm_cid, remoteAddr->svm_port); dg->src = VMCI_MAKE_HANDLE(vsk->localAddr.svm_cid, vsk->localAddr.svm_port); @@ -4590,7 +4633,11 @@ VSockVmciStreamGetsockopt(struct socket *sock, // IN */ static int +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED +#else +VSockVmciStreamSendmsg( +#endif struct socket *sock, // IN: socket to send on struct msghdr *msg, // IN: message to send size_t len) // IN: length of message @@ -4712,7 +4759,11 @@ VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED * able to send. */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) written = vmci_qpair_enquev(vsk->qpair, msg->msg_iov, +#else + written = vmci_qpair_enquev(vsk->qpair, &msg->msg_iter.iov, +#endif len - totalWritten, 0); if (written < 0) { err = -ENOMEM; @@ -4759,7 +4810,11 @@ out: */ static int +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED +#else +VSockVmciDgramRecvmsg( +#endif struct socket *sock, // IN: socket to receive from struct msghdr *msg, // IN/OUT: message to receive into size_t len, // IN: length of receive buffer @@ -4809,7 +4864,11 @@ VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED } /* Place the datagram payload in the user's iovec. */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) err = skb_copy_datagram_iovec(skb, sizeof *dg, msg->msg_iov, payloadLen); +#else + err = skb_copy_datagram_iter(skb, sizeof *dg, &msg->msg_iter, payloadLen); +#endif if (err) { goto out; } @@ -4850,7 +4909,11 @@ out: */ static int +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99) VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED +#else +VSockVmciStreamRecvmsg( +#endif struct socket *sock, // IN: socket to receive from struct msghdr *msg, // IN/OUT: message to receive into size_t len, // IN: length of receive buffer @@ -4955,9 +5018,17 @@ VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED } if (flags & MSG_PEEK) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) read = vmci_qpair_peekv(vsk->qpair, msg->msg_iov, len - copied, 0); +#else + read = vmci_qpair_peekv(vsk->qpair, &msg->msg_iter.iov, len - copied, 0); +#endif } else { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) read = vmci_qpair_dequev(vsk->qpair, msg->msg_iov, len - copied, 0); +#else + read = vmci_qpair_dequev(vsk->qpair, &msg->msg_iter.iov, len - copied, 0); +#endif } if (read < 0) { diff --git a/vsock-only/linux/notify.c b/vsock-only/linux/notify.c index 5b1e134..82d8738 100644 --- a/vsock-only/linux/notify.c +++ b/vsock-only/linux/notify.c @@ -516,7 +516,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN PKT_FIELD(vsk, sentWaitingRead) = FALSE; #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0) sk->sk_data_ready(sk, 0); +#else + sk->sk_data_ready(sk); +#endif } diff --git a/vsock-only/linux/notifyQState.c b/vsock-only/linux/notifyQState.c index 464454b..7933be7 100644 --- a/vsock-only/linux/notifyQState.c +++ b/vsock-only/linux/notifyQState.c @@ -164,7 +164,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN struct sockaddr_vm *dst, // IN: unused struct sockaddr_vm *src) // IN: unused { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0) sk->sk_data_ready(sk, 0); +#else + sk->sk_data_ready(sk); +#endif } @@ -566,7 +570,11 @@ VSockVmciNotifyPktRecvPostDequeue(struct sock *sk, // IN } /* See the comment in VSockVmciNotifyPktSendPostEnqueue */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0) sk->sk_data_ready(sk, 0); +#else + sk->sk_data_ready(sk); +#endif } return err;