linux/net/netfilter/xt_cpu.c
<<
>>
Prefs
   1/* Kernel module to match running CPU */
   2
   3/*
   4 * Might be used to distribute connections on several daemons, if
   5 * RPS (Remote Packet Steering) is enabled or NIC is multiqueue capable,
   6 * each RX queue IRQ affined to one CPU (1:1 mapping)
   7 *
   8 */
   9
  10/* (C) 2010 Eric Dumazet
  11 *
  12 * This program is free software; you can redistribute it and/or modify
  13 * it under the terms of the GNU General Public License version 2 as
  14 * published by the Free Software Foundation.
  15 */
  16
  17#include <linux/module.h>
  18#include <linux/skbuff.h>
  19#include <linux/netfilter/xt_cpu.h>
  20#include <linux/netfilter/x_tables.h>
  21
  22MODULE_LICENSE("GPL");
  23MODULE_AUTHOR("Eric Dumazet <eric.dumazet@gmail.com>");
  24MODULE_DESCRIPTION("Xtables: CPU match");
  25MODULE_ALIAS("ipt_cpu");
  26MODULE_ALIAS("ip6t_cpu");
  27
  28static int cpu_mt_check(const struct xt_mtchk_param *par)
  29{
  30        const struct xt_cpu_info *info = par->matchinfo;
  31
  32        if (info->invert & ~1)
  33                return -EINVAL;
  34        return 0;
  35}
  36
  37static bool cpu_mt(const struct sk_buff *skb, struct xt_action_param *par)
  38{
  39        const struct xt_cpu_info *info = par->matchinfo;
  40
  41        return (info->cpu == smp_processor_id()) ^ info->invert;
  42}
  43
  44static struct xt_match cpu_mt_reg __read_mostly = {
  45        .name       = "cpu",
  46        .revision   = 0,
  47        .family     = NFPROTO_UNSPEC,
  48        .checkentry = cpu_mt_check,
  49        .match      = cpu_mt,
  50        .matchsize  = sizeof(struct xt_cpu_info),
  51        .me         = THIS_MODULE,
  52};
  53
  54static int __init cpu_mt_init(void)
  55{
  56        return xt_register_match(&cpu_mt_reg);
  57}
  58
  59static void __exit cpu_mt_exit(void)
  60{
  61        xt_unregister_match(&cpu_mt_reg);
  62}
  63
  64module_init(cpu_mt_init);
  65module_exit(cpu_mt_exit);
  66