1 // SPDX-License-Identifier: GPL-2.0-only
3 * Shared Memory Communications over RDMA (SMC-R) and RoCE
5 * Definitions for the IPPROTO_SMC (socket related)
7 * Copyright IBM Corp. 2016, 2018
8 * Copyright (c) 2024, Alibaba Inc.
10 * Author: D. Wythe <alibuda@linux.alibaba.com>
13 #include <net/protocol.h>
19 static int smc_inet_init_sock(struct sock
*sk
);
21 static struct proto smc_inet_prot
= {
24 .init
= smc_inet_init_sock
,
26 .unhash
= smc_unhash_sk
,
27 .release_cb
= smc_release_cb
,
28 .obj_size
= sizeof(struct smc_sock
),
29 .h
.smc_hash
= &smc_v4_hashinfo
,
30 .slab_flags
= SLAB_TYPESAFE_BY_RCU
,
33 static const struct proto_ops smc_inet_stream_ops
= {
36 .release
= smc_release
,
38 .connect
= smc_connect
,
39 .socketpair
= sock_no_socketpair
,
41 .getname
= smc_getname
,
45 .shutdown
= smc_shutdown
,
46 .setsockopt
= smc_setsockopt
,
47 .getsockopt
= smc_getsockopt
,
48 .sendmsg
= smc_sendmsg
,
49 .recvmsg
= smc_recvmsg
,
51 .splice_read
= smc_splice_read
,
54 static struct inet_protosw smc_inet_protosw
= {
56 .protocol
= IPPROTO_SMC
,
57 .prot
= &smc_inet_prot
,
58 .ops
= &smc_inet_stream_ops
,
59 .flags
= INET_PROTOSW_ICSK
,
62 #if IS_ENABLED(CONFIG_IPV6)
65 struct ipv6_pinfo inet6
;
68 static struct proto smc_inet6_prot
= {
71 .init
= smc_inet_init_sock
,
73 .unhash
= smc_unhash_sk
,
74 .release_cb
= smc_release_cb
,
75 .obj_size
= sizeof(struct smc6_sock
),
76 .h
.smc_hash
= &smc_v6_hashinfo
,
77 .slab_flags
= SLAB_TYPESAFE_BY_RCU
,
78 .ipv6_pinfo_offset
= offsetof(struct smc6_sock
, inet6
),
81 static const struct proto_ops smc_inet6_stream_ops
= {
84 .release
= smc_release
,
86 .connect
= smc_connect
,
87 .socketpair
= sock_no_socketpair
,
89 .getname
= smc_getname
,
93 .shutdown
= smc_shutdown
,
94 .setsockopt
= smc_setsockopt
,
95 .getsockopt
= smc_getsockopt
,
96 .sendmsg
= smc_sendmsg
,
97 .recvmsg
= smc_recvmsg
,
99 .splice_read
= smc_splice_read
,
102 static struct inet_protosw smc_inet6_protosw
= {
104 .protocol
= IPPROTO_SMC
,
105 .prot
= &smc_inet6_prot
,
106 .ops
= &smc_inet6_stream_ops
,
107 .flags
= INET_PROTOSW_ICSK
,
109 #endif /* CONFIG_IPV6 */
111 static unsigned int smc_sync_mss(struct sock
*sk
, u32 pmtu
)
113 /* No need pass it through to clcsock, mss can always be set by
114 * sock_create_kern or smc_setsockopt.
119 static int smc_inet_init_sock(struct sock
*sk
)
121 struct net
*net
= sock_net(sk
);
123 /* init common smc sock */
124 smc_sk_init(net
, sk
, IPPROTO_SMC
);
126 inet_csk(sk
)->icsk_sync_mss
= smc_sync_mss
;
129 return smc_create_clcsk(net
, sk
, sk
->sk_family
);
132 int __init
smc_inet_init(void)
136 rc
= proto_register(&smc_inet_prot
, 1);
138 pr_err("%s: proto_register smc_inet_prot fails with %d\n",
142 /* no return value */
143 inet_register_protosw(&smc_inet_protosw
);
145 #if IS_ENABLED(CONFIG_IPV6)
146 rc
= proto_register(&smc_inet6_prot
, 1);
148 pr_err("%s: proto_register smc_inet6_prot fails with %d\n",
152 rc
= inet6_register_protosw(&smc_inet6_protosw
);
154 pr_err("%s: inet6_register_protosw smc_inet6_protosw fails with %d\n",
156 goto out_inet6_protosw
;
160 proto_unregister(&smc_inet6_prot
);
162 inet_unregister_protosw(&smc_inet_protosw
);
163 proto_unregister(&smc_inet_prot
);
164 #endif /* CONFIG_IPV6 */
168 void smc_inet_exit(void)
170 #if IS_ENABLED(CONFIG_IPV6)
171 inet6_unregister_protosw(&smc_inet6_protosw
);
172 proto_unregister(&smc_inet6_prot
);
173 #endif /* CONFIG_IPV6 */
174 inet_unregister_protosw(&smc_inet_protosw
);
175 proto_unregister(&smc_inet_prot
);