80#include <sys/counter.h>
81#include <sys/kernel.h>
82#include <sys/malloc.h>
85#include <sys/random.h>
87#include <sys/sysctl.h>
88#include <sys/bitstring.h>
103#define V_ip_rfc6864 VNET(ip_rfc6864)
104#define V_ip_do_randomid VNET(ip_do_randomid)
117#define V_id_array VNET(id_array)
118#define V_id_bits VNET(id_bits)
119#define V_array_ptr VNET(array_ptr)
120#define V_array_size VNET(array_size)
121#define V_random_id_collisions VNET(random_id_collisions)
122#define V_random_id_total VNET(random_id_total)
123#define V_ip_id_mtx VNET(ip_id_mtx)
129#define V_ip_id VNET(ip_id)
140 CTLTYPE_INT | CTLFLAG_VNET | CTLFLAG_RW | CTLFLAG_MPSAFE,
142 "Assign random ip_id values");
143SYSCTL_INT(_net_inet_ip, OID_AUTO, rfc6864, CTLFLAG_VNET | CTLFLAG_RW,
144 &VNET_NAME(ip_rfc6864), 0,
145 "Use constant IP ID for atomic datagrams");
147 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_VNET | CTLFLAG_MPSAFE,
150 CTLFLAG_RD | CTLFLAG_VNET,
151 &VNET_NAME(random_id_collisions), 0,
"Count of IP ID collisions");
152SYSCTL_INT(_net_inet_ip, OID_AUTO, random_id_total, CTLFLAG_RD | CTLFLAG_VNET,
153 &VNET_NAME(random_id_total), 0,
"Count of IP IDs created");
161 error = sysctl_handle_int(oidp, &
new, 0, req);
162 if (error || req->newptr == NULL)
164 if (
new != 0 &&
new != 1)
181 error = sysctl_handle_int(oidp, &
new, 0, req);
182 if (error == 0 && req->newptr) {
183 if (
new >= 512 &&
new <= 32768)
197 new_array = malloc(new_size *
sizeof(
uint16_t), M_IPID,
199 new_bits = malloc(bitstr_size(65536), M_IPID, M_WAITOK | M_ZERO);
229 arc4rand(&new_id,
sizeof(new_id), 0);
230 }
while (bit_test(
V_id_bits, new_id) || new_id == 0);
281 mtx_init(&
V_ip_id_mtx,
"ip_id_mtx", NULL, MTX_DEF);
282 V_ip_id = counter_u64_alloc(M_WAITOK);
285 arc4rand(zpcpu_get_cpu(
V_ip_id, i),
sizeof(uint64_t), 0);
VNET_DEFINE_STATIC(int, ip_rfc6864)
SYSCTL_PROC(_net_inet_ip, OID_AUTO, random_id, CTLTYPE_INT|CTLFLAG_VNET|CTLFLAG_RW|CTLFLAG_MPSAFE, &VNET_NAME(ip_do_randomid), 0, sysctl_ip_randomid, "IU", "Assign random ip_id values")
static void ipid_sysinit(void)
VNET_SYSUNINIT(ip_id, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, ipid_sysuninit, NULL)
#define V_random_id_collisions
VNET_SYSINIT(ip_id, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, ipid_sysinit, NULL)
static MALLOC_DEFINE(M_IPID, "ipid", "randomized ip id state")
static void ip_initid(int)
SYSCTL_DECL(_net_inet_ip)
#define V_random_id_total
SYSCTL_INT(_net_inet_ip, OID_AUTO, rfc6864, CTLFLAG_VNET|CTLFLAG_RW, &VNET_NAME(ip_rfc6864), 0, "Use constant IP ID for atomic datagrams")
static uint16_t ip_randomid(void)
void ip_fillid(struct ip *ip)
static int sysctl_ip_randomid(SYSCTL_HANDLER_ARGS)
static void ipid_sysuninit(void)
static int sysctl_ip_id_change(SYSCTL_HANDLER_ARGS)