Add max_keepalive, for limiting keepalives of MQTT v5 clients.
This commit is contained in:
parent
29846d282d
commit
6ef2c79e9a
@ -5,6 +5,8 @@ Broker features:
|
|||||||
- Improved general support for broker generated client ids. Removed libuuid
|
- Improved general support for broker generated client ids. Removed libuuid
|
||||||
dependency.
|
dependency.
|
||||||
- auto_id_prefix now defaults to 'auto-'.
|
- auto_id_prefix now defaults to 'auto-'.
|
||||||
|
- Add max_keepalive option, to allow a maximum keepalive value to be set for
|
||||||
|
MQTT v5 clients only.
|
||||||
|
|
||||||
Client library features:
|
Client library features:
|
||||||
- Add mosquitto_subscribe_multiple() for sending subscriptions to multiple
|
- Add mosquitto_subscribe_multiple() for sending subscriptions to multiple
|
||||||
|
@ -62,6 +62,16 @@ int handle__connack(struct mosquitto *mosq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prop = mosquitto_property_get_property(properties, MQTT_PROP_SERVER_KEEP_ALIVE, false);
|
||||||
|
if(prop){
|
||||||
|
rc = mosquitto_property_read_int16(prop, &mosq->keepalive);
|
||||||
|
if(rc){
|
||||||
|
mosquitto_property_free_all(&properties);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received CONNACK (%d)", mosq->id, reason_code);
|
log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received CONNACK (%d)", mosq->id, reason_code);
|
||||||
pthread_mutex_lock(&mosq->callback_mutex);
|
pthread_mutex_lock(&mosq->callback_mutex);
|
||||||
if(mosq->on_connect){
|
if(mosq->on_connect){
|
||||||
|
@ -435,6 +435,25 @@
|
|||||||
<para>Reloaded on reload signal.</para>
|
<para>Reloaded on reload signal.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>max_keepalive</option> <replaceable>value</replaceable></term>
|
||||||
|
<listitem>
|
||||||
|
<para>For MQTT v5 clients, it is possible to have the
|
||||||
|
server send a "server keepalive" value that will
|
||||||
|
override the keepalive value set by the client. This
|
||||||
|
is intended to be used as a mechanism to say that the
|
||||||
|
server will disconnect the client earlier than it
|
||||||
|
anticipated, and that the client should use the new
|
||||||
|
keepalive value. The max_keepalive option allows you to
|
||||||
|
specify that clients may only connect with keepalive
|
||||||
|
less than or equal to this value, otherwise they will
|
||||||
|
be sent a server keepalive telling them to use
|
||||||
|
max_keepalive. This only applies to MQTT v5 clients.
|
||||||
|
The maximum value allowable, and default value, is
|
||||||
|
65535. Do not set below 10 seconds.</para>
|
||||||
|
<para>Reloaded on reload signal.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>max_queued_bytes</option> <replaceable>count</replaceable></term>
|
<term><option>max_queued_bytes</option> <replaceable>count</replaceable></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -155,6 +155,16 @@
|
|||||||
# false.
|
# false.
|
||||||
#retain_available true
|
#retain_available true
|
||||||
|
|
||||||
|
# For MQTT v5 clients, it is possible to have the server send a "server
|
||||||
|
# keepalive" value that will override the keepalive value set by the client.
|
||||||
|
# This is intended to be used as a mechanism to say that the server will
|
||||||
|
# disconnect the client earlier than it anticipated, and that the client should
|
||||||
|
# use the new keepalive value. The max_keepalive option allows you to specify
|
||||||
|
# that clients may only connect with keepalive less than or equal to this
|
||||||
|
# value, otherwise they will be sent a server keepalive telling them to use
|
||||||
|
# max_keepalive. This only applies to MQTT v5 clients. The maximum value
|
||||||
|
# allowable is 65535. Do not set below 10.
|
||||||
|
#max_keepalive 65535
|
||||||
|
|
||||||
# =================================================================
|
# =================================================================
|
||||||
# Default listener
|
# Default listener
|
||||||
|
@ -212,6 +212,7 @@ static void config__init_reload(struct mosquitto_db *db, struct mosquitto__confi
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
config->log_timestamp = true;
|
config->log_timestamp = true;
|
||||||
|
config->max_keepalive = 65535;
|
||||||
config->persistence = false;
|
config->persistence = false;
|
||||||
mosquitto__free(config->persistence_location);
|
mosquitto__free(config->persistence_location);
|
||||||
config->persistence_location = NULL;
|
config->persistence_location = NULL;
|
||||||
@ -1513,6 +1514,13 @@ int config__read_file_core(struct mosquitto__config *config, bool reload, struct
|
|||||||
}else{
|
}else{
|
||||||
log__printf(NULL, MOSQ_LOG_ERR, "Error: Empty max_inflight_messages value in configuration.");
|
log__printf(NULL, MOSQ_LOG_ERR, "Error: Empty max_inflight_messages value in configuration.");
|
||||||
}
|
}
|
||||||
|
}else if(!strcmp(token, "max_keepalive")){
|
||||||
|
if(conf__parse_int(&token, "max_keepalive", &tmp_int, saveptr)) return MOSQ_ERR_INVAL;
|
||||||
|
if(tmp_int < 10 || tmp_int > 65535){
|
||||||
|
log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid max_keepalive value (%d).", tmp_int);
|
||||||
|
return MOSQ_ERR_INVAL;
|
||||||
|
}
|
||||||
|
config->max_keepalive = tmp_int;
|
||||||
}else if(!strcmp(token, "max_queued_bytes")){
|
}else if(!strcmp(token, "max_queued_bytes")){
|
||||||
token = strtok_r(NULL, " ", &saveptr);
|
token = strtok_r(NULL, " ", &saveptr);
|
||||||
if(token){
|
if(token){
|
||||||
|
@ -297,11 +297,17 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
|
|||||||
rc = 1;
|
rc = 1;
|
||||||
goto handle_connect_error;
|
goto handle_connect_error;
|
||||||
}
|
}
|
||||||
|
if(protocol_version == PROTOCOL_VERSION_v5 && context->keepalive > db->config->max_keepalive){
|
||||||
|
context->keepalive = db->config->max_keepalive;
|
||||||
|
if(mosquitto_property_add_int16(&connack_props, MQTT_PROP_SERVER_KEEP_ALIVE, context->keepalive)){
|
||||||
|
rc = MOSQ_ERR_NOMEM;
|
||||||
|
goto handle_connect_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(protocol_version == PROTOCOL_VERSION_v5){
|
if(protocol_version == PROTOCOL_VERSION_v5){
|
||||||
rc = property__read_all(CMD_CONNECT, &context->in_packet, &properties);
|
rc = property__read_all(CMD_CONNECT, &context->in_packet, &properties);
|
||||||
if(rc) return rc;
|
if(rc) goto handle_connect_error;
|
||||||
mosquitto_property_free_all(&properties);
|
|
||||||
}
|
}
|
||||||
property__process_connect(context, properties);
|
property__process_connect(context, properties);
|
||||||
|
|
||||||
|
@ -259,6 +259,7 @@ struct mosquitto__config {
|
|||||||
bool log_timestamp;
|
bool log_timestamp;
|
||||||
char *log_file;
|
char *log_file;
|
||||||
FILE *log_fptr;
|
FILE *log_fptr;
|
||||||
|
uint16_t max_keepalive;
|
||||||
uint32_t message_size_limit;
|
uint32_t message_size_limit;
|
||||||
bool persistence;
|
bool persistence;
|
||||||
char *persistence_location;
|
char *persistence_location;
|
||||||
|
42
test/broker/12-prop-server-keepalive.py
Executable file
42
test/broker/12-prop-server-keepalive.py
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# Test whether sending a non zero session expiry interval in DISCONNECT after
|
||||||
|
# having sent a zero session expiry interval is treated correctly in MQTT v5.
|
||||||
|
|
||||||
|
from mosq_test_helper import *
|
||||||
|
|
||||||
|
def write_config(filename, port):
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
f.write("port %d\n" % (port))
|
||||||
|
f.write("\n")
|
||||||
|
f.write("max_keepalive 60\n")
|
||||||
|
|
||||||
|
port = mosq_test.get_port(1)
|
||||||
|
conf_file = os.path.basename(__file__).replace('.py', '.conf')
|
||||||
|
write_config(conf_file, port)
|
||||||
|
|
||||||
|
|
||||||
|
rc = 1
|
||||||
|
|
||||||
|
keepalive = 61
|
||||||
|
connect_packet = mosq_test.gen_connect("test", proto_ver=5, keepalive=keepalive)
|
||||||
|
|
||||||
|
props = mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_SERVER_KEEP_ALIVE, 60)
|
||||||
|
connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5, properties=props)
|
||||||
|
|
||||||
|
broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port, use_conf=True)
|
||||||
|
|
||||||
|
try:
|
||||||
|
sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port)
|
||||||
|
sock.close()
|
||||||
|
rc = 0
|
||||||
|
finally:
|
||||||
|
os.remove(conf_file)
|
||||||
|
broker.terminate()
|
||||||
|
broker.wait()
|
||||||
|
(stdo, stde) = broker.communicate()
|
||||||
|
if rc:
|
||||||
|
print(stde)
|
||||||
|
|
||||||
|
exit(rc)
|
||||||
|
|
@ -140,3 +140,4 @@ endif
|
|||||||
./12-prop-subpub-payload-format.py
|
./12-prop-subpub-payload-format.py
|
||||||
./12-prop-subpub-content-type.py
|
./12-prop-subpub-content-type.py
|
||||||
./12-prop-assigned-client-identifier.py
|
./12-prop-assigned-client-identifier.py
|
||||||
|
./12-prop-server-keepalive.py
|
||||||
|
@ -109,6 +109,7 @@ tests = [
|
|||||||
(1, './12-prop-subpub-payload-format.py'),
|
(1, './12-prop-subpub-payload-format.py'),
|
||||||
(1, './12-prop-subpub-content-type.py'),
|
(1, './12-prop-subpub-content-type.py'),
|
||||||
(1, './12-prop-assigned-client-identifier.py'),
|
(1, './12-prop-assigned-client-identifier.py'),
|
||||||
|
(1, './12-prop-server-keepalive.py'),
|
||||||
]
|
]
|
||||||
|
|
||||||
minport = 1888
|
minport = 1888
|
||||||
|
Loading…
Reference in New Issue
Block a user