nfnetlink.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _NFNETLINK_H
  2. #define _NFNETLINK_H
  3. #include <linux/types.h>
  4. #ifndef __KERNEL__
  5. /* nfnetlink groups: Up to 32 maximum - backwards compatibility for userspace */
  6. #define NF_NETLINK_CONNTRACK_NEW  0x00000001
  7. #define NF_NETLINK_CONNTRACK_UPDATE 0x00000002
  8. #define NF_NETLINK_CONNTRACK_DESTROY 0x00000004
  9. #define NF_NETLINK_CONNTRACK_EXP_NEW 0x00000008
  10. #define NF_NETLINK_CONNTRACK_EXP_UPDATE 0x00000010
  11. #define NF_NETLINK_CONNTRACK_EXP_DESTROY 0x00000020
  12. #endif
  13. enum nfnetlink_groups {
  14. NFNLGRP_NONE,
  15. #define NFNLGRP_NONE NFNLGRP_NONE
  16. NFNLGRP_CONNTRACK_NEW,
  17. #define NFNLGRP_CONNTRACK_NEW NFNLGRP_CONNTRACK_NEW
  18. NFNLGRP_CONNTRACK_UPDATE,
  19. #define NFNLGRP_CONNTRACK_UPDATE NFNLGRP_CONNTRACK_UPDATE
  20. NFNLGRP_CONNTRACK_DESTROY,
  21. #define NFNLGRP_CONNTRACK_DESTROY NFNLGRP_CONNTRACK_DESTROY
  22. NFNLGRP_CONNTRACK_EXP_NEW,
  23. #define NFNLGRP_CONNTRACK_EXP_NEW NFNLGRP_CONNTRACK_EXP_NEW
  24. NFNLGRP_CONNTRACK_EXP_UPDATE,
  25. #define NFNLGRP_CONNTRACK_EXP_UPDATE NFNLGRP_CONNTRACK_EXP_UPDATE
  26. NFNLGRP_CONNTRACK_EXP_DESTROY,
  27. #define NFNLGRP_CONNTRACK_EXP_DESTROY NFNLGRP_CONNTRACK_EXP_DESTROY
  28. __NFNLGRP_MAX,
  29. };
  30. #define NFNLGRP_MAX (__NFNLGRP_MAX - 1)
  31. /* Generic structure for encapsulation optional netfilter information.
  32.  * It is reminiscent of sockaddr, but with sa_family replaced
  33.  * with attribute type. 
  34.  * ! This should someday be put somewhere generic as now rtnetlink and
  35.  * ! nfnetlink use the same attributes methods. - J. Schulist.
  36.  */
  37. struct nfattr
  38. {
  39. u_int16_t nfa_len;
  40. u_int16_t nfa_type; /* we use 15 bits for the type, and the highest
  41.  * bit to indicate whether the payload is nested */
  42. } __attribute__ ((packed));
  43. /* FIXME: Apart from NFNL_NFA_NESTED shamelessly copy and pasted from
  44.  * rtnetlink.h, it's time to put this in a generic file */
  45. #define NFNL_NFA_NEST 0x8000
  46. #define NFA_TYPE(attr)  ((attr)->nfa_type & 0x7fff)
  47. #define NFA_ALIGNTO     4
  48. #define NFA_ALIGN(len) (((len) + NFA_ALIGNTO - 1) & ~(NFA_ALIGNTO - 1))
  49. #define NFA_OK(nfa,len) ((len) > 0 && (nfa)->nfa_len >= sizeof(struct nfattr) 
  50. && (nfa)->nfa_len <= (len))
  51. #define NFA_NEXT(nfa,attrlen) ((attrlen) -= NFA_ALIGN((nfa)->nfa_len), 
  52. (struct nfattr *)(((char *)(nfa)) + NFA_ALIGN((nfa)->nfa_len)))
  53. #define NFA_LENGTH(len) (NFA_ALIGN(sizeof(struct nfattr)) + (len))
  54. #define NFA_SPACE(len) NFA_ALIGN(NFA_LENGTH(len))
  55. #define NFA_DATA(nfa)   ((void *)(((char *)(nfa)) + NFA_LENGTH(0)))
  56. #define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0))
  57. #define NFA_NEST(skb, type) 
  58. ({ struct nfattr *__start = (struct nfattr *) (skb)->tail; 
  59. NFA_PUT(skb, (NFNL_NFA_NEST | type), 0, NULL); 
  60. __start;  })
  61. #define NFA_NEST_END(skb, start) 
  62. ({      (start)->nfa_len = ((skb)->tail - (unsigned char *) (start)); 
  63.         (skb)->len; })
  64. #define NFA_NEST_CANCEL(skb, start) 
  65. ({      if (start) 
  66.                 skb_trim(skb, (unsigned char *) (start) - (skb)->data); 
  67.         -1; })
  68. /* General form of address family dependent message.
  69.  */
  70. struct nfgenmsg {
  71. u_int8_t  nfgen_family; /* AF_xxx */
  72. u_int8_t  version; /* nfnetlink version */
  73. u_int16_t res_id; /* resource id */
  74. } __attribute__ ((packed));
  75. #define NFNETLINK_V0 0
  76. #define NFM_NFA(n)      ((struct nfattr *)(((char *)(n)) 
  77.         + NLMSG_ALIGN(sizeof(struct nfgenmsg))))
  78. #define NFM_PAYLOAD(n)  NLMSG_PAYLOAD(n, sizeof(struct nfgenmsg))
  79. /* netfilter netlink message types are split in two pieces:
  80.  * 8 bit subsystem, 8bit operation.
  81.  */
  82. #define NFNL_SUBSYS_ID(x) ((x & 0xff00) >> 8)
  83. #define NFNL_MSG_TYPE(x) (x & 0x00ff)
  84. /* No enum here, otherwise __stringify() trick of MODULE_ALIAS_NFNL_SUBSYS()
  85.  * won't work anymore */
  86. #define NFNL_SUBSYS_NONE  0
  87. #define NFNL_SUBSYS_CTNETLINK 1
  88. #define NFNL_SUBSYS_CTNETLINK_EXP 2
  89. #define NFNL_SUBSYS_QUEUE 3
  90. #define NFNL_SUBSYS_ULOG 4
  91. #define NFNL_SUBSYS_COUNT 5
  92. #ifdef __KERNEL__
  93. #include <linux/netlink.h>
  94. #include <linux/capability.h>
  95. struct nfnl_callback
  96. {
  97. int (*call)(struct sock *nl, struct sk_buff *skb, 
  98. struct nlmsghdr *nlh, struct nfattr *cda[], int *errp);
  99. kernel_cap_t cap_required; /* capabilities required for this msg */
  100. u_int16_t attr_count; /* number of nfattr's */
  101. };
  102. struct nfnetlink_subsystem
  103. {
  104. const char *name;
  105. __u8 subsys_id; /* nfnetlink subsystem ID */
  106. __u8 cb_count; /* number of callbacks */
  107. struct nfnl_callback *cb; /* callback for individual types */
  108. };
  109. extern void __nfa_fill(struct sk_buff *skb, int attrtype,
  110.         int attrlen, const void *data);
  111. #define NFA_PUT(skb, attrtype, attrlen, data) 
  112. ({ if (skb_tailroom(skb) < (int)NFA_SPACE(attrlen)) goto nfattr_failure; 
  113.    __nfa_fill(skb, attrtype, attrlen, data); })
  114. extern struct semaphore nfnl_sem;
  115. #define nfnl_shlock() down(&nfnl_sem)
  116. #define nfnl_shlock_nowait() down_trylock(&nfnl_sem)
  117. #define nfnl_shunlock() do { up(&nfnl_sem); 
  118.      if(nfnl && nfnl->sk_receive_queue.qlen) 
  119.     nfnl->sk_data_ready(nfnl, 0); 
  120.                          } while(0)
  121. extern void nfnl_lock(void);
  122. extern void nfnl_unlock(void);
  123. extern int nfnetlink_subsys_register(struct nfnetlink_subsystem *n);
  124. extern int nfnetlink_subsys_unregister(struct nfnetlink_subsystem *n);
  125. extern int nfattr_parse(struct nfattr *tb[], int maxattr, 
  126. struct nfattr *nfa, int len);
  127. #define nfattr_parse_nested(tb, max, nfa) 
  128. nfattr_parse((tb), (max), NFA_DATA((nfa)), NFA_PAYLOAD((nfa)))
  129. #define nfattr_bad_size(tb, max, cta_min)
  130. ({ int __i, __res = 0;
  131.   for (__i=0; __i<max; __i++) 
  132.   if (tb[__i] && NFA_PAYLOAD(tb[__i]) < cta_min[__i]){
  133.   __res = 1;
  134.   break;
  135.   }
  136.   __res;
  137. })
  138. extern int nfnetlink_send(struct sk_buff *skb, u32 pid, unsigned group, 
  139.   int echo);
  140. extern int nfnetlink_unicast(struct sk_buff *skb, u_int32_t pid, int flags);
  141. #define MODULE_ALIAS_NFNL_SUBSYS(subsys) 
  142. MODULE_ALIAS("nfnetlink-subsys-" __stringify(subsys))
  143. #endif /* __KERNEL__ */
  144. #endif /* _NFNETLINK_H */