source: trunk/target/linux/generic/patches-2.6.37/621-sched_act_connmark.patch @ 27457

Last change on this file since 27457 was 27457, checked in by florian, 5 years ago

[kernel] sched_connmark depends on NF_CONNTRACK_MARK (#8976, #9423)

File size: 4.7 KB
  • new file net/sched/act_connmark.c

    - +  
     1/* 
     2 * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org> 
     3 * 
     4 * This program is free software; you can redistribute it and/or modify it 
     5 * under the terms and conditions of the GNU General Public License, 
     6 * version 2, as published by the Free Software Foundation. 
     7 * 
     8 * This program is distributed in the hope it will be useful, but WITHOUT 
     9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
     10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
     11 * more details. 
     12 * 
     13 * You should have received a copy of the GNU General Public License along with 
     14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
     15 * Place - Suite 330, Boston, MA 02111-1307 USA. 
     16 */ 
     17 
     18#include <linux/module.h> 
     19#include <linux/init.h> 
     20#include <linux/kernel.h> 
     21#include <linux/skbuff.h> 
     22#include <linux/rtnetlink.h> 
     23#include <linux/pkt_cls.h> 
     24#include <linux/ip.h> 
     25#include <linux/ipv6.h> 
     26#include <net/netlink.h> 
     27#include <net/pkt_sched.h> 
     28#include <net/act_api.h> 
     29 
     30#include <net/netfilter/nf_conntrack.h> 
     31#include <net/netfilter/nf_conntrack_core.h> 
     32 
     33#define TCA_ACT_CONNMARK        20 
     34 
     35#define CONNMARK_TAB_MASK     3 
     36static struct tcf_common *tcf_connmark_ht[CONNMARK_TAB_MASK + 1]; 
     37static u32 connmark_idx_gen; 
     38static DEFINE_RWLOCK(connmark_lock); 
     39 
     40static struct tcf_hashinfo connmark_hash_info = { 
     41        .htab   =       tcf_connmark_ht, 
     42        .hmask  =       CONNMARK_TAB_MASK, 
     43        .lock   =       &connmark_lock, 
     44}; 
     45 
     46static int tcf_connmark(struct sk_buff *skb, struct tc_action *a, 
     47                       struct tcf_result *res) 
     48{ 
     49        struct nf_conn *c; 
     50        enum ip_conntrack_info ctinfo; 
     51        int proto; 
     52        int r; 
     53 
     54        if (skb->protocol == htons(ETH_P_IP)) { 
     55                if (skb->len < sizeof(struct iphdr)) 
     56                        goto out; 
     57                proto = PF_INET; 
     58        } else if (skb->protocol == htons(ETH_P_IPV6)) { 
     59                if (skb->len < sizeof(struct ipv6hdr)) 
     60                        goto out; 
     61                proto = PF_INET6; 
     62        } else 
     63                goto out; 
     64 
     65        r = nf_conntrack_in(dev_net(skb->dev), proto, NF_INET_PRE_ROUTING, skb); 
     66        if (r != NF_ACCEPT) 
     67                goto out; 
     68 
     69        c = nf_ct_get(skb, &ctinfo); 
     70        if (!c) 
     71                goto out; 
     72 
     73        skb->mark = c->mark; 
     74        nf_conntrack_put(skb->nfct); 
     75        skb->nfct = NULL; 
     76 
     77out: 
     78        return TC_ACT_PIPE; 
     79} 
     80 
     81static int tcf_connmark_init(struct nlattr *nla, struct nlattr *est, 
     82                         struct tc_action *a, int ovr, int bind) 
     83{ 
     84        struct tcf_common *pc; 
     85 
     86        pc = tcf_hash_create(0, est, a, sizeof(*pc), bind, 
     87                             &connmark_idx_gen, &connmark_hash_info); 
     88        if (IS_ERR(pc)) 
     89            return PTR_ERR(pc); 
     90 
     91        tcf_hash_insert(pc, &connmark_hash_info); 
     92 
     93        return ACT_P_CREATED; 
     94} 
     95 
     96static inline int tcf_connmark_cleanup(struct tc_action *a, int bind) 
     97{ 
     98        if (a->priv) 
     99                return tcf_hash_release(a->priv, bind, &connmark_hash_info); 
     100        return 0; 
     101} 
     102 
     103static inline int tcf_connmark_dump(struct sk_buff *skb, struct tc_action *a, 
     104                                int bind, int ref) 
     105{ 
     106        return skb->len; 
     107} 
     108 
     109static struct tc_action_ops act_connmark_ops = { 
     110        .kind           =       "connmark", 
     111        .hinfo          =       &connmark_hash_info, 
     112        .type           =       TCA_ACT_CONNMARK, 
     113        .capab          =       TCA_CAP_NONE, 
     114        .owner          =       THIS_MODULE, 
     115        .act            =       tcf_connmark, 
     116        .dump           =       tcf_connmark_dump, 
     117        .cleanup        =       tcf_connmark_cleanup, 
     118        .init           =       tcf_connmark_init, 
     119        .walk           =       tcf_generic_walker, 
     120}; 
     121 
     122MODULE_AUTHOR("Felix Fietkau <nbd@openwrt.org>"); 
     123MODULE_DESCRIPTION("Connection tracking mark restoring"); 
     124MODULE_LICENSE("GPL"); 
     125 
     126static int __init connmark_init_module(void) 
     127{ 
     128        return tcf_register_action(&act_connmark_ops); 
     129} 
     130 
     131static void __exit connmark_cleanup_module(void) 
     132{ 
     133        tcf_unregister_action(&act_connmark_ops); 
     134} 
     135 
     136module_init(connmark_init_module); 
     137module_exit(connmark_cleanup_module); 
  • net/sched/Kconfig

    a b config NET_ACT_CSUM 
    559559          To compile this code as a module, choose M here: the 
    560560          module will be called act_csum. 
    561561 
     562config NET_ACT_CONNMARK 
     563        tristate "Connection Tracking Marking" 
     564        depends on NET_CLS_ACT 
     565        depends on NF_CONNTRACK 
     566        depends on NF_CONNTRACK_MARK 
     567        ---help--- 
     568          Say Y here to restore the connmark from a scheduler action 
     569 
     570          If unsure, say N. 
     571 
     572          To compile this code as a module, choose M here: the 
     573          module will be called act_connmark. 
     574 
    562575config NET_CLS_IND 
    563576        bool "Incoming device classification" 
    564577        depends on NET_CLS_U32 || NET_CLS_FW 
  • net/sched/Makefile

    a b obj-$(CONFIG_NET_ACT_PEDIT) += act_pedit 
    1616obj-$(CONFIG_NET_ACT_SIMP)      += act_simple.o 
    1717obj-$(CONFIG_NET_ACT_SKBEDIT)   += act_skbedit.o 
    1818obj-$(CONFIG_NET_ACT_CSUM)      += act_csum.o 
     19obj-$(CONFIG_NET_ACT_CONNMARK)  += act_connmark.o 
    1920obj-$(CONFIG_NET_SCH_FIFO)      += sch_fifo.o 
    2021obj-$(CONFIG_NET_SCH_CBQ)       += sch_cbq.o 
    2122obj-$(CONFIG_NET_SCH_HTB)       += sch_htb.o 
Note: See TracBrowser for help on using the repository browser.