mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-19 23:02:31 +00:00
docs: connector: convert to ReST and rename to connector.rst
As it has some function definitions, move them to connector.h. The remaining conversion is actually: - add blank lines and identation in order to identify paragraphs; - fix tables markups; - add some lists markups; - mark literal blocks; - adjust title markups. At its new index.rst, let's add a :orphan: while this is not linked to the main index.rst file, in order to avoid build warnings. Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
387b14684f
commit
720594f691
@ -1,6 +1,8 @@
|
|||||||
/*****************************************/
|
:orphan:
|
||||||
Kernel Connector.
|
|
||||||
/*****************************************/
|
================
|
||||||
|
Kernel Connector
|
||||||
|
================
|
||||||
|
|
||||||
Kernel connector - new netlink based userspace <-> kernel space easy
|
Kernel connector - new netlink based userspace <-> kernel space easy
|
||||||
to use communication module.
|
to use communication module.
|
||||||
@ -12,94 +14,55 @@ identifier, the appropriate callback will be called.
|
|||||||
|
|
||||||
From the userspace point of view it's quite straightforward:
|
From the userspace point of view it's quite straightforward:
|
||||||
|
|
||||||
socket();
|
- socket();
|
||||||
bind();
|
- bind();
|
||||||
send();
|
- send();
|
||||||
recv();
|
- recv();
|
||||||
|
|
||||||
But if kernelspace wants to use the full power of such connections, the
|
But if kernelspace wants to use the full power of such connections, the
|
||||||
driver writer must create special sockets, must know about struct sk_buff
|
driver writer must create special sockets, must know about struct sk_buff
|
||||||
handling, etc... The Connector driver allows any kernelspace agents to use
|
handling, etc... The Connector driver allows any kernelspace agents to use
|
||||||
netlink based networking for inter-process communication in a significantly
|
netlink based networking for inter-process communication in a significantly
|
||||||
easier way:
|
easier way::
|
||||||
|
|
||||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
|
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
|
||||||
void cn_netlink_send_multi(struct cn_msg *msg, u16 len, u32 portid, u32 __group, int gfp_mask);
|
void cn_netlink_send_multi(struct cn_msg *msg, u16 len, u32 portid, u32 __group, int gfp_mask);
|
||||||
void cn_netlink_send(struct cn_msg *msg, u32 portid, u32 __group, int gfp_mask);
|
void cn_netlink_send(struct cn_msg *msg, u32 portid, u32 __group, int gfp_mask);
|
||||||
|
|
||||||
struct cb_id
|
struct cb_id
|
||||||
{
|
{
|
||||||
__u32 idx;
|
__u32 idx;
|
||||||
__u32 val;
|
__u32 val;
|
||||||
};
|
};
|
||||||
|
|
||||||
idx and val are unique identifiers which must be registered in the
|
idx and val are unique identifiers which must be registered in the
|
||||||
connector.h header for in-kernel usage. void (*callback) (void *) is a
|
connector.h header for in-kernel usage. `void (*callback) (void *)` is a
|
||||||
callback function which will be called when a message with above idx.val
|
callback function which will be called when a message with above idx.val
|
||||||
is received by the connector core. The argument for that function must
|
is received by the connector core. The argument for that function must
|
||||||
be dereferenced to struct cn_msg *.
|
be dereferenced to `struct cn_msg *`::
|
||||||
|
|
||||||
struct cn_msg
|
struct cn_msg
|
||||||
{
|
{
|
||||||
struct cb_id id;
|
struct cb_id id;
|
||||||
|
|
||||||
__u32 seq;
|
__u32 seq;
|
||||||
__u32 ack;
|
__u32 ack;
|
||||||
|
|
||||||
__u32 len; /* Length of the following data */
|
__u32 len; /* Length of the following data */
|
||||||
__u8 data[0];
|
__u8 data[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************/
|
Connector interfaces
|
||||||
Connector interfaces.
|
====================
|
||||||
/*****************************************/
|
|
||||||
|
|
||||||
int cn_add_callback(struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *));
|
.. kernel-doc:: include/linux/connector.h
|
||||||
|
|
||||||
Registers new callback with connector core.
|
Note:
|
||||||
|
When registering new callback user, connector core assigns
|
||||||
|
netlink group to the user which is equal to its id.idx.
|
||||||
|
|
||||||
struct cb_id *id - unique connector's user identifier.
|
Protocol description
|
||||||
It must be registered in connector.h for legal in-kernel users.
|
====================
|
||||||
char *name - connector's callback symbolic name.
|
|
||||||
void (*callback) (struct cn..) - connector's callback.
|
|
||||||
cn_msg and the sender's credentials
|
|
||||||
|
|
||||||
|
|
||||||
void cn_del_callback(struct cb_id *id);
|
|
||||||
|
|
||||||
Unregisters new callback with connector core.
|
|
||||||
|
|
||||||
struct cb_id *id - unique connector's user identifier.
|
|
||||||
|
|
||||||
|
|
||||||
int cn_netlink_send_multi(struct cn_msg *msg, u16 len, u32 portid, u32 __groups, int gfp_mask);
|
|
||||||
int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 __groups, int gfp_mask);
|
|
||||||
|
|
||||||
Sends message to the specified groups. It can be safely called from
|
|
||||||
softirq context, but may silently fail under strong memory pressure.
|
|
||||||
If there are no listeners for given group -ESRCH can be returned.
|
|
||||||
|
|
||||||
struct cn_msg * - message header(with attached data).
|
|
||||||
u16 len - for *_multi multiple cn_msg messages can be sent
|
|
||||||
u32 port - destination port.
|
|
||||||
If non-zero the message will be sent to the
|
|
||||||
given port, which should be set to the
|
|
||||||
original sender.
|
|
||||||
u32 __group - destination group.
|
|
||||||
If port and __group is zero, then appropriate group will
|
|
||||||
be searched through all registered connector users,
|
|
||||||
and message will be delivered to the group which was
|
|
||||||
created for user with the same ID as in msg.
|
|
||||||
If __group is not zero, then message will be delivered
|
|
||||||
to the specified group.
|
|
||||||
int gfp_mask - GFP mask.
|
|
||||||
|
|
||||||
Note: When registering new callback user, connector core assigns
|
|
||||||
netlink group to the user which is equal to its id.idx.
|
|
||||||
|
|
||||||
/*****************************************/
|
|
||||||
Protocol description.
|
|
||||||
/*****************************************/
|
|
||||||
|
|
||||||
The current framework offers a transport layer with fixed headers. The
|
The current framework offers a transport layer with fixed headers. The
|
||||||
recommended protocol which uses such a header is as following:
|
recommended protocol which uses such a header is as following:
|
||||||
@ -132,9 +95,8 @@ driver (it also registers itself with id={-1, -1}).
|
|||||||
As example of this usage can be found in the cn_test.c module which
|
As example of this usage can be found in the cn_test.c module which
|
||||||
uses the connector to request notification and to send messages.
|
uses the connector to request notification and to send messages.
|
||||||
|
|
||||||
/*****************************************/
|
Reliability
|
||||||
Reliability.
|
===========
|
||||||
/*****************************************/
|
|
||||||
|
|
||||||
Netlink itself is not a reliable protocol. That means that messages can
|
Netlink itself is not a reliable protocol. That means that messages can
|
||||||
be lost due to memory pressure or process' receiving queue overflowed,
|
be lost due to memory pressure or process' receiving queue overflowed,
|
||||||
@ -142,32 +104,31 @@ so caller is warned that it must be prepared. That is why the struct
|
|||||||
cn_msg [main connector's message header] contains u32 seq and u32 ack
|
cn_msg [main connector's message header] contains u32 seq and u32 ack
|
||||||
fields.
|
fields.
|
||||||
|
|
||||||
/*****************************************/
|
Userspace usage
|
||||||
Userspace usage.
|
===============
|
||||||
/*****************************************/
|
|
||||||
|
|
||||||
2.6.14 has a new netlink socket implementation, which by default does not
|
2.6.14 has a new netlink socket implementation, which by default does not
|
||||||
allow people to send data to netlink groups other than 1.
|
allow people to send data to netlink groups other than 1.
|
||||||
So, if you wish to use a netlink socket (for example using connector)
|
So, if you wish to use a netlink socket (for example using connector)
|
||||||
with a different group number, the userspace application must subscribe to
|
with a different group number, the userspace application must subscribe to
|
||||||
that group first. It can be achieved by the following pseudocode:
|
that group first. It can be achieved by the following pseudocode::
|
||||||
|
|
||||||
s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
|
s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
|
||||||
|
|
||||||
l_local.nl_family = AF_NETLINK;
|
l_local.nl_family = AF_NETLINK;
|
||||||
l_local.nl_groups = 12345;
|
l_local.nl_groups = 12345;
|
||||||
l_local.nl_pid = 0;
|
l_local.nl_pid = 0;
|
||||||
|
|
||||||
if (bind(s, (struct sockaddr *)&l_local, sizeof(struct sockaddr_nl)) == -1) {
|
if (bind(s, (struct sockaddr *)&l_local, sizeof(struct sockaddr_nl)) == -1) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
close(s);
|
close(s);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
int on = l_local.nl_groups;
|
int on = l_local.nl_groups;
|
||||||
setsockopt(s, 270, 1, &on, sizeof(on));
|
setsockopt(s, 270, 1, &on, sizeof(on));
|
||||||
}
|
}
|
||||||
|
|
||||||
Where 270 above is SOL_NETLINK, and 1 is a NETLINK_ADD_MEMBERSHIP socket
|
Where 270 above is SOL_NETLINK, and 1 is a NETLINK_ADD_MEMBERSHIP socket
|
||||||
option. To drop a multicast subscription, one should call the above socket
|
option. To drop a multicast subscription, one should call the above socket
|
||||||
@ -180,16 +141,15 @@ group number 12345, you must increment CN_NETLINK_USERS to that number.
|
|||||||
Additional 0xf numbers are allocated to be used by non-in-kernel users.
|
Additional 0xf numbers are allocated to be used by non-in-kernel users.
|
||||||
|
|
||||||
Due to this limitation, group 0xffffffff does not work now, so one can
|
Due to this limitation, group 0xffffffff does not work now, so one can
|
||||||
not use add/remove connector's group notifications, but as far as I know,
|
not use add/remove connector's group notifications, but as far as I know,
|
||||||
only cn_test.c test module used it.
|
only cn_test.c test module used it.
|
||||||
|
|
||||||
Some work in netlink area is still being done, so things can be changed in
|
Some work in netlink area is still being done, so things can be changed in
|
||||||
2.6.15 timeframe, if it will happen, documentation will be updated for that
|
2.6.15 timeframe, if it will happen, documentation will be updated for that
|
||||||
kernel.
|
kernel.
|
||||||
|
|
||||||
/*****************************************/
|
|
||||||
Code samples
|
Code samples
|
||||||
/*****************************************/
|
============
|
||||||
|
|
||||||
Sample code for a connector test module and user space can be found
|
Sample code for a connector test module and user space can be found
|
||||||
in samples/connector/. To build this code, enable CONFIG_CONNECTOR
|
in samples/connector/. To build this code, enable CONFIG_CONNECTOR
|
@ -19,7 +19,7 @@ config W1_CON
|
|||||||
default y
|
default y
|
||||||
---help---
|
---help---
|
||||||
This allows to communicate with userspace using connector. For more
|
This allows to communicate with userspace using connector. For more
|
||||||
information see <file:Documentation/connector/connector.txt>.
|
information see <file:Documentation/connector/connector.rst>.
|
||||||
There are three types of messages between w1 core and userspace:
|
There are three types of messages between w1 core and userspace:
|
||||||
1. Events. They are generated each time new master or slave device found
|
1. Events. They are generated each time new master or slave device found
|
||||||
either due to automatic or requested search.
|
either due to automatic or requested search.
|
||||||
|
@ -55,10 +55,71 @@ struct cn_dev {
|
|||||||
struct cn_queue_dev *cbdev;
|
struct cn_queue_dev *cbdev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cn_add_callback() - Registers new callback with connector core.
|
||||||
|
*
|
||||||
|
* @id: unique connector's user identifier.
|
||||||
|
* It must be registered in connector.h for legal
|
||||||
|
* in-kernel users.
|
||||||
|
* @name: connector's callback symbolic name.
|
||||||
|
* @callback: connector's callback.
|
||||||
|
* parameters are %cn_msg and the sender's credentials
|
||||||
|
*/
|
||||||
int cn_add_callback(struct cb_id *id, const char *name,
|
int cn_add_callback(struct cb_id *id, const char *name,
|
||||||
void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
|
void (*callback)(struct cn_msg *, struct netlink_skb_parms *));
|
||||||
void cn_del_callback(struct cb_id *);
|
/**
|
||||||
|
* cn_del_callback() - Unregisters new callback with connector core.
|
||||||
|
*
|
||||||
|
* @id: unique connector's user identifier.
|
||||||
|
*/
|
||||||
|
void cn_del_callback(struct cb_id *id);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cn_netlink_send_mult - Sends message to the specified groups.
|
||||||
|
*
|
||||||
|
* @msg: message header(with attached data).
|
||||||
|
* @len: Number of @msg to be sent.
|
||||||
|
* @portid: destination port.
|
||||||
|
* If non-zero the message will be sent to the given port,
|
||||||
|
* which should be set to the original sender.
|
||||||
|
* @group: destination group.
|
||||||
|
* If @portid and @group is zero, then appropriate group will
|
||||||
|
* be searched through all registered connector users, and
|
||||||
|
* message will be delivered to the group which was created
|
||||||
|
* for user with the same ID as in @msg.
|
||||||
|
* If @group is not zero, then message will be delivered
|
||||||
|
* to the specified group.
|
||||||
|
* @gfp_mask: GFP mask.
|
||||||
|
*
|
||||||
|
* It can be safely called from softirq context, but may silently
|
||||||
|
* fail under strong memory pressure.
|
||||||
|
*
|
||||||
|
* If there are no listeners for given group %-ESRCH can be returned.
|
||||||
|
*/
|
||||||
int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask);
|
int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cn_netlink_send_mult - Sends message to the specified groups.
|
||||||
|
*
|
||||||
|
* @msg: message header(with attached data).
|
||||||
|
* @portid: destination port.
|
||||||
|
* If non-zero the message will be sent to the given port,
|
||||||
|
* which should be set to the original sender.
|
||||||
|
* @group: destination group.
|
||||||
|
* If @portid and @group is zero, then appropriate group will
|
||||||
|
* be searched through all registered connector users, and
|
||||||
|
* message will be delivered to the group which was created
|
||||||
|
* for user with the same ID as in @msg.
|
||||||
|
* If @group is not zero, then message will be delivered
|
||||||
|
* to the specified group.
|
||||||
|
* @gfp_mask: GFP mask.
|
||||||
|
*
|
||||||
|
* It can be safely called from softirq context, but may silently
|
||||||
|
* fail under strong memory pressure.
|
||||||
|
*
|
||||||
|
* If there are no listeners for given group %-ESRCH can be returned.
|
||||||
|
*/
|
||||||
int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask);
|
int cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask);
|
||||||
|
|
||||||
int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name,
|
int cn_queue_add_callback(struct cn_queue_dev *dev, const char *name,
|
||||||
|
@ -99,7 +99,7 @@ config SAMPLE_CONNECTOR
|
|||||||
When enabled, this builds both a sample kernel module for
|
When enabled, this builds both a sample kernel module for
|
||||||
the connector interface and a user space tool to communicate
|
the connector interface and a user space tool to communicate
|
||||||
with it.
|
with it.
|
||||||
See also Documentation/connector/connector.txt
|
See also Documentation/connector/connector.rst
|
||||||
|
|
||||||
config SAMPLE_HIDRAW
|
config SAMPLE_HIDRAW
|
||||||
bool "hidraw sample"
|
bool "hidraw sample"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user