Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: Do not filter multicast addresses by default

A Linux PC is connected with another device over Bluetooth PAN using a
BNEP interface.

Whenever a packet is tried to be sent over the BNEP interface, the
function "bnep_net_xmit()" in "net/bluetooth/bnep/netdev.c" is called.
This function calls "bnep_net_mc_filter()", which checks (if the
destination address is multicast) if the address is set in a certain
multicast filter (&s->mc_filter). If it is not, then it is not sent out.

This filter is only changed in two other functions, found in
net/bluetooth/bnep/core.c": in "bnep_ctrl_set_mc_filter()", which is
only called if a message of type "BNEP_FILTER_MULTI_ADDR_SET" is
received. Otherwise, it is set in "bnep_add_connection()", where it is
set to a default value which only adds the broadcast address to the
filter:

set_bit(bnep_mc_hash(dev->broadcast), (ulong *) &s->mc_filter);

To sum up, if the BNEP interface does not receive any message of type
"BNEP_FILTER_MULTI_ADDR_SET", it will not send out any messages with
multicast destination addresses except for broadcast.

However, in the BNEP specification (page 27 in
http://grouper.ieee.org/groups/802/15/Bluetooth/BNEP.pdf), it is said
that per default, all multicast addresses should not be filtered, i.e.
the BNEP interface should be able to send packets with any multicast
destination address.

It seems that the default case is wrong: the multicast filter should not
block almost all multicast addresses, but should not filter out any.

This leads to the problem that e.g. Neighbor Solicitation messages sent
with Bluetooth PAN over the BNEP interface to a multicast destination
address other than broadcast are blocked and not sent out.

Therefore, in the default case, we set the mc_filter to ~0LL to not
filter out any multicast addresses.

Signed-off-by: Danny Schweizer <danny.schweizer@proofnet.de>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Danny Schweizer and committed by
Marcel Holtmann
4ada1282 41881465

+5 -2
+5 -2
net/bluetooth/bnep/core.c
··· 608 608 s->msg.msg_flags = MSG_NOSIGNAL; 609 609 610 610 #ifdef CONFIG_BT_BNEP_MC_FILTER 611 - /* Set default mc filter */ 612 - set_bit(bnep_mc_hash(dev->broadcast), (ulong *) &s->mc_filter); 611 + /* Set default mc filter to not filter out any mc addresses 612 + * as defined in the BNEP specification (revision 0.95a) 613 + * http://grouper.ieee.org/groups/802/15/Bluetooth/BNEP.pdf 614 + */ 615 + s->mc_filter = ~0LL; 613 616 #endif 614 617 615 618 #ifdef CONFIG_BT_BNEP_PROTO_FILTER