Deleted Added
full compact
pfil.h (210121) pfil.h (241888)
1/* $FreeBSD: head/sys/net/pfil.h 210121 2010-07-15 14:41:06Z luigi $ */
1/* $FreeBSD: head/sys/net/pfil.h 241888 2012-10-22 14:10:17Z melifaro $ */
2/* $NetBSD: pfil.h,v 1.22 2003/06/23 12:57:08 martin Exp $ */
3
4/*-
5 * Copyright (c) 1996 Matthew R. Green
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

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

59#define PFIL_WAITOK 0x00000004
60#define PFIL_ALL (PFIL_IN|PFIL_OUT)
61
62typedef TAILQ_HEAD(pfil_list, packet_filter_hook) pfil_list_t;
63
64#define PFIL_TYPE_AF 1 /* key is AF_* type */
65#define PFIL_TYPE_IFNET 2 /* key is ifnet pointer */
66
2/* $NetBSD: pfil.h,v 1.22 2003/06/23 12:57:08 martin Exp $ */
3
4/*-
5 * Copyright (c) 1996 Matthew R. Green
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

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

59#define PFIL_WAITOK 0x00000004
60#define PFIL_ALL (PFIL_IN|PFIL_OUT)
61
62typedef TAILQ_HEAD(pfil_list, packet_filter_hook) pfil_list_t;
63
64#define PFIL_TYPE_AF 1 /* key is AF_* type */
65#define PFIL_TYPE_IFNET 2 /* key is ifnet pointer */
66
67#define PFIL_FLAG_PRIVATE_LOCK 0x01 /* Personal lock instead of global */
68
67struct pfil_head {
68 pfil_list_t ph_in;
69 pfil_list_t ph_out;
70 int ph_type;
71 int ph_nhooks;
72#if defined( __linux__ ) || defined( _WIN32 )
73 rwlock_t ph_mtx;
74#else
69struct pfil_head {
70 pfil_list_t ph_in;
71 pfil_list_t ph_out;
72 int ph_type;
73 int ph_nhooks;
74#if defined( __linux__ ) || defined( _WIN32 )
75 rwlock_t ph_mtx;
76#else
75 struct rmlock ph_lock;
77 struct rmlock *ph_plock; /* Pointer to the used lock */
78 struct rmlock ph_lock; /* Private lock storage */
79 int flags;
76#endif
77 union {
78 u_long phu_val;
79 void *phu_ptr;
80 } ph_un;
81#define ph_af ph_un.phu_val
82#define ph_ifnet ph_un.phu_ptr
83 LIST_ENTRY(pfil_head) ph_list;
84};
85
86int pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *,
87 int, struct inpcb *), void *, int, struct pfil_head *);
88int pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *,
89 int, struct inpcb *), void *, int, struct pfil_head *);
90int pfil_run_hooks(struct pfil_head *, struct mbuf **, struct ifnet *,
91 int, struct inpcb *inp);
92
80#endif
81 union {
82 u_long phu_val;
83 void *phu_ptr;
84 } ph_un;
85#define ph_af ph_un.phu_val
86#define ph_ifnet ph_un.phu_ptr
87 LIST_ENTRY(pfil_head) ph_list;
88};
89
90int pfil_add_hook(int (*func)(void *, struct mbuf **, struct ifnet *,
91 int, struct inpcb *), void *, int, struct pfil_head *);
92int pfil_remove_hook(int (*func)(void *, struct mbuf **, struct ifnet *,
93 int, struct inpcb *), void *, int, struct pfil_head *);
94int pfil_run_hooks(struct pfil_head *, struct mbuf **, struct ifnet *,
95 int, struct inpcb *inp);
96
97struct rm_priotracker; /* Do not require including rmlock header */
98int pfil_try_rlock(struct pfil_head *, struct rm_priotracker *);
99void pfil_rlock(struct pfil_head *, struct rm_priotracker *);
100void pfil_runlock(struct pfil_head *, struct rm_priotracker *);
101void pfil_wlock(struct pfil_head *);
102void pfil_wunlock(struct pfil_head *);
103int pfil_wowned(struct pfil_head *ph);
104
93int pfil_head_register(struct pfil_head *);
94int pfil_head_unregister(struct pfil_head *);
95
96struct pfil_head *pfil_head_get(int, u_long);
97
98#define PFIL_HOOKED(p) ((p)->ph_nhooks > 0)
105int pfil_head_register(struct pfil_head *);
106int pfil_head_unregister(struct pfil_head *);
107
108struct pfil_head *pfil_head_get(int, u_long);
109
110#define PFIL_HOOKED(p) ((p)->ph_nhooks > 0)
99#define PFIL_LOCK_INIT(p) \
100 rm_init_flags(&(p)->ph_lock, "PFil hook read/write mutex", RM_RECURSE)
101#define PFIL_LOCK_DESTROY(p) rm_destroy(&(p)->ph_lock)
102#define PFIL_RLOCK(p, t) rm_rlock(&(p)->ph_lock, (t))
103#define PFIL_WLOCK(p) rm_wlock(&(p)->ph_lock)
104#define PFIL_RUNLOCK(p, t) rm_runlock(&(p)->ph_lock, (t))
105#define PFIL_WUNLOCK(p) rm_wunlock(&(p)->ph_lock)
106#define PFIL_LIST_LOCK() mtx_lock(&pfil_global_lock)
107#define PFIL_LIST_UNLOCK() mtx_unlock(&pfil_global_lock)
111#define PFIL_LOCK_INIT_REAL(l, t) \
112 rm_init_flags(l, "PFil " t " rmlock", RM_RECURSE)
113#define PFIL_LOCK_DESTROY_REAL(l) \
114 rm_destroy(l)
115#define PFIL_LOCK_INIT(p) do { \
116 if ((p)->flags & PFIL_FLAG_PRIVATE_LOCK) { \
117 PFIL_LOCK_INIT_REAL(&(p)->ph_lock, "private"); \
118 (p)->ph_plock = &(p)->ph_lock; \
119 } else \
120 (p)->ph_plock = &V_pfil_lock; \
121} while (0)
122#define PFIL_LOCK_DESTROY(p) do { \
123 if ((p)->flags & PFIL_FLAG_PRIVATE_LOCK) \
124 PFIL_LOCK_DESTROY_REAL((p)->ph_plock); \
125} while (0)
126#define PFIL_TRY_RLOCK(p, t) rm_try_rlock((p)->ph_plock, (t))
127#define PFIL_RLOCK(p, t) rm_rlock((p)->ph_plock, (t))
128#define PFIL_WLOCK(p) rm_wlock((p)->ph_plock)
129#define PFIL_RUNLOCK(p, t) rm_runlock((p)->ph_plock, (t))
130#define PFIL_WUNLOCK(p) rm_wunlock((p)->ph_plock)
131#define PFIL_WOWNED(p) rm_wowned((p)->ph_plock)
132#define PFIL_LIST_LOCK() mtx_lock(&pfil_global_lock)
133#define PFIL_LIST_UNLOCK() mtx_unlock(&pfil_global_lock)
108
109static __inline struct packet_filter_hook *
110pfil_hook_get(int dir, struct pfil_head *ph)
111{
112
113 if (dir == PFIL_IN)
114 return (TAILQ_FIRST(&ph->ph_in));
115 else if (dir == PFIL_OUT)
116 return (TAILQ_FIRST(&ph->ph_out));
117 else
118 return (NULL);
119}
120
121#endif /* _NET_PFIL_H_ */
134
135static __inline struct packet_filter_hook *
136pfil_hook_get(int dir, struct pfil_head *ph)
137{
138
139 if (dir == PFIL_IN)
140 return (TAILQ_FIRST(&ph->ph_in));
141 else if (dir == PFIL_OUT)
142 return (TAILQ_FIRST(&ph->ph_out));
143 else
144 return (NULL);
145}
146
147#endif /* _NET_PFIL_H_ */