/* The mode we are using for processing commands */
int mode;
+
+ /* Whether FIN has ben sent on the stream */
+ int isfin;
};
static void user_data_init(struct user_data_st *user_data, SSL *con, char *buf,
#endif
BIO *bio_c_msg = NULL;
const char *keylog_file = NULL, *early_data_file = NULL;
- int isdtls = 0;
- int isquic = 0;
+ int isdtls = 0, isquic = 0;
char *psksessf = NULL;
int enable_pha = 0;
int enable_client_rpk = 0;
user_data->buflen = 0;
user_data->bufoff = 0;
user_data->mode = mode;
+ user_data->isfin = 0;
}
static int user_data_add(struct user_data_st *user_data, size_t i)
#define USER_COMMAND_RECONNECT 2
#define USER_COMMAND_RENEGOTIATE 3
#define USER_COMMAND_KEY_UPDATE 4
+#define USER_COMMAND_FIN 5
static int user_data_execute(struct user_data_st *user_data, int cmd, char *arg)
{
BIO_printf(bio_err, " {help}: Get this help text\n");
BIO_printf(bio_err, " {quit}: Close the connection to the peer\n");
BIO_printf(bio_err, " {reconnect}: Reconnect to the peer\n");
- if (SSL_version(user_data->con) == TLS1_3_VERSION) {
+ if (SSL_is_quic(user_data->con)) {
+ BIO_printf(bio_err, " {fin}: Send FIN on the stream. No further writing is possible\n");
+ } else if(SSL_version(user_data->con) == TLS1_3_VERSION) {
BIO_printf(bio_err, " {keyup:req|noreq}: Send a Key Update message\n");
BIO_printf(bio_err, " Arguments:\n");
BIO_printf(bio_err, " req = peer update requested (default)\n");
break;
return USER_DATA_PROCESS_CONTINUE;
}
+
+ case USER_COMMAND_FIN:
+ if (!SSL_stream_conclude(user_data->con, 0))
+ break;
+ user_data->isfin = 1;
+ return USER_DATA_PROCESS_NO_DATA;
+
default:
break;
}
cmd = USER_COMMAND_QUIT;
} else if (OPENSSL_strcasecmp(cmd_start, "reconnect") == 0) {
cmd = USER_COMMAND_RECONNECT;
- } else if (SSL_version(user_data->con) == TLS1_3_VERSION) {
+ } else if(SSL_is_quic(user_data->con)) {
+ if (OPENSSL_strcasecmp(cmd_start, "fin") == 0)
+ cmd = USER_COMMAND_FIN;
+ } if (SSL_version(user_data->con) == TLS1_3_VERSION) {
if (OPENSSL_strcasecmp(cmd_start, "keyup") == 0) {
cmd = USER_COMMAND_KEY_UPDATE;
if (arg_start == NULL)
}
}
+ if (user_data->isfin) {
+ user_data->buflen = user_data->bufoff = *len = *off = 0;
+ return USER_DATA_PROCESS_NO_DATA;
+ }
+
#ifdef CHARSET_EBCDIC
ebcdic2ascii(buf_start, buf_start, outlen);
#endif