net/emcute: Allow RETAIN flag to be set on incoming PUBLISHs

This commit is contained in:
Vera Clemens 2021-04-13 16:51:24 +02:00
parent d9973d4bf8
commit b0f4781e15
2 changed files with 17 additions and 6 deletions

View File

@ -167,7 +167,7 @@ static void on_publish(size_t len, size_t pos)
/* return error code in case we don't support/understand active flags. So
* far we only understand QoS 1... */
if (rbuf[pos + 1] & ~(EMCUTE_QOS_1 | EMCUTE_TIT_SHORT)) {
if (rbuf[pos + 1] & ~(EMCUTE_QOS_1 | EMCUTE_TIT_SHORT | EMCUTE_RETAIN)) {
buf[6] = REJ_NOTSUP;
sock_udp_send(&sock, &buf, 7, &gateway);
return;

View File

@ -64,7 +64,7 @@ class MQTTSNServer(Automaton):
super(MQTTSNServer, self).__init__(*args, **kwargs)
def parse_args(self, spawn, bind_addr, topic_name, mode, pub_interval,
qos_level=0,
qos_level=0, retain=False,
data_len_start=1, data_len_end=1000, data_len_step=1,
bind_port=SERVER_PORT, family=socket.AF_INET,
type=socket.SOCK_DGRAM, proto=0, *args, **kwargs):
@ -78,6 +78,7 @@ class MQTTSNServer(Automaton):
self.data_len = data_len_start
self.data_len_end = data_len_end
self.data_len_step = data_len_step
self.retain = retain
self.last_mid = random.randint(0, 0xffff)
self.topics = []
self.registered_topics = []
@ -159,24 +160,28 @@ class MQTTSNServer(Automaton):
# send deliberately broken length packets
# (to small payload, len field < 256)
self.last_packet = mqttsn.MQTTSN(len=128) / mqttsn.MQTTSNPublish(
qos=self._qos_flags, tid=tid, mid=mid, data="128"
qos=self._qos_flags, tid=tid, mid=mid, retain=self.retain,
data="128"
)
self.send(self.last_packet)
# send deliberately broken length packets
# (to small payload, len field >= 256)
self.last_packet = mqttsn.MQTTSN(len=400) / mqttsn.MQTTSNPublish(
qos=self._qos_flags, tid=tid, mid=mid, data="400"
qos=self._qos_flags, tid=tid, mid=mid, retain=self.retain,
data="400"
)
self.send(self.last_packet)
# send deliberately broken length packets (too large payload)
self.last_packet = mqttsn.MQTTSN(len=10) / mqttsn.MQTTSNPublish(
qos=self._qos_flags, tid=tid, mid=mid, data="X" * 20
qos=self._qos_flags, tid=tid, mid=mid, retain=self.retain,
data="X" * 20
)
self.send(self.last_packet)
return subscription, mid
if self.data_len < self.data_len_end:
self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNPublish(
qos=self._qos_flags, tid=tid, mid=mid, data="X" * self.data_len
qos=self._qos_flags, tid=tid, mid=mid, retain=self.retain,
data="X" * self.data_len
)
self.send(self.last_packet)
return subscription, mid
@ -465,6 +470,12 @@ def testfunc(child):
{"qos_level": 1, "mode": "sub", "topic_name": "/test",
"data_len_start": 0, "data_len_end": DATA_MAX_LEN,
"data_len_step": 50},
{"qos_level": 0, "mode": "sub", "topic_name": "/test",
"data_len_start": 0, "data_len_end": DATA_MAX_LEN,
"data_len_step": 50, "retain": True},
{"qos_level": 1, "mode": "sub", "topic_name": "/test",
"data_len_start": 0, "data_len_end": DATA_MAX_LEN,
"data_len_step": 50, "retain": True},
{"qos_level": 1, "mode": "sub",
"topic_name": "/" + ("x" * (TOPIC_MAX_LEN - 1)),
"data_len_start": 8, "data_len_end": 9},