#4616 NORM Update.: Mesh doesn't resume from suspend on reciept of multicast packets
Zarro Boogs per Child
bugtracker at laptop.org
Mon Nov 26 03:21:21 EST 2007
#4616: Mesh doesn't resume from suspend on reciept of multicast packets
----------------------------------+-----------------------------------------
Reporter: gnu | Owner: cjb
Type: defect | Status: new
Priority: normal | Milestone: Update.1
Component: power manager (OHM) | Version: Development build as of this date
Resolution: | Keywords:
Verified: 0 |
----------------------------------+-----------------------------------------
Comment(by gnu):
First: "If a received frame meets the wakeup criteria, then the radio
wakes up the host via the line to the EC."
Why are there any "wakeup criteria"?
Why not just have the rule be: "Whenever the radio has an unmasked
interrupt pending for the host, and its USB interface is suspended, then
it wakes up the host via the line to the EC."
Then the software can just set the usual interrupt masks to tell the
firmware which packets (or events, like loss of association) it cares
about. If it wants no wakeups, it can just mask off all interrupts. If
it only wants loss-of-assoc, it can set that mask bit. If it wants
unicast but not multicast, it can set that interrupt mask.
Second: "how do you define which multicast group each subset [of hosts]
listens to?"
There's an interface.
http://dev.laptop.org/git?p=olpc-2.6;a=blob;f=drivers/net/wireless/libertas/cmd.c;h=ce2841731231fb8ca91213d94fbdc22721268f23;hb=b776810bcc6492addb10a0aa3d9b05a650243cad#l635
shows it on line 635, where it uses the CMD_MAC_MULTICAST_ADR command to
pass a table of MAC addresses to the firmware. The rest of the kernel
already knows how and when to call such an interface (for an Ethernet or
anything else that supports multicast). The kernel starts off the table
with its own internal multicast addresses (the all-ipv6-nodes-multicast
address, the multicast address it uses for neighbor discovery, etc). When
user programs join particular multicast groups by binding a socket to a
particular IPv6 multicast address, the kernel adds the corresponding MAC
address to the table and passes it down to the hardware, via this
function. When such a socket is closed, the kernel removes the address
from the table. According to drivers/net/wireless/libertas/defs.h, it can
hold 32 muliticast addresses to look for. The driver keeps its local copy
of the table in its struct _wlan_adapter (see dev.h) in the member
"multicastlist".
Multicast is handled already -- if only the firmware was looking in the
right place in its own implementation!
--
Ticket URL: <http://dev.laptop.org/ticket/4616#comment:18>
One Laptop Per Child <http://dev.laptop.org>
OLPC bug tracking system
More information about the Bugs
mailing list