Fixed IPv6 and Multicast unittests
This commit is contained in:
parent
8ec093f7e0
commit
bbb8c06292
2 changed files with 12 additions and 8 deletions
|
@ -1,6 +1,7 @@
|
||||||
import logging
|
import logging
|
||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
|
import socket
|
||||||
from coapthon.messages.message import Message
|
from coapthon.messages.message import Message
|
||||||
from coapthon import defines
|
from coapthon import defines
|
||||||
from coapthon.messages.request import Request
|
from coapthon.messages.request import Request
|
||||||
|
@ -105,10 +106,11 @@ class MessageLayer(object):
|
||||||
host, port = response.source
|
host, port = response.source
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return
|
||||||
|
all_coap_nodes = defines.ALL_COAP_NODES_IPV6 if socket.getaddrinfo(host, None)[0][0] == socket.AF_INET6 else defines.ALL_COAP_NODES
|
||||||
key_mid = str_append_hash(host, port, response.mid)
|
key_mid = str_append_hash(host, port, response.mid)
|
||||||
key_mid_multicast = str_append_hash(defines.ALL_COAP_NODES, port, response.mid)
|
key_mid_multicast = str_append_hash(all_coap_nodes, port, response.mid)
|
||||||
key_token = str_append_hash(host, port, response.token)
|
key_token = str_append_hash(host, port, response.token)
|
||||||
key_token_multicast = str_append_hash(defines.ALL_COAP_NODES, port, response.token)
|
key_token_multicast = str_append_hash(all_coap_nodes, port, response.token)
|
||||||
if key_mid in list(self._transactions.keys()):
|
if key_mid in list(self._transactions.keys()):
|
||||||
transaction = self._transactions[key_mid]
|
transaction = self._transactions[key_mid]
|
||||||
if response.token != transaction.request.token:
|
if response.token != transaction.request.token:
|
||||||
|
@ -151,10 +153,11 @@ class MessageLayer(object):
|
||||||
host, port = message.source
|
host, port = message.source
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return
|
return
|
||||||
|
all_coap_nodes = defines.ALL_COAP_NODES_IPV6 if socket.getaddrinfo(host, None)[0][0] == socket.AF_INET6 else defines.ALL_COAP_NODES
|
||||||
key_mid = str_append_hash(host, port, message.mid)
|
key_mid = str_append_hash(host, port, message.mid)
|
||||||
key_mid_multicast = str_append_hash(defines.ALL_COAP_NODES, port, message.mid)
|
key_mid_multicast = str_append_hash(all_coap_nodes, port, message.mid)
|
||||||
key_token = str_append_hash(host, port, message.token)
|
key_token = str_append_hash(host, port, message.token)
|
||||||
key_token_multicast = str_append_hash(defines.ALL_COAP_NODES, port, message.token)
|
key_token_multicast = str_append_hash(all_coap_nodes, port, message.token)
|
||||||
if key_mid in list(self._transactions.keys()):
|
if key_mid in list(self._transactions.keys()):
|
||||||
transaction = self._transactions[key_mid]
|
transaction = self._transactions[key_mid]
|
||||||
elif key_token in self._transactions_token:
|
elif key_token in self._transactions_token:
|
||||||
|
|
|
@ -88,20 +88,21 @@ class CoAP(object):
|
||||||
mreq = struct.pack("4sl", socket.inet_aton(defines.ALL_COAP_NODES), socket.INADDR_ANY)
|
mreq = struct.pack("4sl", socket.inet_aton(defines.ALL_COAP_NODES), socket.INADDR_ANY)
|
||||||
self._socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
|
self._socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
|
||||||
else:
|
else:
|
||||||
|
# Bugfix for Python 3.6 for Windows ... missing IPPROTO_IPV6 constant
|
||||||
|
if not hasattr(socket, 'IPPROTO_IPV6'):
|
||||||
|
socket.IPPROTO_IPV6 = 41
|
||||||
|
|
||||||
self._socket = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
self._socket = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||||
|
|
||||||
# Allow multiple copies of this program on one machine
|
# Allow multiple copies of this program on one machine
|
||||||
# (not strictly needed)
|
# (not strictly needed)
|
||||||
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
self._socket.bind((defines.ALL_COAP_NODES_IPV6, self.server_address[1]))
|
self._socket.bind(('', self.server_address[1]))
|
||||||
|
|
||||||
addrinfo_multicast = socket.getaddrinfo(defines.ALL_COAP_NODES_IPV6, 5683)[0]
|
addrinfo_multicast = socket.getaddrinfo(defines.ALL_COAP_NODES_IPV6, 5683)[0]
|
||||||
group_bin = socket.inet_pton(socket.AF_INET6, addrinfo_multicast[4][0])
|
group_bin = socket.inet_pton(socket.AF_INET6, addrinfo_multicast[4][0])
|
||||||
mreq = group_bin + struct.pack('@I', 0)
|
mreq = group_bin + struct.pack('@I', 0)
|
||||||
self._socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
|
self._socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
|
||||||
self._unicast_socket = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
|
|
||||||
self._unicast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
||||||
self._unicast_socket.bind(self.server_address)
|
|
||||||
else:
|
else:
|
||||||
if addrinfo[0] == socket.AF_INET: # IPv4
|
if addrinfo[0] == socket.AF_INET: # IPv4
|
||||||
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
|
Loading…
Reference in a new issue