home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / netlink.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  8.3 KB  |  270 lines

  1. #ifndef __LINUX_NETLINK_H
  2. #define __LINUX_NETLINK_H
  3.  
  4. #include <linux/socket.h> /* for sa_family_t */
  5. #include <linux/types.h>
  6.  
  7. #define NETLINK_ROUTE        0    /* Routing/device hook                */
  8. #define NETLINK_UNUSED        1    /* Unused number                */
  9. #define NETLINK_USERSOCK    2    /* Reserved for user mode socket protocols     */
  10. #define NETLINK_FIREWALL    3    /* Firewalling hook                */
  11. #define NETLINK_INET_DIAG    4    /* INET socket monitoring            */
  12. #define NETLINK_NFLOG        5    /* netfilter/iptables ULOG */
  13. #define NETLINK_XFRM        6    /* ipsec */
  14. #define NETLINK_SELINUX        7    /* SELinux event notifications */
  15. #define NETLINK_ISCSI        8    /* Open-iSCSI */
  16. #define NETLINK_AUDIT        9    /* auditing */
  17. #define NETLINK_FIB_LOOKUP    10    
  18. #define NETLINK_CONNECTOR    11
  19. #define NETLINK_NETFILTER    12    /* netfilter subsystem */
  20. #define NETLINK_IP6_FW        13
  21. #define NETLINK_DNRTMSG        14    /* DECnet routing messages */
  22. #define NETLINK_KOBJECT_UEVENT    15    /* Kernel messages to userspace */
  23. #define NETLINK_GENERIC        16
  24. /* leave room for NETLINK_DM (DM Events) */
  25. #define NETLINK_SCSITRANSPORT    18    /* SCSI Transports */
  26. #define NETLINK_ECRYPTFS    19
  27.  
  28. #define MAX_LINKS 32        
  29.  
  30. struct net;
  31.  
  32. struct sockaddr_nl
  33. {
  34.     sa_family_t    nl_family;    /* AF_NETLINK    */
  35.     unsigned short    nl_pad;        /* zero        */
  36.     __u32        nl_pid;        /* port ID    */
  37.            __u32        nl_groups;    /* multicast groups mask */
  38. };
  39.  
  40. struct nlmsghdr
  41. {
  42.     __u32        nlmsg_len;    /* Length of message including header */
  43.     __u16        nlmsg_type;    /* Message content */
  44.     __u16        nlmsg_flags;    /* Additional flags */
  45.     __u32        nlmsg_seq;    /* Sequence number */
  46.     __u32        nlmsg_pid;    /* Sending process port ID */
  47. };
  48.  
  49. /* Flags values */
  50.  
  51. #define NLM_F_REQUEST        1    /* It is request message.     */
  52. #define NLM_F_MULTI        2    /* Multipart message, terminated by NLMSG_DONE */
  53. #define NLM_F_ACK        4    /* Reply with ack, with zero or error code */
  54. #define NLM_F_ECHO        8    /* Echo this request         */
  55.  
  56. /* Modifiers to GET request */
  57. #define NLM_F_ROOT    0x100    /* specify tree    root    */
  58. #define NLM_F_MATCH    0x200    /* return all matching    */
  59. #define NLM_F_ATOMIC    0x400    /* atomic GET        */
  60. #define NLM_F_DUMP    (NLM_F_ROOT|NLM_F_MATCH)
  61.  
  62. /* Modifiers to NEW request */
  63. #define NLM_F_REPLACE    0x100    /* Override existing        */
  64. #define NLM_F_EXCL    0x200    /* Do not touch, if it exists    */
  65. #define NLM_F_CREATE    0x400    /* Create, if it does not exist    */
  66. #define NLM_F_APPEND    0x800    /* Add to end of list        */
  67.  
  68. /*
  69.    4.4BSD ADD        NLM_F_CREATE|NLM_F_EXCL
  70.    4.4BSD CHANGE    NLM_F_REPLACE
  71.  
  72.    True CHANGE        NLM_F_CREATE|NLM_F_REPLACE
  73.    Append        NLM_F_CREATE
  74.    Check        NLM_F_EXCL
  75.  */
  76.  
  77. #define NLMSG_ALIGNTO    4
  78. #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
  79. #define NLMSG_HDRLEN     ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
  80. #define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))
  81. #define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
  82. #define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
  83. #define NLMSG_NEXT(nlh,len)     ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
  84.                   (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
  85. #define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
  86.                (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
  87.                (nlh)->nlmsg_len <= (len))
  88. #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
  89.  
  90. #define NLMSG_NOOP        0x1    /* Nothing.        */
  91. #define NLMSG_ERROR        0x2    /* Error        */
  92. #define NLMSG_DONE        0x3    /* End of a dump    */
  93. #define NLMSG_OVERRUN        0x4    /* Data lost        */
  94.  
  95. #define NLMSG_MIN_TYPE        0x10    /* < 0x10: reserved control messages */
  96.  
  97. struct nlmsgerr
  98. {
  99.     int        error;
  100.     struct nlmsghdr msg;
  101. };
  102.  
  103. #define NETLINK_ADD_MEMBERSHIP    1
  104. #define NETLINK_DROP_MEMBERSHIP    2
  105. #define NETLINK_PKTINFO        3
  106.  
  107. struct nl_pktinfo
  108. {
  109.     __u32    group;
  110. };
  111.  
  112. #define NET_MAJOR 36        /* Major 36 is reserved for networking                         */
  113.  
  114. enum {
  115.     NETLINK_UNCONNECTED = 0,
  116.     NETLINK_CONNECTED,
  117. };
  118.  
  119. /*
  120.  *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
  121.  * +---------------------+- - -+- - - - - - - - - -+- - -+
  122.  * |        Header       | Pad |     Payload       | Pad |
  123.  * |   (struct nlattr)   | ing |                   | ing |
  124.  * +---------------------+- - -+- - - - - - - - - -+- - -+
  125.  *  <-------------- nlattr->nla_len -------------->
  126.  */
  127.  
  128. struct nlattr
  129. {
  130.     __u16           nla_len;
  131.     __u16           nla_type;
  132. };
  133.  
  134. /*
  135.  * nla_type (16 bits)
  136.  * +---+---+-------------------------------+
  137.  * | N | O | Attribute Type                |
  138.  * +---+---+-------------------------------+
  139.  * N := Carries nested attributes
  140.  * O := Payload stored in network byte order
  141.  *
  142.  * Note: The N and O flag are mutually exclusive.
  143.  */
  144. #define NLA_F_NESTED        (1 << 15)
  145. #define NLA_F_NET_BYTEORDER    (1 << 14)
  146. #define NLA_TYPE_MASK        ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
  147.  
  148. #define NLA_ALIGNTO        4
  149. #define NLA_ALIGN(len)        (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
  150. #define NLA_HDRLEN        ((int) NLA_ALIGN(sizeof(struct nlattr)))
  151.  
  152. #ifdef __KERNEL__
  153.  
  154. #include <linux/capability.h>
  155. #include <linux/skbuff.h>
  156.  
  157. static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb)
  158. {
  159.     return (struct nlmsghdr *)skb->data;
  160. }
  161.  
  162. struct netlink_skb_parms
  163. {
  164.     struct ucred        creds;        /* Skb credentials    */
  165.     __u32            pid;
  166.     __u32            dst_group;
  167.     kernel_cap_t        eff_cap;
  168.     __u32            loginuid;    /* Login (audit) uid */
  169.     __u32            sessionid;    /* Session id (audit) */
  170.     __u32            sid;        /* SELinux security id */
  171. };
  172.  
  173. #define NETLINK_CB(skb)        (*(struct netlink_skb_parms*)&((skb)->cb))
  174. #define NETLINK_CREDS(skb)    (&NETLINK_CB((skb)).creds)
  175.  
  176.  
  177. extern struct sock *netlink_kernel_create(struct net *net,
  178.                       int unit,unsigned int groups,
  179.                       void (*input)(struct sk_buff *skb),
  180.                       struct mutex *cb_mutex,
  181.                       struct module *module);
  182. extern void netlink_kernel_release(struct sock *sk);
  183. extern int netlink_change_ngroups(struct sock *sk, unsigned int groups);
  184. extern void netlink_clear_multicast_users(struct sock *sk, unsigned int group);
  185. extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);
  186. extern int netlink_has_listeners(struct sock *sk, unsigned int group);
  187. extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);
  188. extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,
  189.                  __u32 group, gfp_t allocation);
  190. extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code);
  191. extern int netlink_register_notifier(struct notifier_block *nb);
  192. extern int netlink_unregister_notifier(struct notifier_block *nb);
  193.  
  194. /* finegrained unicast helpers: */
  195. struct sock *netlink_getsockbyfilp(struct file *filp);
  196. int netlink_attachskb(struct sock *sk, struct sk_buff *skb,
  197.               long *timeo, struct sock *ssk);
  198. void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
  199. int netlink_sendskb(struct sock *sk, struct sk_buff *skb);
  200.  
  201. /*
  202.  *    skb should fit one page. This choice is good for headerless malloc.
  203.  *    But we should limit to 8K so that userspace does not have to
  204.  *    use enormous buffer sizes on recvmsg() calls just to avoid
  205.  *    MSG_TRUNC when PAGE_SIZE is very large.
  206.  */
  207. #if PAGE_SIZE < 8192UL
  208. #define NLMSG_GOODSIZE    SKB_WITH_OVERHEAD(PAGE_SIZE)
  209. #else
  210. #define NLMSG_GOODSIZE    SKB_WITH_OVERHEAD(8192UL)
  211. #endif
  212.  
  213. #define NLMSG_DEFAULT_SIZE (NLMSG_GOODSIZE - NLMSG_HDRLEN)
  214.  
  215.  
  216. struct netlink_callback
  217. {
  218.     struct sk_buff    *skb;
  219.     struct nlmsghdr    *nlh;
  220.     int        (*dump)(struct sk_buff * skb, struct netlink_callback *cb);
  221.     int        (*done)(struct netlink_callback *cb);
  222.     int        family;
  223.     long        args[6];
  224. };
  225.  
  226. struct netlink_notify
  227. {
  228.     struct net *net;
  229.     int pid;
  230.     int protocol;
  231. };
  232.  
  233. static __inline__ struct nlmsghdr *
  234. __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
  235. {
  236.     struct nlmsghdr *nlh;
  237.     int size = NLMSG_LENGTH(len);
  238.  
  239.     nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
  240.     nlh->nlmsg_type = type;
  241.     nlh->nlmsg_len = size;
  242.     nlh->nlmsg_flags = flags;
  243.     nlh->nlmsg_pid = pid;
  244.     nlh->nlmsg_seq = seq;
  245.     memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
  246.     return nlh;
  247. }
  248.  
  249. #define NLMSG_NEW(skb, pid, seq, type, len, flags) \
  250. ({    if (unlikely(skb_tailroom(skb) < (int)NLMSG_SPACE(len))) \
  251.         goto nlmsg_failure; \
  252.     __nlmsg_put(skb, pid, seq, type, len, flags); })
  253.  
  254. #define NLMSG_PUT(skb, pid, seq, type, len) \
  255.     NLMSG_NEW(skb, pid, seq, type, len, 0)
  256.  
  257. extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
  258.                   struct nlmsghdr *nlh,
  259.                   int (*dump)(struct sk_buff *skb, struct netlink_callback*),
  260.                   int (*done)(struct netlink_callback*));
  261.  
  262.  
  263. #define NL_NONROOT_RECV 0x1
  264. #define NL_NONROOT_SEND 0x2
  265. extern void netlink_set_nonroot(int protocol, unsigned flag);
  266.  
  267. #endif /* __KERNEL__ */
  268.  
  269. #endif    /* __LINUX_NETLINK_H */
  270.