lib/wifi: remove static constructors

Remove static constructors from 'socket_call.cc'

issue #5096
This commit is contained in:
Sebastian Sumpf 2024-01-22 08:04:42 +01:00 committed by Christian Helmuth
parent 491ab232bf
commit 684de7a57b

View File

@ -219,15 +219,31 @@ struct Call
int err = 0; int err = 0;
}; };
static Call _call;
static Semaphore _block;
namespace Lx { namespace Lx {
class Socket; class Socket;
} }
struct Statics
{
Call call;
Semaphore block;
};
static Statics & statics()
{
static Statics instance { };
return instance;
};
static Call &_call()
{
return statics().call;
}
/** /**
* Context for socket calls * Context for socket calls
@ -248,7 +264,7 @@ class Lx::Socket
struct socket *_call_socket() struct socket *_call_socket()
{ {
struct socket *sock = static_cast<struct socket*>(_call.handle->socket); struct socket *sock = static_cast<struct socket*>(_call().handle->socket);
if (!sock) if (!sock)
error("BUG: sock is zero"); error("BUG: sock is zero");
@ -258,71 +274,71 @@ class Lx::Socket
void _do_socket() void _do_socket()
{ {
struct socket *s; struct socket *s;
int res = lx_sock_create_kern(_call.socket.domain, _call.socket.type, int res = lx_sock_create_kern(_call().socket.domain, _call().socket.type,
_call.socket.protocol, &s); _call().socket.protocol, &s);
if (!res) { if (!res) {
_call.socket.result = s; _call().socket.result = s;
_call.err = 0; _call().err = 0;
return; return;
} }
_call.socket.result = nullptr; _call().socket.result = nullptr;
_call.err = res; _call().err = res;
} }
void _do_close() void _do_close()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
_call.err = lx_sock_release(sock); _call().err = lx_sock_release(sock);
} }
void _do_bind() void _do_bind()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
_call.err = lx_sock_bind(sock, _call().err = lx_sock_bind(sock,
const_cast<void*>(_call.bind.addr), const_cast<void*>(_call().bind.addr),
_call.bind.addrlen); _call().bind.addrlen);
} }
void _do_getsockname() void _do_getsockname()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
int addrlen = *_call.getsockname.addrlen; int addrlen = *_call().getsockname.addrlen;
_call.err = lx_sock_getname(sock, _call.getsockname.addr, 0); _call().err = lx_sock_getname(sock, _call().getsockname.addr, 0);
*_call.getsockname.addrlen = addrlen; *_call().getsockname.addrlen = addrlen;
} }
void _do_recvmsg() void _do_recvmsg()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
_call.err = lx_sock_recvmsg(sock, &_call.recvmsg.msg, _call().err = lx_sock_recvmsg(sock, &_call().recvmsg.msg,
_call.recvmsg.flags, _call().recvmsg.flags,
_call.handle->non_block); _call().handle->non_block);
} }
void _do_sendmsg() void _do_sendmsg()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
_call.err = lx_sock_sendmsg(sock, &_call.sendmsg.msg, _call().err = lx_sock_sendmsg(sock, &_call().sendmsg.msg,
_call.sendmsg.flags, _call().sendmsg.flags,
_call.handle->non_block); _call().handle->non_block);
} }
void _do_setsockopt() void _do_setsockopt()
{ {
struct socket *sock = _call_socket(); struct socket *sock = _call_socket();
_call.err = lx_sock_setsockopt(sock, _call().err = lx_sock_setsockopt(sock,
_call.setsockopt.level, _call().setsockopt.level,
_call.setsockopt.optname, _call().setsockopt.optname,
_call.setsockopt.optval, _call().setsockopt.optval,
_call.setsockopt.optlen); _call().setsockopt.optlen);
} }
void _do_get_mac_address() void _do_get_mac_address()
@ -331,18 +347,18 @@ class Lx::Socket
if (!addr) if (!addr)
return; return;
size_t const copy = 6 > _call.get_mac_address.addr_len size_t const copy = 6 > _call().get_mac_address.addr_len
? _call.get_mac_address.addr_len ? _call().get_mac_address.addr_len
: 6; : 6;
memcpy(_call.get_mac_address.addr, addr, copy); memcpy(_call().get_mac_address.addr, addr, copy);
} }
void _do_poll_all() void _do_poll_all()
{ {
Wifi::Poll_socket_fd *sockets = _call.poll_all.sockets; Wifi::Poll_socket_fd *sockets = _call().poll_all.sockets;
unsigned num = _call.poll_all.num; unsigned num = _call().poll_all.num;
int timeout = _call.poll_all.timeout; int timeout = _call().poll_all.timeout;
int nready = 0; int nready = 0;
bool timeout_triggered = false; bool timeout_triggered = false;
@ -404,12 +420,12 @@ class Lx::Socket
woken_up = true; woken_up = true;
} while (1); } while (1);
_call.err = nready; _call().err = nready;
} }
void _do_non_block() void _do_non_block()
{ {
_call.handle->non_block = _call.non_block.value; _call().handle->non_block = _call().non_block.value;
} }
void _handle() void _handle()
@ -420,7 +436,7 @@ class Lx::Socket
void _handle_blockade() void _handle_blockade()
{ {
_block.up(); statics().block.up();
} }
public: public:
@ -435,7 +451,7 @@ class Lx::Socket
void exec_call() void exec_call()
{ {
switch (_call.opcode) { switch (_call().opcode) {
case Call::BIND: _do_bind(); break; case Call::BIND: _do_bind(); break;
case Call::CLOSE: _do_close(); break; case Call::CLOSE: _do_close(); break;
case Call::GETSOCKNAME: _do_getsockname(); break; case Call::GETSOCKNAME: _do_getsockname(); break;
@ -457,9 +473,9 @@ class Lx::Socket
* when actually did something useful, i.e., were called by * when actually did something useful, i.e., were called by
* some socket operation and not by kicking the socket. * some socket operation and not by kicking the socket.
*/ */
Call::Opcode old = _call.opcode; Call::Opcode old = _call().opcode;
_call.opcode = Call::NONE; _call().opcode = Call::NONE;
if (old != Call::NONE) { _dispatcher_blockade.local_submit(); } if (old != Call::NONE) { _dispatcher_blockade.local_submit(); }
} }
@ -467,7 +483,7 @@ class Lx::Socket
void submit_and_block() void submit_and_block()
{ {
_sender.submit(); _sender.submit();
_block.down(); statics().block.down();
} }
}; };
@ -532,17 +548,17 @@ using namespace Wifi;
Wifi::Socket *Socket_call::socket(int domain, int type, int protocol) Wifi::Socket *Socket_call::socket(int domain, int type, int protocol)
{ {
/* FIXME domain, type, protocol values */ /* FIXME domain, type, protocol values */
_call.opcode = Call::SOCKET; _call().opcode = Call::SOCKET;
_call.socket.domain = domain; _call().socket.domain = domain;
_call.socket.type = type & 0xff; _call().socket.type = type & 0xff;
_call.socket.protocol = protocol; _call().socket.protocol = protocol;
_socket->submit_and_block(); _socket->submit_and_block();
if (_call.socket.result == 0) if (_call().socket.result == 0)
return 0; return 0;
Wifi::Socket *s = new (Lx_kit::env().heap) Wifi::Socket(_call.socket.result); Wifi::Socket *s = new (Lx_kit::env().heap) Wifi::Socket(_call().socket.result);
return s; return s;
} }
@ -550,30 +566,30 @@ Wifi::Socket *Socket_call::socket(int domain, int type, int protocol)
int Socket_call::close(Socket *s) int Socket_call::close(Socket *s)
{ {
_call.opcode = Call::CLOSE; _call().opcode = Call::CLOSE;
_call.handle = s; _call().handle = s;
_socket->submit_and_block(); _socket->submit_and_block();
if (_call.err) if (_call().err)
warning("closing socket failed: ", _call.err); warning("closing socket failed: ", _call().err);
destroy(Lx_kit::env().heap, s); destroy(Lx_kit::env().heap, s);
return _call.err; return _call().err;
} }
int Socket_call::bind(Socket *s, Wifi::Sockaddr const *addr, unsigned addrlen) int Socket_call::bind(Socket *s, Wifi::Sockaddr const *addr, unsigned addrlen)
{ {
/* FIXME convert to/from Sockaddr */ /* FIXME convert to/from Sockaddr */
_call.opcode = Call::BIND; _call().opcode = Call::BIND;
_call.handle = s; _call().handle = s;
_call.bind.addr = (void const *)addr; _call().bind.addr = (void const *)addr;
_call.bind.addrlen = addrlen; _call().bind.addrlen = addrlen;
_socket->submit_and_block(); _socket->submit_and_block();
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
@ -581,28 +597,28 @@ int Socket_call::getsockname(Socket *s, Wifi::Sockaddr *addr, unsigned *addrlen)
{ {
/* FIXME convert to/from Sockaddr */ /* FIXME convert to/from Sockaddr */
/* FIXME unsigned * -> int * */ /* FIXME unsigned * -> int * */
_call.opcode = Call::GETSOCKNAME; _call().opcode = Call::GETSOCKNAME;
_call.handle = s; _call().handle = s;
_call.getsockname.addr = (void *)addr; _call().getsockname.addr = (void *)addr;
_call.getsockname.addrlen = (int *)addrlen; _call().getsockname.addrlen = (int *)addrlen;
_socket->submit_and_block(); _socket->submit_and_block();
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
int Socket_call::poll_all(Poll_socket_fd *s, unsigned num, int timeout) int Socket_call::poll_all(Poll_socket_fd *s, unsigned num, int timeout)
{ {
_call.opcode = Call::POLL_ALL; _call().opcode = Call::POLL_ALL;
_call.handle = 0; _call().handle = 0;
_call.poll_all.sockets = s; _call().poll_all.sockets = s;
_call.poll_all.num = num; _call().poll_all.num = num;
_call.poll_all.timeout = timeout; _call().poll_all.timeout = timeout;
_socket->submit_and_block(); _socket->submit_and_block();
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
@ -621,49 +637,49 @@ static inline int msg_flags(Wifi::Flags in)
Wifi::ssize_t Socket_call::recvmsg(Socket *s, Wifi::Msghdr *msg, Wifi::Flags flags) Wifi::ssize_t Socket_call::recvmsg(Socket *s, Wifi::Msghdr *msg, Wifi::Flags flags)
{ {
_call.opcode = Call::RECVMSG; _call().opcode = Call::RECVMSG;
_call.handle = s; _call().handle = s;
_call.recvmsg.msg.msg_name = msg->msg_name; _call().recvmsg.msg.msg_name = msg->msg_name;
_call.recvmsg.msg.msg_namelen = msg->msg_namelen; _call().recvmsg.msg.msg_namelen = msg->msg_namelen;
_call.recvmsg.msg.msg_iovcount = msg->msg_iovlen; _call().recvmsg.msg.msg_iovcount = msg->msg_iovlen;
_call.recvmsg.msg.msg_control = msg->msg_control; _call().recvmsg.msg.msg_control = msg->msg_control;
_call.recvmsg.msg.msg_controllen = msg->msg_controllen; _call().recvmsg.msg.msg_controllen = msg->msg_controllen;
_call.recvmsg.flags = msg_flags(flags); _call().recvmsg.flags = msg_flags(flags);
for (unsigned i = 0; i < msg->msg_iovlen; ++i) { for (unsigned i = 0; i < msg->msg_iovlen; ++i) {
_call.recvmsg.msg.msg_iov[i].iov_base = msg->msg_iov[i].iov_base; _call().recvmsg.msg.msg_iov[i].iov_base = msg->msg_iov[i].iov_base;
_call.recvmsg.msg.msg_iov[i].iov_len = msg->msg_iov[i].iov_len; _call().recvmsg.msg.msg_iov[i].iov_len = msg->msg_iov[i].iov_len;
} }
_socket->submit_and_block(); _socket->submit_and_block();
msg->msg_namelen = _call.recvmsg.msg.msg_namelen; msg->msg_namelen = _call().recvmsg.msg.msg_namelen;
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
Wifi::ssize_t Socket_call::sendmsg(Socket *s, Wifi::Msghdr const *msg, Wifi::Flags flags) Wifi::ssize_t Socket_call::sendmsg(Socket *s, Wifi::Msghdr const *msg, Wifi::Flags flags)
{ {
_call.opcode = Call::SENDMSG; _call().opcode = Call::SENDMSG;
_call.handle = s; _call().handle = s;
_call.sendmsg.msg.msg_name = msg->msg_name; _call().sendmsg.msg.msg_name = msg->msg_name;
_call.sendmsg.msg.msg_namelen = msg->msg_namelen; _call().sendmsg.msg.msg_namelen = msg->msg_namelen;
_call.sendmsg.msg.msg_iovcount = msg->msg_iovlen; _call().sendmsg.msg.msg_iovcount = msg->msg_iovlen;
_call.sendmsg.msg.msg_control = 0; _call().sendmsg.msg.msg_control = 0;
_call.sendmsg.msg.msg_controllen = 0; _call().sendmsg.msg.msg_controllen = 0;
_call.sendmsg.flags = msg_flags(flags); _call().sendmsg.flags = msg_flags(flags);
for (unsigned i = 0; i < msg->msg_iovlen; ++i) { for (unsigned i = 0; i < msg->msg_iovlen; ++i) {
_call.sendmsg.msg.msg_iov[i].iov_base = msg->msg_iov[i].iov_base; _call().sendmsg.msg.msg_iov[i].iov_base = msg->msg_iov[i].iov_base;
_call.sendmsg.msg.msg_iov[i].iov_len = msg->msg_iov[i].iov_len; _call().sendmsg.msg.msg_iov[i].iov_len = msg->msg_iov[i].iov_len;
} }
_socket->submit_and_block(); _socket->submit_and_block();
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
@ -709,24 +725,24 @@ int Socket_call::setsockopt(Socket *s,
const void *optval, unsigned optlen) const void *optval, unsigned optlen)
{ {
/* FIXME optval values */ /* FIXME optval values */
_call.opcode = Call::SETSOCKOPT; _call().opcode = Call::SETSOCKOPT;
_call.handle = s; _call().handle = s;
_call.setsockopt.level = sockopt_level(level); _call().setsockopt.level = sockopt_level(level);
_call.setsockopt.optname = sockopt_name(level, optname); _call().setsockopt.optname = sockopt_name(level, optname);
_call.setsockopt.optval = optval; _call().setsockopt.optval = optval;
_call.setsockopt.optlen = optlen; _call().setsockopt.optlen = optlen;
_socket->submit_and_block(); _socket->submit_and_block();
return convert_errno_from_linux(_call.err); return convert_errno_from_linux(_call().err);
} }
void Socket_call::non_block(Socket *s, bool value) void Socket_call::non_block(Socket *s, bool value)
{ {
_call.opcode = Call::NON_BLOCK; _call().opcode = Call::NON_BLOCK;
_call.handle = s; _call().handle = s;
_call.non_block.value = value; _call().non_block.value = value;
_socket->submit_and_block(); _socket->submit_and_block();
} }
@ -734,10 +750,10 @@ void Socket_call::non_block(Socket *s, bool value)
void Socket_call::get_mac_address(unsigned char *addr) void Socket_call::get_mac_address(unsigned char *addr)
{ {
_call.opcode = Call::GET_MAC_ADDRESS; _call().opcode = Call::GET_MAC_ADDRESS;
_call.handle = 0; _call().handle = 0;
_call.get_mac_address.addr = addr; _call().get_mac_address.addr = addr;
_call.get_mac_address.addr_len = 6; // XXX enforce and set from caller _call().get_mac_address.addr_len = 6; // XXX enforce and set from caller
_socket->submit_and_block(); _socket->submit_and_block();
} }