Fixed IPv6 and Multicast unittests

This commit is contained in:
Björn Freise 2019-04-23 11:33:40 +02:00
parent 8ec093f7e0
commit bbb8c06292
2 changed files with 12 additions and 8 deletions

View file

@ -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:

View file

@ -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)