主题中讨论的其他部件:cc3300
工具/软件:
我们的电路板是运行 Linux 的 am62x 和采用 AP 模式的 CC3300。 我们能够传输多播 IP 数据包。 但是、如果 AP 至少关联了一个站点、我们只能在无线中看到数据包。
即使没有关联站点、我们也会尝试通过无线方式从 AP 传输多播数据包。 我们不确定 WiFi 堆栈的哪一层正在丢弃数据包。
在这种情况下、是否可以将 CC33XX 配置为不过滤多播数据包?
谢谢。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
我们的电路板是运行 Linux 的 am62x 和采用 AP 模式的 CC3300。 我们能够传输多播 IP 数据包。 但是、如果 AP 至少关联了一个站点、我们只能在无线中看到数据包。
即使没有关联站点、我们也会尝试通过无线方式从 AP 传输多播数据包。 我们不确定 WiFi 堆栈的哪一层正在丢弃数据包。
在这种情况下、是否可以将 CC33XX 配置为不过滤多播数据包?
谢谢。
尊敬的 Sabeeh:
在测试中、我使用了我们的电路板、该电路板具有 CC3300 无线电(器件 1)和两个其他 (Linux) 器件(具有 WIFI 无线电)。 其中一个对讲机支持监控模式(设备 2)、用于监控无线中的所有数据包。 另一个用作 Wi-Fi 站点(器件 3)以连接到器件 1。
在 am62x 设备 1 上、我创建了 AP、配置为 WPA2 PSK 身份验证。 192.168.225.1/24 被分配给 wlan0 接口。
这是 hostapd.conf 文件:
interface=wlan0 ssid=12345678 hw_mode=g channel=8 auth_algs=1 wmm_enabled=1 ieee80211n=1 wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=CCMP wpa_passphrase=XXXXXXX
在支持监控模式的设备(设备 2)上、我安装了 aircrack-ng、并使用该软件包中的 airmon-ng 命令将 wifi 设备置于监控模式。 然后、我使用 Wireshark 监控无线传输的数据包。
我使用此 python 脚本来从 AP 发送 UDP 多播数据包:
import socket
MCAST_GRP = '239.255.0.1' # site-local ipv4 administrative scope, 239.255.0.0 to 239.255.255.255
MCAST_PORT = 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton('192.168.225.1')
sock.sendto(b"Hello Multicast", (MCAST_GRP, MCAST_PORT))
我将附加我在器件 3 上使用的 Python 脚本、该脚本作为工作站连接、可接收多播数据包。
在侦听 Wireshark 中的流量时、我发现、当连接器件 3 时、Wireshark 可以看到来自 AP 的多播数据包。
但是、如果器件 3 未作为站点连接(因此没有与 AP 关联的站点)、则 Wireshark 没有观察到任何多播数据包(即使 python 脚本仍在发送它们)。
我们有一个用例、希望即使没有关联站点、也能通过无线方式传输多播数据包。
谢谢、
Bryan
这是接收器 python 程序:
#!/usr/bin/env python3
import socket, struct, sys
import argparse, re, netifaces
parser = argparse.ArgumentParser(description='Receive a multicast packet')
parser.add_argument('-a', '--address', help='IP address assigned to the wifi interface')
args = parser.parse_args()
if args.address:
addr = args.address
else:
pat = re.compile(r'^192\.168\.225\.')
found = False
for interface in netifaces.interfaces():
if not found:
addrlist = netifaces.ifaddresses(interface)
if netifaces.AF_INET in addrlist:
for link in addrlist[netifaces.AF_INET]:
if pat.match(link['addr']):
addr = link['addr']
found = True
print("Receiving on {} ({})".format(addr, interface))
break
if not found:
print("Couldn't find wifi IP address")
sys.exit(1)
MCAST_GRP = '239.255.0.1'
MCAST_PORT = 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
#mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
mreq = struct.pack("4s4s", socket.inet_aton(MCAST_GRP), socket.inet_aton(addr))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print(sock.recv(1024))
您好、
我尚未能够使用另一个用作 AP 的器件进行测试。 我也不确定在什么级别应用限制、尽管我确实看到接口的数据包计数器在发送多播数据包时会增加。 我不知道数据包是在内核 802.11 级别、 cc33xx 驱动程序还是由 CC33xx 固件丢弃。 这是否是您在确定时可能会有所帮助的东西?
即使 wifi 芯片组通常不支持这样做、但 CC33xx 是否支持它、这对我们来说是非常有用的。
谢谢、
Bryan
您好 Bryan、
回想一下您的实验、您在上面提到、您使用的 AP 模式是 WPA2。 但是 、Wireshark 只有在有站点连接到 AP 时才能解密 WPA2。 在更技术性的术语中、Wireshark 搜索在连接过程中生成的 EAPOL 数据包、并根据这些数据进行解密。 如果您没有 EAPOL 数据包、则 Wireshark 不会解密。 或者您没有从 Wireshark 看到任何数据包?
我认为可能 AP 仍在发送这些数据包。 您是否可以尝试将 AP 设置为打开/无安全性?
虽然我看到接口的数据包计数器在发送多播数据包时有所增加
您是指在 TX 还是 RX 方向上? STA(器件 3)或 AP(器件 1)?
您好 Bryan、
在进一步研究之前、我想更好地了解用例或应用。 我想我不明白为什么器件 3 不需要在您的应用中连接。
此外、我尝试了与您的 python 脚本类似的内容(也是 python 脚本)、因此我能够看到 TX 数据包递增的类似行为、但在监听器捕获中没有看到。 我认为这是因为我们使用的是基于 IP 的广播包。 但网络上没有其他 IP 地址、因为没有其他设备。 因此、python 应用程序需要能够发送到所有 MAC 地址、而不是 IP... 可能。
因为现在我对此感兴趣、这就是我使用的脚本:
import socket
import struct
iface = "wlan1"
src_mac = b"\xee\x9a\x34\x06\x7b\xba"
dst_mac = b"\xff\xff\xff\xff\xff\xff"
ethertype = 0x88b5
payload = b"HelloWorld"
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
sock.bind((iface,0))
eth_header = dst_mac + src_mac + struct.pack("!H", ethertype)
frame = eth_header + payload
while 1:
sock.send(frame)
sock.close()
但与您报告的行为相同:这些原始数据包仅在连接工作站时发送。 如果电台断开连接、我没有看到他们。 正如您所说的、AP 接口上的 TX 数据包无论如何都会增加。
现在、我们需要了解这些数据包被丢弃的位置和原因。 我可以帮助看看这个,但这将需要一些时间。
如上所述、用此类内容了解目标和用例会有所帮助。