netlink.h revision c40bba6922b470c0fd0c7a7b8b09584527c468e9
10633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#ifndef __LINUX_NETLINK_H 20633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define __LINUX_NETLINK_H 30633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 4d639d9d18b2ef5a43cda5424830005333acfb288osdl.net!shemminger#include <linux/socket.h> /* for sa_family_t */ 50633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#include <linux/types.h> 60633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 70633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_ROUTE 0 /* Routing/device hook */ 81d35a1273d97bf140fc0c770e58933cf1e9bb1b1Stephen Hemminger#define NETLINK_UNUSED 1 /* Unused number */ 90633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ 100633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_FIREWALL 3 /* Firewalling hook */ 11351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger#define NETLINK_INET_DIAG 4 /* INET socket monitoring */ 120633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ 130633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_XFRM 6 /* ipsec */ 140633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_SELINUX 7 /* SELinux event notifications */ 15351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger#define NETLINK_ISCSI 8 /* Open-iSCSI */ 160633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_AUDIT 9 /* auditing */ 176864c1e7890c65dd2ee037809f772790b04792b4shemminger#define NETLINK_FIB_LOOKUP 10 182034ee975057937855cab33768b27977dcd4feaeshemminger#define NETLINK_CONNECTOR 11 196864c1e7890c65dd2ee037809f772790b04792b4shemminger#define NETLINK_NETFILTER 12 /* netfilter subsystem */ 200633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_IP6_FW 13 210633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ 22d639d9d18b2ef5a43cda5424830005333acfb288osdl.net!shemminger#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ 232034ee975057937855cab33768b27977dcd4feaeshemminger#define NETLINK_GENERIC 16 24ead2ba7008c9db02954dae6f180aed8770a0560dStephen Hemminger/* leave room for NETLINK_DM (DM Events) */ 25ead2ba7008c9db02954dae6f180aed8770a0560dStephen Hemminger#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ 26de3d12f48ac1869fc9f9cb442b2d692b027d8a14Stephen Hemminger#define NETLINK_ECRYPTFS 19 270633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 280633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define MAX_LINKS 32 290633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 305472ac6f9fab8632b89da31df56419c8423b020dStephen Hemmingerstruct net; 315472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger 320633baa17231b777e75b813439c237e3de380cc8osdl.net!shemmingerstruct sockaddr_nl 330633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger{ 340633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger sa_family_t nl_family; /* AF_NETLINK */ 350633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger unsigned short nl_pad; /* zero */ 36de3d12f48ac1869fc9f9cb442b2d692b027d8a14Stephen Hemminger __u32 nl_pid; /* port ID */ 370633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger __u32 nl_groups; /* multicast groups mask */ 380633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger}; 390633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 400633baa17231b777e75b813439c237e3de380cc8osdl.net!shemmingerstruct nlmsghdr 410633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger{ 420633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger __u32 nlmsg_len; /* Length of message including header */ 430633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger __u16 nlmsg_type; /* Message content */ 440633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger __u16 nlmsg_flags; /* Additional flags */ 450633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger __u32 nlmsg_seq; /* Sequence number */ 46de3d12f48ac1869fc9f9cb442b2d692b027d8a14Stephen Hemminger __u32 nlmsg_pid; /* Sending process port ID */ 470633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger}; 480633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 490633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger/* Flags values */ 500633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 510633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_REQUEST 1 /* It is request message. */ 520633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */ 530633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_ACK 4 /* Reply with ack, with zero or error code */ 540633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_ECHO 8 /* Echo this request */ 550633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 560633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger/* Modifiers to GET request */ 570633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_ROOT 0x100 /* specify tree root */ 580633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_MATCH 0x200 /* return all matching */ 590633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_ATOMIC 0x400 /* atomic GET */ 600633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) 610633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 620633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger/* Modifiers to NEW request */ 630633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_REPLACE 0x100 /* Override existing */ 640633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ 650633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ 660633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLM_F_APPEND 0x800 /* Add to end of list */ 670633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 680633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger/* 690633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL 700633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 4.4BSD CHANGE NLM_F_REPLACE 710633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 720633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger True CHANGE NLM_F_CREATE|NLM_F_REPLACE 730633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger Append NLM_F_CREATE 740633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger Check NLM_F_EXCL 750633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger */ 760633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 770633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_ALIGNTO 4 780633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) 7909954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) 8009954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN)) 810633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) 820633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) 830633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ 840633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) 850633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ 860633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ 870633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger (nlh)->nlmsg_len <= (len)) 880633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) 890633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 900633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_NOOP 0x1 /* Nothing. */ 910633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_ERROR 0x2 /* Error */ 920633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_DONE 0x3 /* End of a dump */ 930633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NLMSG_OVERRUN 0x4 /* Data lost */ 940633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 9509954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ 9609954dc61adc3051cbb2127e2bfcf692502c8306shemminger 970633baa17231b777e75b813439c237e3de380cc8osdl.net!shemmingerstruct nlmsgerr 980633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger{ 990633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger int error; 1000633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger struct nlmsghdr msg; 1010633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger}; 1020633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 103351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger#define NETLINK_ADD_MEMBERSHIP 1 104351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger#define NETLINK_DROP_MEMBERSHIP 2 105351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger#define NETLINK_PKTINFO 3 106c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NETLINK_BROADCAST_ERROR 4 107c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NETLINK_NO_ENOBUFS 5 108351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 109351efcde4e62967362a10b29f3b701cfecd7cdfcshemmingerstruct nl_pktinfo 110351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger{ 111351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger __u32 group; 112351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger}; 113351efcde4e62967362a10b29f3b701cfecd7cdfcshemminger 1140633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#define NET_MAJOR 36 /* Major 36 is reserved for networking */ 1150633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 1160633baa17231b777e75b813439c237e3de380cc8osdl.net!shemmingerenum { 1170633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger NETLINK_UNCONNECTED = 0, 1180633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger NETLINK_CONNECTED, 1190633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger}; 1200633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 12109954dc61adc3051cbb2127e2bfcf692502c8306shemminger/* 12209954dc61adc3051cbb2127e2bfcf692502c8306shemminger * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> 12309954dc61adc3051cbb2127e2bfcf692502c8306shemminger * +---------------------+- - -+- - - - - - - - - -+- - -+ 12409954dc61adc3051cbb2127e2bfcf692502c8306shemminger * | Header | Pad | Payload | Pad | 12509954dc61adc3051cbb2127e2bfcf692502c8306shemminger * | (struct nlattr) | ing | | ing | 12609954dc61adc3051cbb2127e2bfcf692502c8306shemminger * +---------------------+- - -+- - - - - - - - - -+- - -+ 12709954dc61adc3051cbb2127e2bfcf692502c8306shemminger * <-------------- nlattr->nla_len --------------> 12809954dc61adc3051cbb2127e2bfcf692502c8306shemminger */ 12909954dc61adc3051cbb2127e2bfcf692502c8306shemminger 13009954dc61adc3051cbb2127e2bfcf692502c8306shemmingerstruct nlattr 13109954dc61adc3051cbb2127e2bfcf692502c8306shemminger{ 13209954dc61adc3051cbb2127e2bfcf692502c8306shemminger __u16 nla_len; 13309954dc61adc3051cbb2127e2bfcf692502c8306shemminger __u16 nla_type; 13409954dc61adc3051cbb2127e2bfcf692502c8306shemminger}; 13509954dc61adc3051cbb2127e2bfcf692502c8306shemminger 1365472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger/* 1375472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * nla_type (16 bits) 1385472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * +---+---+-------------------------------+ 1395472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * | N | O | Attribute Type | 1405472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * +---+---+-------------------------------+ 1415472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * N := Carries nested attributes 1425472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * O := Payload stored in network byte order 1435472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * 1445472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger * Note: The N and O flag are mutually exclusive. 1455472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger */ 1465472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger#define NLA_F_NESTED (1 << 15) 1475472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger#define NLA_F_NET_BYTEORDER (1 << 14) 1485472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) 1495472ac6f9fab8632b89da31df56419c8423b020dStephen Hemminger 15009954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLA_ALIGNTO 4 15109954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) 15209954dc61adc3051cbb2127e2bfcf692502c8306shemminger#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) 15309954dc61adc3051cbb2127e2bfcf692502c8306shemminger 154c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#ifdef __KERNEL__ 155c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 156c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#include <linux/capability.h> 157c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#include <linux/skbuff.h> 158c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 159c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstatic inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb) 160c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger{ 161c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger return (struct nlmsghdr *)skb->data; 162c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger} 163c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 164c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstruct netlink_skb_parms 165c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger{ 166c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct ucred creds; /* Skb credentials */ 167c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 pid; 168c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 dst_group; 169c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger kernel_cap_t eff_cap; 170c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 loginuid; /* Login (audit) uid */ 171c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 sessionid; /* Session id (audit) */ 172c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 sid; /* SELinux security id */ 173c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger}; 174c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 175c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NETLINK_CB(skb) (*(struct netlink_skb_parms*)&((skb)->cb)) 176c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NETLINK_CREDS(skb) (&NETLINK_CB((skb)).creds) 177c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 178c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 179c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern struct sock *netlink_kernel_create(struct net *net, 180c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int unit,unsigned int groups, 181c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger void (*input)(struct sk_buff *skb), 182c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct mutex *cb_mutex, 183c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct module *module); 184c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern void netlink_kernel_release(struct sock *sk); 185c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_change_ngroups(struct sock *sk, unsigned int groups); 186c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern void netlink_clear_multicast_users(struct sock *sk, unsigned int group); 187c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err); 188c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_has_listeners(struct sock *sk, unsigned int group); 189c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock); 190c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid, 191c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __u32 group, gfp_t allocation); 192c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code); 193c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_register_notifier(struct notifier_block *nb); 194c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_unregister_notifier(struct notifier_block *nb); 195c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 196c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger/* finegrained unicast helpers: */ 197c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstruct sock *netlink_getsockbyfilp(struct file *filp); 198c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerint netlink_attachskb(struct sock *sk, struct sk_buff *skb, 199c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger long *timeo, struct sock *ssk); 200c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingervoid netlink_detachskb(struct sock *sk, struct sk_buff *skb); 201c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerint netlink_sendskb(struct sock *sk, struct sk_buff *skb); 202c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 203c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger/* 204c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger * skb should fit one page. This choice is good for headerless malloc. 205c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger * But we should limit to 8K so that userspace does not have to 206c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger * use enormous buffer sizes on recvmsg() calls just to avoid 207c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger * MSG_TRUNC when PAGE_SIZE is very large. 208c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger */ 209c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#if PAGE_SIZE < 8192UL 210c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NLMSG_GOODSIZE SKB_WITH_OVERHEAD(PAGE_SIZE) 211c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#else 212c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NLMSG_GOODSIZE SKB_WITH_OVERHEAD(8192UL) 213c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#endif 214c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 215c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NLMSG_DEFAULT_SIZE (NLMSG_GOODSIZE - NLMSG_HDRLEN) 216c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 217c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 218c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstruct netlink_callback 219c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger{ 220c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct sk_buff *skb; 221c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct nlmsghdr *nlh; 222c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int (*dump)(struct sk_buff * skb, struct netlink_callback *cb); 223c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int (*done)(struct netlink_callback *cb); 224c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int family; 225c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger long args[6]; 226c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger}; 227c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 228c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstruct netlink_notify 229c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger{ 230c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct net *net; 231c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int pid; 232c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int protocol; 233c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger}; 234c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 235c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerstatic __inline__ struct nlmsghdr * 236c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) 237c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger{ 238c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct nlmsghdr *nlh; 239c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int size = NLMSG_LENGTH(len); 240c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 241c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size)); 242c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh->nlmsg_type = type; 243c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh->nlmsg_len = size; 244c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh->nlmsg_flags = flags; 245c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh->nlmsg_pid = pid; 246c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger nlh->nlmsg_seq = seq; 247c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger if (!__builtin_constant_p(size) || NLMSG_ALIGN(size) - size != 0) 248c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size); 249c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger return nlh; 250c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger} 251c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 252c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NLMSG_NEW(skb, pid, seq, type, len, flags) \ 253c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger({ if (unlikely(skb_tailroom(skb) < (int)NLMSG_SPACE(len))) \ 254c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger goto nlmsg_failure; \ 255c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger __nlmsg_put(skb, pid, seq, type, len, flags); }) 256c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 257c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NLMSG_PUT(skb, pid, seq, type, len) \ 258c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger NLMSG_NEW(skb, pid, seq, type, len, 0) 259c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 260c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, 261c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger struct nlmsghdr *nlh, 262c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int (*dump)(struct sk_buff *skb, struct netlink_callback*), 263c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger int (*done)(struct netlink_callback*)); 264c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 265c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 266c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NL_NONROOT_RECV 0x1 267c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#define NL_NONROOT_SEND 0x2 268c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemmingerextern void netlink_set_nonroot(int protocol, unsigned flag); 269c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger 270c40bba6922b470c0fd0c7a7b8b09584527c468e9Stephen Hemminger#endif /* __KERNEL__ */ 2710633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger 2720633baa17231b777e75b813439c237e3de380cc8osdl.net!shemminger#endif /* __LINUX_NETLINK_H */ 273