1 2/*- 3 * Copyright (c) 2008 Michael J. Silbersack. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/sys/netinet/ip_id.c 302372 2016-07-06 14:09:49Z nwhitehorn $"); |
30 31/* 32 * IP ID generation is a fascinating topic. 33 * 34 * In order to avoid ID collisions during packet reassembly, common sense 35 * dictates that the period between reuse of IDs be as large as possible. 36 * This leads to the classic implementation of a system-wide counter, thereby 37 * ensuring that IDs repeat only once every 2^16 packets. --- 232 unchanged lines hidden (view full) --- 270 */ 271 ip->ip_id = htons((*(uint64_t *)zpcpu_get(V_ip_id)) & 0xffff); 272 } 273} 274 275static void 276ipid_sysinit(void) 277{ |
278 int i; |
279 280 mtx_init(&V_ip_id_mtx, "ip_id_mtx", NULL, MTX_DEF); 281 V_ip_id = counter_u64_alloc(M_WAITOK); |
282 283 CPU_FOREACH(i) |
284 arc4rand(zpcpu_get_cpu(V_ip_id, i), sizeof(uint64_t), 0); 285} 286VNET_SYSINIT(ip_id, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY, ipid_sysinit, NULL); 287 288static void 289ipid_sysuninit(void) 290{ 291 292 if (V_id_array != NULL) { 293 free(V_id_array, M_IPID); 294 free(V_id_bits, M_IPID); 295 } 296 counter_u64_free(V_ip_id); 297 mtx_destroy(&V_ip_id_mtx); 298} 299VNET_SYSUNINIT(ip_id, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, ipid_sysuninit, NULL); |