aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-04-11 15:52:35 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2016-04-12 17:01:52 -0400
commit3c435e2e414e82ec6c0e96a1dfc2be3ddc3c23b4 (patch)
treea0f99fe0f71f91d082da086646c47a8fbf8f4202
parent85f1e7c29a46360b1b5f9cf87af6b27066c345fd (diff)
netfilter: conntrack: de-inline nf_conntrack_eventmask_report
Way too large; move it to nf_conntrack_ecache.c. Reduces total object size by 1216 byte on my machine. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/net/netfilter/nf_conntrack_ecache.h66
-rw-r--r--net/netfilter/nf_conntrack_ecache.c54
2 files changed, 66 insertions, 54 deletions
diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h
index 57c880378443..019a5b859868 100644
--- a/include/net/netfilter/nf_conntrack_ecache.h
+++ b/include/net/netfilter/nf_conntrack_ecache.h
@@ -73,6 +73,8 @@ void nf_conntrack_unregister_notifier(struct net *net,
73 struct nf_ct_event_notifier *nb); 73 struct nf_ct_event_notifier *nb);
74 74
75void nf_ct_deliver_cached_events(struct nf_conn *ct); 75void nf_ct_deliver_cached_events(struct nf_conn *ct);
76int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,
77 u32 portid, int report);
76 78
77static inline void 79static inline void
78nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct) 80nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
@@ -91,69 +93,25 @@ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
91} 93}
92 94
93static inline int 95static inline int
94nf_conntrack_eventmask_report(unsigned int eventmask,
95 struct nf_conn *ct,
96 u32 portid,
97 int report)
98{
99 int ret = 0;
100 struct net *net = nf_ct_net(ct);
101 struct nf_ct_event_notifier *notify;
102 struct nf_conntrack_ecache *e;
103
104 rcu_read_lock();
105 notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
106 if (notify == NULL)
107 goto out_unlock;
108
109 e = nf_ct_ecache_find(ct);
110 if (e == NULL)
111 goto out_unlock;
112
113 if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) {
114 struct nf_ct_event item = {
115 .ct = ct,
116 .portid = e->portid ? e->portid : portid,
117 .report = report
118 };
119 /* This is a resent of a destroy event? If so, skip missed */
120 unsigned long missed = e->portid ? 0 : e->missed;
121
122 if (!((eventmask | missed) & e->ctmask))
123 goto out_unlock;
124
125 ret = notify->fcn(eventmask | missed, &item);
126 if (unlikely(ret < 0 || missed)) {
127 spin_lock_bh(&ct->lock);
128 if (ret < 0) {
129 /* This is a destroy event that has been
130 * triggered by a process, we store the PORTID
131 * to include it in the retransmission. */
132 if (eventmask & (1 << IPCT_DESTROY) &&
133 e->portid == 0 && portid != 0)
134 e->portid = portid;
135 else
136 e->missed |= eventmask;
137 } else
138 e->missed &= ~missed;
139 spin_unlock_bh(&ct->lock);
140 }
141 }
142out_unlock:
143 rcu_read_unlock();
144 return ret;
145}
146
147static inline int
148nf_conntrack_event_report(enum ip_conntrack_events event, struct nf_conn *ct, 96nf_conntrack_event_report(enum ip_conntrack_events event, struct nf_conn *ct,
149 u32 portid, int report) 97 u32 portid, int report)
150{ 98{
99 const struct net *net = nf_ct_net(ct);
100
101 if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
102 return 0;
103
151 return nf_conntrack_eventmask_report(1 << event, ct, portid, report); 104 return nf_conntrack_eventmask_report(1 << event, ct, portid, report);
152} 105}
153 106
154static inline int 107static inline int
155nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct) 108nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
156{ 109{
110 const struct net *net = nf_ct_net(ct);
111
112 if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
113 return 0;
114
157 return nf_conntrack_eventmask_report(1 << event, ct, 0, 0); 115 return nf_conntrack_eventmask_report(1 << event, ct, 0, 0);
158} 116}
159 117
diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c
index 4e78c57b818f..a0ebab96a92f 100644
--- a/net/netfilter/nf_conntrack_ecache.c
+++ b/net/netfilter/nf_conntrack_ecache.c
@@ -113,6 +113,60 @@ static void ecache_work(struct work_struct *work)
113 schedule_delayed_work(&ctnet->ecache_dwork, delay); 113 schedule_delayed_work(&ctnet->ecache_dwork, delay);
114} 114}
115 115
116int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,
117 u32 portid, int report)
118{
119 int ret = 0;
120 struct net *net = nf_ct_net(ct);
121 struct nf_ct_event_notifier *notify;
122 struct nf_conntrack_ecache *e;
123
124 rcu_read_lock();
125 notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
126 if (!notify)
127 goto out_unlock;
128
129 e = nf_ct_ecache_find(ct);
130 if (!e)
131 goto out_unlock;
132
133 if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) {
134 struct nf_ct_event item = {
135 .ct = ct,
136 .portid = e->portid ? e->portid : portid,
137 .report = report
138 };
139 /* This is a resent of a destroy event? If so, skip missed */
140 unsigned long missed = e->portid ? 0 : e->missed;
141
142 if (!((eventmask | missed) & e->ctmask))
143 goto out_unlock;
144
145 ret = notify->fcn(eventmask | missed, &item);
146 if (unlikely(ret < 0 || missed)) {
147 spin_lock_bh(&ct->lock);
148 if (ret < 0) {
149 /* This is a destroy event that has been
150 * triggered by a process, we store the PORTID
151 * to include it in the retransmission.
152 */
153 if (eventmask & (1 << IPCT_DESTROY) &&
154 e->portid == 0 && portid != 0)
155 e->portid = portid;
156 else
157 e->missed |= eventmask;
158 } else {
159 e->missed &= ~missed;
160 }
161 spin_unlock_bh(&ct->lock);
162 }
163 }
164out_unlock:
165 rcu_read_unlock();
166 return ret;
167}
168EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);
169
116/* deliver cached events and clear cache entry - must be called with locally 170/* deliver cached events and clear cache entry - must be called with locally
117 * disabled softirqs */ 171 * disabled softirqs */
118void nf_ct_deliver_cached_events(struct nf_conn *ct) 172void nf_ct_deliver_cached_events(struct nf_conn *ct)