net/smc/smc_inet.c

Source file repositories/reference/linux-study-clean/net/smc/smc_inet.c

File Facts

System
Linux kernel
Corpus path
net/smc/smc_inet.c
Extension
.c
Size
3901 bytes
Lines
164
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

static 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,
};

static struct inet_protosw smc_inet_protosw = {
	.type		= SOCK_STREAM,
	.protocol	= IPPROTO_SMC,
	.prot		= &smc_inet_prot,
	.ops		= &smc_inet_stream_ops,
};

#if IS_ENABLED(CONFIG_IPV6)
struct smc6_sock {
	struct smc_sock		smc;
	struct ipv6_pinfo	inet6;
};

static 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 smc6_sock),
	.h.smc_hash	= &smc_v6_hashinfo,
	.slab_flags	= SLAB_TYPESAFE_BY_RCU,
	.ipv6_pinfo_offset	= offsetof(struct smc6_sock, inet6),
};

static 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,
};

static struct inet_protosw smc_inet6_protosw = {
	.type		= SOCK_STREAM,
	.protocol	= IPPROTO_SMC,
	.prot		= &smc_inet6_prot,
	.ops		= &smc_inet6_stream_ops,
};
#endif /* CONFIG_IPV6 */

static int smc_inet_init_sock(struct sock *sk)
{
	struct net *net = sock_net(sk);

	/* init common smc sock */
	smc_sk_init(net, sk, IPPROTO_SMC);
	/* create clcsock */
	return smc_create_clcsk(net, sk, sk->sk_family);
}

int __init smc_inet_init(void)
{
	int rc;

Annotation

Implementation Notes