home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / netlink.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.4 KB  |  242 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_W1        1    /* 1-wire subsystem                */
  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.  
  25. #define MAX_LINKS 32        
  26.  
  27. struct sockaddr_nl
  28. {
  29.     sa_family_t    nl_family;    /* AF_NETLINK    */
  30.     unsigned short    nl_pad;        /* zero        */
  31.     __u32        nl_pid;        /* process pid    */
  32.            __u32        nl_groups;    /* multicast groups mask */
  33. };
  34.  
  35. struct nlmsghdr
  36. {
  37.     __u32        nlmsg_len;    /* Length of message including header */
  38.     __u16        nlmsg_type;    /* Message content */
  39.     __u16        nlmsg_flags;    /* Additional flags */
  40.     __u32        nlmsg_seq;    /* Sequence number */
  41.     __u32        nlmsg_pid;    /* Sending process PID */
  42. };
  43.  
  44. /* Flags values */
  45.  
  46. #define NLM_F_REQUEST        1    /* It is request message.     */
  47. #define NLM_F_MULTI        2    /* Multipart message, terminated by NLMSG_DONE */
  48. #define NLM_F_ACK        4    /* Reply with ack, with zero or error code */
  49. #define NLM_F_ECHO        8    /* Echo this request         */
  50.  
  51. /* Modifiers to GET request */
  52. #define NLM_F_ROOT    0x100    /* specify tree    root    */
  53. #define NLM_F_MATCH    0x200    /* return all matching    */
  54. #define NLM_F_ATOMIC    0x400    /* atomic GET        */
  55. #define NLM_F_DUMP    (NLM_F_ROOT|NLM_F_MATCH)
  56.  
  57. /* Modifiers to NEW request */
  58. #define NLM_F_REPLACE    0x100    /* Override existing        */
  59. #define NLM_F_EXCL    0x200    /* Do not touch, if it exists    */
  60. #define NLM_F_CREATE    0x400    /* Create, if it does not exist    */
  61. #define NLM_F_APPEND    0x800    /* Add to end of list        */
  62.  
  63. /*
  64.    4.4BSD ADD        NLM_F_CREATE|NLM_F_EXCL
  65.    4.4BSD CHANGE    NLM_F_REPLACE
  66.  
  67.    True CHANGE        NLM_F_CREATE|NLM_F_REPLACE
  68.    Append        NLM_F_CREATE
  69.    Check        NLM_F_EXCL
  70.  */
  71.  
  72. #define NLMSG_ALIGNTO    4
  73. #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
  74. #define NLMSG_HDRLEN     ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
  75. #define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))
  76. #define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
  77. #define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
  78. #define NLMSG_NEXT(nlh,len)     ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \
  79.                   (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
  80. #define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \
  81.                (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
  82.                (nlh)->nlmsg_len <= (len))
  83. #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
  84.  
  85. #define NLMSG_NOOP        0x1    /* Nothing.        */
  86. #define NLMSG_ERROR        0x2    /* Error        */
  87. #define NLMSG_DONE        0x3    /* End of a dump    */
  88. #define NLMSG_OVERRUN        0x4    /* Data lost        */
  89.  
  90. #define NLMSG_MIN_TYPE        0x10    /* < 0x10: reserved control messages */
  91.  
  92. struct nlmsgerr
  93. {
  94.     int        error;
  95.     struct nlmsghdr msg;
  96. };
  97.  
  98. #define NETLINK_ADD_MEMBERSHIP    1
  99. #define NETLINK_DROP_MEMBERSHIP    2
  100. #define NETLINK_PKTINFO        3
  101.  
  102. struct nl_pktinfo
  103. {
  104.     __u32    group;
  105. };
  106.  
  107. #define NET_MAJOR 36        /* Major 36 is reserved for networking                         */
  108.  
  109. enum {
  110.     NETLINK_UNCONNECTED = 0,
  111.     NETLINK_CONNECTED,
  112. };
  113.  
  114. /*
  115.  *  <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
  116.  * +---------------------+- - -+- - - - - - - - - -+- - -+
  117.  * |        Header       | Pad |     Payload       | Pad |
  118.  * |   (struct nlattr)   | ing |                   | ing |
  119.  * +---------------------+- - -+- - - - - - - - - -+- - -+
  120.  *  <-------------- nlattr->nla_len -------------->
  121.  */
  122.  
  123. struct nlattr
  124. {
  125.     __u16           nla_len;
  126.     __u16           nla_type;
  127. };
  128.  
  129. #define NLA_ALIGNTO        4
  130. #define NLA_ALIGN(len)        (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
  131. #define NLA_HDRLEN        ((int) NLA_ALIGN(sizeof(struct nlattr)))
  132.  
  133. #ifdef __KERNEL__
  134.  
  135. #include <linux/capability.h>
  136. #include <linux/skbuff.h>
  137.  
  138. struct netlink_skb_parms
  139. {
  140.     struct ucred        creds;        /* Skb credentials    */
  141.     __u32            pid;
  142.     __u32            dst_pid;
  143.     __u32            dst_group;
  144.     kernel_cap_t        eff_cap;
  145.     __u32            loginuid;    /* Login (audit) uid */
  146.     __u32            sid;        /* SELinux security id */
  147. };
  148.  
  149. #define NETLINK_CB(skb)        (*(struct netlink_skb_parms*)&((skb)->cb))
  150. #define NETLINK_CREDS(skb)    (&NETLINK_CB((skb)).creds)
  151.  
  152.  
  153. extern struct sock *netlink_kernel_create(int unit, unsigned int groups, void (*input)(struct sock *sk, int len), struct module *module);
  154. extern void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err);
  155. extern int netlink_has_listeners(struct sock *sk, unsigned int group);
  156. extern int netlink_unicast(struct sock *ssk, struct sk_buff *skb, __u32 pid, int nonblock);
  157. extern int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, __u32 pid,
  158.                  __u32 group, gfp_t allocation);
  159. extern void netlink_set_err(struct sock *ssk, __u32 pid, __u32 group, int code);
  160. extern int netlink_register_notifier(struct notifier_block *nb);
  161. extern int netlink_unregister_notifier(struct notifier_block *nb);
  162.  
  163. /* finegrained unicast helpers: */
  164. struct sock *netlink_getsockbyfilp(struct file *filp);
  165. int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
  166.         long timeo, struct sock *ssk);
  167. void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
  168. int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol);
  169.  
  170. /*
  171.  *    skb should fit one page. This choice is good for headerless malloc.
  172.  */
  173. #define NLMSG_GOODORDER 0
  174. #define NLMSG_GOODSIZE (SKB_MAX_ORDER(0, NLMSG_GOODORDER))
  175.  
  176.  
  177. struct netlink_callback
  178. {
  179.     struct sk_buff    *skb;
  180.     struct nlmsghdr    *nlh;
  181.     int        (*dump)(struct sk_buff * skb, struct netlink_callback *cb);
  182.     int        (*done)(struct netlink_callback *cb);
  183.     int        family;
  184.     long        args[5];
  185. };
  186.  
  187. struct netlink_notify
  188. {
  189.     int pid;
  190.     int protocol;
  191. };
  192.  
  193. static __inline__ struct nlmsghdr *
  194. __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags)
  195. {
  196.     struct nlmsghdr *nlh;
  197.     int size = NLMSG_LENGTH(len);
  198.  
  199.     nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size));
  200.     nlh->nlmsg_type = type;
  201.     nlh->nlmsg_len = size;
  202.     nlh->nlmsg_flags = flags;
  203.     nlh->nlmsg_pid = pid;
  204.     nlh->nlmsg_seq = seq;
  205.     memset(NLMSG_DATA(nlh) + len, 0, NLMSG_ALIGN(size) - size);
  206.     return nlh;
  207. }
  208.  
  209. #define NLMSG_NEW(skb, pid, seq, type, len, flags) \
  210. ({    if (skb_tailroom(skb) < (int)NLMSG_SPACE(len)) \
  211.         goto nlmsg_failure; \
  212.     __nlmsg_put(skb, pid, seq, type, len, flags); })
  213.  
  214. #define NLMSG_PUT(skb, pid, seq, type, len) \
  215.     NLMSG_NEW(skb, pid, seq, type, len, 0)
  216.  
  217. #define NLMSG_NEW_ANSWER(skb, cb, type, len, flags) \
  218.     NLMSG_NEW(skb, NETLINK_CB((cb)->skb).pid, \
  219.           (cb)->nlh->nlmsg_seq, type, len, flags)
  220.  
  221. #define NLMSG_END(skb, nlh) \
  222. ({    (nlh)->nlmsg_len = (skb)->tail - (unsigned char *) (nlh); \
  223.     (skb)->len; })
  224.  
  225. #define NLMSG_CANCEL(skb, nlh) \
  226. ({    skb_trim(skb, (unsigned char *) (nlh) - (skb)->data); \
  227.     -1; })
  228.  
  229. extern int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
  230.                   struct nlmsghdr *nlh,
  231.                   int (*dump)(struct sk_buff *skb, struct netlink_callback*),
  232.                   int (*done)(struct netlink_callback*));
  233.  
  234.  
  235. #define NL_NONROOT_RECV 0x1
  236. #define NL_NONROOT_SEND 0x2
  237. extern void netlink_set_nonroot(int protocol, unsigned flag);
  238.  
  239. #endif /* __KERNEL__ */
  240.  
  241. #endif    /* __LINUX_NETLINK_H */
  242.