aboutsummaryrefslogtreecommitdiffstats
path: root/net/netfilter/nf_conntrack_proto.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/netfilter/nf_conntrack_proto.c')
-rw-r--r--net/netfilter/nf_conntrack_proto.c72
1 files changed, 36 insertions, 36 deletions
diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c
index 24c61a38471..330b9acc62d 100644
--- a/net/netfilter/nf_conntrack_proto.c
+++ b/net/netfilter/nf_conntrack_proto.c
@@ -24,38 +24,38 @@
24 24
25#include <net/netfilter/nf_conntrack.h> 25#include <net/netfilter/nf_conntrack.h>
26#include <net/netfilter/nf_conntrack_l3proto.h> 26#include <net/netfilter/nf_conntrack_l3proto.h>
27#include <net/netfilter/nf_conntrack_protocol.h> 27#include <net/netfilter/nf_conntrack_l4proto.h>
28#include <net/netfilter/nf_conntrack_core.h> 28#include <net/netfilter/nf_conntrack_core.h>
29 29
30struct nf_conntrack_protocol **nf_ct_protos[PF_MAX] __read_mostly; 30struct nf_conntrack_l4proto **nf_ct_protos[PF_MAX] __read_mostly;
31struct nf_conntrack_l3proto *nf_ct_l3protos[PF_MAX] __read_mostly; 31struct nf_conntrack_l3proto *nf_ct_l3protos[PF_MAX] __read_mostly;
32 32
33struct nf_conntrack_protocol * 33struct nf_conntrack_l4proto *
34__nf_ct_proto_find(u_int16_t l3proto, u_int8_t protocol) 34__nf_ct_l4proto_find(u_int16_t l3proto, u_int8_t l4proto)
35{ 35{
36 if (unlikely(l3proto >= AF_MAX || nf_ct_protos[l3proto] == NULL)) 36 if (unlikely(l3proto >= AF_MAX || nf_ct_protos[l3proto] == NULL))
37 return &nf_conntrack_generic_protocol; 37 return &nf_conntrack_l4proto_generic;
38 38
39 return nf_ct_protos[l3proto][protocol]; 39 return nf_ct_protos[l3proto][l4proto];
40} 40}
41 41
42/* this is guaranteed to always return a valid protocol helper, since 42/* this is guaranteed to always return a valid protocol helper, since
43 * it falls back to generic_protocol */ 43 * it falls back to generic_protocol */
44struct nf_conntrack_protocol * 44struct nf_conntrack_l4proto *
45nf_ct_proto_find_get(u_int16_t l3proto, u_int8_t protocol) 45nf_ct_l4proto_find_get(u_int16_t l3proto, u_int8_t l4proto)
46{ 46{
47 struct nf_conntrack_protocol *p; 47 struct nf_conntrack_l4proto *p;
48 48
49 preempt_disable(); 49 preempt_disable();
50 p = __nf_ct_proto_find(l3proto, protocol); 50 p = __nf_ct_l4proto_find(l3proto, l4proto);
51 if (!try_module_get(p->me)) 51 if (!try_module_get(p->me))
52 p = &nf_conntrack_generic_protocol; 52 p = &nf_conntrack_l4proto_generic;
53 preempt_enable(); 53 preempt_enable();
54 54
55 return p; 55 return p;
56} 56}
57 57
58void nf_ct_proto_put(struct nf_conntrack_protocol *p) 58void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p)
59{ 59{
60 module_put(p->me); 60 module_put(p->me);
61} 61}
@@ -68,7 +68,7 @@ nf_ct_l3proto_find_get(u_int16_t l3proto)
68 preempt_disable(); 68 preempt_disable();
69 p = __nf_ct_l3proto_find(l3proto); 69 p = __nf_ct_l3proto_find(l3proto);
70 if (!try_module_get(p->me)) 70 if (!try_module_get(p->me))
71 p = &nf_conntrack_generic_l3proto; 71 p = &nf_conntrack_l3proto_generic;
72 preempt_enable(); 72 preempt_enable();
73 73
74 return p; 74 return p;
@@ -86,7 +86,7 @@ nf_ct_l3proto_try_module_get(unsigned short l3proto)
86 struct nf_conntrack_l3proto *p; 86 struct nf_conntrack_l3proto *p;
87 87
88retry: p = nf_ct_l3proto_find_get(l3proto); 88retry: p = nf_ct_l3proto_find_get(l3proto);
89 if (p == &nf_conntrack_generic_l3proto) { 89 if (p == &nf_conntrack_l3proto_generic) {
90 ret = request_module("nf_conntrack-%d", l3proto); 90 ret = request_module("nf_conntrack-%d", l3proto);
91 if (!ret) 91 if (!ret)
92 goto retry; 92 goto retry;
@@ -114,14 +114,14 @@ static int kill_l3proto(struct nf_conn *i, void *data)
114 ((struct nf_conntrack_l3proto *)data)->l3proto); 114 ((struct nf_conntrack_l3proto *)data)->l3proto);
115} 115}
116 116
117static int kill_proto(struct nf_conn *i, void *data) 117static int kill_l4proto(struct nf_conn *i, void *data)
118{ 118{
119 struct nf_conntrack_protocol *proto; 119 struct nf_conntrack_l4proto *l4proto;
120 proto = (struct nf_conntrack_protocol *)data; 120 l4proto = (struct nf_conntrack_l4proto *)data;
121 return (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum == 121 return (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum ==
122 proto->proto) && 122 l4proto->l4proto) &&
123 (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num == 123 (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num ==
124 proto->l3proto); 124 l4proto->l3proto);
125} 125}
126 126
127int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto) 127int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto)
@@ -129,7 +129,7 @@ int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto)
129 int ret = 0; 129 int ret = 0;
130 130
131 write_lock_bh(&nf_conntrack_lock); 131 write_lock_bh(&nf_conntrack_lock);
132 if (nf_ct_l3protos[proto->l3proto] != &nf_conntrack_generic_l3proto) { 132 if (nf_ct_l3protos[proto->l3proto] != &nf_conntrack_l3proto_generic) {
133 ret = -EBUSY; 133 ret = -EBUSY;
134 goto out; 134 goto out;
135 } 135 }
@@ -143,7 +143,7 @@ out:
143void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto) 143void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
144{ 144{
145 write_lock_bh(&nf_conntrack_lock); 145 write_lock_bh(&nf_conntrack_lock);
146 nf_ct_l3protos[proto->l3proto] = &nf_conntrack_generic_l3proto; 146 nf_ct_l3protos[proto->l3proto] = &nf_conntrack_l3proto_generic;
147 write_unlock_bh(&nf_conntrack_lock); 147 write_unlock_bh(&nf_conntrack_lock);
148 148
149 /* Somebody could be still looking at the proto in bh. */ 149 /* Somebody could be still looking at the proto in bh. */
@@ -155,43 +155,43 @@ void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
155 155
156/* FIXME: Allow NULL functions and sub in pointers to generic for 156/* FIXME: Allow NULL functions and sub in pointers to generic for
157 them. --RR */ 157 them. --RR */
158int nf_conntrack_protocol_register(struct nf_conntrack_protocol *proto) 158int nf_conntrack_l4proto_register(struct nf_conntrack_l4proto *l4proto)
159{ 159{
160 int ret = 0; 160 int ret = 0;
161 161
162retry: 162retry:
163 write_lock_bh(&nf_conntrack_lock); 163 write_lock_bh(&nf_conntrack_lock);
164 if (nf_ct_protos[proto->l3proto]) { 164 if (nf_ct_protos[l4proto->l3proto]) {
165 if (nf_ct_protos[proto->l3proto][proto->proto] 165 if (nf_ct_protos[l4proto->l3proto][l4proto->l4proto]
166 != &nf_conntrack_generic_protocol) { 166 != &nf_conntrack_l4proto_generic) {
167 ret = -EBUSY; 167 ret = -EBUSY;
168 goto out_unlock; 168 goto out_unlock;
169 } 169 }
170 } else { 170 } else {
171 /* l3proto may be loaded latter. */ 171 /* l3proto may be loaded latter. */
172 struct nf_conntrack_protocol **proto_array; 172 struct nf_conntrack_l4proto **proto_array;
173 int i; 173 int i;
174 174
175 write_unlock_bh(&nf_conntrack_lock); 175 write_unlock_bh(&nf_conntrack_lock);
176 176
177 proto_array = (struct nf_conntrack_protocol **) 177 proto_array = (struct nf_conntrack_l4proto **)
178 kmalloc(MAX_NF_CT_PROTO * 178 kmalloc(MAX_NF_CT_PROTO *
179 sizeof(struct nf_conntrack_protocol *), 179 sizeof(struct nf_conntrack_l4proto *),
180 GFP_KERNEL); 180 GFP_KERNEL);
181 if (proto_array == NULL) { 181 if (proto_array == NULL) {
182 ret = -ENOMEM; 182 ret = -ENOMEM;
183 goto out; 183 goto out;
184 } 184 }
185 for (i = 0; i < MAX_NF_CT_PROTO; i++) 185 for (i = 0; i < MAX_NF_CT_PROTO; i++)
186 proto_array[i] = &nf_conntrack_generic_protocol; 186 proto_array[i] = &nf_conntrack_l4proto_generic;
187 187
188 write_lock_bh(&nf_conntrack_lock); 188 write_lock_bh(&nf_conntrack_lock);
189 if (nf_ct_protos[proto->l3proto]) { 189 if (nf_ct_protos[l4proto->l3proto]) {
190 /* bad timing, but no problem */ 190 /* bad timing, but no problem */
191 write_unlock_bh(&nf_conntrack_lock); 191 write_unlock_bh(&nf_conntrack_lock);
192 kfree(proto_array); 192 kfree(proto_array);
193 } else { 193 } else {
194 nf_ct_protos[proto->l3proto] = proto_array; 194 nf_ct_protos[l4proto->l3proto] = proto_array;
195 write_unlock_bh(&nf_conntrack_lock); 195 write_unlock_bh(&nf_conntrack_lock);
196 } 196 }
197 197
@@ -202,7 +202,7 @@ retry:
202 goto retry; 202 goto retry;
203 } 203 }
204 204
205 nf_ct_protos[proto->l3proto][proto->proto] = proto; 205 nf_ct_protos[l4proto->l3proto][l4proto->l4proto] = l4proto;
206 206
207out_unlock: 207out_unlock:
208 write_unlock_bh(&nf_conntrack_lock); 208 write_unlock_bh(&nf_conntrack_lock);
@@ -210,16 +210,16 @@ out:
210 return ret; 210 return ret;
211} 211}
212 212
213void nf_conntrack_protocol_unregister(struct nf_conntrack_protocol *proto) 213void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto)
214{ 214{
215 write_lock_bh(&nf_conntrack_lock); 215 write_lock_bh(&nf_conntrack_lock);
216 nf_ct_protos[proto->l3proto][proto->proto] 216 nf_ct_protos[l4proto->l3proto][l4proto->l4proto]
217 = &nf_conntrack_generic_protocol; 217 = &nf_conntrack_l4proto_generic;
218 write_unlock_bh(&nf_conntrack_lock); 218 write_unlock_bh(&nf_conntrack_lock);
219 219
220 /* Somebody could be still looking at the proto in bh. */ 220 /* Somebody could be still looking at the proto in bh. */
221 synchronize_net(); 221 synchronize_net();
222 222
223 /* Remove all contrack entries for this protocol */ 223 /* Remove all contrack entries for this protocol */
224 nf_ct_iterate_cleanup(kill_proto, proto); 224 nf_ct_iterate_cleanup(kill_l4proto, l4proto);
225} 225}