[PATCH 5/8] net: define IPPROTO_SMBDIRECT and SOL_SMBDIRECT constants
Stefan Metzmacher <[email protected]> Tue, 7 Apr 2026 16:46:31 +0200
| Newsgroups | dev.linux.lists.quic,org.kernel.vger.linux-cifs,org.kernel.vger.linux-kernel,org.kernel.vger.linux-rdma,org.kernel.vger.netdev |
|---|---|
| Message-ID | <af3d81da716943128dc98b5aefd44d1aa52c1094.1775571957.git.metze@samba.org> |
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, 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. As the numbers of IPPROTO_QUIC (261) and SOL_QUIC (288) [1] are already used in various (released) userspace applications, I used 289 for SOL_SMBDIRECT instead of 288. [1] https://lore.kernel.org/quic/0cb58f6fcf35ac988660e42704dae9960744a0a7.1763994509.git.lucien.xin@gmail.com/T/#u Cc: Steve French <[email protected]> Cc: Tom Talpey <[email protected]> Cc: Long Li <[email protected]> Cc: Namjae Jeon <[email protected]> Cc: David Howells <[email protected]> Cc: Henrique Carvalho <[email protected]> Cc: [email protected] Cc: [email protected] Cc: David S. Miller <[email protected]> Cc: Eric Dumazet <[email protected]> Cc: Jakub Kicinski <[email protected]> Cc: Paolo Abeni <[email protected]> Cc: Simon Horman <[email protected]> Cc: Kuniyuki Iwashima <[email protected]> Cc: Willem de Bruijn <[email protected]> Cc: [email protected] Cc: Xin Long <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Signed-off-by: Stefan Metzmacher <[email protected]> --- include/linux/socket.h | 2 ++ include/uapi/linux/in.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/include/linux/socket.h b/include/linux/socket.h index ec715ad4bf25..e00cbfdaa8d6 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -401,6 +401,8 @@ struct ucred { #define SOL_MCTP 285 #define SOL_SMC 286 #define SOL_VSOCK 287 +/* 288 reserved for SOL_QUIC */ +#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 ced0fc3c3aa5..933d243b1780 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_MPTCP = 262, /* Multipath TCP connection */ #define IPPROTO_MPTCP IPPROTO_MPTCP IPPROTO_MAX -- 2.43.0