forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch allows to create smc socket via AF_INET, similar to the following code, /* create v4 smc sock */ v4 = socket(AF_INET, SOCK_STREAM, IPPROTO_SMC); /* create v6 smc sock */ v6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_SMC); There are several reasons why we believe it is appropriate here: 1. For smc sockets, it actually use IPv4 (AF-INET) or IPv6 (AF-INET6) address. There is no AF_SMC address at all. 2. Create smc socket in the AF_INET(6) path, which allows us to reuse the infrastructure of AF_INET(6) path, such as common ebpf hooks. Otherwise, smc have to implement it again in AF_SMC path. Signed-off-by: D. Wythe <[email protected]> Signed-off-by: NipaLocal <nipa@local>
- Loading branch information
D. Wythe
authored and
NipaLocal
committed
May 19, 2024
1 parent
4ac67c5
commit ed51700
Showing
5 changed files
with
178 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Shared Memory Communications over RDMA (SMC-R) and RoCE | ||
* | ||
* Definitions for the IPPROTO_SMC (socket related) | ||
* | ||
* Copyright IBM Corp. 2016, 2018 | ||
* | ||
* Author(s): D. Wythe <[email protected]> | ||
*/ | ||
|
||
#include "inet_smc.h" | ||
#include "smc.h" | ||
|
||
struct proto smc_inet_prot = { | ||
.name = "INET_SMC", | ||
.owner = THIS_MODULE, | ||
.init = smc_inet_init_sock, | ||
.hash = smc_hash_sk, | ||
.unhash = smc_unhash_sk, | ||
.release_cb = smc_release_cb, | ||
.obj_size = sizeof(struct smc_sock), | ||
.h.smc_hash = &smc_v4_hashinfo, | ||
.slab_flags = SLAB_TYPESAFE_BY_RCU, | ||
}; | ||
|
||
const struct proto_ops smc_inet_stream_ops = { | ||
.family = PF_INET, | ||
.owner = THIS_MODULE, | ||
.release = smc_release, | ||
.bind = smc_bind, | ||
.connect = smc_connect, | ||
.socketpair = sock_no_socketpair, | ||
.accept = smc_accept, | ||
.getname = smc_getname, | ||
.poll = smc_poll, | ||
.ioctl = smc_ioctl, | ||
.listen = smc_listen, | ||
.shutdown = smc_shutdown, | ||
.setsockopt = smc_setsockopt, | ||
.getsockopt = smc_getsockopt, | ||
.sendmsg = smc_sendmsg, | ||
.recvmsg = smc_recvmsg, | ||
.mmap = sock_no_mmap, | ||
.splice_read = smc_splice_read, | ||
}; | ||
|
||
struct inet_protosw smc_inet_protosw = { | ||
.type = SOCK_STREAM, | ||
.protocol = IPPROTO_SMC, | ||
.prot = &smc_inet_prot, | ||
.ops = &smc_inet_stream_ops, | ||
.flags = INET_PROTOSW_ICSK, | ||
}; | ||
|
||
#if IS_ENABLED(CONFIG_IPV6) | ||
struct proto smc_inet6_prot = { | ||
.name = "INET6_SMC", | ||
.owner = THIS_MODULE, | ||
.init = smc_inet_init_sock, | ||
.hash = smc_hash_sk, | ||
.unhash = smc_unhash_sk, | ||
.release_cb = smc_release_cb, | ||
.obj_size = sizeof(struct smc_sock), | ||
.h.smc_hash = &smc_v6_hashinfo, | ||
.slab_flags = SLAB_TYPESAFE_BY_RCU, | ||
}; | ||
|
||
const struct proto_ops smc_inet6_stream_ops = { | ||
.family = PF_INET6, | ||
.owner = THIS_MODULE, | ||
.release = smc_release, | ||
.bind = smc_bind, | ||
.connect = smc_connect, | ||
.socketpair = sock_no_socketpair, | ||
.accept = smc_accept, | ||
.getname = smc_getname, | ||
.poll = smc_poll, | ||
.ioctl = smc_ioctl, | ||
.listen = smc_listen, | ||
.shutdown = smc_shutdown, | ||
.setsockopt = smc_setsockopt, | ||
.getsockopt = smc_getsockopt, | ||
.sendmsg = smc_sendmsg, | ||
.recvmsg = smc_recvmsg, | ||
.mmap = sock_no_mmap, | ||
.splice_read = smc_splice_read, | ||
}; | ||
|
||
struct inet_protosw smc_inet6_protosw = { | ||
.type = SOCK_STREAM, | ||
.protocol = IPPROTO_SMC, | ||
.prot = &smc_inet6_prot, | ||
.ops = &smc_inet6_stream_ops, | ||
.flags = INET_PROTOSW_ICSK, | ||
}; | ||
#endif | ||
|
||
int smc_inet_init_sock(struct sock *sk) | ||
{ | ||
struct net *net = sock_net(sk); | ||
|
||
/* init common smc sock */ | ||
smc_sock_init(net, sk, IPPROTO_SMC); | ||
/* create clcsock */ | ||
return smc_create_clcsk(net, sk, sk->sk_family); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* | ||
* Shared Memory Communications over RDMA (SMC-R) and RoCE | ||
* | ||
* Definitions for the IPPROTO_SMC (socket related) | ||
* Copyright IBM Corp. 2016 | ||
* | ||
*/ | ||
#ifndef __INET_SMC | ||
#define __INET_SMC | ||
|
||
#include <net/protocol.h> | ||
#include <net/sock.h> | ||
#include <net/tcp.h> | ||
|
||
extern struct proto smc_inet_prot; | ||
extern const struct proto_ops smc_inet_stream_ops; | ||
extern struct inet_protosw smc_inet_protosw; | ||
|
||
#if IS_ENABLED(CONFIG_IPV6) | ||
#include <net/ipv6.h> | ||
/* MUST after net/tcp.h or warning */ | ||
#include <net/transp_v6.h> | ||
extern struct proto smc_inet6_prot; | ||
extern const struct proto_ops smc_inet6_stream_ops; | ||
extern struct inet_protosw smc_inet6_protosw; | ||
#endif | ||
|
||
int smc_inet_init_sock(struct sock *sk); | ||
|
||
#endif /* __INET_SMC */ |