|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * Copyright 1997 Massachusetts Institute of Technology ! 24: * ! 25: * Permission to use, copy, modify, and distribute this software and ! 26: * its documentation for any purpose and without fee is hereby ! 27: * granted, provided that both the above copyright notice and this ! 28: * permission notice appear in all copies, that both the above ! 29: * copyright notice and this permission notice appear in all ! 30: * supporting documentation, and that the name of M.I.T. not be used ! 31: * in advertising or publicity pertaining to distribution of the ! 32: * software without specific, written prior permission. M.I.T. makes ! 33: * no representations about the suitability of this software for any ! 34: * purpose. It is provided "as is" without express or implied ! 35: * warranty. ! 36: * ! 37: * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS ! 38: * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, ! 39: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ! 40: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT ! 41: * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ! 42: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ! 43: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ! 44: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ! 45: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ! 46: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ! 47: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 48: * SUCH DAMAGE. ! 49: * ! 50: */ ! 51: ! 52: #include <sys/param.h> ! 53: #include <sys/systm.h> ! 54: #include <sys/malloc.h> ! 55: #include <sys/socket.h> ! 56: #include <sys/socketvar.h> ! 57: ! 58: #include <net/hostcache.h> ! 59: #include <net/if.h> ! 60: #include <net/if_var.h> ! 61: #include <net/route.h> ! 62: ! 63: #include <netinet/in.h> ! 64: #include <netinet/in_hostcache.h> ! 65: #include <netinet/tcp.h> ! 66: #include <netinet/tcp_timer.h> ! 67: #include <netinet/tcp_var.h> ! 68: ! 69: /* ! 70: * Manage the IP per-host cache (really a thin veneer over the generic ! 71: * per-host cache code). ! 72: */ ! 73: ! 74: /* Look up an entry -- can be called from interrupt context. */ ! 75: struct in_hcentry * ! 76: inhc_lookup(struct sockaddr_in *sin) ! 77: { ! 78: struct hcentry *hc; ! 79: ! 80: hc = hc_get((struct sockaddr *)sin); ! 81: return ((struct in_hcentry *)hc); ! 82: } ! 83: ! 84: /* Look up and possibly create an entry -- must be called from user mode. */ ! 85: struct in_hcentry * ! 86: inhc_alloc(struct sockaddr_in *sin) ! 87: { ! 88: struct in_hcentry *inhc; ! 89: struct rtentry *rt; ! 90: int error; ! 91: /* xxx mutual exclusion for smp */ ! 92: ! 93: inhc = inhc_lookup(sin); ! 94: if (inhc != 0) ! 95: return inhc; ! 96: ! 97: rt = rtalloc1(inhc->inhc_hc.hc_host, 1, 0); ! 98: if (rt == 0) ! 99: return 0; ! 100: ! 101: MALLOC(inhc, struct in_hcentry *, sizeof *inhc, M_HOSTCACHE, M_WAITOK); ! 102: bzero(inhc, sizeof *inhc); ! 103: inhc->inhc_hc.hc_host = dup_sockaddr((struct sockaddr *)sin, 1); ! 104: if (in_broadcast(sin->sin_addr, rt->rt_ifp)) ! 105: inhc->inhc_flags |= INHC_BROADCAST; ! 106: else if (((struct sockaddr_in *)rt->rt_ifa->ifa_addr)->sin_addr.s_addr ! 107: == sin->sin_addr.s_addr) ! 108: inhc->inhc_flags |= INHC_LOCAL; ! 109: else if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) ! 110: inhc->inhc_flags |= INHC_MULTICAST; ! 111: inhc->inhc_pmtu = rt->rt_rmx.rmx_mtu; ! 112: inhc->inhc_recvpipe = rt->rt_rmx.rmx_recvpipe; ! 113: inhc->inhc_sendpipe = rt->rt_rmx.rmx_sendpipe; ! 114: inhc->inhc_ssthresh = rt->rt_rmx.rmx_ssthresh; ! 115: if (rt->rt_rmx.rmx_locks & RTV_RTT) ! 116: inhc->inhc_rttmin = rt->rt_rmx.rmx_rtt ! 117: / (RTM_RTTUNIT / TCP_RTT_SCALE); ! 118: inhc->inhc_hc.hc_rt = rt; ! 119: error = hc_insert(&inhc->inhc_hc); ! 120: if (error != 0) { ! 121: RTFREE(rt); ! 122: FREE(inhc, M_HOSTCACHE); ! 123: return 0; ! 124: } ! 125: /* ! 126: * We don't return the structure directly because hc_get() needs ! 127: * to be allowed to do its own processing. ! 128: */ ! 129: return (inhc_lookup(sin)); ! 130: } ! 131: ! 132: /* ! 133: * This is Van Jacobson's hash function for IPv4 addresses. ! 134: * It is designed to work with a power-of-two-sized hash table. ! 135: */ ! 136: static u_long ! 137: inhc_hash(struct sockaddr *sa, u_long nbuckets) ! 138: { ! 139: u_long ip; ! 140: ! 141: ip = ((struct sockaddr_in *)sa)->sin_addr.s_addr; ! 142: return ((ip ^ (ip >> 23) ^ (ip >> 17)) & ~(nbuckets - 1)); ! 143: } ! 144: ! 145: /* ! 146: * We don't need to do any special work... if there are no references, ! 147: * as the caller has already ensured, then it's OK to kill. ! 148: */ ! 149: static int ! 150: inhc_delete(struct hcentry *hc) ! 151: { ! 152: return 0; ! 153: } ! 154: ! 155: /* ! 156: * Return the next increment for the number of buckets in the hash table. ! 157: * Zero means ``do not bump''. ! 158: */ ! 159: static u_long ! 160: inhc_bump(u_long oldsize) ! 161: { ! 162: if (oldsize < 512) ! 163: return (oldsize << 1); ! 164: return 0; ! 165: } ! 166: ! 167: static struct hccallback inhc_cb = { ! 168: inhc_hash, inhc_delete, inhc_bump ! 169: }; ! 170: ! 171: int ! 172: inhc_init(void) ! 173: { ! 174: ! 175: return (hc_init(AF_INET, &inhc_cb, 128, 0)); ! 176: } ! 177:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.