Comparison

net/server_epoll.lua @ 12802:4a8740e01813

Merge 0.12->trunk
author Kim Alvefur <zash@zash.se>
date Mon, 12 Dec 2022 07:10:54 +0100
parent 12594:29685403be32
child 12827:0605d4f03e25
comparison
equal deleted inserted replaced
12801:ebd6b4d8bf04 12802:4a8740e01813
16 local ipairs = ipairs; 16 local ipairs = ipairs;
17 local traceback = debug.traceback; 17 local traceback = debug.traceback;
18 local logger = require "util.logger"; 18 local logger = require "util.logger";
19 local log = logger.init("server_epoll"); 19 local log = logger.init("server_epoll");
20 local socket = require "socket"; 20 local socket = require "socket";
21 local luasec = require "ssl";
22 local realtime = require "util.time".now; 21 local realtime = require "util.time".now;
23 local monotonic = require "util.time".monotonic; 22 local monotonic = require "util.time".monotonic;
24 local indexedbheap = require "util.indexedbheap"; 23 local indexedbheap = require "util.indexedbheap";
25 local createtable = require "util.table".create; 24 local createtable = require "util.table".create;
26 local inet = require "util.net"; 25 local inet = require "util.net";
27 local inet_pton = inet.pton; 26 local inet_pton = inet.pton;
28 local _SOCKETINVALID = socket._SOCKETINVALID or -1; 27 local _SOCKETINVALID = socket._SOCKETINVALID or -1;
29 local new_id = require "util.id".short; 28 local new_id = require "util.id".short;
30 local xpcall = require "util.xpcall".xpcall; 29 local xpcall = require "util.xpcall".xpcall;
30 local sslconfig = require "util.sslconfig";
31 local tls_impl = require "net.tls_luasec";
31 32
32 local poller = require "util.poll" 33 local poller = require "util.poll"
33 local EEXIST = poller.EEXIST; 34 local EEXIST = poller.EEXIST;
34 local ENOENT = poller.ENOENT; 35 local ENOENT = poller.ENOENT;
35 36
89 -- Reuse write buffer tables 90 -- Reuse write buffer tables
90 keep_buffers = true; 91 keep_buffers = true;
91 92
92 --- How long to wait after getting the shutdown signal before forcefully tearing down every socket 93 --- How long to wait after getting the shutdown signal before forcefully tearing down every socket
93 shutdown_deadline = 5; 94 shutdown_deadline = 5;
95
96 -- TCP Fast Open
97 tcp_fastopen = false;
98
99 -- Defer accept until incoming data is available
100 tcp_defer_accept = false;
94 }}; 101 }};
95 local cfg = default_config.__index; 102 local cfg = default_config.__index;
96 103
97 local fds = createtable(10, 0); -- FD -> conn 104 local fds = createtable(10, 0); -- FD -> conn
98 105
612 619
613 function interface:set_sslctx(sslctx) 620 function interface:set_sslctx(sslctx)
614 self._sslctx = sslctx; 621 self._sslctx = sslctx;
615 end 622 end
616 623
624 function interface:sslctx()
625 return self.tls_ctx
626 end
627
628 function interface:ssl_info()
629 local sock = self.conn;
630 if not sock.info then return nil, "not-implemented"; end
631 return sock:info();
632 end
633
634 function interface:ssl_peercertificate()
635 local sock = self.conn;
636 if not sock.getpeercertificate then return nil, "not-implemented"; end
637 return sock:getpeercertificate();
638 end
639
640 function interface:ssl_peerverification()
641 local sock = self.conn;
642 if not sock.getpeerverification then return nil, { { "Chain verification not supported" } }; end
643 return sock:getpeerverification();
644 end
645
646 function interface:ssl_peerfinished()
647 local sock = self.conn;
648 if not sock.getpeerfinished then return nil, "not-implemented"; end
649 return sock:getpeerfinished();
650 end
651
652 function interface:ssl_exportkeyingmaterial(label, len, context)
653 local sock = self.conn;
654 if sock.exportkeyingmaterial then
655 return sock:exportkeyingmaterial(label, len, context);
656 end
657 end
658
659
617 function interface:starttls(tls_ctx) 660 function interface:starttls(tls_ctx)
618 if tls_ctx then self.tls_ctx = tls_ctx; end 661 if tls_ctx then self.tls_ctx = tls_ctx; end
619 self.starttls = false; 662 self.starttls = false;
620 if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then 663 if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
621 self:debug("Start TLS after write"); 664 self:debug("Start TLS after write");
639 if tls_ctx then self.tls_ctx = tls_ctx; end 682 if tls_ctx then self.tls_ctx = tls_ctx; end
640 self._tls = true; 683 self._tls = true;
641 self.starttls = false; 684 self.starttls = false;
642 self:debug("Starting TLS now"); 685 self:debug("Starting TLS now");
643 self:updatenames(); -- Can't getpeer/sockname after wrap() 686 self:updatenames(); -- Can't getpeer/sockname after wrap()
644 local ok, conn, err = pcall(luasec.wrap, self.conn, self.tls_ctx); 687 local conn, err = self.tls_ctx:wrap(self.conn);
645 if not ok then
646 conn, err = ok, conn;
647 self:debug("Failed to initialize TLS: %s", err);
648 end
649 if not conn then 688 if not conn then
650 self:on("disconnect", err); 689 self:on("disconnect", err);
651 self:destroy(); 690 self:destroy();
652 return conn, err; 691 return conn, err;
653 end 692 end
654 conn:settimeout(0); 693 conn:settimeout(0);
655 self.conn = conn; 694 self.conn = conn;
656 if conn.sni then 695 if conn.sni then
657 if self.servername then 696 if self.servername then
658 conn:sni(self.servername); 697 conn:sni(self.servername);
659 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then 698 elseif next(self.tls_ctx._sni_contexts) ~= nil then
660 conn:sni(self._server.hosts, true); 699 conn:sni(self.tls_ctx._sni_contexts, true);
661 end 700 end
662 end 701 end
663 if self.extra and self.extra.tlsa and conn.settlsa then 702 if self.extra and self.extra.tlsa and conn.settlsa then
664 -- TODO Error handling 703 -- TODO Error handling
665 if not conn:setdane(self.servername or self.extra.dane_hostname) then 704 if not conn:setdane(self.servername or self.extra.dane_hostname) then
739 if extra.servername then 778 if extra.servername then
740 conn.servername = extra.servername; 779 conn.servername = extra.servername;
741 end 780 end
742 end 781 end
743 782
744 conn:updatenames();
745 return conn; 783 return conn;
746 end 784 end
747 785
748 function interface:updatenames() 786 function interface:updatenames()
749 local conn = self.conn; 787 local conn = self.conn;
765 self:debug("Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); 803 self:debug("Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval);
766 self:pausefor(cfg.accept_retry_interval); 804 self:pausefor(cfg.accept_retry_interval);
767 return; 805 return;
768 end 806 end
769 local client = wrapsocket(conn, self, nil, self.listeners); 807 local client = wrapsocket(conn, self, nil, self.listeners);
808 client:updatenames();
770 client:debug("New connection %s on server %s", client, self); 809 client:debug("New connection %s on server %s", client, self);
771 client:defaultoptions(); 810 client:defaultoptions();
772 client._writable = cfg.opportunistic_writes; 811 client._writable = cfg.opportunistic_writes;
773 if self.tls_direct then 812 if self.tls_direct then
774 client:add(true, true); 813 client:add(true, true);
883 sockname = addr; 922 sockname = addr;
884 sockport = port; 923 sockport = port;
885 log = logger.init(("serv%s"):format(new_id())); 924 log = logger.init(("serv%s"):format(new_id()));
886 }, interface_mt); 925 }, interface_mt);
887 server:debug("Server %s created", server); 926 server:debug("Server %s created", server);
927 if cfg.tcp_fastopen then
928 server:setoption("tcp-fastopen", cfg.tcp_fastopen);
929 end
930 if type(cfg.tcp_defer_accept) == "number" then
931 server:setoption("tcp-defer-accept", cfg.tcp_defer_accept);
932 end
888 server:add(true, false); 933 server:add(true, false);
889 return server; 934 return server;
890 end 935 end
891 936
892 local function listen(addr, port, listeners, config) 937 local function listen(addr, port, listeners, config)
906 end 951 end
907 952
908 -- COMPAT 953 -- COMPAT
909 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra) 954 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra)
910 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra); 955 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra);
956 client:updatenames();
911 if not client.peername then 957 if not client.peername then
912 client.peername, client.peerport = addr, port; 958 client.peername, client.peerport = addr, port;
913 end 959 end
914 local ok, err = client:init(); 960 local ok, err = client:init();
915 if not ok then return ok, err; end 961 if not ok then return ok, err; end
939 end 985 end
940 local conn, err = create(); 986 local conn, err = create();
941 if not conn then return conn, err; end 987 if not conn then return conn, err; end
942 local ok, err = conn:settimeout(0); 988 local ok, err = conn:settimeout(0);
943 if not ok then return ok, err; end 989 if not ok then return ok, err; end
990 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra)
991 if cfg.tcp_fastopen then
992 client:setoption("tcp-fastopen-connect", 1);
993 end
944 local ok, err = conn:setpeername(addr, port); 994 local ok, err = conn:setpeername(addr, port);
945 if not ok and err ~= "timeout" then return ok, err; end 995 if not ok and err ~= "timeout" then return ok, err; end
946 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra) 996 client:updatenames();
947 local ok, err = client:init(); 997 local ok, err = client:init();
948 if not client.peername then 998 if not client.peername then
949 -- otherwise not set until connected 999 -- otherwise not set until connected
950 client.peername, client.peerport = addr, port; 1000 client.peername, client.peerport = addr, port;
951 end 1001 end
1083 link = link; 1133 link = link;
1084 set_config = function (newconfig) 1134 set_config = function (newconfig)
1085 cfg = setmetatable(newconfig, default_config); 1135 cfg = setmetatable(newconfig, default_config);
1086 end; 1136 end;
1087 1137
1138 tls_builder = function(basedir)
1139 return sslconfig._new(tls_impl.new_context, basedir)
1140 end,
1141
1088 -- libevent emulation 1142 -- libevent emulation
1089 event = { EV_READ = "r", EV_WRITE = "w", EV_READWRITE = "rw", EV_LEAVE = -1 }; 1143 event = { EV_READ = "r", EV_WRITE = "w", EV_READWRITE = "rw", EV_LEAVE = -1 };
1090 addevent = function (fd, mode, callback) 1144 addevent = function (fd, mode, callback)
1091 log("warn", "Using deprecated libevent emulation, please update code to use watchfd API instead"); 1145 log("warn", "Using deprecated libevent emulation, please update code to use watchfd API instead");
1092 local function onevent(self) 1146 local function onevent(self)