struct server_id notifyd;
struct tevent_timer *cleanup_te;
+
+ struct {
+ char *keyfile;
+ char *certfile;
+ } quic;
};
struct smbd_open_socket {
struct smbd_open_socket *prev, *next;
struct smbd_parent_context *parent;
int fd;
+ bool quic;
struct tevent_fd *fde;
};
struct smbd_open_socket *s = talloc_get_type_abort(private_data,
struct smbd_open_socket);
struct messaging_context *msg_ctx = s->parent->msg_ctx;
+ char *keyfile = s->parent->quic.keyfile;
+ char *certfile = s->parent->quic.certfile;
struct sockaddr_storage addr;
socklen_t in_addrlen = sizeof(addr);
int fd;
if (s->parent->interactive) {
reinit_after_fork(msg_ctx, ev, true);
- smbd_process(ev, msg_ctx, fd, true);
+ if (s->quic) {
+ int ret;
+ ret = quic_server_handshake(fd, keyfile, certfile);
+ if (ret != 0) {
+ exit_server_cleanly("quic_server_handshake");
+ }
+ }
+ smbd_process(ev, msg_ctx, fd, true, s->quic);
exit_server_cleanly("end of interactive mode");
return;
}
if (pid == 0) {
char addrstr[INET6_ADDRSTRLEN];
NTSTATUS status = NT_STATUS_OK;
+ bool quic = s->quic;
/*
* Can't use TALLOC_FREE here. Nulling out the argument to it
print_sockaddr(addrstr, sizeof(addrstr), &addr);
process_set_title("smbd[%s]", "client [%s]", addrstr);
- smbd_process(ev, msg_ctx, fd, false);
+ if (quic) {
+ int ret;
+ ret = quic_server_handshake(fd, keyfile, certfile);
+ if (ret != 0) {
+ exit_server_cleanly("quic_server_handshake");
+ }
+ }
+ smbd_process(ev, msg_ctx, fd, false, quic);
exit:
exit_server_cleanly("end of child");
return;
{
struct smbd_open_socket *s;
- s = talloc(parent, struct smbd_open_socket);
+ s = talloc_zero(parent, struct smbd_open_socket);
if (!s) {
return false;
}
s->parent = parent;
- s->fd = open_socket_in(SOCK_STREAM, ifss, port, true);
+ //s->fd = open_socket_in(SOCK_STREAM, ifss, port, true);
+ port = 443;
+ s->fd = open_socket_in_protocol(SOCK_DGRAM, IPPROTO_QUIC, ifss, port, false);
if (s->fd < 0) {
int err = -(s->fd);
DBG_ERR("open_socket_in failed: %s\n", strerror(err));
return true;
}
+ setsockopt(s->fd, SOL_QUIC, QUIC_SOCKOPT_ALPN, "smb", strlen("smb"));
+ s->quic = true;
+
/* ready to listen */
- set_socket_options(s->fd, "SO_KEEPALIVE");
- set_socket_options(s->fd, lp_socket_options());
+ //set_socket_options(s->fd, "SO_KEEPALIVE");
+ //set_socket_options(s->fd, lp_socket_options());
/* Set server socket to
* non-blocking for the accept. */
#else
sock_addr = "0.0.0.0";
#endif
+ sock_addr = "0.0.0.0";
for (sock_ptr=sock_addr;
next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,"); ) {
parent->msg_ctx = msg_ctx;
am_parent = parent;
+ {
+ struct loadparm_context *lp_ctx = NULL;
+
+ lp_ctx = loadparm_init_s3(parent, loadparm_s3_helpers());
+ parent->quic.keyfile = lpcfg_tls_keyfile(parent, lp_ctx);
+ parent->quic.certfile = lpcfg_tls_certfile(parent, lp_ctx);
+ TALLOC_FREE(lp_ctx);
+ }
+
se = tevent_add_signal(parent->ev_ctx,
parent,
SIGTERM, 0,
/* Stop zombies */
smbd_setup_sig_chld_handler(parent);
- smbd_process(ev_ctx, msg_ctx, sock, true);
+ smbd_process(ev_ctx, msg_ctx, sock, true, false);
exit_server_cleanly(NULL);
return(0);
void smbd_process(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
int sock_fd,
- bool interactive)
+ bool interactive,
+ bool quic)
{
struct smbd_tevent_trace_state trace_state = {
.ev = ev_ctx,
* name"
*/
unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
+ xconn->transport.quic = quic;
(void)smb1_srv_send(xconn, (char *)buf, false, 0, false);
exit_server_cleanly("connection denied");
} else if (!NT_STATUS_IS_OK(status)) {
exit_server_cleanly(nt_errstr(status));
}
+ xconn->transport.quic = quic;
+
sconn->local_address =
tsocket_address_copy(xconn->local_address, sconn);
if (sconn->local_address == NULL) {