xref: /freebsd/usr.sbin/ctld/nvmf.hh (revision 66b5296f1b29083634e2875ff08c32e7b6b866a8)
1*66b5296fSJohn Baldwin /*-
2*66b5296fSJohn Baldwin  * SPDX-License-Identifier: BSD-2-Clause
3*66b5296fSJohn Baldwin  *
4*66b5296fSJohn Baldwin  * Copyright (c) 2025 Chelsio Communications, Inc.
5*66b5296fSJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
6*66b5296fSJohn Baldwin  */
7*66b5296fSJohn Baldwin 
8*66b5296fSJohn Baldwin #ifndef __NVMF_HH__
9*66b5296fSJohn Baldwin #define	__NVMF_HH__
10*66b5296fSJohn Baldwin 
11*66b5296fSJohn Baldwin struct nvmf_association_deleter {
operator ()nvmf_association_deleter12*66b5296fSJohn Baldwin 	void operator()(struct nvmf_association *na) const
13*66b5296fSJohn Baldwin 	{
14*66b5296fSJohn Baldwin 		nvmf_free_association(na);
15*66b5296fSJohn Baldwin 	}
16*66b5296fSJohn Baldwin };
17*66b5296fSJohn Baldwin 
18*66b5296fSJohn Baldwin using nvmf_association_up = std::unique_ptr<nvmf_association,
19*66b5296fSJohn Baldwin 					    nvmf_association_deleter>;
20*66b5296fSJohn Baldwin 
21*66b5296fSJohn Baldwin struct nvmf_capsule_deleter {
operator ()nvmf_capsule_deleter22*66b5296fSJohn Baldwin 	void operator()(struct nvmf_capsule *nc) const
23*66b5296fSJohn Baldwin 	{
24*66b5296fSJohn Baldwin 		nvmf_free_capsule(nc);
25*66b5296fSJohn Baldwin 	}
26*66b5296fSJohn Baldwin };
27*66b5296fSJohn Baldwin 
28*66b5296fSJohn Baldwin using nvmf_capsule_up = std::unique_ptr<nvmf_capsule, nvmf_capsule_deleter>;
29*66b5296fSJohn Baldwin 
30*66b5296fSJohn Baldwin struct nvmf_qpair_deleter {
operator ()nvmf_qpair_deleter31*66b5296fSJohn Baldwin 	void operator()(struct nvmf_qpair *qp) const
32*66b5296fSJohn Baldwin 	{
33*66b5296fSJohn Baldwin 		nvmf_free_qpair(qp);
34*66b5296fSJohn Baldwin 	}
35*66b5296fSJohn Baldwin };
36*66b5296fSJohn Baldwin 
37*66b5296fSJohn Baldwin using nvmf_qpair_up = std::unique_ptr<nvmf_qpair, nvmf_qpair_deleter>;
38*66b5296fSJohn Baldwin 
39*66b5296fSJohn Baldwin struct nvmf_portal : public portal {
nvmf_portalnvmf_portal40*66b5296fSJohn Baldwin 	nvmf_portal(struct portal_group *pg, const char *listen,
41*66b5296fSJohn Baldwin 	    portal_protocol protocol, freebsd::addrinfo_up ai,
42*66b5296fSJohn Baldwin 	    const struct nvmf_association_params &aparams,
43*66b5296fSJohn Baldwin 	    nvmf_association_up na) :
44*66b5296fSJohn Baldwin 		portal(pg, listen, protocol, std::move(ai)),
45*66b5296fSJohn Baldwin 		p_aparams(aparams), p_association(std::move(na)) {}
46*66b5296fSJohn Baldwin 	virtual ~nvmf_portal() override = default;
47*66b5296fSJohn Baldwin 
aparamsnvmf_portal48*66b5296fSJohn Baldwin 	const struct nvmf_association_params *aparams() const
49*66b5296fSJohn Baldwin 	{ return &p_aparams; }
50*66b5296fSJohn Baldwin 
51*66b5296fSJohn Baldwin protected:
associationnvmf_portal52*66b5296fSJohn Baldwin 	struct nvmf_association *association() { return p_association.get(); }
53*66b5296fSJohn Baldwin 
54*66b5296fSJohn Baldwin private:
55*66b5296fSJohn Baldwin 	struct nvmf_association_params	p_aparams;
56*66b5296fSJohn Baldwin 	nvmf_association_up		p_association;
57*66b5296fSJohn Baldwin };
58*66b5296fSJohn Baldwin 
59*66b5296fSJohn Baldwin struct nvmf_discovery_portal final : public nvmf_portal {
nvmf_discovery_portalnvmf_discovery_portal60*66b5296fSJohn Baldwin 	nvmf_discovery_portal(struct portal_group *pg, const char *listen,
61*66b5296fSJohn Baldwin 	    portal_protocol protocol, freebsd::addrinfo_up ai,
62*66b5296fSJohn Baldwin 	    const struct nvmf_association_params &aparams,
63*66b5296fSJohn Baldwin 	    nvmf_association_up na) :
64*66b5296fSJohn Baldwin 		nvmf_portal(pg, listen, protocol, std::move(ai), aparams,
65*66b5296fSJohn Baldwin 		    std::move(na)) {}
66*66b5296fSJohn Baldwin 
67*66b5296fSJohn Baldwin 	void handle_connection(freebsd::fd_up fd, const char *host,
68*66b5296fSJohn Baldwin 	    const struct sockaddr *client_sa) override;
69*66b5296fSJohn Baldwin };
70*66b5296fSJohn Baldwin 
71*66b5296fSJohn Baldwin #endif /* !__NVMF_HH__ */
72