1744bfb21SJohn Baldwin /* SPDX-License-Identifier: MIT 2744bfb21SJohn Baldwin * 3744bfb21SJohn Baldwin * Copyright (C) 2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4744bfb21SJohn Baldwin * Copyright (c) 2022 The FreeBSD Foundation 5744bfb21SJohn Baldwin * 6744bfb21SJohn Baldwin * compat.h contains code that is backported from FreeBSD's main branch. 7744bfb21SJohn Baldwin * It is different from support.h, which is for code that is not _yet_ upstream. 8744bfb21SJohn Baldwin */ 9744bfb21SJohn Baldwin 10744bfb21SJohn Baldwin #include <sys/param.h> 11744bfb21SJohn Baldwin 12744bfb21SJohn Baldwin #if (__FreeBSD_version < 1400036 && __FreeBSD_version >= 1400000) || __FreeBSD_version < 1300519 13744bfb21SJohn Baldwin #define COMPAT_NEED_CHACHA20POLY1305_MBUF 14744bfb21SJohn Baldwin #endif 15744bfb21SJohn Baldwin 16744bfb21SJohn Baldwin #if __FreeBSD_version < 1400048 17744bfb21SJohn Baldwin #define COMPAT_NEED_CHACHA20POLY1305 18744bfb21SJohn Baldwin #endif 19744bfb21SJohn Baldwin 20744bfb21SJohn Baldwin #if __FreeBSD_version < 1400049 21744bfb21SJohn Baldwin #define COMPAT_NEED_CURVE25519 22744bfb21SJohn Baldwin #endif 23744bfb21SJohn Baldwin 24744bfb21SJohn Baldwin #if __FreeBSD_version < 0x7fffffff /* TODO: update this when implemented */ 25744bfb21SJohn Baldwin #define COMPAT_NEED_BLAKE2S 26744bfb21SJohn Baldwin #endif 27744bfb21SJohn Baldwin 28744bfb21SJohn Baldwin #if __FreeBSD_version < 1400059 29744bfb21SJohn Baldwin #include <sys/sockbuf.h> 30744bfb21SJohn Baldwin #define sbcreatecontrol(a, b, c, d, e) sbcreatecontrol(a, b, c, d) 31744bfb21SJohn Baldwin #endif 32744bfb21SJohn Baldwin 33744bfb21SJohn Baldwin #if __FreeBSD_version < 1300507 34744bfb21SJohn Baldwin #include <sys/smp.h> 35744bfb21SJohn Baldwin #include <sys/gtaskqueue.h> 36744bfb21SJohn Baldwin 37744bfb21SJohn Baldwin struct taskqgroup_cpu { 38744bfb21SJohn Baldwin LIST_HEAD(, grouptask) tgc_tasks; 39744bfb21SJohn Baldwin struct gtaskqueue *tgc_taskq; 40744bfb21SJohn Baldwin int tgc_cnt; 41744bfb21SJohn Baldwin int tgc_cpu; 42744bfb21SJohn Baldwin }; 43744bfb21SJohn Baldwin 44744bfb21SJohn Baldwin struct taskqgroup { 45744bfb21SJohn Baldwin struct taskqgroup_cpu tqg_queue[MAXCPU]; 46744bfb21SJohn Baldwin /* Other members trimmed from compat. */ 47744bfb21SJohn Baldwin }; 48744bfb21SJohn Baldwin 49744bfb21SJohn Baldwin static inline void taskqgroup_drain_all(struct taskqgroup *tqg) 50744bfb21SJohn Baldwin { 51744bfb21SJohn Baldwin struct gtaskqueue *q; 52744bfb21SJohn Baldwin 53744bfb21SJohn Baldwin for (int i = 0; i < mp_ncpus; i++) { 54744bfb21SJohn Baldwin q = tqg->tqg_queue[i].tgc_taskq; 55744bfb21SJohn Baldwin if (q == NULL) 56744bfb21SJohn Baldwin continue; 57744bfb21SJohn Baldwin gtaskqueue_drain_all(q); 58744bfb21SJohn Baldwin } 59744bfb21SJohn Baldwin } 60744bfb21SJohn Baldwin #endif 61744bfb21SJohn Baldwin 62744bfb21SJohn Baldwin #if __FreeBSD_version < 1300000 63744bfb21SJohn Baldwin #define VIMAGE 64744bfb21SJohn Baldwin 65744bfb21SJohn Baldwin #include <sys/types.h> 66744bfb21SJohn Baldwin #include <sys/limits.h> 67744bfb21SJohn Baldwin #include <sys/endian.h> 68744bfb21SJohn Baldwin #include <sys/socket.h> 69744bfb21SJohn Baldwin #include <sys/libkern.h> 70744bfb21SJohn Baldwin #include <sys/malloc.h> 71744bfb21SJohn Baldwin #include <sys/proc.h> 72744bfb21SJohn Baldwin #include <sys/lock.h> 73744bfb21SJohn Baldwin #include <sys/socketvar.h> 74744bfb21SJohn Baldwin #include <sys/protosw.h> 75744bfb21SJohn Baldwin #include <net/vnet.h> 76744bfb21SJohn Baldwin #include <net/if.h> 77744bfb21SJohn Baldwin #include <net/if_var.h> 78744bfb21SJohn Baldwin #include <vm/uma.h> 79744bfb21SJohn Baldwin 80744bfb21SJohn Baldwin #define taskqgroup_attach(a, b, c, d, e, f) taskqgroup_attach((a), (b), (c), -1, (f)) 81744bfb21SJohn Baldwin #define taskqgroup_attach_cpu(a, b, c, d, e, f, g) taskqgroup_attach_cpu((a), (b), (c), (d), -1, (g)) 82744bfb21SJohn Baldwin 83744bfb21SJohn Baldwin #undef NET_EPOCH_ENTER 84744bfb21SJohn Baldwin #define NET_EPOCH_ENTER(et) NET_EPOCH_ENTER_ET(et) 85744bfb21SJohn Baldwin #undef NET_EPOCH_EXIT 86744bfb21SJohn Baldwin #define NET_EPOCH_EXIT(et) NET_EPOCH_EXIT_ET(et) 87744bfb21SJohn Baldwin #define NET_EPOCH_CALL(f, c) epoch_call(net_epoch_preempt, (c), (f)) 88744bfb21SJohn Baldwin #define NET_EPOCH_ASSERT() MPASS(in_epoch(net_epoch_preempt)) 89744bfb21SJohn Baldwin 90744bfb21SJohn Baldwin #undef atomic_load_ptr 91744bfb21SJohn Baldwin #define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p)) 92744bfb21SJohn Baldwin 93744bfb21SJohn Baldwin #endif 94744bfb21SJohn Baldwin 95744bfb21SJohn Baldwin #if __FreeBSD_version < 1202000 96744bfb21SJohn Baldwin static inline uint32_t arc4random_uniform(uint32_t bound) 97744bfb21SJohn Baldwin { 98744bfb21SJohn Baldwin uint32_t ret, max_mod_bound; 99744bfb21SJohn Baldwin 100744bfb21SJohn Baldwin if (bound < 2) 101744bfb21SJohn Baldwin return 0; 102744bfb21SJohn Baldwin 103744bfb21SJohn Baldwin max_mod_bound = (1 + ~bound) % bound; 104744bfb21SJohn Baldwin 105744bfb21SJohn Baldwin do { 106744bfb21SJohn Baldwin ret = arc4random(); 107744bfb21SJohn Baldwin } while (ret < max_mod_bound); 108744bfb21SJohn Baldwin 109744bfb21SJohn Baldwin return ret % bound; 110744bfb21SJohn Baldwin } 111744bfb21SJohn Baldwin 112744bfb21SJohn Baldwin typedef void callout_func_t(void *); 113744bfb21SJohn Baldwin 114744bfb21SJohn Baldwin #ifndef CSUM_SND_TAG 115744bfb21SJohn Baldwin #define CSUM_SND_TAG 0x80000000 116744bfb21SJohn Baldwin #endif 117744bfb21SJohn Baldwin 118744bfb21SJohn Baldwin #endif 119