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_ */ |