net/emcute: Allow RETAIN flag to be set on incoming PUBLISHs
This commit is contained in:
parent
d9973d4bf8
commit
b0f4781e15
@ -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
|
/* return error code in case we don't support/understand active flags. So
|
||||||
* far we only understand QoS 1... */
|
* 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;
|
buf[6] = REJ_NOTSUP;
|
||||||
sock_udp_send(&sock, &buf, 7, &gateway);
|
sock_udp_send(&sock, &buf, 7, &gateway);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -64,7 +64,7 @@ class MQTTSNServer(Automaton):
|
|||||||
super(MQTTSNServer, self).__init__(*args, **kwargs)
|
super(MQTTSNServer, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def parse_args(self, spawn, bind_addr, topic_name, mode, pub_interval,
|
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,
|
data_len_start=1, data_len_end=1000, data_len_step=1,
|
||||||
bind_port=SERVER_PORT, family=socket.AF_INET,
|
bind_port=SERVER_PORT, family=socket.AF_INET,
|
||||||
type=socket.SOCK_DGRAM, proto=0, *args, **kwargs):
|
type=socket.SOCK_DGRAM, proto=0, *args, **kwargs):
|
||||||
@ -78,6 +78,7 @@ class MQTTSNServer(Automaton):
|
|||||||
self.data_len = data_len_start
|
self.data_len = data_len_start
|
||||||
self.data_len_end = data_len_end
|
self.data_len_end = data_len_end
|
||||||
self.data_len_step = data_len_step
|
self.data_len_step = data_len_step
|
||||||
|
self.retain = retain
|
||||||
self.last_mid = random.randint(0, 0xffff)
|
self.last_mid = random.randint(0, 0xffff)
|
||||||
self.topics = []
|
self.topics = []
|
||||||
self.registered_topics = []
|
self.registered_topics = []
|
||||||
@ -159,24 +160,28 @@ class MQTTSNServer(Automaton):
|
|||||||
# send deliberately broken length packets
|
# send deliberately broken length packets
|
||||||
# (to small payload, len field < 256)
|
# (to small payload, len field < 256)
|
||||||
self.last_packet = mqttsn.MQTTSN(len=128) / mqttsn.MQTTSNPublish(
|
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)
|
self.send(self.last_packet)
|
||||||
# send deliberately broken length packets
|
# send deliberately broken length packets
|
||||||
# (to small payload, len field >= 256)
|
# (to small payload, len field >= 256)
|
||||||
self.last_packet = mqttsn.MQTTSN(len=400) / mqttsn.MQTTSNPublish(
|
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)
|
self.send(self.last_packet)
|
||||||
# send deliberately broken length packets (too large payload)
|
# send deliberately broken length packets (too large payload)
|
||||||
self.last_packet = mqttsn.MQTTSN(len=10) / mqttsn.MQTTSNPublish(
|
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)
|
self.send(self.last_packet)
|
||||||
return subscription, mid
|
return subscription, mid
|
||||||
if self.data_len < self.data_len_end:
|
if self.data_len < self.data_len_end:
|
||||||
self.last_packet = mqttsn.MQTTSN() / mqttsn.MQTTSNPublish(
|
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)
|
self.send(self.last_packet)
|
||||||
return subscription, mid
|
return subscription, mid
|
||||||
@ -465,6 +470,12 @@ def testfunc(child):
|
|||||||
{"qos_level": 1, "mode": "sub", "topic_name": "/test",
|
{"qos_level": 1, "mode": "sub", "topic_name": "/test",
|
||||||
"data_len_start": 0, "data_len_end": DATA_MAX_LEN,
|
"data_len_start": 0, "data_len_end": DATA_MAX_LEN,
|
||||||
"data_len_step": 50},
|
"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",
|
{"qos_level": 1, "mode": "sub",
|
||||||
"topic_name": "/" + ("x" * (TOPIC_MAX_LEN - 1)),
|
"topic_name": "/" + ("x" * (TOPIC_MAX_LEN - 1)),
|
||||||
"data_len_start": 8, "data_len_end": 9},
|
"data_len_start": 8, "data_len_end": 9},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user