Deleted Added
full compact
pf_table.c (127145) pf_table.c (130613)
1/* $FreeBSD: head/sys/contrib/pf/net/pf_table.c 127145 2004-03-17 21:11:02Z mlaier $ */
2/* $OpenBSD: pf_table.c,v 1.41 2003/08/22 15:19:23 henning Exp $ */
1/* $FreeBSD: head/sys/contrib/pf/net/pf_table.c 130613 2004-06-16 23:24:02Z mlaier $ */
2/* $OpenBSD: pf_table.c,v 1.47 2004/03/09 21:44:41 mcbride Exp $ */
3
4/*
5 * Copyright (c) 2002 Cedric Berger
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:

--- 45 unchanged lines hidden (view full) ---

56
57#define ACCEPT_FLAGS(oklist) \
58 do { \
59 if ((flags & ~(oklist)) & \
60 PFR_FLAG_ALLMASK) \
61 return (EINVAL); \
62 } while (0)
63
3
4/*
5 * Copyright (c) 2002 Cedric Berger
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:

--- 45 unchanged lines hidden (view full) ---

56
57#define ACCEPT_FLAGS(oklist) \
58 do { \
59 if ((flags & ~(oklist)) & \
60 PFR_FLAG_ALLMASK) \
61 return (EINVAL); \
62 } while (0)
63
64#ifdef __FreeBSD__
65static inline int
66_copyin(const void *uaddr, void *kaddr, size_t len)
67{
68 int r;
69
70 PF_UNLOCK();
71 r = copyin(uaddr, kaddr, len);
72 PF_LOCK();
73
74 return (r);
75}
76
77static inline int
78_copyout(const void *uaddr, void *kaddr, size_t len)
79{
80 int r;
81
82 PF_UNLOCK();
83 r = copyout(uaddr, kaddr, len);
84 PF_LOCK();
85
86 return (r);
87}
88
89#define COPYIN(from, to, size) \
90 ((flags & PFR_FLAG_USERIOCTL) ? \
91 _copyin((from), (to), (size)) : \
92 (bcopy((from), (to), (size)), 0))
93
94#define COPYOUT(from, to, size) \
95 ((flags & PFR_FLAG_USERIOCTL) ? \
96 _copyout((from), (to), (size)) : \
97 (bcopy((from), (to), (size)), 0))
98
99#else
100
101#define COPYIN(from, to, size) \
102 ((flags & PFR_FLAG_USERIOCTL) ? \
103 copyin((from), (to), (size)) : \
104 (bcopy((from), (to), (size)), 0))
105
106#define COPYOUT(from, to, size) \
107 ((flags & PFR_FLAG_USERIOCTL) ? \
108 copyout((from), (to), (size)) : \
109 (bcopy((from), (to), (size)), 0))
110
111#endif
112
64#define FILLIN_SIN(sin, addr) \
65 do { \
66 (sin).sin_len = sizeof(sin); \
67 (sin).sin_family = AF_INET; \
68 (sin).sin_addr = (addr); \
69 } while (0)
70
71#define FILLIN_SIN6(sin6, addr) \

--- 6 unchanged lines hidden (view full) ---

78#define SWAP(type, a1, a2) \
79 do { \
80 type tmp = a1; \
81 a1 = a2; \
82 a2 = tmp; \
83 } while (0)
84
85#define SUNION2PF(su, af) (((af)==AF_INET) ? \
113#define FILLIN_SIN(sin, addr) \
114 do { \
115 (sin).sin_len = sizeof(sin); \
116 (sin).sin_family = AF_INET; \
117 (sin).sin_addr = (addr); \
118 } while (0)
119
120#define FILLIN_SIN6(sin6, addr) \

--- 6 unchanged lines hidden (view full) ---

127#define SWAP(type, a1, a2) \
128 do { \
129 type tmp = a1; \
130 a1 = a2; \
131 a2 = tmp; \
132 } while (0)
133
134#define SUNION2PF(su, af) (((af)==AF_INET) ? \
86 (struct pf_addr *)&(su)->sin.sin_addr : \
87 (struct pf_addr *)&(su)->sin6.sin6_addr)
135 (struct pf_addr *)&(su)->sin.sin_addr : \
136 (struct pf_addr *)&(su)->sin6.sin6_addr)
88
89#define AF_BITS(af) (((af)==AF_INET)?32:128)
90#define ADDR_NETWORK(ad) ((ad)->pfra_net < AF_BITS((ad)->pfra_af))
91#define KENTRY_NETWORK(ke) ((ke)->pfrke_net < AF_BITS((ke)->pfrke_af))
92#define KENTRY_RNF_ROOT(ke) \
93 ((((struct radix_node *)(ke))->rn_flags & RNF_ROOT) != 0)
94
95#define NO_ADDRESSES (-1)
96#define ENQUEUE_UNMARKED_ONLY (1)
97#define INVERT_NEG_FLAG (1)
98
99struct pfr_walktree {
100 enum pfrw_op {
101 PFRW_MARK,
102 PFRW_SWEEP,
103 PFRW_ENQUEUE,
104 PFRW_GET_ADDRS,
105 PFRW_GET_ASTATS,
137
138#define AF_BITS(af) (((af)==AF_INET)?32:128)
139#define ADDR_NETWORK(ad) ((ad)->pfra_net < AF_BITS((ad)->pfra_af))
140#define KENTRY_NETWORK(ke) ((ke)->pfrke_net < AF_BITS((ke)->pfrke_af))
141#define KENTRY_RNF_ROOT(ke) \
142 ((((struct radix_node *)(ke))->rn_flags & RNF_ROOT) != 0)
143
144#define NO_ADDRESSES (-1)
145#define ENQUEUE_UNMARKED_ONLY (1)
146#define INVERT_NEG_FLAG (1)
147
148struct pfr_walktree {
149 enum pfrw_op {
150 PFRW_MARK,
151 PFRW_SWEEP,
152 PFRW_ENQUEUE,
153 PFRW_GET_ADDRS,
154 PFRW_GET_ASTATS,
106 PFRW_POOL_GET
155 PFRW_POOL_GET,
156 PFRW_DYNADDR_UPDATE
107 } pfrw_op;
108 union {
109 struct pfr_addr *pfrw1_addr;
110 struct pfr_astats *pfrw1_astats;
111 struct pfr_kentryworkq *pfrw1_workq;
112 struct pfr_kentry *pfrw1_kentry;
157 } pfrw_op;
158 union {
159 struct pfr_addr *pfrw1_addr;
160 struct pfr_astats *pfrw1_astats;
161 struct pfr_kentryworkq *pfrw1_workq;
162 struct pfr_kentry *pfrw1_kentry;
163 struct pfi_dynaddr *pfrw1_dyn;
113 } pfrw_1;
114 int pfrw_free;
164 } pfrw_1;
165 int pfrw_free;
166 int pfrw_flags;
115};
116#define pfrw_addr pfrw_1.pfrw1_addr
117#define pfrw_astats pfrw_1.pfrw1_astats
118#define pfrw_workq pfrw_1.pfrw1_workq
119#define pfrw_kentry pfrw_1.pfrw1_kentry
167};
168#define pfrw_addr pfrw_1.pfrw1_addr
169#define pfrw_astats pfrw_1.pfrw1_astats
170#define pfrw_workq pfrw_1.pfrw1_workq
171#define pfrw_kentry pfrw_1.pfrw1_kentry
172#define pfrw_dyn pfrw_1.pfrw1_dyn
120#define pfrw_cnt pfrw_free
121
122#define senderr(e) do { rv = (e); goto _bad; } while (0)
123
124#ifdef __FreeBSD__
125uma_zone_t pfr_ktable_pl;
126uma_zone_t pfr_kentry_pl;
127#else
128struct pool pfr_ktable_pl;
129struct pool pfr_kentry_pl;
130#endif
131struct sockaddr_in pfr_sin;
132struct sockaddr_in6 pfr_sin6;
173#define pfrw_cnt pfrw_free
174
175#define senderr(e) do { rv = (e); goto _bad; } while (0)
176
177#ifdef __FreeBSD__
178uma_zone_t pfr_ktable_pl;
179uma_zone_t pfr_kentry_pl;
180#else
181struct pool pfr_ktable_pl;
182struct pool pfr_kentry_pl;
183#endif
184struct sockaddr_in pfr_sin;
185struct sockaddr_in6 pfr_sin6;
133union sockaddr_union pfr_mask;
186union sockaddr_union pfr_mask;
134struct pf_addr pfr_ffaddr;
135
136void pfr_copyout_addr(struct pfr_addr *,
137 struct pfr_kentry *ke);
138int pfr_validate_addr(struct pfr_addr *);
139void pfr_enqueue_addrs(struct pfr_ktable *,
140 struct pfr_kentryworkq *, int *, int);
141void pfr_mark_addrs(struct pfr_ktable *);
142struct pfr_kentry *pfr_lookup_addr(struct pfr_ktable *,
143 struct pfr_addr *, int);
144struct pfr_kentry *pfr_create_kentry(struct pfr_addr *);
145void pfr_destroy_kentries(struct pfr_kentryworkq *);
146void pfr_destroy_kentry(struct pfr_kentry *);
147void pfr_insert_kentries(struct pfr_ktable *,
148 struct pfr_kentryworkq *, long);
149void pfr_remove_kentries(struct pfr_ktable *,
150 struct pfr_kentryworkq *);
151void pfr_clstats_kentries(struct pfr_kentryworkq *, long,
152 int);
187struct pf_addr pfr_ffaddr;
188
189void pfr_copyout_addr(struct pfr_addr *,
190 struct pfr_kentry *ke);
191int pfr_validate_addr(struct pfr_addr *);
192void pfr_enqueue_addrs(struct pfr_ktable *,
193 struct pfr_kentryworkq *, int *, int);
194void pfr_mark_addrs(struct pfr_ktable *);
195struct pfr_kentry *pfr_lookup_addr(struct pfr_ktable *,
196 struct pfr_addr *, int);
197struct pfr_kentry *pfr_create_kentry(struct pfr_addr *);
198void pfr_destroy_kentries(struct pfr_kentryworkq *);
199void pfr_destroy_kentry(struct pfr_kentry *);
200void pfr_insert_kentries(struct pfr_ktable *,
201 struct pfr_kentryworkq *, long);
202void pfr_remove_kentries(struct pfr_ktable *,
203 struct pfr_kentryworkq *);
204void pfr_clstats_kentries(struct pfr_kentryworkq *, long,
205 int);
153void pfr_reset_feedback(struct pfr_addr *, int);
206void pfr_reset_feedback(struct pfr_addr *, int, int);
154void pfr_prepare_network(union sockaddr_union *, int, int);
155int pfr_route_kentry(struct pfr_ktable *,
156 struct pfr_kentry *);
157int pfr_unroute_kentry(struct pfr_ktable *,
158 struct pfr_kentry *);
159int pfr_walktree(struct radix_node *, void *);
207void pfr_prepare_network(union sockaddr_union *, int, int);
208int pfr_route_kentry(struct pfr_ktable *,
209 struct pfr_kentry *);
210int pfr_unroute_kentry(struct pfr_ktable *,
211 struct pfr_kentry *);
212int pfr_walktree(struct radix_node *, void *);
160int pfr_validate_table(struct pfr_table *, int);
213int pfr_validate_table(struct pfr_table *, int, int);
161void pfr_commit_ktable(struct pfr_ktable *, long);
162void pfr_insert_ktables(struct pfr_ktableworkq *);
163void pfr_insert_ktable(struct pfr_ktable *);
164void pfr_setflags_ktables(struct pfr_ktableworkq *);
165void pfr_setflags_ktable(struct pfr_ktable *, int);
166void pfr_clstats_ktables(struct pfr_ktableworkq *, long,
167 int);
168void pfr_clstats_ktable(struct pfr_ktable *, long, int);
169struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int);
170void pfr_destroy_ktables(struct pfr_ktableworkq *, int);
171void pfr_destroy_ktable(struct pfr_ktable *, int);
172int pfr_ktable_compare(struct pfr_ktable *,
173 struct pfr_ktable *);
174struct pfr_ktable *pfr_lookup_table(struct pfr_table *);
214void pfr_commit_ktable(struct pfr_ktable *, long);
215void pfr_insert_ktables(struct pfr_ktableworkq *);
216void pfr_insert_ktable(struct pfr_ktable *);
217void pfr_setflags_ktables(struct pfr_ktableworkq *);
218void pfr_setflags_ktable(struct pfr_ktable *, int);
219void pfr_clstats_ktables(struct pfr_ktableworkq *, long,
220 int);
221void pfr_clstats_ktable(struct pfr_ktable *, long, int);
222struct pfr_ktable *pfr_create_ktable(struct pfr_table *, long, int);
223void pfr_destroy_ktables(struct pfr_ktableworkq *, int);
224void pfr_destroy_ktable(struct pfr_ktable *, int);
225int pfr_ktable_compare(struct pfr_ktable *,
226 struct pfr_ktable *);
227struct pfr_ktable *pfr_lookup_table(struct pfr_table *);
175void pfr_clean_node_mask(struct pfr_ktable *,
228void pfr_clean_node_mask(struct pfr_ktable *,
176 struct pfr_kentryworkq *);
177int pfr_table_count(struct pfr_table *, int);
178int pfr_skip_table(struct pfr_table *,
179 struct pfr_ktable *, int);
229 struct pfr_kentryworkq *);
230int pfr_table_count(struct pfr_table *, int);
231int pfr_skip_table(struct pfr_table *,
232 struct pfr_ktable *, int);
180struct pfr_kentry *pfr_kentry_byidx(struct pfr_ktable *, int, int);
233struct pfr_kentry *pfr_kentry_byidx(struct pfr_ktable *, int, int);
181
182RB_PROTOTYPE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
183RB_GENERATE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
184
185struct pfr_ktablehead pfr_ktables;
186struct pfr_table pfr_nulltable;
187int pfr_ktable_cnt;
188

--- 18 unchanged lines hidden (view full) ---

207int
208pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
209{
210 struct pfr_ktable *kt;
211 struct pfr_kentryworkq workq;
212 int s;
213
214 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
234
235RB_PROTOTYPE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
236RB_GENERATE(pfr_ktablehead, pfr_ktable, pfrkt_tree, pfr_ktable_compare);
237
238struct pfr_ktablehead pfr_ktables;
239struct pfr_table pfr_nulltable;
240int pfr_ktable_cnt;
241

--- 18 unchanged lines hidden (view full) ---

260int
261pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
262{
263 struct pfr_ktable *kt;
264 struct pfr_kentryworkq workq;
265 int s;
266
267 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
215 if (pfr_validate_table(tbl, 0))
268 if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
216 return (EINVAL);
217 kt = pfr_lookup_table(tbl);
218 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
219 return (ESRCH);
220 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
221 return (EPERM);
222 pfr_enqueue_addrs(kt, &workq, ndel, 0);
223

--- 17 unchanged lines hidden (view full) ---

241 int *nadd, int flags)
242{
243 struct pfr_ktable *kt, *tmpkt;
244 struct pfr_kentryworkq workq;
245 struct pfr_kentry *p, *q;
246 struct pfr_addr ad;
247 int i, rv, s, xadd = 0;
248#ifdef __FreeBSD__
269 return (EINVAL);
270 kt = pfr_lookup_table(tbl);
271 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
272 return (ESRCH);
273 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
274 return (EPERM);
275 pfr_enqueue_addrs(kt, &workq, ndel, 0);
276

--- 17 unchanged lines hidden (view full) ---

294 int *nadd, int flags)
295{
296 struct pfr_ktable *kt, *tmpkt;
297 struct pfr_kentryworkq workq;
298 struct pfr_kentry *p, *q;
299 struct pfr_addr ad;
300 int i, rv, s, xadd = 0;
301#ifdef __FreeBSD__
249 int ec;
250 /*
251 * XXX Is it OK under LP64 environments?
252 */
253 long tzero = (long)time_second;
254#else
255 long tzero = time.tv_sec;
256#endif
257
258 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
302 /*
303 * XXX Is it OK under LP64 environments?
304 */
305 long tzero = (long)time_second;
306#else
307 long tzero = time.tv_sec;
308#endif
309
310 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
259 if (pfr_validate_table(tbl, 0))
311 if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
260 return (EINVAL);
261 kt = pfr_lookup_table(tbl);
262 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
263 return (ESRCH);
264 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
265 return (EPERM);
266 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
267 if (tmpkt == NULL)
268 return (ENOMEM);
269 SLIST_INIT(&workq);
270 for (i = 0; i < size; i++) {
312 return (EINVAL);
313 kt = pfr_lookup_table(tbl);
314 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
315 return (ESRCH);
316 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
317 return (EPERM);
318 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
319 if (tmpkt == NULL)
320 return (ENOMEM);
321 SLIST_INIT(&workq);
322 for (i = 0; i < size; i++) {
271#ifdef __FreeBSD__
272 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
273 if (ec)
323 if (COPYIN(addr+i, &ad, sizeof(ad)))
274 senderr(EFAULT);
324 senderr(EFAULT);
275#else
276 if (copyin(addr+i, &ad, sizeof(ad)))
277 senderr(EFAULT);
278#endif
279 if (pfr_validate_addr(&ad))
280 senderr(EINVAL);
281 p = pfr_lookup_addr(kt, &ad, 1);
282 q = pfr_lookup_addr(tmpkt, &ad, 1);
283 if (flags & PFR_FLAG_FEEDBACK) {
284 if (q != NULL)
285 ad.pfra_fback = PFR_FB_DUPLICATE;
286 else if (p == NULL)

--- 10 unchanged lines hidden (view full) ---

297 if (pfr_route_kentry(tmpkt, p)) {
298 pfr_destroy_kentry(p);
299 ad.pfra_fback = PFR_FB_NONE;
300 } else {
301 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
302 xadd++;
303 }
304 }
325 if (pfr_validate_addr(&ad))
326 senderr(EINVAL);
327 p = pfr_lookup_addr(kt, &ad, 1);
328 q = pfr_lookup_addr(tmpkt, &ad, 1);
329 if (flags & PFR_FLAG_FEEDBACK) {
330 if (q != NULL)
331 ad.pfra_fback = PFR_FB_DUPLICATE;
332 else if (p == NULL)

--- 10 unchanged lines hidden (view full) ---

343 if (pfr_route_kentry(tmpkt, p)) {
344 pfr_destroy_kentry(p);
345 ad.pfra_fback = PFR_FB_NONE;
346 } else {
347 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
348 xadd++;
349 }
350 }
305#ifdef __FreeBSD__
306 if (flags & PFR_FLAG_FEEDBACK) {
351 if (flags & PFR_FLAG_FEEDBACK) {
307 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
308 if (ec)
352 if (COPYOUT(&ad, addr+i, sizeof(ad)))
309 senderr(EFAULT);
310 }
353 senderr(EFAULT);
354 }
311#else
312 if (flags & PFR_FLAG_FEEDBACK)
313 if (copyout(&ad, addr+i, sizeof(ad)))
314 senderr(EFAULT);
315#endif
316 }
317 pfr_clean_node_mask(tmpkt, &workq);
318 if (!(flags & PFR_FLAG_DUMMY)) {
319 if (flags & PFR_FLAG_ATOMIC)
320 s = splsoftnet();
321 pfr_insert_kentries(kt, &workq, tzero);
322 if (flags & PFR_FLAG_ATOMIC)
323 splx(s);
324 } else
325 pfr_destroy_kentries(&workq);
326 if (nadd != NULL)
327 *nadd = xadd;
328 pfr_destroy_ktable(tmpkt, 0);
329 return (0);
330_bad:
331 pfr_clean_node_mask(tmpkt, &workq);
332 pfr_destroy_kentries(&workq);
333 if (flags & PFR_FLAG_FEEDBACK)
355 }
356 pfr_clean_node_mask(tmpkt, &workq);
357 if (!(flags & PFR_FLAG_DUMMY)) {
358 if (flags & PFR_FLAG_ATOMIC)
359 s = splsoftnet();
360 pfr_insert_kentries(kt, &workq, tzero);
361 if (flags & PFR_FLAG_ATOMIC)
362 splx(s);
363 } else
364 pfr_destroy_kentries(&workq);
365 if (nadd != NULL)
366 *nadd = xadd;
367 pfr_destroy_ktable(tmpkt, 0);
368 return (0);
369_bad:
370 pfr_clean_node_mask(tmpkt, &workq);
371 pfr_destroy_kentries(&workq);
372 if (flags & PFR_FLAG_FEEDBACK)
334 pfr_reset_feedback(addr, size);
373 pfr_reset_feedback(addr, size, flags);
335 pfr_destroy_ktable(tmpkt, 0);
336 return (rv);
337}
338
339int
340pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
341 int *ndel, int flags)
342{
343 struct pfr_ktable *kt;
344 struct pfr_kentryworkq workq;
345 struct pfr_kentry *p;
346 struct pfr_addr ad;
347 int i, rv, s, xdel = 0;
374 pfr_destroy_ktable(tmpkt, 0);
375 return (rv);
376}
377
378int
379pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
380 int *ndel, int flags)
381{
382 struct pfr_ktable *kt;
383 struct pfr_kentryworkq workq;
384 struct pfr_kentry *p;
385 struct pfr_addr ad;
386 int i, rv, s, xdel = 0;
348#ifdef __FreeBSD__
349 int ec;
350#endif
351
352 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
387
388 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
353 if (pfr_validate_table(tbl, 0))
389 if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
354 return (EINVAL);
355 kt = pfr_lookup_table(tbl);
356 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
357 return (ESRCH);
358 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
359 return (EPERM);
360 pfr_mark_addrs(kt);
361 SLIST_INIT(&workq);
362 for (i = 0; i < size; i++) {
390 return (EINVAL);
391 kt = pfr_lookup_table(tbl);
392 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
393 return (ESRCH);
394 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
395 return (EPERM);
396 pfr_mark_addrs(kt);
397 SLIST_INIT(&workq);
398 for (i = 0; i < size; i++) {
363#ifdef __FreeBSD__
364 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
365 if (ec)
399 if (COPYIN(addr+i, &ad, sizeof(ad)))
366 senderr(EFAULT);
400 senderr(EFAULT);
367#else
368 if (copyin(addr+i, &ad, sizeof(ad)))
369 senderr(EFAULT);
370#endif
371 if (pfr_validate_addr(&ad))
372 senderr(EINVAL);
373 p = pfr_lookup_addr(kt, &ad, 1);
374 if (flags & PFR_FLAG_FEEDBACK) {
375 if (p == NULL)
376 ad.pfra_fback = PFR_FB_NONE;
377 else if (p->pfrke_not != ad.pfra_not)
378 ad.pfra_fback = PFR_FB_CONFLICT;
379 else if (p->pfrke_mark)
380 ad.pfra_fback = PFR_FB_DUPLICATE;
381 else
382 ad.pfra_fback = PFR_FB_DELETED;
383 }
384 if (p != NULL && p->pfrke_not == ad.pfra_not &&
385 !p->pfrke_mark) {
386 p->pfrke_mark = 1;
387 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
388 xdel++;
389 }
401 if (pfr_validate_addr(&ad))
402 senderr(EINVAL);
403 p = pfr_lookup_addr(kt, &ad, 1);
404 if (flags & PFR_FLAG_FEEDBACK) {
405 if (p == NULL)
406 ad.pfra_fback = PFR_FB_NONE;
407 else if (p->pfrke_not != ad.pfra_not)
408 ad.pfra_fback = PFR_FB_CONFLICT;
409 else if (p->pfrke_mark)
410 ad.pfra_fback = PFR_FB_DUPLICATE;
411 else
412 ad.pfra_fback = PFR_FB_DELETED;
413 }
414 if (p != NULL && p->pfrke_not == ad.pfra_not &&
415 !p->pfrke_mark) {
416 p->pfrke_mark = 1;
417 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
418 xdel++;
419 }
390#ifdef __FreeBSD__
391 if (flags & PFR_FLAG_FEEDBACK) {
392 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
393 if (ec)
394 senderr(EFAULT);
395 }
396#else
397 if (flags & PFR_FLAG_FEEDBACK)
420 if (flags & PFR_FLAG_FEEDBACK)
398 if (copyout(&ad, addr+i, sizeof(ad)))
421 if (COPYOUT(&ad, addr+i, sizeof(ad)))
399 senderr(EFAULT);
422 senderr(EFAULT);
400#endif
401 }
402 if (!(flags & PFR_FLAG_DUMMY)) {
403 if (flags & PFR_FLAG_ATOMIC)
404 s = splsoftnet();
405 pfr_remove_kentries(kt, &workq);
406 if (flags & PFR_FLAG_ATOMIC)
407 splx(s);
408 }
409 if (ndel != NULL)
410 *ndel = xdel;
411 return (0);
412_bad:
413 if (flags & PFR_FLAG_FEEDBACK)
423 }
424 if (!(flags & PFR_FLAG_DUMMY)) {
425 if (flags & PFR_FLAG_ATOMIC)
426 s = splsoftnet();
427 pfr_remove_kentries(kt, &workq);
428 if (flags & PFR_FLAG_ATOMIC)
429 splx(s);
430 }
431 if (ndel != NULL)
432 *ndel = xdel;
433 return (0);
434_bad:
435 if (flags & PFR_FLAG_FEEDBACK)
414 pfr_reset_feedback(addr, size);
436 pfr_reset_feedback(addr, size, flags);
415 return (rv);
416}
417
418int
419pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
420 int *size2, int *nadd, int *ndel, int *nchange, int flags)
421{
422 struct pfr_ktable *kt, *tmpkt;
423 struct pfr_kentryworkq addq, delq, changeq;
424 struct pfr_kentry *p, *q;
425 struct pfr_addr ad;
426 int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
427#ifdef __FreeBSD__
437 return (rv);
438}
439
440int
441pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
442 int *size2, int *nadd, int *ndel, int *nchange, int flags)
443{
444 struct pfr_ktable *kt, *tmpkt;
445 struct pfr_kentryworkq addq, delq, changeq;
446 struct pfr_kentry *p, *q;
447 struct pfr_addr ad;
448 int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
449#ifdef __FreeBSD__
428 int ec;
429 /*
430 * XXX Is it OK under LP64 environments?
431 */
432 long tzero = (long)time_second;
433#else
434 long tzero = time.tv_sec;
435#endif
436
437 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
450 /*
451 * XXX Is it OK under LP64 environments?
452 */
453 long tzero = (long)time_second;
454#else
455 long tzero = time.tv_sec;
456#endif
457
458 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
438 if (pfr_validate_table(tbl, 0))
459 if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
439 return (EINVAL);
440 kt = pfr_lookup_table(tbl);
441 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
442 return (ESRCH);
443 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
444 return (EPERM);
445 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
446 if (tmpkt == NULL)
447 return (ENOMEM);
448 pfr_mark_addrs(kt);
449 SLIST_INIT(&addq);
450 SLIST_INIT(&delq);
451 SLIST_INIT(&changeq);
452 for (i = 0; i < size; i++) {
460 return (EINVAL);
461 kt = pfr_lookup_table(tbl);
462 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
463 return (ESRCH);
464 if (kt->pfrkt_flags & PFR_TFLAG_CONST)
465 return (EPERM);
466 tmpkt = pfr_create_ktable(&pfr_nulltable, 0, 0);
467 if (tmpkt == NULL)
468 return (ENOMEM);
469 pfr_mark_addrs(kt);
470 SLIST_INIT(&addq);
471 SLIST_INIT(&delq);
472 SLIST_INIT(&changeq);
473 for (i = 0; i < size; i++) {
453#ifdef __FreeBSD__
454 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
455 if (ec)
474 if (COPYIN(addr+i, &ad, sizeof(ad)))
456 senderr(EFAULT);
475 senderr(EFAULT);
457#else
458 if (copyin(addr+i, &ad, sizeof(ad)))
459 senderr(EFAULT);
460#endif
461 if (pfr_validate_addr(&ad))
462 senderr(EINVAL);
463 ad.pfra_fback = PFR_FB_NONE;
464 p = pfr_lookup_addr(kt, &ad, 1);
465 if (p != NULL) {
466 if (p->pfrke_mark) {
467 ad.pfra_fback = PFR_FB_DUPLICATE;
468 goto _skip;

--- 18 unchanged lines hidden (view full) ---

487 ad.pfra_fback = PFR_FB_NONE;
488 } else {
489 SLIST_INSERT_HEAD(&addq, p, pfrke_workq);
490 ad.pfra_fback = PFR_FB_ADDED;
491 xadd++;
492 }
493 }
494_skip:
476 if (pfr_validate_addr(&ad))
477 senderr(EINVAL);
478 ad.pfra_fback = PFR_FB_NONE;
479 p = pfr_lookup_addr(kt, &ad, 1);
480 if (p != NULL) {
481 if (p->pfrke_mark) {
482 ad.pfra_fback = PFR_FB_DUPLICATE;
483 goto _skip;

--- 18 unchanged lines hidden (view full) ---

502 ad.pfra_fback = PFR_FB_NONE;
503 } else {
504 SLIST_INSERT_HEAD(&addq, p, pfrke_workq);
505 ad.pfra_fback = PFR_FB_ADDED;
506 xadd++;
507 }
508 }
509_skip:
495#ifdef __FreeBSD__
496 if (flags & PFR_FLAG_FEEDBACK) {
497 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
498 if (ec)
499 senderr(EFAULT);
500 }
501#else
502 if (flags & PFR_FLAG_FEEDBACK)
510 if (flags & PFR_FLAG_FEEDBACK)
503 if (copyout(&ad, addr+i, sizeof(ad)))
511 if (COPYOUT(&ad, addr+i, sizeof(ad)))
504 senderr(EFAULT);
512 senderr(EFAULT);
505#endif
506 }
507 pfr_enqueue_addrs(kt, &delq, &xdel, ENQUEUE_UNMARKED_ONLY);
508 if ((flags & PFR_FLAG_FEEDBACK) && *size2) {
509 if (*size2 < size+xdel) {
510 *size2 = size+xdel;
511 senderr(0);
512 }
513 i = 0;
514 SLIST_FOREACH(p, &delq, pfrke_workq) {
515 pfr_copyout_addr(&ad, p);
516 ad.pfra_fback = PFR_FB_DELETED;
513 }
514 pfr_enqueue_addrs(kt, &delq, &xdel, ENQUEUE_UNMARKED_ONLY);
515 if ((flags & PFR_FLAG_FEEDBACK) && *size2) {
516 if (*size2 < size+xdel) {
517 *size2 = size+xdel;
518 senderr(0);
519 }
520 i = 0;
521 SLIST_FOREACH(p, &delq, pfrke_workq) {
522 pfr_copyout_addr(&ad, p);
523 ad.pfra_fback = PFR_FB_DELETED;
517#ifdef __FreeBSD__
518 PF_COPYOUT(&ad, addr+size+i, sizeof(ad), ec);
519 if (ec)
524 if (COPYOUT(&ad, addr+size+i, sizeof(ad)))
520 senderr(EFAULT);
525 senderr(EFAULT);
521#else
522 if (copyout(&ad, addr+size+i, sizeof(ad)))
523 senderr(EFAULT);
524#endif
525 i++;
526 }
527 }
528 pfr_clean_node_mask(tmpkt, &addq);
529 if (!(flags & PFR_FLAG_DUMMY)) {
530 if (flags & PFR_FLAG_ATOMIC)
531 s = splsoftnet();
532 pfr_insert_kentries(kt, &addq, tzero);

--- 4 unchanged lines hidden (view full) ---

537 } else
538 pfr_destroy_kentries(&addq);
539 if (nadd != NULL)
540 *nadd = xadd;
541 if (ndel != NULL)
542 *ndel = xdel;
543 if (nchange != NULL)
544 *nchange = xchange;
526 i++;
527 }
528 }
529 pfr_clean_node_mask(tmpkt, &addq);
530 if (!(flags & PFR_FLAG_DUMMY)) {
531 if (flags & PFR_FLAG_ATOMIC)
532 s = splsoftnet();
533 pfr_insert_kentries(kt, &addq, tzero);

--- 4 unchanged lines hidden (view full) ---

538 } else
539 pfr_destroy_kentries(&addq);
540 if (nadd != NULL)
541 *nadd = xadd;
542 if (ndel != NULL)
543 *ndel = xdel;
544 if (nchange != NULL)
545 *nchange = xchange;
545 if ((flags & PFR_FLAG_FEEDBACK) && *size2)
546 if ((flags & PFR_FLAG_FEEDBACK) && size2)
546 *size2 = size+xdel;
547 pfr_destroy_ktable(tmpkt, 0);
548 return (0);
549_bad:
550 pfr_clean_node_mask(tmpkt, &addq);
551 pfr_destroy_kentries(&addq);
552 if (flags & PFR_FLAG_FEEDBACK)
547 *size2 = size+xdel;
548 pfr_destroy_ktable(tmpkt, 0);
549 return (0);
550_bad:
551 pfr_clean_node_mask(tmpkt, &addq);
552 pfr_destroy_kentries(&addq);
553 if (flags & PFR_FLAG_FEEDBACK)
553 pfr_reset_feedback(addr, size);
554 pfr_reset_feedback(addr, size, flags);
554 pfr_destroy_ktable(tmpkt, 0);
555 return (rv);
556}
557
558int
559pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
560 int *nmatch, int flags)
561{
562 struct pfr_ktable *kt;
563 struct pfr_kentry *p;
564 struct pfr_addr ad;
565 int i, xmatch = 0;
555 pfr_destroy_ktable(tmpkt, 0);
556 return (rv);
557}
558
559int
560pfr_tst_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
561 int *nmatch, int flags)
562{
563 struct pfr_ktable *kt;
564 struct pfr_kentry *p;
565 struct pfr_addr ad;
566 int i, xmatch = 0;
566#ifdef __FreeBSD__
567 int ec;
568#endif
569
570 ACCEPT_FLAGS(PFR_FLAG_REPLACE);
567
568 ACCEPT_FLAGS(PFR_FLAG_REPLACE);
571 if (pfr_validate_table(tbl, 0))
569 if (pfr_validate_table(tbl, 0, 0))
572 return (EINVAL);
573 kt = pfr_lookup_table(tbl);
574 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
575 return (ESRCH);
576
577 for (i = 0; i < size; i++) {
570 return (EINVAL);
571 kt = pfr_lookup_table(tbl);
572 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
573 return (ESRCH);
574
575 for (i = 0; i < size; i++) {
578#ifdef __FreeBSD__
579 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
580 if (ec)
576 if (COPYIN(addr+i, &ad, sizeof(ad)))
581 return (EFAULT);
577 return (EFAULT);
582#else
583 if (copyin(addr+i, &ad, sizeof(ad)))
584 return (EFAULT);
585#endif
586 if (pfr_validate_addr(&ad))
587 return (EINVAL);
588 if (ADDR_NETWORK(&ad))
589 return (EINVAL);
590 p = pfr_lookup_addr(kt, &ad, 0);
591 if (flags & PFR_FLAG_REPLACE)
592 pfr_copyout_addr(&ad, p);
593 ad.pfra_fback = (p == NULL) ? PFR_FB_NONE :
594 (p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH);
595 if (p != NULL && !p->pfrke_not)
596 xmatch++;
578 if (pfr_validate_addr(&ad))
579 return (EINVAL);
580 if (ADDR_NETWORK(&ad))
581 return (EINVAL);
582 p = pfr_lookup_addr(kt, &ad, 0);
583 if (flags & PFR_FLAG_REPLACE)
584 pfr_copyout_addr(&ad, p);
585 ad.pfra_fback = (p == NULL) ? PFR_FB_NONE :
586 (p->pfrke_not ? PFR_FB_NOTMATCH : PFR_FB_MATCH);
587 if (p != NULL && !p->pfrke_not)
588 xmatch++;
597#ifdef __FreeBSD__
598 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
599 if (ec)
589 if (COPYOUT(&ad, addr+i, sizeof(ad)))
600 return (EFAULT);
590 return (EFAULT);
601#else
602 if (copyout(&ad, addr+i, sizeof(ad)))
603 return (EFAULT);
604#endif
605 }
606 if (nmatch != NULL)
607 *nmatch = xmatch;
608 return (0);
609}
610
611int
612pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,
613 int flags)
614{
615 struct pfr_ktable *kt;
616 struct pfr_walktree w;
617 int rv;
618
619 ACCEPT_FLAGS(0);
591 }
592 if (nmatch != NULL)
593 *nmatch = xmatch;
594 return (0);
595}
596
597int
598pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,
599 int flags)
600{
601 struct pfr_ktable *kt;
602 struct pfr_walktree w;
603 int rv;
604
605 ACCEPT_FLAGS(0);
620 if (pfr_validate_table(tbl, 0))
606 if (pfr_validate_table(tbl, 0, 0))
621 return (EINVAL);
622 kt = pfr_lookup_table(tbl);
623 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
624 return (ESRCH);
625 if (kt->pfrkt_cnt > *size) {
626 *size = kt->pfrkt_cnt;
627 return (0);
628 }
629
630 bzero(&w, sizeof(w));
631 w.pfrw_op = PFRW_GET_ADDRS;
632 w.pfrw_addr = addr;
633 w.pfrw_free = kt->pfrkt_cnt;
607 return (EINVAL);
608 kt = pfr_lookup_table(tbl);
609 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
610 return (ESRCH);
611 if (kt->pfrkt_cnt > *size) {
612 *size = kt->pfrkt_cnt;
613 return (0);
614 }
615
616 bzero(&w, sizeof(w));
617 w.pfrw_op = PFRW_GET_ADDRS;
618 w.pfrw_addr = addr;
619 w.pfrw_free = kt->pfrkt_cnt;
620 w.pfrw_flags = flags;
634#ifdef __FreeBSD__
635 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
636#else
637 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
638#endif
639 if (!rv)
640#ifdef __FreeBSD__
641 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,

--- 26 unchanged lines hidden (view full) ---

668 * XXX Is it OK under LP64 environments?
669 */
670 long tzero = (long)time_second;
671#else
672 long tzero = time.tv_sec;
673#endif
674
675 ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
621#ifdef __FreeBSD__
622 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
623#else
624 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
625#endif
626 if (!rv)
627#ifdef __FreeBSD__
628 rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,

--- 26 unchanged lines hidden (view full) ---

655 * XXX Is it OK under LP64 environments?
656 */
657 long tzero = (long)time_second;
658#else
659 long tzero = time.tv_sec;
660#endif
661
662 ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
676 if (pfr_validate_table(tbl, 0))
663 if (pfr_validate_table(tbl, 0, 0))
677 return (EINVAL);
678 kt = pfr_lookup_table(tbl);
679 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
680 return (ESRCH);
681 if (kt->pfrkt_cnt > *size) {
682 *size = kt->pfrkt_cnt;
683 return (0);
684 }
685
686 bzero(&w, sizeof(w));
687 w.pfrw_op = PFRW_GET_ASTATS;
688 w.pfrw_astats = addr;
689 w.pfrw_free = kt->pfrkt_cnt;
664 return (EINVAL);
665 kt = pfr_lookup_table(tbl);
666 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
667 return (ESRCH);
668 if (kt->pfrkt_cnt > *size) {
669 *size = kt->pfrkt_cnt;
670 return (0);
671 }
672
673 bzero(&w, sizeof(w));
674 w.pfrw_op = PFRW_GET_ASTATS;
675 w.pfrw_astats = addr;
676 w.pfrw_free = kt->pfrkt_cnt;
677 w.pfrw_flags = flags;
690 if (flags & PFR_FLAG_ATOMIC)
691 s = splsoftnet();
692#ifdef __FreeBSD__
693 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
694#else
695 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
696#endif
697 if (!rv)

--- 25 unchanged lines hidden (view full) ---

723pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
724 int *nzero, int flags)
725{
726 struct pfr_ktable *kt;
727 struct pfr_kentryworkq workq;
728 struct pfr_kentry *p;
729 struct pfr_addr ad;
730 int i, rv, s, xzero = 0;
678 if (flags & PFR_FLAG_ATOMIC)
679 s = splsoftnet();
680#ifdef __FreeBSD__
681 rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
682#else
683 rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
684#endif
685 if (!rv)

--- 25 unchanged lines hidden (view full) ---

711pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
712 int *nzero, int flags)
713{
714 struct pfr_ktable *kt;
715 struct pfr_kentryworkq workq;
716 struct pfr_kentry *p;
717 struct pfr_addr ad;
718 int i, rv, s, xzero = 0;
731#ifdef __FreeBSD__
732 int ec;
733#endif
734
735 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
719
720 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
736 if (pfr_validate_table(tbl, 0))
721 if (pfr_validate_table(tbl, 0, 0))
737 return (EINVAL);
738 kt = pfr_lookup_table(tbl);
739 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
740 return (ESRCH);
741 SLIST_INIT(&workq);
742 for (i = 0; i < size; i++) {
722 return (EINVAL);
723 kt = pfr_lookup_table(tbl);
724 if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
725 return (ESRCH);
726 SLIST_INIT(&workq);
727 for (i = 0; i < size; i++) {
743#ifdef __FreeBSD__
744 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
745 if (ec)
728 if (COPYIN(addr+i, &ad, sizeof(ad)))
746 senderr(EFAULT);
729 senderr(EFAULT);
747#else
748 if (copyin(addr+i, &ad, sizeof(ad)))
749 senderr(EFAULT);
750#endif
751 if (pfr_validate_addr(&ad))
752 senderr(EINVAL);
753 p = pfr_lookup_addr(kt, &ad, 1);
754 if (flags & PFR_FLAG_FEEDBACK) {
755 ad.pfra_fback = (p != NULL) ?
756 PFR_FB_CLEARED : PFR_FB_NONE;
730 if (pfr_validate_addr(&ad))
731 senderr(EINVAL);
732 p = pfr_lookup_addr(kt, &ad, 1);
733 if (flags & PFR_FLAG_FEEDBACK) {
734 ad.pfra_fback = (p != NULL) ?
735 PFR_FB_CLEARED : PFR_FB_NONE;
757#ifdef __FreeBSD__
758 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
759 if (ec)
736 if (COPYOUT(&ad, addr+i, sizeof(ad)))
760 senderr(EFAULT);
737 senderr(EFAULT);
761#else
762 if (copyout(&ad, addr+i, sizeof(ad)))
763 senderr(EFAULT);
764#endif
765 }
766 if (p != NULL) {
767 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
768 xzero++;
769 }
770 }
771
772 if (!(flags & PFR_FLAG_DUMMY)) {
773 if (flags & PFR_FLAG_ATOMIC)
774 s = splsoftnet();
775 pfr_clstats_kentries(&workq, 0, 0);
776 if (flags & PFR_FLAG_ATOMIC)
777 splx(s);
778 }
779 if (nzero != NULL)
780 *nzero = xzero;
781 return (0);
782_bad:
783 if (flags & PFR_FLAG_FEEDBACK)
738 }
739 if (p != NULL) {
740 SLIST_INSERT_HEAD(&workq, p, pfrke_workq);
741 xzero++;
742 }
743 }
744
745 if (!(flags & PFR_FLAG_DUMMY)) {
746 if (flags & PFR_FLAG_ATOMIC)
747 s = splsoftnet();
748 pfr_clstats_kentries(&workq, 0, 0);
749 if (flags & PFR_FLAG_ATOMIC)
750 splx(s);
751 }
752 if (nzero != NULL)
753 *nzero = xzero;
754 return (0);
755_bad:
756 if (flags & PFR_FLAG_FEEDBACK)
784 pfr_reset_feedback(addr, size);
757 pfr_reset_feedback(addr, size, flags);
785 return (rv);
786}
787
788int
789pfr_validate_addr(struct pfr_addr *ad)
790{
791 int i;
792

--- 184 unchanged lines hidden (view full) ---

977 kt->pfrkt_cnt -= n;
978 pfr_destroy_kentries(workq);
979}
980
981void
982pfr_clean_node_mask(struct pfr_ktable *kt,
983 struct pfr_kentryworkq *workq)
984{
758 return (rv);
759}
760
761int
762pfr_validate_addr(struct pfr_addr *ad)
763{
764 int i;
765

--- 184 unchanged lines hidden (view full) ---

950 kt->pfrkt_cnt -= n;
951 pfr_destroy_kentries(workq);
952}
953
954void
955pfr_clean_node_mask(struct pfr_ktable *kt,
956 struct pfr_kentryworkq *workq)
957{
985 struct pfr_kentry *p;
958 struct pfr_kentry *p;
986
959
987 SLIST_FOREACH(p, workq, pfrke_workq)
988 pfr_unroute_kentry(kt, p);
960 SLIST_FOREACH(p, workq, pfrke_workq)
961 pfr_unroute_kentry(kt, p);
989}
990
991void
992pfr_clstats_kentries(struct pfr_kentryworkq *workq, long tzero, int negchange)
993{
994 struct pfr_kentry *p;
995 int s;
996

--- 4 unchanged lines hidden (view full) ---

1001 bzero(p->pfrke_packets, sizeof(p->pfrke_packets));
1002 bzero(p->pfrke_bytes, sizeof(p->pfrke_bytes));
1003 splx(s);
1004 p->pfrke_tzero = tzero;
1005 }
1006}
1007
1008void
962}
963
964void
965pfr_clstats_kentries(struct pfr_kentryworkq *workq, long tzero, int negchange)
966{
967 struct pfr_kentry *p;
968 int s;
969

--- 4 unchanged lines hidden (view full) ---

974 bzero(p->pfrke_packets, sizeof(p->pfrke_packets));
975 bzero(p->pfrke_bytes, sizeof(p->pfrke_bytes));
976 splx(s);
977 p->pfrke_tzero = tzero;
978 }
979}
980
981void
1009pfr_reset_feedback(struct pfr_addr *addr, int size)
982pfr_reset_feedback(struct pfr_addr *addr, int size, int flags)
1010{
1011 struct pfr_addr ad;
1012 int i;
983{
984 struct pfr_addr ad;
985 int i;
1013#ifdef __FreeBSD__
1014 int ec;
1015#endif
1016
1017 for (i = 0; i < size; i++) {
986
987 for (i = 0; i < size; i++) {
1018#ifdef __FreeBSD__
1019 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
1020 if (ec)
988 if (COPYIN(addr+i, &ad, sizeof(ad)))
1021 break;
989 break;
1022#else
1023 if (copyin(addr+i, &ad, sizeof(ad)))
1024 break;
1025#endif
1026 ad.pfra_fback = PFR_FB_NONE;
990 ad.pfra_fback = PFR_FB_NONE;
1027#ifdef __FreeBSD__
1028 PF_COPYOUT(&ad, addr+i, sizeof(ad), ec);
1029 if (ec)
991 if (COPYOUT(&ad, addr+i, sizeof(ad)))
1030 break;
992 break;
1031#else
1032 if (copyout(&ad, addr+i, sizeof(ad)))
1033 break;
1034#endif
1035 }
1036}
1037
1038void
1039pfr_prepare_network(union sockaddr_union *sa, int af, int net)
1040{
1041 int i;
1042

--- 97 unchanged lines hidden (view full) ---

1140 ad->pfra_ip6addr = ke->pfrke_sa.sin6.sin6_addr;
1141}
1142
1143int
1144pfr_walktree(struct radix_node *rn, void *arg)
1145{
1146 struct pfr_kentry *ke = (struct pfr_kentry *)rn;
1147 struct pfr_walktree *w = arg;
993 }
994}
995
996void
997pfr_prepare_network(union sockaddr_union *sa, int af, int net)
998{
999 int i;
1000

--- 97 unchanged lines hidden (view full) ---

1098 ad->pfra_ip6addr = ke->pfrke_sa.sin6.sin6_addr;
1099}
1100
1101int
1102pfr_walktree(struct radix_node *rn, void *arg)
1103{
1104 struct pfr_kentry *ke = (struct pfr_kentry *)rn;
1105 struct pfr_walktree *w = arg;
1148 int s;
1149#ifdef __FreeBSD__
1150 int ec;
1151#endif
1106 int s, flags = w->pfrw_flags;
1152
1153 switch (w->pfrw_op) {
1154 case PFRW_MARK:
1155 ke->pfrke_mark = 0;
1156 break;
1157 case PFRW_SWEEP:
1158 if (ke->pfrke_mark)
1159 break;
1107
1108 switch (w->pfrw_op) {
1109 case PFRW_MARK:
1110 ke->pfrke_mark = 0;
1111 break;
1112 case PFRW_SWEEP:
1113 if (ke->pfrke_mark)
1114 break;
1160 /* fall trough */
1115 /* FALLTHROUGH */
1161 case PFRW_ENQUEUE:
1162 SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq);
1163 w->pfrw_cnt++;
1164 break;
1165 case PFRW_GET_ADDRS:
1166 if (w->pfrw_free-- > 0) {
1167 struct pfr_addr ad;
1168
1169 pfr_copyout_addr(&ad, ke);
1116 case PFRW_ENQUEUE:
1117 SLIST_INSERT_HEAD(w->pfrw_workq, ke, pfrke_workq);
1118 w->pfrw_cnt++;
1119 break;
1120 case PFRW_GET_ADDRS:
1121 if (w->pfrw_free-- > 0) {
1122 struct pfr_addr ad;
1123
1124 pfr_copyout_addr(&ad, ke);
1170#ifdef __FreeBSD__
1171 PF_COPYOUT(&ad, w->pfrw_addr, sizeof(ad), ec);
1172 if (ec)
1173 return (EFAULT);
1174#else
1175 if (copyout(&ad, w->pfrw_addr, sizeof(ad)))
1176 return (EFAULT);
1125 if (copyout(&ad, w->pfrw_addr, sizeof(ad)))
1126 return (EFAULT);
1177#endif
1178 w->pfrw_addr++;
1179 }
1180 break;
1181 case PFRW_GET_ASTATS:
1182 if (w->pfrw_free-- > 0) {
1183 struct pfr_astats as;
1184
1185 pfr_copyout_addr(&as.pfras_a, ke);
1186
1187 s = splsoftnet();
1188 bcopy(ke->pfrke_packets, as.pfras_packets,
1189 sizeof(as.pfras_packets));
1190 bcopy(ke->pfrke_bytes, as.pfras_bytes,
1191 sizeof(as.pfras_bytes));
1192 splx(s);
1193 as.pfras_tzero = ke->pfrke_tzero;
1194
1127 w->pfrw_addr++;
1128 }
1129 break;
1130 case PFRW_GET_ASTATS:
1131 if (w->pfrw_free-- > 0) {
1132 struct pfr_astats as;
1133
1134 pfr_copyout_addr(&as.pfras_a, ke);
1135
1136 s = splsoftnet();
1137 bcopy(ke->pfrke_packets, as.pfras_packets,
1138 sizeof(as.pfras_packets));
1139 bcopy(ke->pfrke_bytes, as.pfras_bytes,
1140 sizeof(as.pfras_bytes));
1141 splx(s);
1142 as.pfras_tzero = ke->pfrke_tzero;
1143
1195#ifdef __FreeBSD__
1196 PF_COPYOUT(&as, w->pfrw_astats, sizeof(as), ec);
1197 if (ec)
1144 if (COPYOUT(&as, w->pfrw_astats, sizeof(as)))
1198 return (EFAULT);
1145 return (EFAULT);
1199#else
1200 if (copyout(&as, w->pfrw_astats, sizeof(as)))
1201 return (EFAULT);
1202#endif
1203 w->pfrw_astats++;
1204 }
1205 break;
1206 case PFRW_POOL_GET:
1207 if (ke->pfrke_not)
1208 break; /* negative entries are ignored */
1209 if (!w->pfrw_cnt--) {
1210 w->pfrw_kentry = ke;
1211 return (1); /* finish search */
1212 }
1213 break;
1146 w->pfrw_astats++;
1147 }
1148 break;
1149 case PFRW_POOL_GET:
1150 if (ke->pfrke_not)
1151 break; /* negative entries are ignored */
1152 if (!w->pfrw_cnt--) {
1153 w->pfrw_kentry = ke;
1154 return (1); /* finish search */
1155 }
1156 break;
1157 case PFRW_DYNADDR_UPDATE:
1158 if (ke->pfrke_af == AF_INET) {
1159 if (w->pfrw_dyn->pfid_acnt4++ > 0)
1160 break;
1161 pfr_prepare_network(&pfr_mask, AF_INET, ke->pfrke_net);
1162 w->pfrw_dyn->pfid_addr4 = *SUNION2PF(
1163 &ke->pfrke_sa, AF_INET);
1164 w->pfrw_dyn->pfid_mask4 = *SUNION2PF(
1165 &pfr_mask, AF_INET);
1166 } else {
1167 if (w->pfrw_dyn->pfid_acnt6++ > 0)
1168 break;
1169 pfr_prepare_network(&pfr_mask, AF_INET6, ke->pfrke_net);
1170 w->pfrw_dyn->pfid_addr6 = *SUNION2PF(
1171 &ke->pfrke_sa, AF_INET6);
1172 w->pfrw_dyn->pfid_mask6 = *SUNION2PF(
1173 &pfr_mask, AF_INET6);
1174 }
1175 break;
1214 }
1215 return (0);
1216}
1217
1218int
1219pfr_clr_tables(struct pfr_table *filter, int *ndel, int flags)
1220{
1221 struct pfr_ktableworkq workq;
1222 struct pfr_ktable *p;
1223 int s, xdel = 0;
1224
1225 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ALLRSETS);
1226 if (pfr_table_count(filter, flags) < 0)
1227 return (ENOENT);
1228
1229 SLIST_INIT(&workq);
1230 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1231 if (pfr_skip_table(filter, p, flags))
1232 continue;
1176 }
1177 return (0);
1178}
1179
1180int
1181pfr_clr_tables(struct pfr_table *filter, int *ndel, int flags)
1182{
1183 struct pfr_ktableworkq workq;
1184 struct pfr_ktable *p;
1185 int s, xdel = 0;
1186
1187 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ALLRSETS);
1188 if (pfr_table_count(filter, flags) < 0)
1189 return (ENOENT);
1190
1191 SLIST_INIT(&workq);
1192 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1193 if (pfr_skip_table(filter, p, flags))
1194 continue;
1195 if (!strcmp(p->pfrkt_anchor, PF_RESERVED_ANCHOR))
1196 continue;
1233 if (!(p->pfrkt_flags & PFR_TFLAG_ACTIVE))
1234 continue;
1235 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;
1236 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1237 xdel++;
1238 }
1239 if (!(flags & PFR_FLAG_DUMMY)) {
1240 if (flags & PFR_FLAG_ATOMIC)

--- 9 unchanged lines hidden (view full) ---

1250
1251int
1252pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
1253{
1254 struct pfr_ktableworkq addq, changeq;
1255 struct pfr_ktable *p, *q, *r, key;
1256 int i, rv, s, xadd = 0;
1257#ifdef __FreeBSD__
1197 if (!(p->pfrkt_flags & PFR_TFLAG_ACTIVE))
1198 continue;
1199 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;
1200 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1201 xdel++;
1202 }
1203 if (!(flags & PFR_FLAG_DUMMY)) {
1204 if (flags & PFR_FLAG_ATOMIC)

--- 9 unchanged lines hidden (view full) ---

1214
1215int
1216pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
1217{
1218 struct pfr_ktableworkq addq, changeq;
1219 struct pfr_ktable *p, *q, *r, key;
1220 int i, rv, s, xadd = 0;
1221#ifdef __FreeBSD__
1258 int ec;
1259 /*
1260 * XXX Is it OK under LP64 environments?
1261 */
1262 long tzero = (long)time_second;
1263#else
1264 long tzero = time.tv_sec;
1265#endif
1266
1267 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1268 SLIST_INIT(&addq);
1269 SLIST_INIT(&changeq);
1270 for (i = 0; i < size; i++) {
1222 /*
1223 * XXX Is it OK under LP64 environments?
1224 */
1225 long tzero = (long)time_second;
1226#else
1227 long tzero = time.tv_sec;
1228#endif
1229
1230 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1231 SLIST_INIT(&addq);
1232 SLIST_INIT(&changeq);
1233 for (i = 0; i < size; i++) {
1271#ifdef __FreeBSD__
1272 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1273 if (ec)
1234 if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1274 senderr(EFAULT);
1235 senderr(EFAULT);
1275#else
1276 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1277 senderr(EFAULT);
1278#endif
1279 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK))
1236 if (pfr_validate_table(&key.pfrkt_t, PFR_TFLAG_USRMASK,
1237 flags & PFR_FLAG_USERIOCTL))
1280 senderr(EINVAL);
1281 key.pfrkt_flags |= PFR_TFLAG_ACTIVE;
1282 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1283 if (p == NULL) {
1284 p = pfr_create_ktable(&key.pfrkt_t, tzero, 1);
1285 if (p == NULL)
1286 senderr(ENOMEM);
1287 SLIST_FOREACH(q, &addq, pfrkt_workq) {

--- 55 unchanged lines hidden (view full) ---

1343}
1344
1345int
1346pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
1347{
1348 struct pfr_ktableworkq workq;
1349 struct pfr_ktable *p, *q, key;
1350 int i, s, xdel = 0;
1238 senderr(EINVAL);
1239 key.pfrkt_flags |= PFR_TFLAG_ACTIVE;
1240 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1241 if (p == NULL) {
1242 p = pfr_create_ktable(&key.pfrkt_t, tzero, 1);
1243 if (p == NULL)
1244 senderr(ENOMEM);
1245 SLIST_FOREACH(q, &addq, pfrkt_workq) {

--- 55 unchanged lines hidden (view full) ---

1301}
1302
1303int
1304pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
1305{
1306 struct pfr_ktableworkq workq;
1307 struct pfr_ktable *p, *q, key;
1308 int i, s, xdel = 0;
1351#ifdef __FreeBSD__
1352 int ec;
1353#endif
1354
1355 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1356 SLIST_INIT(&workq);
1357 for (i = 0; i < size; i++) {
1309
1310 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1311 SLIST_INIT(&workq);
1312 for (i = 0; i < size; i++) {
1358#ifdef __FreeBSD__
1359 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1360 if (ec)
1313 if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1361 return (EFAULT);
1314 return (EFAULT);
1362#else
1363 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1364 return (EFAULT);
1365#endif
1366 if (pfr_validate_table(&key.pfrkt_t, 0))
1315 if (pfr_validate_table(&key.pfrkt_t, 0,
1316 flags & PFR_FLAG_USERIOCTL))
1367 return (EINVAL);
1368 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1369 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1370 SLIST_FOREACH(q, &workq, pfrkt_workq)
1371 if (!pfr_ktable_compare(p, q))
1372 goto _skip;
1373 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;
1374 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);

--- 16 unchanged lines hidden (view full) ---

1391}
1392
1393int
1394pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
1395 int flags)
1396{
1397 struct pfr_ktable *p;
1398 int n, nn;
1317 return (EINVAL);
1318 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1319 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1320 SLIST_FOREACH(q, &workq, pfrkt_workq)
1321 if (!pfr_ktable_compare(p, q))
1322 goto _skip;
1323 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_ACTIVE;
1324 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);

--- 16 unchanged lines hidden (view full) ---

1341}
1342
1343int
1344pfr_get_tables(struct pfr_table *filter, struct pfr_table *tbl, int *size,
1345 int flags)
1346{
1347 struct pfr_ktable *p;
1348 int n, nn;
1399#ifdef __FreeBSD__
1400 int ec;
1401#endif
1402
1403 ACCEPT_FLAGS(PFR_FLAG_ALLRSETS);
1404 n = nn = pfr_table_count(filter, flags);
1405 if (n < 0)
1406 return (ENOENT);
1407 if (n > *size) {
1408 *size = n;
1409 return (0);
1410 }
1411 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1412 if (pfr_skip_table(filter, p, flags))
1413 continue;
1414 if (n-- <= 0)
1415 continue;
1349
1350 ACCEPT_FLAGS(PFR_FLAG_ALLRSETS);
1351 n = nn = pfr_table_count(filter, flags);
1352 if (n < 0)
1353 return (ENOENT);
1354 if (n > *size) {
1355 *size = n;
1356 return (0);
1357 }
1358 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1359 if (pfr_skip_table(filter, p, flags))
1360 continue;
1361 if (n-- <= 0)
1362 continue;
1416#ifdef __FreeBSD__
1417 PF_COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl), ec);
1418 if (ec)
1363 if (COPYOUT(&p->pfrkt_t, tbl++, sizeof(*tbl)))
1419 return (EFAULT);
1364 return (EFAULT);
1420#else
1421 if (copyout(&p->pfrkt_t, tbl++, sizeof(*tbl)))
1422 return (EFAULT);
1423#endif
1424 }
1425 if (n) {
1426 printf("pfr_get_tables: corruption detected (%d).\n", n);
1427 return (ENOTTY);
1428 }
1429 *size = nn;
1430 return (0);
1431}
1432
1433int
1434pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
1435 int flags)
1436{
1437 struct pfr_ktable *p;
1438 struct pfr_ktableworkq workq;
1439 int s, n, nn;
1440#ifdef __FreeBSD__
1365 }
1366 if (n) {
1367 printf("pfr_get_tables: corruption detected (%d).\n", n);
1368 return (ENOTTY);
1369 }
1370 *size = nn;
1371 return (0);
1372}
1373
1374int
1375pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
1376 int flags)
1377{
1378 struct pfr_ktable *p;
1379 struct pfr_ktableworkq workq;
1380 int s, n, nn;
1381#ifdef __FreeBSD__
1441 int ec;
1442 /*
1443 * XXX Is it OK under LP64 environments?
1444 */
1445 long tzero = (long)time_second;
1446#else
1447 long tzero = time.tv_sec;
1448#endif
1449

--- 11 unchanged lines hidden (view full) ---

1461 s = splsoftnet();
1462 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1463 if (pfr_skip_table(filter, p, flags))
1464 continue;
1465 if (n-- <= 0)
1466 continue;
1467 if (!(flags & PFR_FLAG_ATOMIC))
1468 s = splsoftnet();
1382 /*
1383 * XXX Is it OK under LP64 environments?
1384 */
1385 long tzero = (long)time_second;
1386#else
1387 long tzero = time.tv_sec;
1388#endif
1389

--- 11 unchanged lines hidden (view full) ---

1401 s = splsoftnet();
1402 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1403 if (pfr_skip_table(filter, p, flags))
1404 continue;
1405 if (n-- <= 0)
1406 continue;
1407 if (!(flags & PFR_FLAG_ATOMIC))
1408 s = splsoftnet();
1469#ifdef __FreeBSD__
1470 PF_COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl), ec);
1471 if (ec) {
1409 if (COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
1472 splx(s);
1473 return (EFAULT);
1474 }
1410 splx(s);
1411 return (EFAULT);
1412 }
1475#else
1476 if (copyout(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
1477 splx(s);
1478 return (EFAULT);
1479 }
1480#endif
1481 if (!(flags & PFR_FLAG_ATOMIC))
1482 splx(s);
1483 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1484 }
1485 if (flags & PFR_FLAG_CLSTATS)
1486 pfr_clstats_ktables(&workq, tzero,
1487 flags & PFR_FLAG_ADDRSTOO);
1488 if (flags & PFR_FLAG_ATOMIC)

--- 8 unchanged lines hidden (view full) ---

1497
1498int
1499pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
1500{
1501 struct pfr_ktableworkq workq;
1502 struct pfr_ktable *p, key;
1503 int i, s, xzero = 0;
1504#ifdef __FreeBSD__
1413 if (!(flags & PFR_FLAG_ATOMIC))
1414 splx(s);
1415 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1416 }
1417 if (flags & PFR_FLAG_CLSTATS)
1418 pfr_clstats_ktables(&workq, tzero,
1419 flags & PFR_FLAG_ADDRSTOO);
1420 if (flags & PFR_FLAG_ATOMIC)

--- 8 unchanged lines hidden (view full) ---

1429
1430int
1431pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
1432{
1433 struct pfr_ktableworkq workq;
1434 struct pfr_ktable *p, key;
1435 int i, s, xzero = 0;
1436#ifdef __FreeBSD__
1505 int ec;
1506 /*
1507 * XXX Is it OK under LP64 environments?
1508 */
1509 long tzero = (long)time_second;
1510#else
1511 long tzero = time.tv_sec;
1512#endif
1513
1514 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
1515 SLIST_INIT(&workq);
1516 for (i = 0; i < size; i++) {
1437 /*
1438 * XXX Is it OK under LP64 environments?
1439 */
1440 long tzero = (long)time_second;
1441#else
1442 long tzero = time.tv_sec;
1443#endif
1444
1445 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
1446 SLIST_INIT(&workq);
1447 for (i = 0; i < size; i++) {
1517#ifdef __FreeBSD__
1518 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1519 if (ec)
1448 if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1520 return (EFAULT);
1449 return (EFAULT);
1521#else
1522 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1523 return (EFAULT);
1524#endif
1525 if (pfr_validate_table(&key.pfrkt_t, 0))
1450 if (pfr_validate_table(&key.pfrkt_t, 0, 0))
1526 return (EINVAL);
1527 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1528 if (p != NULL) {
1529 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1530 xzero++;
1531 }
1532 }
1533 if (!(flags & PFR_FLAG_DUMMY)) {

--- 10 unchanged lines hidden (view full) ---

1544
1545int
1546pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
1547 int *nchange, int *ndel, int flags)
1548{
1549 struct pfr_ktableworkq workq;
1550 struct pfr_ktable *p, *q, key;
1551 int i, s, xchange = 0, xdel = 0;
1451 return (EINVAL);
1452 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1453 if (p != NULL) {
1454 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1455 xzero++;
1456 }
1457 }
1458 if (!(flags & PFR_FLAG_DUMMY)) {

--- 10 unchanged lines hidden (view full) ---

1469
1470int
1471pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
1472 int *nchange, int *ndel, int flags)
1473{
1474 struct pfr_ktableworkq workq;
1475 struct pfr_ktable *p, *q, key;
1476 int i, s, xchange = 0, xdel = 0;
1552#ifdef __FreeBSD__
1553 int ec;
1554#endif
1555
1556 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1557 if ((setflag & ~PFR_TFLAG_USRMASK) ||
1558 (clrflag & ~PFR_TFLAG_USRMASK) ||
1559 (setflag & clrflag))
1560 return (EINVAL);
1561 SLIST_INIT(&workq);
1562 for (i = 0; i < size; i++) {
1477
1478 ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
1479 if ((setflag & ~PFR_TFLAG_USRMASK) ||
1480 (clrflag & ~PFR_TFLAG_USRMASK) ||
1481 (setflag & clrflag))
1482 return (EINVAL);
1483 SLIST_INIT(&workq);
1484 for (i = 0; i < size; i++) {
1563#ifdef __FreeBSD__
1564 PF_COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t), ec);
1565 if (ec)
1485 if (COPYIN(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1566 return (EFAULT);
1486 return (EFAULT);
1567#else
1568 if (copyin(tbl+i, &key.pfrkt_t, sizeof(key.pfrkt_t)))
1569 return (EFAULT);
1570#endif
1571 if (pfr_validate_table(&key.pfrkt_t, 0))
1487 if (pfr_validate_table(&key.pfrkt_t, 0,
1488 flags & PFR_FLAG_USERIOCTL))
1572 return (EINVAL);
1573 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1574 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1575 p->pfrkt_nflags = (p->pfrkt_flags | setflag) &
1576 ~clrflag;
1577 if (p->pfrkt_nflags == p->pfrkt_flags)
1578 goto _skip;
1579 SLIST_FOREACH(q, &workq, pfrkt_workq)

--- 63 unchanged lines hidden (view full) ---

1643{
1644 struct pfr_ktableworkq tableq;
1645 struct pfr_kentryworkq addrq;
1646 struct pfr_ktable *kt, *rt, *shadow, key;
1647 struct pfr_kentry *p;
1648 struct pfr_addr ad;
1649 struct pf_ruleset *rs;
1650 int i, rv, xadd = 0, xaddr = 0;
1489 return (EINVAL);
1490 p = RB_FIND(pfr_ktablehead, &pfr_ktables, &key);
1491 if (p != NULL && (p->pfrkt_flags & PFR_TFLAG_ACTIVE)) {
1492 p->pfrkt_nflags = (p->pfrkt_flags | setflag) &
1493 ~clrflag;
1494 if (p->pfrkt_nflags == p->pfrkt_flags)
1495 goto _skip;
1496 SLIST_FOREACH(q, &workq, pfrkt_workq)

--- 63 unchanged lines hidden (view full) ---

1560{
1561 struct pfr_ktableworkq tableq;
1562 struct pfr_kentryworkq addrq;
1563 struct pfr_ktable *kt, *rt, *shadow, key;
1564 struct pfr_kentry *p;
1565 struct pfr_addr ad;
1566 struct pf_ruleset *rs;
1567 int i, rv, xadd = 0, xaddr = 0;
1651#ifdef __FreeBSD__
1652 int ec;
1653#endif
1654
1655 ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO);
1656 if (size && !(flags & PFR_FLAG_ADDRSTOO))
1657 return (EINVAL);
1568
1569 ACCEPT_FLAGS(PFR_FLAG_DUMMY|PFR_FLAG_ADDRSTOO);
1570 if (size && !(flags & PFR_FLAG_ADDRSTOO))
1571 return (EINVAL);
1658 if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK))
1572 if (pfr_validate_table(tbl, PFR_TFLAG_USRMASK,
1573 flags & PFR_FLAG_USERIOCTL))
1659 return (EINVAL);
1660 rs = pf_find_ruleset(tbl->pfrt_anchor, tbl->pfrt_ruleset);
1661 if (rs == NULL || !rs->topen || ticket != rs->tticket)
1662 return (EBUSY);
1663 tbl->pfrt_flags |= PFR_TFLAG_INACTIVE;
1664 SLIST_INIT(&tableq);
1665 kt = RB_FIND(pfr_ktablehead, &pfr_ktables, (struct pfr_ktable *)tbl);
1666 if (kt == NULL) {

--- 25 unchanged lines hidden (view full) ---

1692_skip:
1693 shadow = pfr_create_ktable(tbl, 0, 0);
1694 if (shadow == NULL) {
1695 pfr_destroy_ktables(&tableq, 0);
1696 return (ENOMEM);
1697 }
1698 SLIST_INIT(&addrq);
1699 for (i = 0; i < size; i++) {
1574 return (EINVAL);
1575 rs = pf_find_ruleset(tbl->pfrt_anchor, tbl->pfrt_ruleset);
1576 if (rs == NULL || !rs->topen || ticket != rs->tticket)
1577 return (EBUSY);
1578 tbl->pfrt_flags |= PFR_TFLAG_INACTIVE;
1579 SLIST_INIT(&tableq);
1580 kt = RB_FIND(pfr_ktablehead, &pfr_ktables, (struct pfr_ktable *)tbl);
1581 if (kt == NULL) {

--- 25 unchanged lines hidden (view full) ---

1607_skip:
1608 shadow = pfr_create_ktable(tbl, 0, 0);
1609 if (shadow == NULL) {
1610 pfr_destroy_ktables(&tableq, 0);
1611 return (ENOMEM);
1612 }
1613 SLIST_INIT(&addrq);
1614 for (i = 0; i < size; i++) {
1700#ifdef __FreeBSD__
1701 PF_COPYIN(addr+i, &ad, sizeof(ad), ec);
1702 if (ec)
1615 if (COPYIN(addr+i, &ad, sizeof(ad)))
1703 senderr(EFAULT);
1616 senderr(EFAULT);
1704#else
1705 if (copyin(addr+i, &ad, sizeof(ad)))
1706 senderr(EFAULT);
1707#endif
1708 if (pfr_validate_addr(&ad))
1709 senderr(EINVAL);
1710 if (pfr_lookup_addr(shadow, &ad, 1) != NULL)
1711 continue;
1712 p = pfr_create_kentry(&ad);
1713 if (p == NULL)
1714 senderr(ENOMEM);
1715 if (pfr_route_kentry(shadow, p)) {

--- 25 unchanged lines hidden (view full) ---

1741_bad:
1742 pfr_destroy_ktable(shadow, 0);
1743 pfr_destroy_ktables(&tableq, 0);
1744 pfr_destroy_kentries(&addrq);
1745 return (rv);
1746}
1747
1748int
1617 if (pfr_validate_addr(&ad))
1618 senderr(EINVAL);
1619 if (pfr_lookup_addr(shadow, &ad, 1) != NULL)
1620 continue;
1621 p = pfr_create_kentry(&ad);
1622 if (p == NULL)
1623 senderr(ENOMEM);
1624 if (pfr_route_kentry(shadow, p)) {

--- 25 unchanged lines hidden (view full) ---

1650_bad:
1651 pfr_destroy_ktable(shadow, 0);
1652 pfr_destroy_ktables(&tableq, 0);
1653 pfr_destroy_kentries(&addrq);
1654 return (rv);
1655}
1656
1657int
1658pfr_ina_rollback(struct pfr_table *trs, u_int32_t ticket, int *ndel, int flags)
1659{
1660 struct pfr_ktableworkq workq;
1661 struct pfr_ktable *p;
1662 struct pf_ruleset *rs;
1663 int xdel = 0;
1664
1665 ACCEPT_FLAGS(PFR_FLAG_DUMMY);
1666 rs = pf_find_ruleset(trs->pfrt_anchor, trs->pfrt_ruleset);
1667 if (rs == NULL || !rs->topen || ticket != rs->tticket)
1668 return (0);
1669 SLIST_INIT(&workq);
1670 RB_FOREACH(p, pfr_ktablehead, &pfr_ktables) {
1671 if (!(p->pfrkt_flags & PFR_TFLAG_INACTIVE) ||
1672 pfr_skip_table(trs, p, 0))
1673 continue;
1674 p->pfrkt_nflags = p->pfrkt_flags & ~PFR_TFLAG_INACTIVE;
1675 SLIST_INSERT_HEAD(&workq, p, pfrkt_workq);
1676 xdel++;
1677 }
1678 if (!(flags & PFR_FLAG_DUMMY)) {
1679 pfr_setflags_ktables(&workq);
1680 rs->topen = 0;
1681 pf_remove_if_empty_ruleset(rs);
1682 }
1683 if (ndel != NULL)
1684 *ndel = xdel;
1685 return (0);
1686}
1687
1688int
1749pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
1750 int *nchange, int flags)
1751{
1752 struct pfr_ktable *p;
1753 struct pfr_ktableworkq workq;
1754 struct pf_ruleset *rs;
1755 int s, xadd = 0, xchange = 0;
1756#ifdef __FreeBSD__

--- 95 unchanged lines hidden (view full) ---

1852 (kt->pfrkt_flags & PFR_TFLAG_SETMASK) | PFR_TFLAG_ACTIVE)
1853 & ~PFR_TFLAG_INACTIVE;
1854 pfr_destroy_ktable(shadow, 0);
1855 kt->pfrkt_shadow = NULL;
1856 pfr_setflags_ktable(kt, nflags);
1857}
1858
1859int
1689pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
1690 int *nchange, int flags)
1691{
1692 struct pfr_ktable *p;
1693 struct pfr_ktableworkq workq;
1694 struct pf_ruleset *rs;
1695 int s, xadd = 0, xchange = 0;
1696#ifdef __FreeBSD__

--- 95 unchanged lines hidden (view full) ---

1792 (kt->pfrkt_flags & PFR_TFLAG_SETMASK) | PFR_TFLAG_ACTIVE)
1793 & ~PFR_TFLAG_INACTIVE;
1794 pfr_destroy_ktable(shadow, 0);
1795 kt->pfrkt_shadow = NULL;
1796 pfr_setflags_ktable(kt, nflags);
1797}
1798
1799int
1860pfr_validate_table(struct pfr_table *tbl, int allowedflags)
1800pfr_validate_table(struct pfr_table *tbl, int allowedflags, int no_reserved)
1861{
1862 int i;
1863
1864 if (!tbl->pfrt_name[0])
1865 return (-1);
1801{
1802 int i;
1803
1804 if (!tbl->pfrt_name[0])
1805 return (-1);
1806 if (no_reserved && !strcmp(tbl->pfrt_anchor, PF_RESERVED_ANCHOR))
1807 return (-1);
1866 if (tbl->pfrt_name[PF_TABLE_NAME_SIZE-1])
1867 return (-1);
1868 for (i = strlen(tbl->pfrt_name); i < PF_TABLE_NAME_SIZE; i++)
1869 if (tbl->pfrt_name[i])
1870 return (-1);
1871 if (tbl->pfrt_flags & ~allowedflags)
1872 return (-1);
1873 return (0);

--- 212 unchanged lines hidden (view full) ---

2086{
2087 int d;
2088
2089 if ((d = strncmp(p->pfrkt_name, q->pfrkt_name, PF_TABLE_NAME_SIZE)))
2090 return (d);
2091 if ((d = strncmp(p->pfrkt_anchor, q->pfrkt_anchor,
2092 PF_ANCHOR_NAME_SIZE)))
2093 return (d);
1808 if (tbl->pfrt_name[PF_TABLE_NAME_SIZE-1])
1809 return (-1);
1810 for (i = strlen(tbl->pfrt_name); i < PF_TABLE_NAME_SIZE; i++)
1811 if (tbl->pfrt_name[i])
1812 return (-1);
1813 if (tbl->pfrt_flags & ~allowedflags)
1814 return (-1);
1815 return (0);

--- 212 unchanged lines hidden (view full) ---

2028{
2029 int d;
2030
2031 if ((d = strncmp(p->pfrkt_name, q->pfrkt_name, PF_TABLE_NAME_SIZE)))
2032 return (d);
2033 if ((d = strncmp(p->pfrkt_anchor, q->pfrkt_anchor,
2034 PF_ANCHOR_NAME_SIZE)))
2035 return (d);
2094 return strncmp(p->pfrkt_ruleset, q->pfrkt_ruleset,
2095 PF_RULESET_NAME_SIZE);
2036 return (strncmp(p->pfrkt_ruleset, q->pfrkt_ruleset,
2037 PF_RULESET_NAME_SIZE));
2096}
2097
2098struct pfr_ktable *
2099pfr_lookup_table(struct pfr_table *tbl)
2100{
2101 /* struct pfr_ktable start like a struct pfr_table */
2038}
2039
2040struct pfr_ktable *
2041pfr_lookup_table(struct pfr_table *tbl)
2042{
2043 /* struct pfr_ktable start like a struct pfr_table */
2102 return RB_FIND(pfr_ktablehead, &pfr_ktables, (struct pfr_ktable *)tbl);
2044 return (RB_FIND(pfr_ktablehead, &pfr_ktables,
2045 (struct pfr_ktable *)tbl));
2103}
2104
2105int
2106pfr_match_addr(struct pfr_ktable *kt, struct pf_addr *a, sa_family_t af)
2107{
2108 struct pfr_kentry *ke = NULL;
2109 int match;
2110
2111 if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE) && kt->pfrkt_root != NULL)
2112 kt = kt->pfrkt_root;
2113 if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
2046}
2047
2048int
2049pfr_match_addr(struct pfr_ktable *kt, struct pf_addr *a, sa_family_t af)
2050{
2051 struct pfr_kentry *ke = NULL;
2052 int match;
2053
2054 if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE) && kt->pfrkt_root != NULL)
2055 kt = kt->pfrkt_root;
2056 if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
2114 return 0;
2057 return (0);
2115
2116 switch (af) {
2117 case AF_INET:
2118 pfr_sin.sin_addr.s_addr = a->addr32[0];
2119 ke = (struct pfr_kentry *)rn_match(&pfr_sin, kt->pfrkt_ip4);
2120 if (ke && KENTRY_RNF_ROOT(ke))
2121 ke = NULL;
2122 break;

--- 88 unchanged lines hidden (view full) ---

2211 pfr_insert_ktable(rt);
2212 }
2213 kt->pfrkt_root = rt;
2214 }
2215 pfr_insert_ktable(kt);
2216 }
2217 if (!kt->pfrkt_refcnt[PFR_REFCNT_RULE]++)
2218 pfr_setflags_ktable(kt, kt->pfrkt_flags|PFR_TFLAG_REFERENCED);
2058
2059 switch (af) {
2060 case AF_INET:
2061 pfr_sin.sin_addr.s_addr = a->addr32[0];
2062 ke = (struct pfr_kentry *)rn_match(&pfr_sin, kt->pfrkt_ip4);
2063 if (ke && KENTRY_RNF_ROOT(ke))
2064 ke = NULL;
2065 break;

--- 88 unchanged lines hidden (view full) ---

2154 pfr_insert_ktable(rt);
2155 }
2156 kt->pfrkt_root = rt;
2157 }
2158 pfr_insert_ktable(kt);
2159 }
2160 if (!kt->pfrkt_refcnt[PFR_REFCNT_RULE]++)
2161 pfr_setflags_ktable(kt, kt->pfrkt_flags|PFR_TFLAG_REFERENCED);
2219 return kt;
2162 return (kt);
2220}
2221
2222void
2223pfr_detach_table(struct pfr_ktable *kt)
2224{
2225 if (kt->pfrkt_refcnt[PFR_REFCNT_RULE] <= 0)
2226 printf("pfr_detach_table: refcount = %d.\n",
2227 kt->pfrkt_refcnt[PFR_REFCNT_RULE]);

--- 50 unchanged lines hidden (view full) ---

2278 if (!KENTRY_NETWORK(ke)) {
2279 /* this is a single IP address - no possible nested block */
2280 PF_ACPY(counter, addr, af);
2281 *pidx = idx;
2282 return (0);
2283 }
2284 for (;;) {
2285 /* we don't want to use a nested block */
2163}
2164
2165void
2166pfr_detach_table(struct pfr_ktable *kt)
2167{
2168 if (kt->pfrkt_refcnt[PFR_REFCNT_RULE] <= 0)
2169 printf("pfr_detach_table: refcount = %d.\n",
2170 kt->pfrkt_refcnt[PFR_REFCNT_RULE]);

--- 50 unchanged lines hidden (view full) ---

2221 if (!KENTRY_NETWORK(ke)) {
2222 /* this is a single IP address - no possible nested block */
2223 PF_ACPY(counter, addr, af);
2224 *pidx = idx;
2225 return (0);
2226 }
2227 for (;;) {
2228 /* we don't want to use a nested block */
2286 ke2 = (struct pfr_kentry *)(af == AF_INET ?
2229 ke2 = (struct pfr_kentry *)(af == AF_INET ?
2287 rn_match(&pfr_sin, kt->pfrkt_ip4) :
2288 rn_match(&pfr_sin6, kt->pfrkt_ip6));
2289 /* no need to check KENTRY_RNF_ROOT() here */
2290 if (ke2 == ke) {
2291 /* lookup return the same block - perfect */
2292 PF_ACPY(counter, addr, af);
2293 *pidx = idx;
2294 return (0);

--- 13 unchanged lines hidden (view full) ---

2308 }
2309}
2310
2311struct pfr_kentry *
2312pfr_kentry_byidx(struct pfr_ktable *kt, int idx, int af)
2313{
2314 struct pfr_walktree w;
2315
2230 rn_match(&pfr_sin, kt->pfrkt_ip4) :
2231 rn_match(&pfr_sin6, kt->pfrkt_ip6));
2232 /* no need to check KENTRY_RNF_ROOT() here */
2233 if (ke2 == ke) {
2234 /* lookup return the same block - perfect */
2235 PF_ACPY(counter, addr, af);
2236 *pidx = idx;
2237 return (0);

--- 13 unchanged lines hidden (view full) ---

2251 }
2252}
2253
2254struct pfr_kentry *
2255pfr_kentry_byidx(struct pfr_ktable *kt, int idx, int af)
2256{
2257 struct pfr_walktree w;
2258
2316 bzero(&w, sizeof(w));
2317 w.pfrw_op = PFRW_POOL_GET;
2318 w.pfrw_cnt = idx;
2259 bzero(&w, sizeof(w));
2260 w.pfrw_op = PFRW_POOL_GET;
2261 w.pfrw_cnt = idx;
2319
2262
2320 switch(af) {
2263 switch (af) {
2321 case AF_INET:
2322#ifdef __FreeBSD__
2323 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2324#else
2325 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2326#endif
2264 case AF_INET:
2265#ifdef __FreeBSD__
2266 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2267#else
2268 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2269#endif
2327 return w.pfrw_kentry;
2270 return (w.pfrw_kentry);
2328 case AF_INET6:
2329#ifdef __FreeBSD__
2330 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2331#else
2332 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2333#endif
2271 case AF_INET6:
2272#ifdef __FreeBSD__
2273 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2274#else
2275 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2276#endif
2334 return w.pfrw_kentry;
2277 return (w.pfrw_kentry);
2335 default:
2278 default:
2336 return NULL;
2279 return (NULL);
2337 }
2338}
2280 }
2281}
2282
2283void
2284pfr_dynaddr_update(struct pfr_ktable *kt, struct pfi_dynaddr *dyn)
2285{
2286 struct pfr_walktree w;
2287 int s;
2288
2289 bzero(&w, sizeof(w));
2290 w.pfrw_op = PFRW_DYNADDR_UPDATE;
2291 w.pfrw_dyn = dyn;
2292
2293 s = splsoftnet();
2294 dyn->pfid_acnt4 = 0;
2295 dyn->pfid_acnt6 = 0;
2296 if (!dyn->pfid_af || dyn->pfid_af == AF_INET)
2297#ifdef __FreeBSD__
2298 kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2299#else
2300 rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
2301#endif
2302 if (!dyn->pfid_af || dyn->pfid_af == AF_INET6)
2303#ifdef __FreeBSD__
2304 kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2305#else
2306 rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
2307#endif
2308 splx(s);
2309}