Changeset 42094


Ignore:
Timestamp:
2014-08-10T11:21:19+02:00 (3 years ago)
Author:
jow
Message:

BB: netfilter: support /proc conntrack flushing of specific ip addresses

Signed-off-by: Jo-Philipp Wich <jow@…>

Backport of r42092

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/barrier_breaker/target/linux/generic/patches-3.10/604-netfilter_conntrack_flush.patch

    r37832 r42094  
    11--- a/net/netfilter/nf_conntrack_standalone.c 
    22+++ b/net/netfilter/nf_conntrack_standalone.c 
    3 @@ -268,10 +268,34 @@ static int ct_open(struct inode *inode, 
     3@@ -17,6 +17,7 @@ 
     4 #include <linux/percpu.h> 
     5 #include <linux/netdevice.h> 
     6 #include <linux/security.h> 
     7+#include <linux/inet.h> 
     8 #include <net/net_namespace.h> 
     9 #ifdef CONFIG_SYSCTL 
     10 #include <linux/sysctl.h> 
     11@@ -268,10 +269,63 @@ static int ct_open(struct inode *inode, 
    412                        sizeof(struct ct_iter_state)); 
    513 } 
    614  
    7 +static int kill_all(struct nf_conn *i, void *data) 
     15+struct kill_request { 
     16+       u16 family; 
     17+       union nf_inet_addr addr; 
     18+}; 
     19+ 
     20+static int kill_matching(struct nf_conn *i, void *data) 
    821+{ 
    9 +    return 1; 
     22+       struct kill_request *kr = data; 
     23+       struct nf_conntrack_tuple *t = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple; 
     24+ 
     25+       if (!kr->family) 
     26+               return 1; 
     27+ 
     28+       if (t->src.l3num != kr->family) 
     29+               return 0; 
     30+ 
     31+       return (nf_inet_addr_cmp(&kr->addr, &t->src.u3) || 
     32+               nf_inet_addr_cmp(&kr->addr, &t->dst.u3)); 
    1033+} 
    1134+ 
     
    1538+       struct seq_file *seq = file->private_data; 
    1639+       struct net *net = seq_file_net(seq); 
     40+       struct kill_request kr = { }; 
     41+       char req[INET6_ADDRSTRLEN] = { }; 
    1742+ 
    18 +       if (count) { 
    19 +               char c; 
     43+       if (count == 0) 
     44+               return 0; 
    2045+ 
    21 +               if (get_user(c, buf)) 
    22 +                       return -EFAULT; 
     46+       if (count >= INET6_ADDRSTRLEN) 
     47+               count = INET6_ADDRSTRLEN - 1; 
    2348+ 
    24 +               if (c == 'f') 
    25 +                       nf_ct_iterate_cleanup(net, kill_all, NULL); 
     49+       if (copy_from_user(req, buf, count)) 
     50+               return -EFAULT; 
     51+ 
     52+       if (strnchr(req, count, ':')) { 
     53+               kr.family = AF_INET6; 
     54+               if (!in6_pton(req, count, (void *)&kr.addr, '\n', NULL)) 
     55+                       return -EINVAL; 
     56+       } else if (strnchr(req, count, '.')) { 
     57+               kr.family = AF_INET; 
     58+               if (!in4_pton(req, count, (void *)&kr.addr, '\n', NULL)) 
     59+                       return -EINVAL; 
    2660+       } 
     61+ 
     62+       nf_ct_iterate_cleanup(net, kill_matching, &kr); 
     63+ 
    2764+       return count; 
    2865+} 
     
    3673        .release = seq_release_net, 
    3774 }; 
    38 @@ -373,7 +397,7 @@ static int nf_conntrack_standalone_init_ 
     75@@ -373,7 +427,7 @@ static int nf_conntrack_standalone_init_ 
    3976 { 
    4077        struct proc_dir_entry *pde; 
Note: See TracChangeset for help on using the changeset viewer.