nf_queue.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #include <linux/kernel.h>
  2. #include <linux/slab.h>
  3. #include <linux/init.h>
  4. #include <linux/module.h>
  5. #include <linux/proc_fs.h>
  6. #include <linux/skbuff.h>
  7. #include <linux/netfilter.h>
  8. #include <linux/seq_file.h>
  9. #include <linux/rcupdate.h>
  10. #include <net/protocol.h>
  11. #include <net/netfilter/nf_queue.h>
  12. #include <net/dst.h>
  13. #include "nf_internals.h"
  14. /*
  15. * A queue handler may be registered for each protocol. Each is protected by
  16. * long term mutex. The handler must provide an an outfn() to accept packets
  17. * for queueing and must reinject all packets it receives, no matter what.
  18. */
  19. static const struct nf_queue_handler __rcu *queue_handler[NFPROTO_NUMPROTO] __read_mostly;
  20. static DEFINE_MUTEX(queue_handler_mutex);
  21. /* return EBUSY when somebody else is registered, return EEXIST if the
  22. * same handler is registered, return 0 in case of success. */
  23. int nf_register_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh)
  24. {
  25. int ret;
  26. const struct nf_queue_handler *old;
  27. if (pf >= ARRAY_SIZE(queue_handler))
  28. return -EINVAL;
  29. mutex_lock(&queue_handler_mutex);
  30. old = rcu_dereference_protected(queue_handler[pf],
  31. lockdep_is_held(&queue_handler_mutex));
  32. if (old == qh)
  33. ret = -EEXIST;
  34. else if (old)
  35. ret = -EBUSY;
  36. else {
  37. rcu_assign_pointer(queue_handler[pf], qh);
  38. ret = 0;
  39. }
  40. mutex_unlock(&queue_handler_mutex);
  41. return ret;
  42. }
  43. EXPORT_SYMBOL(nf_register_queue_handler);
  44. /* The caller must flush their queue before this */
  45. int nf_unregister_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh)
  46. {
  47. const struct nf_queue_handler *old;
  48. if (pf >= ARRAY_SIZE(queue_handler))
  49. return -EINVAL;
  50. mutex_lock(&queue_handler_mutex);
  51. old = rcu_dereference_protected(queue_handler[pf],
  52. lockdep_is_held(&queue_handler_mutex));
  53. if (old && old != qh) {
  54. mutex_unlock(&queue_handler_mutex);
  55. return -EINVAL;
  56. }
  57. rcu_assign_pointer(queue_handler[pf], NULL);
  58. mutex_unlock(&queue_handler_mutex);
  59. synchronize_rcu();
  60. return 0;
  61. }
  62. EXPORT_SYMBOL(nf_unregister_queue_handler);
  63. void nf_unregister_queue_handlers(const struct nf_queue_handler *qh)
  64. {
  65. u_int8_t pf;
  66. mutex_lock(&queue_handler_mutex);
  67. for (pf = 0; pf < ARRAY_SIZE(queue_handler); pf++) {
  68. if (rcu_dereference_protected(
  69. queue_handler[pf],
  70. lockdep_is_held(&queue_handler_mutex)
  71. ) == qh)
  72. rcu_assign_pointer(queue_handler[pf], NULL);
  73. }
  74. mutex_unlock(&queue_handler_mutex);
  75. synchronize_rcu();
  76. }
  77. EXPORT_SYMBOL_GPL(nf_unregister_queue_handlers);
  78. static void nf_queue_entry_release_refs(struct nf_queue_entry *entry)
  79. {
  80. /* Release those devices we held, or Alexey will kill me. */
  81. if (entry->indev)
  82. dev_put(entry->indev);
  83. if (entry->outdev)
  84. dev_put(entry->outdev);
  85. #ifdef CONFIG_BRIDGE_NETFILTER
  86. if (entry->skb->nf_bridge) {
  87. struct nf_bridge_info *nf_bridge = entry->skb->nf_bridge;
  88. if (nf_bridge->physindev)
  89. dev_put(nf_bridge->physindev);
  90. if (nf_bridge->physoutdev)
  91. dev_put(nf_bridge->physoutdev);
  92. }
  93. #endif
  94. /* Drop reference to owner of hook which queued us. */
  95. module_put(entry->elem->owner);
  96. }
  97. /*
  98. * Any packet that leaves via this function must come back
  99. * through nf_reinject().
  100. */
  101. static int __nf_queue(struct sk_buff *skb,
  102. struct list_head *elem,
  103. u_int8_t pf, unsigned int hook,
  104. struct net_device *indev,
  105. struct net_device *outdev,
  106. int (*okfn)(struct sk_buff *),
  107. unsigned int queuenum)
  108. {
  109. int status = -ENOENT;
  110. struct nf_queue_entry *entry = NULL;
  111. #ifdef CONFIG_BRIDGE_NETFILTER
  112. struct net_device *physindev;
  113. struct net_device *physoutdev;
  114. #endif
  115. const struct nf_afinfo *afinfo;
  116. const struct nf_queue_handler *qh;
  117. /* QUEUE == DROP if no one is waiting, to be safe. */
  118. rcu_read_lock();
  119. qh = rcu_dereference(queue_handler[pf]);
  120. if (!qh) {
  121. status = -ESRCH;
  122. goto err_unlock;
  123. }
  124. afinfo = nf_get_afinfo(pf);
  125. if (!afinfo)
  126. goto err_unlock;
  127. entry = kmalloc(sizeof(*entry) + afinfo->route_key_size, GFP_ATOMIC);
  128. if (!entry) {
  129. status = -ENOMEM;
  130. goto err_unlock;
  131. }
  132. *entry = (struct nf_queue_entry) {
  133. .skb = skb,
  134. .elem = list_entry(elem, struct nf_hook_ops, list),
  135. .pf = pf,
  136. .hook = hook,
  137. .indev = indev,
  138. .outdev = outdev,
  139. .okfn = okfn,
  140. };
  141. /* If it's going away, ignore hook. */
  142. if (!try_module_get(entry->elem->owner)) {
  143. status = -ECANCELED;
  144. goto err_unlock;
  145. }
  146. /* Bump dev refs so they don't vanish while packet is out */
  147. if (indev)
  148. dev_hold(indev);
  149. if (outdev)
  150. dev_hold(outdev);
  151. #ifdef CONFIG_BRIDGE_NETFILTER
  152. if (skb->nf_bridge) {
  153. physindev = skb->nf_bridge->physindev;
  154. if (physindev)
  155. dev_hold(physindev);
  156. physoutdev = skb->nf_bridge->physoutdev;
  157. if (physoutdev)
  158. dev_hold(physoutdev);
  159. }
  160. #endif
  161. skb_dst_force(skb);
  162. afinfo->saveroute(skb, entry);
  163. status = qh->outfn(entry, queuenum);
  164. rcu_read_unlock();
  165. if (status < 0) {
  166. nf_queue_entry_release_refs(entry);
  167. goto err;
  168. }
  169. return 0;
  170. err_unlock:
  171. rcu_read_unlock();
  172. err:
  173. kfree(entry);
  174. return status;
  175. }
  176. int nf_queue(struct sk_buff *skb,
  177. struct list_head *elem,
  178. u_int8_t pf, unsigned int hook,
  179. struct net_device *indev,
  180. struct net_device *outdev,
  181. int (*okfn)(struct sk_buff *),
  182. unsigned int queuenum)
  183. {
  184. struct sk_buff *segs;
  185. int err;
  186. unsigned int queued;
  187. if (!skb_is_gso(skb))
  188. return __nf_queue(skb, elem, pf, hook, indev, outdev, okfn,
  189. queuenum);
  190. switch (pf) {
  191. case NFPROTO_IPV4:
  192. skb->protocol = htons(ETH_P_IP);
  193. break;
  194. case NFPROTO_IPV6:
  195. skb->protocol = htons(ETH_P_IPV6);
  196. break;
  197. }
  198. segs = skb_gso_segment(skb, 0);
  199. /* Does not use PTR_ERR to limit the number of error codes that can be
  200. * returned by nf_queue. For instance, callers rely on -ECANCELED to mean
  201. * 'ignore this hook'.
  202. */
  203. if (IS_ERR(segs))
  204. return -EINVAL;
  205. queued = 0;
  206. err = 0;
  207. do {
  208. struct sk_buff *nskb = segs->next;
  209. segs->next = NULL;
  210. if (err == 0)
  211. err = __nf_queue(segs, elem, pf, hook, indev,
  212. outdev, okfn, queuenum);
  213. if (err == 0)
  214. queued++;
  215. else
  216. kfree_skb(segs);
  217. segs = nskb;
  218. } while (segs);
  219. /* also free orig skb if only some segments were queued */
  220. if (unlikely(err && queued))
  221. err = 0;
  222. if (err == 0)
  223. kfree_skb(skb);
  224. return err;
  225. }
  226. void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
  227. {
  228. struct sk_buff *skb = entry->skb;
  229. struct list_head *elem = &entry->elem->list;
  230. const struct nf_afinfo *afinfo;
  231. int err;
  232. rcu_read_lock();
  233. nf_queue_entry_release_refs(entry);
  234. /* Continue traversal iff userspace said ok... */
  235. if (verdict == NF_REPEAT) {
  236. elem = elem->prev;
  237. verdict = NF_ACCEPT;
  238. }
  239. if (verdict == NF_ACCEPT) {
  240. afinfo = nf_get_afinfo(entry->pf);
  241. if (!afinfo || afinfo->reroute(skb, entry) < 0)
  242. verdict = NF_DROP;
  243. }
  244. if (verdict == NF_ACCEPT) {
  245. next_hook:
  246. verdict = nf_iterate(&nf_hooks[entry->pf][entry->hook],
  247. skb, entry->hook,
  248. entry->indev, entry->outdev, &elem,
  249. entry->okfn, INT_MIN);
  250. }
  251. switch (verdict & NF_VERDICT_MASK) {
  252. case NF_ACCEPT:
  253. case NF_STOP:
  254. local_bh_disable();
  255. entry->okfn(skb);
  256. local_bh_enable();
  257. break;
  258. case NF_QUEUE:
  259. err = __nf_queue(skb, elem, entry->pf, entry->hook,
  260. entry->indev, entry->outdev, entry->okfn,
  261. verdict >> NF_VERDICT_QBITS);
  262. if (err < 0) {
  263. if (err == -ECANCELED)
  264. goto next_hook;
  265. if (err == -ESRCH &&
  266. (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS))
  267. goto next_hook;
  268. kfree_skb(skb);
  269. }
  270. break;
  271. case NF_STOLEN:
  272. default:
  273. kfree_skb(skb);
  274. }
  275. rcu_read_unlock();
  276. kfree(entry);
  277. }
  278. EXPORT_SYMBOL(nf_reinject);
  279. #ifdef CONFIG_PROC_FS
  280. static void *seq_start(struct seq_file *seq, loff_t *pos)
  281. {
  282. if (*pos >= ARRAY_SIZE(queue_handler))
  283. return NULL;
  284. return pos;
  285. }
  286. static void *seq_next(struct seq_file *s, void *v, loff_t *pos)
  287. {
  288. (*pos)++;
  289. if (*pos >= ARRAY_SIZE(queue_handler))
  290. return NULL;
  291. return pos;
  292. }
  293. static void seq_stop(struct seq_file *s, void *v)
  294. {
  295. }
  296. static int seq_show(struct seq_file *s, void *v)
  297. {
  298. int ret;
  299. loff_t *pos = v;
  300. const struct nf_queue_handler *qh;
  301. rcu_read_lock();
  302. qh = rcu_dereference(queue_handler[*pos]);
  303. if (!qh)
  304. ret = seq_printf(s, "%2lld NONE\n", *pos);
  305. else
  306. ret = seq_printf(s, "%2lld %s\n", *pos, qh->name);
  307. rcu_read_unlock();
  308. return ret;
  309. }
  310. static const struct seq_operations nfqueue_seq_ops = {
  311. .start = seq_start,
  312. .next = seq_next,
  313. .stop = seq_stop,
  314. .show = seq_show,
  315. };
  316. static int nfqueue_open(struct inode *inode, struct file *file)
  317. {
  318. return seq_open(file, &nfqueue_seq_ops);
  319. }
  320. static const struct file_operations nfqueue_file_ops = {
  321. .owner = THIS_MODULE,
  322. .open = nfqueue_open,
  323. .read = seq_read,
  324. .llseek = seq_lseek,
  325. .release = seq_release,
  326. };
  327. #endif /* PROC_FS */
  328. int __init netfilter_queue_init(void)
  329. {
  330. #ifdef CONFIG_PROC_FS
  331. if (!proc_create("nf_queue", S_IRUGO,
  332. proc_net_netfilter, &nfqueue_file_ops))
  333. return -1;
  334. #endif
  335. return 0;
  336. }