This patch adds IPPROTO_SMBDIRECT and SOL_SMBDIRECT constants to the networking subsystem. These definitions are essential for applications to set socket options and protocol identifiers related to the SMBDIRECT protocol, defined in [MS-SMBD] by Microsoft. It is used as wrapper around RDMA in order to provide a transport for SMB3, but Microsoft also uses it as transport for other protocols. SMBDIRECT works over Infiniband, RoCE and iWarp. RoCEv2 is based on IP/UDP and iWarp is based on IP/TCP, so these use IP addresses natively. Infiniband and RoCEv1 require IPOIB in order to be used for SMBDIRECT. So instead of adding a PF_SMBDIRECT, which would only use AF_INET[6], we use IPPROTO_SMBDIRECT instead, this uses a number not allocated from IANA, as it would not appear in an IP header. This is similar to IPPROTO_SMC, IPPROTO_MPTCP and IPPROTO_QUIC, which are linux specific values for the socket() syscall. socket(AF_INET, SOCK_STREAM, IPPROTO_SMBDIRECT); socket(AF_INET6, SOCK_STREAM, IPPROTO_SMBDIRECT); This will allow the existing smbdirect code used by cifs.ko and ksmbd.ko to be moved behind the socket layer [1], so that there's less special handling. Only sock_sendmsg() sock_recvmsg() are used, so that the main stream handling is done all the same for tcp, smbdirect and later also quic. The special RDMA read/write handling will be via direct function calls as they are currently done for the in kernel consumers. As a start __sock_create(kern=0)/sk->sk_kern_sock == 0 will still cause a -EPROTONOSUPPORT. So only in kernel consumers will be supported for now. Once I have developed a stable interface for the RDMA read/write handling using sendmsg/recvmsg with MSG_OOB and msg_control, it will also exposed to userspace in order to allow Samba to use it. [1] https://git.samba.org/?p=metze/linux/wip.git;a=shortlog;h=refs/heads/master-ipproto-smbdirect Cc: David S. Miller Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Kuniyuki Iwashima Cc: Willem de Bruijn Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: Xin Long Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: linux-rdma@vger.kernel.org Signed-off-by: Stefan Metzmacher --- In order to avoid conflicts with the addition of IPPROTO_QUIC, the patch is based on netdev-next/main + the patch adding IPPROTO_QUIC and SOL_QUIC [2]. [2] https://lore.kernel.org/quic/0cb58f6fcf35ac988660e42704dae9960744a0a7.1763994509.git.lucien.xin@gmail.com/T/#u As the numbers of IPPROTO_QUIC and SOL_QUIC are already used in various userspace applications it would be good to have this merged to netdev-next/main even if the actual implementation is still waiting for review. Having IPPROTO_SMBDIRECT+SOL_SMBDIRECT merged would also make thinks easier for me. --- include/linux/socket.h | 1 + include/uapi/linux/in.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/include/linux/socket.h b/include/linux/socket.h index b4563ffe552b..350a579a87da 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -402,6 +402,7 @@ struct ucred { #define SOL_SMC 286 #define SOL_VSOCK 287 #define SOL_QUIC 288 +#define SOL_SMBDIRECT 289 /* IPX options */ #define IPX_TYPE 1 diff --git a/include/uapi/linux/in.h b/include/uapi/linux/in.h index 34becd90d3a6..b30caa6db8ca 100644 --- a/include/uapi/linux/in.h +++ b/include/uapi/linux/in.h @@ -85,6 +85,8 @@ enum { #define IPPROTO_RAW IPPROTO_RAW IPPROTO_SMC = 256, /* Shared Memory Communications */ #define IPPROTO_SMC IPPROTO_SMC + IPPROTO_SMBDIRECT = 257, /* RDMA based transport (mostly used by SMB3) */ +#define IPPROTO_SMBDIRECT IPPROTO_SMBDIRECT IPPROTO_QUIC = 261, /* A UDP-Based Multiplexed and Secure Transport */ #define IPPROTO_QUIC IPPROTO_QUIC IPPROTO_MPTCP = 262, /* Multipath TCP connection */ -- 2.43.0