€•ÌîŒsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ(/translations/zh_CN/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/pt_BR/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/sp_SP/driver-api/connector”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒB/var/lib/git/docbuild/linux/Documentation/driver-api/connector.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒKernel Connector”h]”hŒKernel Connector”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒaKernel connector - new netlink based userspace <-> kernel space easy to use communication module.”h]”hŒaKernel connector - new netlink based userspace <-> kernel space easy to use communication module.”…”�”}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÞ)�”}”(hX The Connector driver makes it easy to connect various agents using a netlink based network. One must register a callback and an identifier. When the driver receives a special netlink message with the appropriate identifier, the appropriate callback will be called.”h]”hX The Connector driver makes it easy to connect various agents using a netlink based network. One must register a callback and an identifier. When the driver receives a special netlink message with the appropriate identifier, the appropriate callback will be called.”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhÊh²hubhÞ)�”}”(hŒFrom the userspace point of view it’s quite straightforward:”…”�”}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhŒ block_quote”“”)�”}”(hŒ*- socket(); - bind(); - send(); - recv(); ”h]”hŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ socket();”h]”hÞ)�”}”(hjh]”hŒ socket();”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubj)�”}”(hŒbind();”h]”hÞ)�”}”(hj/h]”hŒbind();”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubj)�”}”(hŒsend();”h]”hÞ)�”}”(hjFh]”hŒsend();”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubj)�”}”(hŒrecv(); ”h]”hÞ)�”}”(hŒrecv();”h]”hŒrecv();”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jh³hÇh´Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KhhÊh²hubhÞ)�”}”(hX6But if kernelspace wants to use the full power of such connections, the driver writer must create special sockets, must know about struct sk_buff handling, etc... The Connector driver allows any kernelspace agents to use netlink based networking for inter-process communication in a significantly easier way::”h]”hX5But if kernelspace wants to use the full power of such connections, the driver writer must create special sockets, must know about struct sk_buff handling, etc... The Connector driver allows any kernelspace agents to use netlink based networking for inter-process communication in a significantly easier way:”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhŒ literal_block”“”)�”}”(hX�int cn_add_callback(const struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); void cn_netlink_send_mult(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); struct cb_id { __u32 idx; __u32 val; };”h]”hX�int cn_add_callback(const struct cb_id *id, char *name, void (*callback) (struct cn_msg *, struct netlink_skb_parms *)); void cn_netlink_send_mult(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); struct cb_id { __u32 idx; __u32 val; };”…”�”}”hj‘sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´KhhÊh²hubhÞ)�”}”(hXDidx and val are unique identifiers which must be registered in the 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 is received by the connector core. The argument for that function must be dereferenced to `struct cn_msg *`::”h]”(hŒlidx and val are unique identifiers which must be registered in the connector.h header for in-kernel usage. ”…”�”}”(hjŸh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`void (*callback) (void *)`”h]”hŒvoid (*callback) (void *)”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjŸubhŒª is a 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 be dereferenced to ”…”�”}”(hjŸh²hh³Nh´Nubj¨)�”}”(hŒ`struct cn_msg *`”h]”hŒstruct cn_msg *”…”�”}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjŸubhŒ:”…”�”}”(hjŸh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K&hhÊh²hubj�)�”}”(hXstruct cn_msg { struct cb_id id; __u32 seq; __u32 ack; __u16 len; /* Length of the following data */ __u16 flags; __u8 data[0]; };”h]”hXstruct cn_msg { struct cb_id id; __u32 seq; __u32 ack; __u16 len; /* Length of the following data */ __u16 flags; __u8 data[0]; };”…”�”}”hjÓsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´K,hhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒConnector interfaces”h]”hŒConnector interfaces”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjáh²hh³hÇh´K9ubj )�”}”(hŒ¨.. kernel-doc:: include/linux/connector.h Note: When registering new callback user, connector core assigns netlink group to the user which is equal to its id.idx. ”h]”(hŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œcn_add_callback (C function)”Œc.cn_add_callback”hNt”auh1jöhjòubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ}int cn_add_callback (const struct cb_id *id, const char *name, void (*callback)(struct cn_msg *, struct netlink_skb_parms *))”h]”hŒdesc_signature_line”“”)�”}”(hŒzint cn_add_callback(const struct cb_id *id, const char *name, void (*callback)(struct cn_msg*, struct netlink_skb_parms*))”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒint”h]”hŒint”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jhjh²hh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K:ubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j*hjh²hh³j)h´K:ubhŒ desc_name”“”)�”}”(hŒcn_add_callback”h]”hŒ desc_sig_name”“”)�”}”(hŒcn_add_callback”h]”hŒcn_add_callback”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jAhj=ubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1j;hjh²hh³j)h´K:ubhŒdesc_parameterlist”“”)�”}”(hŒg(const struct cb_id *id, const char *name, void (*callback)(struct cn_msg*, struct netlink_skb_parms*))”h]”(hŒdesc_parameter”“”)�”}”(hŒconst struct cb_id *id”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒconst”h]”hŒconst”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jfhjbubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjbubjg)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhjbubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjbubh)�”}”(hhh]”jB)�”}”(hŒcb_id”h]”hŒcb_id”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj¡ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”Œc”Œreftype”Œ identifier”Œ reftarget”j¦Œmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”jÀŒ ASTIdentifier”“”)�”}”j»jEsbŒc.cn_add_callback”†”asbuh1hhjbubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjbubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jÛhjbubjB)�”}”(hŒid”h]”hŒid”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjbubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj\ubja)�”}”(hŒconst char *name”h]”(jg)�”}”(hjjh]”hŒconst”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhjubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjubj)�”}”(hŒchar”h]”hŒchar”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhjubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhjubjB)�”}”(hŒname”h]”hŒname”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj\ubja)�”}”(hŒ;void (*callback)(struct cn_msg*, struct netlink_skb_parms*)”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhj^ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj^ubjÜ)�”}”(hŒ(”h]”hŒ(”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjB)�”}”(hŒcallback”h]”hŒcallback”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj^ubjÜ)�”}”(hŒ)”h]”hŒ)”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjÜ)�”}”(hj€h]”hŒ(”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjg)�”}”(hj‡h]”hŒstruct”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhj^ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj^ubh)�”}”(hhh]”jB)�”}”(hŒcn_msg”h]”hŒcn_msg”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjÝubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jâŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÉŒc.cn_add_callback”†”asbuh1hhj^ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjÜ)�”}”(hŒ,”h]”hŒ,”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj^ubjg)�”}”(hj‡h]”hŒstruct”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhj^ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj^ubh)�”}”(hhh]”jB)�”}”(hŒnetlink_skb_parms”h]”hŒnetlink_skb_parms”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjBubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jGŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÉŒc.cn_add_callback”†”asbuh1hhj^ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubjÜ)�”}”(hj©h]”hŒ)”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj^ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj\ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jZhjh²hh³j)h´K:ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jŒsphinx_line_type”Œ declarator”hjh²hh³j)h´K:ubah}”(h]”jah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j h³j)h´K:hj h²hubhŒ desc_content”“”)�”}”(hhh]”hÞ)�”}”(hŒ+Registers new callback with connector core.”h]”hŒ+Registers new callback with connector core.”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K:hj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jžhj h²hh³j)h´K:ubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”Œdomain”j¹Œobjtype”j»Œdesctype”j»Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jh²hhjòubhŒ container”“”)�”}”(hXd**Parameters** ``const struct cb_id *id`` unique connector's user identifier. It must be registered in connector.h for legal in-kernel users. ``const char *name`` connector's callback symbolic name. ``void (*callback)(struct cn_msg *, struct netlink_skb_parms *)`` connector's callback. parameters are ``cn_msg`` and the sender's credentials”h]”(hÞ)�”}”(hŒ**Parameters**”h]”hŒstrong”“”)�”}”(hjÍh]”hŒ Parameters”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjËubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K>hjÇubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ``const struct cb_id *id`` unique connector's user identifier. It must be registered in connector.h for legal in-kernel users. ”h]”(hŒterm”“”)�”}”(hŒ``const struct cb_id *id``”h]”hŒliteral”“”)�”}”(hjôh]”hŒconst struct cb_id *id”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjòubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K>hjìubhŒ definition”“”)�”}”(hhh]”hÞ)�”}”(hŒcunique connector's user identifier. It must be registered in connector.h for legal in-kernel users.”h]”hŒeunique connector’s user identifier. It must be registered in connector.h for legal in-kernel users.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Khjçubjë)�”}”(hŒ9``const char *name`` connector's callback symbolic name. ”h]”(jñ)�”}”(hŒ``const char *name``”h]”j÷)�”}”(hj2h]”hŒconst char *name”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K?hj,ubj )�”}”(hhh]”hÞ)�”}”(hŒ#connector's callback symbolic name.”h]”hŒ%connector’s callback symbolic name.”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jGh´K?hjHubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jGh´K?hjçubjë)�”}”(hŒŽ``void (*callback)(struct cn_msg *, struct netlink_skb_parms *)`` connector's callback. parameters are ``cn_msg`` and the sender's credentials”h]”(jñ)�”}”(hŒA``void (*callback)(struct cn_msg *, struct netlink_skb_parms *)``”h]”j÷)�”}”(hjkh]”hŒ=void (*callback)(struct cn_msg *, struct netlink_skb_parms *)”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjiubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K@hjeubj )�”}”(hhh]”hÞ)�”}”(hŒLconnector's callback. parameters are ``cn_msg`` and the sender's credentials”h]”(hŒ'connector’s callback. parameters are ”…”�”}”(hj„h²hh³Nh´Nubj÷)�”}”(hŒ ``cn_msg``”h]”hŒcn_msg”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj„ubhŒ and the sender’s credentials”…”�”}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j€h´K@hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjeubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j€h´K@hjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÇubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÅhjòubj÷)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒcn_del_callback (C function)”Œc.cn_del_callback”hNt”auh1jöhjòubj)�”}”(hhh]”(j )�”}”(hŒ-void cn_del_callback (const struct cb_id *id)”h]”j)�”}”(hŒ,void cn_del_callback(const struct cb_id *id)”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhjÒh²hh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KFubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjÒh²hh³jäh´KFubj<)�”}”(hŒcn_del_callback”h]”jB)�”}”(hŒcn_del_callback”h]”hŒcn_del_callback”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjóubah}”(h]”h ]”(jUjVeh"]”h$]”h&]”hÅhÆuh1j;hjÒh²hh³jäh´KFubj[)�”}”(hŒ(const struct cb_id *id)”h]”ja)�”}”(hŒconst struct cb_id *id”h]”(jg)�”}”(hjjh]”hŒconst”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhjubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjubjg)�”}”(hj‡h]”hŒstruct”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhjubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjubh)�”}”(hhh]”jB)�”}”(hŒcb_id”h]”hŒcb_id”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjIubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jNŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÈ)�”}”j»jùsbŒc.cn_del_callback”†”asbuh1hhjubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhjubjB)�”}”(hŒid”h]”hŒid”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jZhjÒh²hh³jäh´KFubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj�ˆuh1jj‘j’hjÎh²hh³jäh´KFubah}”(h]”jÉah ]”(j–j—eh"]”h$]”h&]”j›ˆjœ)j�huh1j h³jäh´KFhjËh²hubjŸ)�”}”(hhh]”hÞ)�”}”(hŒ-Unregisters new callback with connector core.”h]”hŒ-Unregisters new callback with connector core.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KFhj®h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jžhjËh²hh³jäh´KFubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”j¿j¹jÀjÉjÁjÉj‰jÉjĉuh1jh²hhjòubjÆ)�”}”(hŒP**Parameters** ``const struct cb_id *id`` unique connector's user identifier.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”jÐ)�”}”(hjÓh]”hŒ Parameters”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KJhjÍubjæ)�”}”(hhh]”jë)�”}”(hŒ>``const struct cb_id *id`` unique connector's user identifier.”h]”(jñ)�”}”(hŒ``const struct cb_id *id``”h]”j÷)�”}”(hjòh]”hŒconst struct cb_id *id”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KLhjìubj )�”}”(hhh]”hÞ)�”}”(hŒ#unique connector's user identifier.”h]”hŒ%unique connector’s user identifier.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KHhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjìubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jh´KLhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÍubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÅhjòubj÷)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ!cn_netlink_send_mult (C function)”Œc.cn_netlink_send_mult”hNt”auh1jöhjòubj)�”}”(hhh]”(j )�”}”(hŒŠint cn_netlink_send_mult (struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask, netlink_filter_fn filter, void *filter_data)”h]”j)�”}”(hŒ‰int cn_netlink_send_mult(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask, netlink_filter_fn filter, void *filter_data)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhjHh²hh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KNubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjHh²hh³jZh´KNubj<)�”}”(hŒcn_netlink_send_mult”h]”jB)�”}”(hŒcn_netlink_send_mult”h]”hŒcn_netlink_send_mult”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjiubah}”(h]”h ]”(jUjVeh"]”h$]”h&]”hÅhÆuh1j;hjHh²hh³jZh´KNubj[)�”}”(hŒq(struct cn_msg *msg, u16 len, u32 portid, u32 group, gfp_t gfp_mask, netlink_filter_fn filter, void *filter_data)”h]”(ja)�”}”(hŒstruct cn_msg *msg”h]”(jg)�”}”(hj‡h]”hŒstruct”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhj…ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj…ubh)�”}”(hhh]”jB)�”}”(hŒcn_msg”h]”hŒcn_msg”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj¤ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”j©Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÈ)�”}”j»josbŒc.cn_netlink_send_mult”†”asbuh1hhj…ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj…ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj…ubjB)�”}”(hŒmsg”h]”hŒmsg”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj…ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒu16 len”h]”(h)�”}”(hhh]”jB)�”}”(hŒu16”h]”hŒu16”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjûubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÃŒc.cn_netlink_send_mult”†”asbuh1hhj÷ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj÷ubjB)�”}”(hŒlen”h]”hŒlen”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒ u32 portid”h]”(h)�”}”(hhh]”jB)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjCubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jHŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÃŒc.cn_netlink_send_mult”†”asbuh1hhj?ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj?ubjB)�”}”(hŒportid”h]”hŒportid”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj?ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒ u32 group”h]”(h)�”}”(hhh]”jB)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj‹ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”j�Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÃŒc.cn_netlink_send_mult”†”asbuh1hhj‡ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj‡ubjB)�”}”(hŒgroup”h]”hŒgroup”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj‡ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒgfp_t gfp_mask”h]”(h)�”}”(hhh]”jB)�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjÓubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jØŒmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÃŒc.cn_netlink_send_mult”†”asbuh1hhjÏubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjÏubjB)�”}”(hŒgfp_mask”h]”hŒgfp_mask”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjÏubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒnetlink_filter_fn filter”h]”(h)�”}”(hhh]”jB)�”}”(hŒnetlink_filter_fn”h]”hŒnetlink_filter_fn”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”j Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÃŒc.cn_netlink_send_mult”†”asbuh1hhj ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj< h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj ubjB)�”}”(hŒfilter”h]”hŒfilter”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubja)�”}”(hŒvoid *filter_data”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhj_ ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj_ ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhj_ ubjB)�”}”(hŒ filter_data”h]”hŒ filter_data”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj_ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj�ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jZhjHh²hh³jZh´KNubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj�ˆuh1jj‘j’hjDh²hh³jZh´KNubah}”(h]”j?ah ]”(j–j—eh"]”h$]”h&]”j›ˆjœ)j�huh1j h³jZh´KNhjAh²hubjŸ)�”}”(hhh]”hÞ)�”}”(hŒ&Sends message to the specified groups.”h]”hŒ&Sends message to the specified groups.”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KNhj³ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jžhjAh²hh³jZh´KNubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”j¿j¹jÀjÎ jÁjÎ j‰jÉjĉuh1jh²hhjòubjÆ)�”}”(hXÔ**Parameters** ``struct cn_msg *msg`` message header(with attached data). ``u16 len`` Number of **msg** to be sent. ``u32 portid`` 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 **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_t gfp_mask`` GFP mask. ``netlink_filter_fn filter`` Filter function to be used at netlink layer. ``void *filter_data`` Filter data to be supplied to the filter function **Description** 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.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”jÐ)�”}”(hjØ h]”hŒ Parameters”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KRhjÒ ubjæ)�”}”(hhh]”(jë)�”}”(hŒ;``struct cn_msg *msg`` message header(with attached data). ”h]”(jñ)�”}”(hŒ``struct cn_msg *msg``”h]”j÷)�”}”(hj÷ h]”hŒstruct cn_msg *msg”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjõ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KPhjñ ubj )�”}”(hhh]”hÞ)�”}”(hŒ#message header(with attached data).”h]”hŒ#message header(with attached data).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j h´KPhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjñ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j h´KPhjî ubjë)�”}”(hŒ*``u16 len`` Number of **msg** to be sent. ”h]”(jñ)�”}”(hŒ ``u16 len``”h]”j÷)�”}”(hj0 h]”hŒu16 len”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj. ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KQhj* ubj )�”}”(hhh]”hÞ)�”}”(hŒNumber of **msg** to be sent.”h]”(hŒ Number of ”…”�”}”(hjI h²hh³Nh´NubjÐ)�”}”(hŒ**msg**”h]”hŒmsg”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjI ubhŒ to be sent.”…”�”}”(hjI h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jE h´KQhjF ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj* ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jE h´KQhjî ubjë)�”}”(hŒ…``u32 portid`` destination port. If non-zero the message will be sent to the given port, which should be set to the original sender. ”h]”(jñ)�”}”(hŒ``u32 portid``”h]”j÷)�”}”(hj{ h]”hŒ u32 portid”…”�”}”(hj} h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjy ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KThju ubj )�”}”(hhh]”hÞ)�”}”(hŒudestination port. If non-zero the message will be sent to the given port, which should be set to the original sender.”h]”hŒudestination port. If non-zero the message will be sent to the given port, which should be set to the original sender.”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KRhj‘ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hju ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j� h´KThjî ubjë)�”}”(hXM``u32 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. ”h]”(jñ)�”}”(hŒ ``u32 group``”h]”j÷)�”}”(hjµ h]”hŒ u32 group”…”�”}”(hj· h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj³ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K[hj¯ ubj )�”}”(hhh]”hÞ)�”}”(hX>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.”h]”(hŒdestination group. If ”…”�”}”(hjÎ h²hh³Nh´NubjÐ)�”}”(hŒ **portid**”h]”hŒportid”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÎ ubhŒ and ”…”�”}”(hjÎ h²hh³Nh´NubjÐ)�”}”(hŒ **group**”h]”hŒgroup”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÎ ubhŒ· 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 ”…”�”}”(hjÎ h²hh³Nh´NubjÐ)�”}”(hŒ**msg**”h]”hŒmsg”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÎ ubhŒ. If ”…”�”}”(hjÎ h²hh³Nh´NubjÐ)�”}”(hŒ **group**”h]”hŒgroup”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjÎ ubhŒD is not zero, then message will be delivered to the specified group.”…”�”}”(hjÎ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KUhjË ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¯ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jÊ h´K[hjî ubjë)�”}”(hŒ``gfp_t gfp_mask`` GFP mask. ”h]”(jñ)�”}”(hŒ``gfp_t gfp_mask``”h]”j÷)�”}”(hj7 h]”hŒgfp_t gfp_mask”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj5 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K\hj1 ubj )�”}”(hhh]”hÞ)�”}”(hŒ GFP mask.”h]”hŒ GFP mask.”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³jL h´K\hjM ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj1 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jL h´K\hjî ubjë)�”}”(hŒJ``netlink_filter_fn filter`` Filter function to be used at netlink layer. ”h]”(jñ)�”}”(hŒ``netlink_filter_fn filter``”h]”j÷)�”}”(hjp h]”hŒnetlink_filter_fn filter”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjn ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K]hjj ubj )�”}”(hhh]”hÞ)�”}”(hŒ,Filter function to be used at netlink layer.”h]”hŒ,Filter function to be used at netlink layer.”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j… h´K]hj† ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j… h´K]hjî ubjë)�”}”(hŒH``void *filter_data`` Filter data to be supplied to the filter function ”h]”(jñ)�”}”(hŒ``void *filter_data``”h]”j÷)�”}”(hj© h]”hŒvoid *filter_data”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj§ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K^hj£ ubj )�”}”(hhh]”hÞ)�”}”(hŒ1Filter data to be supplied to the filter function”h]”hŒ1Filter data to be supplied to the filter function”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j¾ h´K^hj¿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj£ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j¾ h´K^hjî ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÒ ubhÞ)�”}”(hŒ**Description**”h]”jÐ)�”}”(hjä h]”hŒ Description”…”�”}”(hjæ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjâ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K`hjÒ ubhÞ)�”}”(hŒaIt can be safely called from softirq context, but may silently fail under strong memory pressure.”h]”hŒaIt can be safely called from softirq context, but may silently fail under strong memory pressure.”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K_hjÒ ubhÞ)�”}”(hŒEIf there are no listeners for given group ``-ESRCH`` can be returned.”h]”(hŒ*If there are no listeners for given group ”…”�”}”(hj h²hh³Nh´Nubj÷)�”}”(hŒ ``-ESRCH``”h]”hŒ-ESRCH”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj ubhŒ can be returned.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KbhjÒ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÅhjòubj÷)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒcn_netlink_send (C function)”Œc.cn_netlink_send”hNt”auh1jöhjòubj)�”}”(hhh]”(j )�”}”(hŒOint cn_netlink_send (struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask)”h]”j)�”}”(hŒNint cn_netlink_send(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”j%ah"]”h$]”h&]”uh1jhjF h²hh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kkubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjY h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjF h²hh³jX h´Kkubj<)�”}”(hŒcn_netlink_send”h]”jB)�”}”(hŒcn_netlink_send”h]”hŒcn_netlink_send”…”�”}”(hjk h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjg ubah}”(h]”h ]”(jUjVeh"]”h$]”h&]”hÅhÆuh1j;hjF h²hh³jX h´Kkubj[)�”}”(hŒ;(struct cn_msg *msg, u32 portid, u32 group, gfp_t gfp_mask)”h]”(ja)�”}”(hŒstruct cn_msg *msg”h]”(jg)�”}”(hj‡h]”hŒstruct”…”�”}”(hj‡ h²hh³Nh´Nubah}”(h]”h ]”jsah"]”h$]”h&]”uh1jfhjƒ ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjƒ ubh)�”}”(hhh]”jB)�”}”(hŒcn_msg”h]”hŒcn_msg”…”�”}”(hj¥ h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj¢ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”j§ Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÈ)�”}”j»jm sbŒc.cn_netlink_send”†”asbuh1hhjƒ ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÅ h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjƒ ubjÜ)�”}”(hjßh]”hŒ*”…”�”}”(hjÓ h²hh³Nh´Nubah}”(h]”h ]”jèah"]”h$]”h&]”uh1jÛhjƒ ubjB)�”}”(hŒmsg”h]”hŒmsg”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjƒ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj ubja)�”}”(hŒ u32 portid”h]”(h)�”}”(hhh]”jB)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjù ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jþ Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÁ Œc.cn_netlink_send”†”asbuh1hhjõ ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hjõ ubjB)�”}”(hŒportid”h]”hŒportid”…”�”}”(hj( h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjõ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj ubja)�”}”(hŒ u32 group”h]”(h)�”}”(hhh]”jB)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjD h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhjA ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jF Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÁ Œc.cn_netlink_send”†”asbuh1hhj= ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjb h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj= ubjB)�”}”(hŒgroup”h]”hŒgroup”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj= ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj ubja)�”}”(hŒgfp_t gfp_mask”h]”(h)�”}”(hhh]”jB)�”}”(hŒgfp_t”h]”hŒgfp_t”…”�”}”(hjŒ h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj‰ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j¹Œreftype”j»Œ reftarget”jŽ Œmodname”NŒ classname”Nj¿jÂ)�”}”jÅ]”jÁ Œc.cn_netlink_send”†”asbuh1hhj… ubj+)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjª h²hh³Nh´Nubah}”(h]”h ]”j7ah"]”h$]”h&]”uh1j*hj… ubjB)�”}”(hŒgfp_mask”h]”hŒgfp_mask”…”�”}”(hj¸ h²hh³Nh´Nubah}”(h]”h ]”jNah"]”h$]”h&]”uh1jAhj… ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j`hj ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jZhjF h²hh³jX h´Kkubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj�ˆuh1jj‘j’hjB h²hh³jX h´Kkubah}”(h]”j= ah ]”(j–j—eh"]”h$]”h&]”j›ˆjœ)j�huh1j h³jX h´Kkhj? h²hubjŸ)�”}”(hhh]”hÞ)�”}”(hŒ&Sends message to the specified groups.”h]”hŒ&Sends message to the specified groups.”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kkhjß h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jžhj? h²hh³jX h´Kkubeh}”(h]”h ]”(j¹Œfunction”eh"]”h$]”h&]”j¿j¹jÀjú jÁjú j‰jÉjĉuh1jh²hhjòubjÆ)�”}”(hX**Parameters** ``struct cn_msg *msg`` message header(with attached data). ``u32 portid`` 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 **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_t gfp_mask`` GFP mask. **Description** 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.”h]”(hÞ)�”}”(hŒ**Parameters**”h]”jÐ)�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kohjþ ubjæ)�”}”(hhh]”(jë)�”}”(hŒ;``struct cn_msg *msg`` message header(with attached data). ”h]”(jñ)�”}”(hŒ``struct cn_msg *msg``”h]”j÷)�”}”(hj#h]”hŒstruct cn_msg *msg”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kmhjubj )�”}”(hhh]”hÞ)�”}”(hŒ#message header(with attached data).”h]”hŒ#message header(with attached data).”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j8h´Kmhj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j8h´Kmhjubjë)�”}”(hŒ…``u32 portid`` destination port. If non-zero the message will be sent to the given port, which should be set to the original sender. ”h]”(jñ)�”}”(hŒ``u32 portid``”h]”j÷)�”}”(hj\h]”hŒ u32 portid”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´KphjVubj )�”}”(hhh]”hÞ)�”}”(hŒudestination port. If non-zero the message will be sent to the given port, which should be set to the original sender.”h]”hŒudestination port. If non-zero the message will be sent to the given port, which should be set to the original sender.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Knhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³jqh´Kphjubjë)�”}”(hXM``u32 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. ”h]”(jñ)�”}”(hŒ ``u32 group``”h]”j÷)�”}”(hj–h]”hŒ u32 group”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kwhj�ubj )�”}”(hhh]”hÞ)�”}”(hX>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.”h]”(hŒdestination group. If ”…”�”}”(hj¯h²hh³Nh´NubjÐ)�”}”(hŒ **portid**”h]”hŒportid”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj¯ubhŒ and ”…”�”}”(hj¯h²hh³Nh´NubjÐ)�”}”(hŒ **group**”h]”hŒgroup”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj¯ubhŒ· 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 ”…”�”}”(hj¯h²hh³Nh´NubjÐ)�”}”(hŒ**msg**”h]”hŒmsg”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj¯ubhŒ. If ”…”�”}”(hj¯h²hh³Nh´NubjÐ)�”}”(hŒ **group**”h]”hŒgroup”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhj¯ubhŒD is not zero, then message will be delivered to the specified group.”…”�”}”(hj¯h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kqhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j«h´Kwhjubjë)�”}”(hŒ``gfp_t gfp_mask`` GFP mask. ”h]”(jñ)�”}”(hŒ``gfp_t gfp_mask``”h]”j÷)�”}”(hjh]”hŒgfp_t gfp_mask”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kxhjubj )�”}”(hhh]”hÞ)�”}”(hŒ GFP mask.”h]”hŒ GFP mask.”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³j-h´Kxhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³j-h´Kxhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhjþ ubhÞ)�”}”(hŒ**Description**”h]”jÐ)�”}”(hjSh]”hŒ Description”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÏhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kzhjþ ubhÞ)�”}”(hŒaIt can be safely called from softirq context, but may silently fail under strong memory pressure.”h]”hŒaIt can be safely called from softirq context, but may silently fail under strong memory pressure.”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´Kyhjþ ubhÞ)�”}”(hŒEIf there are no listeners for given group ``-ESRCH`` can be returned.”h]”(hŒ*If there are no listeners for given group ”…”�”}”(hjxh²hh³Nh´Nubj÷)�”}”(hŒ ``-ESRCH``”h]”hŒ-ESRCH”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jöhjxubhŒ can be returned.”…”�”}”(hjxh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œ^/var/lib/git/docbuild/linux/Documentation/driver-api/connector:59: ./include/linux/connector.h”h´K|hjþ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jÅhjòubjæ)�”}”(hhh]”jë)�”}”(hŒyNote: When registering new callback user, connector core assigns netlink group to the user which is equal to its id.idx. ”h]”(jñ)�”}”(hŒNote:”h]”hŒNote:”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jðh³hÇh´K?hj£ubj )�”}”(hhh]”hÞ)�”}”(hŒrWhen registering new callback user, connector core assigns netlink group to the user which is equal to its id.idx.”h]”hŒrWhen registering new callback user, connector core assigns netlink group to the user which is equal to its id.idx.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K>hjµubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj£ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jêh³hÇh´K?hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjòubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K;hjáh²hubeh}”(h]”Œconnector-interfaces”ah ]”h"]”Œconnector interfaces”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K9ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒProtocol description”h]”hŒProtocol description”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjæh²hh³hÇh´KBubhÞ)�”}”(hŒ†The current framework offers a transport layer with fixed headers. The recommended protocol which uses such a header is as following:”h]”hŒ†The current framework offers a transport layer with fixed headers. The recommended protocol which uses such a header is as following:”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KDhjæh²hubhÞ)�”}”(hŒàmsg->seq and msg->ack are used to determine message genealogy. When someone sends a message, they use a locally unique sequence and random acknowledge number. The sequence number may be copied into nlmsghdr->nlmsg_seq too.”h]”hŒàmsg->seq and msg->ack are used to determine message genealogy. When someone sends a message, they use a locally unique sequence and random acknowledge number. The sequence number may be copied into nlmsghdr->nlmsg_seq too.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KGhjæh²hubhÞ)�”}”(hŒ:The sequence number is incremented with each message sent.”h]”hŒ:The sequence number is incremented with each message sent.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KLhjæh²hubhÞ)�”}”(hŒ´If you expect a reply to the message, then the sequence number in the received message MUST be the same as in the original message, and the acknowledge number MUST be the same + 1.”h]”hŒ´If you expect a reply to the message, then the sequence number in the received message MUST be the same as in the original message, and the acknowledge number MUST be the same + 1.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KNhjæh²hubhÞ)�”}”(hX4If we receive a message and its sequence number is not equal to one we are expecting, then it is a new message. If we receive a message and its sequence number is the same as one we are expecting, but its acknowledge is not equal to the sequence number in the original message + 1, then it is a new message.”h]”hX4If we receive a message and its sequence number is not equal to one we are expecting, then it is a new message. If we receive a message and its sequence number is the same as one we are expecting, but its acknowledge is not equal to the sequence number in the original message + 1, then it is a new message.”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KRhjæh²hubhÞ)�”}”(hŒ5Obviously, the protocol header contains the above id.”h]”hŒ5Obviously, the protocol header contains the above id.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KXhjæh²hubhÞ)�”}”(hXDThe connector allows event notification in the following form: kernel driver or userspace process can ask connector to notify it when selected ids will be turned on or off (registered or unregistered its callback). It is done by sending a special command to the connector driver (it also registers itself with id={-1, -1}).”h]”hXDThe connector allows event notification in the following form: kernel driver or userspace process can ask connector to notify it when selected ids will be turned on or off (registered or unregistered its callback). It is done by sending a special command to the connector driver (it also registers itself with id={-1, -1}).”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KZhjæh²hubhÞ)�”}”(hŒ„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.”h]”hŒ„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.”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K`hjæh²hubeh}”(h]”Œprotocol-description”ah ]”h"]”Œprotocol description”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KBubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Reliability”h]”hŒ Reliability”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjoh²hh³hÇh´KdubhÞ)�”}”(hX#Netlink itself is not a reliable protocol. That means that messages can be lost due to memory pressure or process' receiving queue overflowed, 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 fields.”h]”hX'Netlink itself is not a reliable protocol. That means that messages can be lost due to memory pressure or process’ receiving queue overflowed, 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 fields.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kfhjoh²hubeh}”(h]”Œ reliability”ah ]”h"]”Œ reliability”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KdubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒUserspace usage”h]”hŒUserspace usage”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj–h²hh³hÇh´KmubhÞ)�”}”(hXX2.6.14 has a new netlink socket implementation, which by default does not allow people to send data to netlink groups other than 1. So, if you wish to use a netlink socket (for example using connector) with a different group number, the userspace application must subscribe to that group first. It can be achieved by the following pseudocode::”h]”hXW2.6.14 has a new netlink socket implementation, which by default does not allow people to send data to netlink groups other than 1. So, if you wish to use a netlink socket (for example using connector) with a different group number, the userspace application must subscribe to that group first. It can be achieved by the following pseudocode:”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kohj–h²hubj�)�”}”(hXcs = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); l_local.nl_family = AF_NETLINK; l_local.nl_groups = 12345; l_local.nl_pid = 0; if (bind(s, (struct sockaddr *)&l_local, sizeof(struct sockaddr_nl)) == -1) { perror("bind"); close(s); return -1; } { int on = l_local.nl_groups; setsockopt(s, 270, 1, &on, sizeof(on)); }”h]”hXcs = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR); l_local.nl_family = AF_NETLINK; l_local.nl_groups = 12345; l_local.nl_pid = 0; if (bind(s, (struct sockaddr *)&l_local, sizeof(struct sockaddr_nl)) == -1) { perror("bind"); close(s); return -1; } { int on = l_local.nl_groups; setsockopt(s, 270, 1, &on, sizeof(on)); }”…”�”}”hjµsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j�h³hÇh´Kuhj–h²hubhÞ)�”}”(hŒÝ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 with the NETLINK_DROP_MEMBERSHIP parameter which is defined as 0.”h]”hŒÝ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 with the NETLINK_DROP_MEMBERSHIP parameter which is defined as 0.”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K†hj–h²hubhÞ)�”}”(hXm2.6.14 netlink code only allows to select a group which is less or equal to the maximum group number, which is used at netlink_kernel_create() time. In case of connector it is CN_NETLINK_USERS + 0xf, so if you want to use 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.”h]”hXm2.6.14 netlink code only allows to select a group which is less or equal to the maximum group number, which is used at netlink_kernel_create() time. In case of connector it is CN_NETLINK_USERS + 0xf, so if you want to use 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.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KŠhj–h²hubhÞ)�”}”(hŒ´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, only cn_test.c test module used it.”h]”hŒ¶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, only cn_test.c test module used it.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj–h²hubhÞ)�”}”(hŒž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 kernel.”h]”hŒž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 kernel.”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K”hj–h²hubeh}”(h]”Œuserspace-usage”ah ]”h"]”Œuserspace usage”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KmubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Code samples”h]”hŒ Code samples”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K™ubhÞ)�”}”(hŒšSample code for a connector test module and user space can be found in samples/connector/. To build this code, enable CONFIG_CONNECTOR and CONFIG_SAMPLES.”h]”hŒšSample code for a connector test module and user space can be found in samples/connector/. To build this code, enable CONFIG_CONNECTOR and CONFIG_SAMPLES.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K›hjh²hubeh}”(h]”Œ code-samples”ah ]”h"]”Œ code samples”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K™ubeh}”(h]”Œkernel-connector”ah ]”h"]”Œkernel connector”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jUŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j/j,jãjàjljij“j�jjýj'j$uŒ nametypes”}”(j/‰jã‰jl‰j“‰j‰j'‰uh}”(j,hÊjàjájjjÉjÎj?jDj= jB jijæj�jojýj–j$juŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.