- compat layer extended through the full BSD API surface pf_ioctl/pf_lb/ pf_if/pf_norm/pf_table/pf_ruleset/radix/md5/sha2 need (all compile): cpumem/counters model, ifaddr/ifg groups, cred view, endian+in6 names, NAT46/64, SipHash24, mbuf_list, frag6 helpers, ip6 forward/checksum, tcp options/FSM names, taskqueue & sysctl shims (documented in docs/porting-notes.md) - pfsrc/divert_sock.c: real BSD divert(4) as runtime-registered PF_DIVERT=32 socket family inside the module (sock_register; NPROTO=AF_MAX=45 -> zero core patches); divert_packet/divert6_packet wired for pf.c - compat/pfk_ifq.c: OpenBSD 8.0 ifq framework with priq back end; hfsc and fq_codel aliases pending M5 (recorded in feature matrix as pending) - design + plan updated for the divert decision (user-requested) - stage-port.sh: single deterministic rename program for headers and .c
39 lines
1000 B
C
39 lines
1000 B
C
/* PFLINUX compat: <sys/refcnt.h> — refcount_t wrapper with OpenBSD API */
|
|
#ifndef _PFK_REFCNT_H
|
|
#define _PFK_REFCNT_H
|
|
#include <linux/refcount.h>
|
|
|
|
struct refcnt { refcount_t rc; };
|
|
#define REFCNT_INITIALIZER { .rc = REFCNT_INIT }
|
|
|
|
static inline void refcnt_init(struct refcnt *r)
|
|
{
|
|
refcount_set(&r->rc, 1);
|
|
}
|
|
static inline unsigned int refcnt_value(const struct refcnt *r)
|
|
{
|
|
return refcount_read((refcount_t *)&r->rc);
|
|
}
|
|
static inline void refcnt_take(struct refcnt *r)
|
|
{
|
|
refcount_inc(&r->rc);
|
|
}
|
|
/* returns true if ref was valid and taken (OpenBSD refcnt_take_if) */
|
|
static inline bool refcnt_take_not0(struct refcnt *r)
|
|
{
|
|
return refcount_inc_not_zero(&r->rc);
|
|
}
|
|
static inline unsigned int refcnt_rele(struct refcnt *r)
|
|
{
|
|
return (unsigned int)refcount_dec_and_test(&r->rc) ?
|
|
refcnt_value(r) : refcnt_value(r) + 1;
|
|
}
|
|
static inline unsigned int refcnt_rele_wake(struct refcnt *r)
|
|
{
|
|
return refcnt_rele(r);
|
|
}
|
|
static inline void refcnt_finalize(struct refcnt *r, const void *unused)
|
|
{
|
|
}
|
|
#endif
|