#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