From: David Woodhouse <dwmw2@infradead.org> Date: 2002-10-21 11:11:59
I'm playing with userspace applications which want to monitor the status of
IrDA and Bluetooth devices. Rather than polling for the interface state
(this is a handheld device and polling wastes CPU and battery), I want to
use netlink.
I have two problems:
1. I appear to need CAP_NET_ADMIN to bind to the netlink groups which give
me this information. I can poll for it just fine, but need
elevated privs to be notified. Why is this, and is there a workaround?
2. Even root doesn't get notification of state changes for Bluetooth
interfaces, because they're not treated as 'normal' network devices
like IrDA devices are. I can see the logic behind that -- by why
is it done differently from IrDA? Is there a way to get notification
of BT interface state changes?
--
dwmw2
I'm playing with userspace applications which want to monitor the status of
IrDA and Bluetooth devices. Rather than polling for the interface state
(this is a handheld device and polling wastes CPU and battery), I want to
use netlink.
I have two problems:
1. I appear to need CAP_NET_ADMIN to bind to the netlink groups which give
me this information. I can poll for it just fine, but need
elevated privs to be notified. Why is this, and is there a workaround?
Alexey should be able to give you a better comment.
If you can get the status via ioctl there should be no reason why you
shouldnt get it via netlink. The change maybe a little involved
(look at:net/netlink/af_netlink.c::netlink_bind()) since
there are some valid reasons to block non-admin from receiving certain
messages. I think the LSM people may have been trying to do this, cant
remember details.
2. Even root doesn't get notification of state changes for Bluetooth
interfaces, because they're not treated as 'normal' network devices
like IrDA devices are. I can see the logic behind that -- by why
is it done differently from IrDA? Is there a way to get notification
of BT interface state changes?
I cant see anything on netlink and irda; i am also not very familiar with
either IrDA or Bluetooth.
Regardless, you dont need to be a net device to use netlink. Its a
messaging system and you can use it both within the kernel as well as
kernel<->userspace. If you get stuck writting the interface ping me
privately.
cheers,
jamal
From: James Morris <hidden> Date: 2002-10-21 13:40:31
On Mon, 21 Oct 2002, David Woodhouse wrote:
1. I appear to need CAP_NET_ADMIN to bind to the netlink groups which give
me this information. I can poll for it just fine, but need
elevated privs to be notified. Why is this, and is there a workaround?
Andi Kleen implemented a simple and effective workaround this for 2.4
which has gone into the tree (see netlink_set_nonroot() in rtnetlink.c).
Another more complicated solution was partially developed for 2.5, but is
unlikely to make it in by Halloween.
- James
--
James Morris
[off-list ref]
From: David Woodhouse <dwmw2@infradead.org> Date: 2002-10-21 18:52:23
hadi@cyberus.ca said:
I cant see anything on netlink and irda; i am also not very familiar
with either IrDA or Bluetooth. Regardless, you dont need to be a net
device to use netlink.
IrDA devices are network devices. The core network code sends a RTM_NETLINK
message when they go up or down. All is well, and once the permission fix
gets into the kernel I'm using, my irda monitor applet no longer needs to
poll the state of the interface.
But Bluetooth devices are not network devices, it seems. There exists no
current mechanism for notifying anyone of state changes. Should we invent a
new method of notification using netlink, or should Bluetooth interfaces in
fact be normal network devices just like IrDA devices are?
--
dwmw2
I cant see anything on netlink and irda; i am also not very familiar
with either IrDA or Bluetooth. Regardless, you dont need to be a net
device to use netlink.
IrDA devices are network devices. The core network code sends a RTM_NETLINK
message when they go up or down. All is well, and once the permission fix
gets into the kernel I'm using, my irda monitor applet no longer needs to
poll the state of the interface.
Ah, ok. I see what you mean - for a moment i thought IrDA was doing
something clever with netlink.
But Bluetooth devices are not network devices, it seems. There exists no
current mechanism for notifying anyone of state changes. Should we invent a
new method of notification using netlink, or should Bluetooth interfaces in
fact be normal network devices just like IrDA devices are?
I think the only time you should go netdev is when it makes sense to run
IP. Is there IP over bluttooth? Then you could take advantage of all the
nice features provided by netdevices (other than being IP devices;->).
If not, it probably time for someone to write a generic notification
scheme via netlink.
cheers,
jamal
From: Maksim (Max) Krasnyanskiy <hidden> Date: 2002-10-23 19:35:33
Hi Jamal,
quoted
But Bluetooth devices are not network devices, it seems. There exists no
current mechanism for notifying anyone of state changes. Should we invent a
new method of notification using netlink, or should Bluetooth interfaces in
fact be normal network devices just like IrDA devices are?
I think the only time you should go netdev is when it makes sense to run IP.
Totally agree.
Is there IP over bluttooth?
Yep. It's called BNEP (Bluetooth Network Encapsulation Protocol) which is bascially
an Ethernet emulation. That thing is the netdev of course.
Then you could take advantage of all the nice features provided by netdevices (other
than being IP devices;->).
If not, it probably time for someone to write a generic notification
scheme via netlink.
@@ -328,7 +334,7 @@return-EINVAL;/* Only superuser is allowed to listen multicasts */-if(nladdr->nl_groups&&!capable(CAP_NET_ADMIN))+if(nladdr->nl_groups&&!netlink_capable(sock,NL_NONROOT_RECV))return-EPERM;if(nlk->pid){
@@ -368,7 +374,7 @@return-EINVAL;/* Only superuser is allowed to send multicasts */-if(nladdr->nl_groups&&!capable(CAP_NET_ADMIN))+if(nladdr->nl_groups&&!netlink_capable(sock,NL_NONROOT_SEND))return-EPERM;if(!nlk->pid)