Changeset 32657


Ignore:
Timestamp:
Jul 10, 2017, 3:22:14 PM (2 weeks ago)
Author:
brainslayer
Message:

experimental 3.2 port

Location:
src/linux/universal/linux-3.2
Files:
11 added
12 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.2/include/linux/if_bridge.h

    r18171 r32657  
    103103
    104104extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *));
     105extern void br_dev_update_stats(struct net_device *dev, struct rtnl_link_stats64 *nlstats);
    105106
    106107typedef int br_should_route_hook_t(struct sk_buff *skb);
  • src/linux/universal/linux-3.2/include/linux/skbuff.h

    r29392 r32657  
    418418                                peeked:1,
    419419                                nf_trace:1;
     420        __u8                    fast_forwarded:1;
    420421        kmemcheck_bitfield_end(flags1);
    421422        __be16                  protocol;
  • src/linux/universal/linux-3.2/include/net/ip6_route.h

    r24310 r32657  
    9494                                                    struct in6_addr *saddr);
    9595
    96 extern struct rt6_info          *rt6_lookup(struct net *net,
     96extern struct rt6_info  *__weak rt6_lookup(struct net *net,
    9797                                            const struct in6_addr *daddr,
    9898                                            const struct in6_addr *saddr,
  • src/linux/universal/linux-3.2/include/net/netfilter/nf_conntrack_ecache.h

    r20364 r32657  
    6565};
    6666
    67 struct nf_ct_event_notifier {
    68         int (*fcn)(unsigned int events, struct nf_ct_event *item);
    69 };
    70 
    71 extern int nf_conntrack_register_notifier(struct net *net, struct nf_ct_event_notifier *nb);
    72 extern void nf_conntrack_unregister_notifier(struct net *net, struct nf_ct_event_notifier *nb);
     67extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);
     68extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);
    7369
    7470extern void nf_ct_deliver_cached_events(struct nf_conn *ct);
     
    7773nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
    7874{
    79         struct net *net = nf_ct_net(ct);
    80         struct nf_conntrack_ecache *e;
    81 
    82         if ( (net->ct.nf_conntrack_event_cb == NULL) &&
    83              (net->ct.nf_conntrack_event_cb_2 == NULL) )
    84                 return;
     75        struct nf_conntrack_ecache *e;
    8576
    8677        e = nf_ct_ecache_find(ct);
     
    9788                              int report)
    9889{
    99         int ret = 0;
     90        struct nf_conntrack_ecache *e;
     91
    10092        struct net *net = nf_ct_net(ct);
    101         struct nf_ct_event_notifier *notify;
    102         struct nf_ct_event_notifier *notify_2;
    103         struct nf_conntrack_ecache *e;
    104 
    105         rcu_read_lock();
    106         /* Incredibly nasty duplication in order to hack second event */
    107         notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
    108         notify_2 = rcu_dereference(net->ct.nf_conntrack_event_cb_2);
    109         if ((notify == NULL) && (notify_2 == NULL))
    110                 goto out_unlock;
    11193
    11294        e = nf_ct_ecache_find(ct);
    11395        if (e == NULL)
    114                 goto out_unlock;
     96                return 0;
    11597
    11698        if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) {
     
    124106
    125107                if (!((eventmask | missed) & e->ctmask))
    126                         goto out_unlock;
    127 
    128                 ret = min( notify ? notify->fcn(eventmask | missed, &item) : 0,
    129                            notify_2 ? notify_2->fcn(eventmask | missed, &item) : 0 );
    130                 if (unlikely(ret < 0 || missed)) {
    131                         spin_lock_bh(&ct->lock);
    132                         if (ret < 0) {
    133                                 /* This is a destroy event that has been
    134                                  * triggered by a process, we store the PID
    135                                  * to include it in the retransmission. */
    136                                 if (eventmask & (1 << IPCT_DESTROY) &&
    137                                     e->pid == 0 && pid != 0)
    138                                         e->pid = pid;
    139                                 else
    140                                         e->missed |= eventmask;
    141                         } else
    142                                 e->missed &= ~missed;
    143                         spin_unlock_bh(&ct->lock);
    144                 }
    145         }
    146 out_unlock:
    147         rcu_read_unlock();
    148         return ret;
     108                        return 0;
     109
     110                atomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);
     111        }
     112        return 0;
    149113}
    150114
  • src/linux/universal/linux-3.2/include/net/netns/conntrack.h

    r20256 r32657  
    1919        struct hlist_nulls_head dying;
    2020        struct ip_conntrack_stat __percpu *stat;
    21         struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
    22         struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb_2;
     21        struct atomic_notifier_head nf_conntrack_chain;
    2322        struct nf_exp_event_notifier __rcu *nf_expect_event_cb;
    2423        int                     sysctl_events;
  • src/linux/universal/linux-3.2/net/Makefile

    r18630 r32657  
    1717obj-$(CONFIG_NET)               += ethernet/ 802/ sched/ netlink/
    1818obj-$(CONFIG_NETFILTER)         += netfilter/
     19obj-m                           += shortcut-fe/
    1920obj-$(CONFIG_INET)              += ipv4/
    2021obj-$(CONFIG_XFRM)              += xfrm/
  • src/linux/universal/linux-3.2/net/bridge/br_if.c

    r23284 r32657  
    459459
    460460}
     461
     462/* Update bridge statistics for bridge packets processed by offload engines */
     463void br_dev_update_stats(struct net_device *dev, struct rtnl_link_stats64 *nlstats)
     464{
     465        struct net_bridge *br;
     466        struct br_cpu_netstats *stats;
     467
     468        /*
     469         * Is this a bridge?
     470         */
     471        if (!(dev->priv_flags & IFF_EBRIDGE))
     472                return;
     473
     474        br = netdev_priv(dev);
     475        stats = per_cpu_ptr(br->stats, 0);
     476
     477        u64_stats_update_begin(&stats->syncp);
     478        stats->rx_packets += nlstats->rx_packets;
     479        stats->rx_bytes += nlstats->rx_bytes;
     480        stats->tx_packets += nlstats->tx_packets;
     481        stats->tx_bytes += nlstats->tx_bytes;
     482        u64_stats_update_end(&stats->syncp);
     483}
     484EXPORT_SYMBOL_GPL(br_dev_update_stats);
  • src/linux/universal/linux-3.2/net/core/dev.c

    r31709 r32657  
    21872187                if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
    21882188                        skb_dst_drop(skb);
    2189 
     2189        if (!skb->fast_forwarded) {
    21902190#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
    21912191                if (!list_empty(&ptype_all) &&
     
    21952195#endif
    21962196                        dev_queue_xmit_nit(skb, dev);
    2197 
     2197        }
    21982198                features = netif_skb_features(skb);
    21992199
     
    32503250        int ret = NET_RX_DROP;
    32513251        __be16 type;
     3252        int (*fast_recv)(struct sk_buff *skb);
     3253
    32523254
    32533255        if (!netdev_tstamp_prequeue)
     
    32783280                if (unlikely(!skb))
    32793281                        goto out;
     3282        }
     3283
     3284        fast_recv = rcu_dereference(fast_nat_recv);
     3285        if (fast_recv && fast_recv(skb)) {
     3286                ret = NET_RX_SUCCESS;
     3287                goto out;
    32803288        }
    32813289
     
    37513759}
    37523760EXPORT_SYMBOL(napi_gro_frags);
     3761
     3762int (*fast_nat_recv)(struct sk_buff *skb) __rcu __read_mostly;
     3763EXPORT_SYMBOL_GPL(fast_nat_recv);
    37533764
    37543765/*
  • src/linux/universal/linux-3.2/net/netfilter/nf_conntrack_core.c

    r31542 r32657  
    14961496        /*  - and look it like as a confirmed connection */
    14971497        nf_ct_untracked_status_or(IPS_CONFIRMED | IPS_UNTRACKED);
     1498        ATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);
     1499
    14981500        return 0;
    14991501
  • src/linux/universal/linux-3.2/net/netfilter/nf_conntrack_ecache.c

    r20256 r32657  
    1717#include <linux/err.h>
    1818#include <linux/percpu.h>
     19#include <linux/notifier.h>
    1920#include <linux/kernel.h>
    2021#include <linux/netdevice.h>
     
    3233void nf_ct_deliver_cached_events(struct nf_conn *ct)
    3334{
    34         struct net *net = nf_ct_net(ct);
    3535        unsigned long events;
    3636        /* Incredibly nasty duplication in order to hack second event */
    37         struct nf_ct_event_notifier *notify;
    38         struct nf_ct_event_notifier *notify_2;
    3937        struct nf_conntrack_ecache *e;
    4038
    41         rcu_read_lock();
    42         notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
    43         notify_2 = rcu_dereference(net->ct.nf_conntrack_event_cb_2);
    44         if ( (notify == NULL) && (notify_2 == NULL) )
    45                 goto out_unlock;
     39        struct net *net = nf_ct_net(ct);
    4640
    4741        e = nf_ct_ecache_find(ct);
    4842        if (e == NULL)
    49                 goto out_unlock;
     43                return;
    5044
    5145        events = xchg(&e->cache, 0);
     
    6458
    6559                if (!((events | missed) & e->ctmask))
    66                         goto out_unlock;
    67 
    68                 ret = min( notify ? notify->fcn(events | missed, &item) : 0,
    69                            notify_2 ? notify_2->fcn(events | missed, &item) : 0);
    70                 if (unlikely(ret < 0 || missed)) {
    71                         spin_lock_bh(&ct->lock);
    72                         if (ret < 0)
    73                                 e->missed |= events;
    74                         else
    75                                 e->missed &= ~missed;
    76                         spin_unlock_bh(&ct->lock);
     60                        return;
     61
     62                atomic_notifier_call_chain(&net->ct.nf_conntrack_chain,
     63                        events | missed,
     64                        &item);
     65                if (likely(!missed))
     66                        return;
     67
     68                spin_lock_bh(&ct->lock);
     69                e->missed &= ~missed;
     70                spin_unlock_bh(&ct->lock);
    7771                }
    7872        }
    79 
    80 out_unlock:
    81         rcu_read_unlock();
     73        return;
    8274}
    8375EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);
    8476
    85 int nf_conntrack_register_notifier(struct net *net,
    86                                    struct nf_ct_event_notifier *new)
    87 {
    88         int ret = 0;
    89         struct nf_ct_event_notifier *notify;
    90         struct nf_ct_event_notifier *notify_2;
    91 
    92         mutex_lock(&nf_ct_ecache_mutex);
    93         notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb,
    94                                            lockdep_is_held(&nf_ct_ecache_mutex));
    95         notify_2 = rcu_dereference_protected(net->ct.nf_conntrack_event_cb_2,
    96                                            lockdep_is_held(&nf_ct_ecache_mutex));
    97         if ( (notify != NULL) && (notify_2 != NULL) ) {
    98                 ret = -EBUSY;
    99                 goto out_unlock;
    100         }
    101         if (notify == NULL)
    102             rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new);
    103         else
    104             rcu_assign_pointer(net->ct.nf_conntrack_event_cb_2, new);
    105         mutex_unlock(&nf_ct_ecache_mutex);
    106         return ret;
    107 
    108 out_unlock:
    109         mutex_unlock(&nf_ct_ecache_mutex);
    110         return ret;
     77int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb)
     78{
     79        return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);
    11180}
    11281EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);
    11382
    114 void nf_conntrack_unregister_notifier(struct net *net,
    115                                       struct nf_ct_event_notifier *new)
    116 {
    117         struct nf_ct_event_notifier *notify;
    118         struct nf_ct_event_notifier *notify_2;
    119 
    120         mutex_lock(&nf_ct_ecache_mutex);
    121         notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb,
    122                                            lockdep_is_held(&nf_ct_ecache_mutex));
    123         notify_2 = rcu_dereference_protected(net->ct.nf_conntrack_event_cb_2,
    124                                            lockdep_is_held(&nf_ct_ecache_mutex));
    125         BUG_ON((notify != new) || (notify_2 != new));
    126         if (notify == new)
    127             RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, NULL);
    128         else
    129             RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb_2, NULL);
    130         mutex_unlock(&nf_ct_ecache_mutex);
     83int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)
     84{
     85        return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);
    13186}
    13287EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
  • src/linux/universal/linux-3.2/net/netfilter/nf_conntrack_netlink.c

    r18364 r32657  
    2929#include <linux/spinlock.h>
    3030#include <linux/interrupt.h>
     31#include <linux/notifier.h>
    3132#include <linux/slab.h>
    3233
     
    540541}
    541542
    542 static int
    543 ctnetlink_conntrack_event(unsigned int events, struct nf_ct_event *item)
     543static int ctnetlink_conntrack_event(struct notifier_block *this,
     544                                     unsigned long events, void *ptr)
    544545{
    545546        struct net *net;
     
    547548        struct nfgenmsg *nfmsg;
    548549        struct nlattr *nest_parms;
     550        struct nf_ct_event *item = ptr;
    549551        struct nf_conn *ct = item->ct;
    550552        struct sk_buff *skb;
     
    21182120
    21192121#ifdef CONFIG_NF_CONNTRACK_EVENTS
    2120 static struct nf_ct_event_notifier ctnl_notifier = {
    2121         .fcn = ctnetlink_conntrack_event,
     2122static struct notifier_block ctnl_notifier = {
     2123        .notifier_call = ctnetlink_conntrack_event,
    21222124};
    21232125
  • src/linux/universal/linux-3.2/net/netfilter/nf_conntrack_proto_tcp.c

    r20364 r32657  
    3232/* Do not check the TCP window for incoming packets  */
    3333static int nf_ct_tcp_no_window_check __read_mostly = 1;
     34EXPORT_SYMBOL_GPL(nf_ct_tcp_no_window_check);
    3435
    3536/* "Be conservative in what you do,
Note: See TracChangeset for help on using the changeset viewer.