diff options
Diffstat (limited to 'sys/netatm/uni/uniarp_cache.c')
-rw-r--r-- | sys/netatm/uni/uniarp_cache.c | 436 |
1 files changed, 0 insertions, 436 deletions
diff --git a/sys/netatm/uni/uniarp_cache.c b/sys/netatm/uni/uniarp_cache.c deleted file mode 100644 index 074b8c7..0000000 --- a/sys/netatm/uni/uniarp_cache.c +++ /dev/null @@ -1,436 +0,0 @@ -/*- - * =================================== - * HARP | Host ATM Research Platform - * =================================== - * - * - * This Host ATM Research Platform ("HARP") file (the "Software") is - * made available by Network Computing Services, Inc. ("NetworkCS") - * "AS IS". NetworkCS does not provide maintenance, improvements or - * support of any kind. - * - * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, - * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE - * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. - * In no event shall NetworkCS be responsible for any damages, including - * but not limited to consequential damages, arising from or relating to - * any use of the Software or related support. - * - * Copyright 1994-1998 Network Computing Services, Inc. - * - * Copies of this Software may be made, however, the above copyright - * notice must be reproduced on all copies. - */ - -/* - * ATM Forum UNI Support - * --------------------- - * - * UNI ATMARP support (RFC1577) - ARP cache processing - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/types.h> -#include <sys/errno.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <sys/socketvar.h> -#include <sys/syslog.h> -#include <net/if.h> -#include <netinet/in.h> -#include <netatm/port.h> -#include <netatm/queue.h> -#include <netatm/atm.h> -#include <netatm/atm_sys.h> -#include <netatm/atm_sap.h> -#include <netatm/atm_cm.h> -#include <netatm/atm_if.h> -#include <netatm/atm_vc.h> -#include <netatm/atm_ioctl.h> -#include <netatm/atm_sigmgr.h> -#include <netatm/atm_stack.h> -#include <netatm/atm_pcb.h> -#include <netatm/atm_var.h> - -#include <netatm/ipatm/ipatm_var.h> -#include <netatm/ipatm/ipatm_serv.h> -#include <netatm/uni/unisig_var.h> -#include <netatm/uni/uniip_var.h> - -/* - * Add data to the arp table cache - * - * Called at splnet. - * - * Arguments: - * uip pointer to UNI IP interface - * ip pointer to IP address structure - * atm pointer to ATM address structure - * atmsub pointer to ATM subaddress structure - * origin source of arp information - * - * Returns: - * 0 cache successfully updated - * else updated failed - reason indicated - * - */ -int -uniarp_cache_svc(uip, ip, atm, atmsub, origin) - struct uniip *uip; - struct in_addr *ip; - Atm_addr *atm; - Atm_addr *atmsub; - u_int origin; -{ - struct ip_nif *inp; - struct ipvcc *ivp, *inext, *itail; - struct uniarp *nouap, *ipuap; - char abuf[64]; - -#ifdef DIAGNOSTIC - strncpy(abuf, unisig_addr_print(atmsub), sizeof(abuf)); - abuf[sizeof(abuf) - 1] = 0; - ATM_DEBUG4("cache_svc: ip=%s, atm=(%s,%s), origin=%d\n", - inet_ntoa(*ip), unisig_addr_print(atm), abuf, origin); -#endif - - /* - * Get interface info - */ - inp = uip->uip_ipnif; - - /* - * Find both cached entry and 'nomap' entries for this data. - */ - UNIARP_LOOKUP(ip->s_addr, ipuap); - for (nouap = uniarp_nomaptab; nouap; nouap = nouap->ua_next) { - if (ATM_ADDR_EQUAL(atm, &nouap->ua_dstatm) && - ATM_ADDR_EQUAL(atmsub, &nouap->ua_dstatmsub) && - (nouap->ua_intf == uip)) - break; - } - - /* - * If there aren't any entries yet, create one - * May be called from netisr - don't wait. - */ - if ((ipuap == NULL) && (nouap == NULL)) { - ipuap = uma_zalloc(uniarp_zone, M_NOWAIT); - if (ipuap == NULL) - return (ENOMEM); - ipuap->ua_dstip.s_addr = ip->s_addr; - ipuap->ua_dstatm.address_format = T_ATM_ABSENT; - ipuap->ua_dstatmsub.address_format = T_ATM_ABSENT; - ipuap->ua_intf = uip; - UNIARP_ADD(ipuap); - } - - /* - * If there's no cached mapping, then make the 'nomap' entry - * the new cached entry. - */ - if (ipuap == NULL) { - UNLINK(nouap, struct uniarp, uniarp_nomaptab, ua_next); - nouap->ua_dstip.s_addr = ip->s_addr; - ipuap = nouap; - nouap = NULL; - UNIARP_ADD(ipuap); - } - - /* - * We need to check the consistency of the new data with any - * cached data. So taking the easy case first, if there isn't - * an ATM address in the cache then we can skip all these checks. - */ - if (ipuap->ua_dstatm.address_format != T_ATM_ABSENT) { - /* - * See if the new data conflicts with what's in the cache - */ - if (ATM_ADDR_EQUAL(atm, &ipuap->ua_dstatm) && - ATM_ADDR_EQUAL(atmsub, &ipuap->ua_dstatmsub) && - (uip == ipuap->ua_intf)) { - /* - * No conflicts here - */ - goto dataok; - } - - /* - * Data conflict...how we deal with this depends on - * the origins of the conflicting data - */ - if (origin == ipuap->ua_origin) { - /* - * The new data has equal precedence - if there are - * any VCCs using this entry, then we reject this - * "duplicate IP address" update. - */ - if (ipuap->ua_ivp != NULL) { - strncpy(abuf, unisig_addr_print(atmsub), - sizeof(abuf)); - abuf[sizeof(abuf) - 1] = 0; - log(LOG_WARNING, - "uniarp: duplicate IP address %s from %s,%s\n", - inet_ntoa(*ip), unisig_addr_print(atm), - abuf); - return (EACCES); - } - - } else if (origin > ipuap->ua_origin) { - /* - * New data's origin has higher precedence, - * so accept the new mapping and notify IP/ATM - * that a mapping change has occurred. IP/ATM will - * close any VCC's which aren't waiting for this map. - */ - ipuap->ua_flags |= UAF_LOCKED; - for (ivp = ipuap->ua_ivp; ivp; ivp = inext) { - inext = ivp->iv_arpnext; - (*inp->inf_arpnotify)(ivp, MAP_CHANGED); - } - ipuap->ua_flags &= ~UAF_LOCKED; - } else { - /* - * New data is of lesser origin precedence, - * so we just reject the update attempt. - */ - return (EACCES); - } - - strncpy(abuf, unisig_addr_print(atmsub), sizeof(abuf)); - abuf[sizeof(abuf) - 1] = 0; - log(LOG_WARNING, - "uniarp: ATM address for %s changed to %s,%s\n", - inet_ntoa(*ip), unisig_addr_print(atm), abuf); - } - - /* - * Update the cache entry with the new data - */ - ATM_ADDR_COPY(atm, &ipuap->ua_dstatm); - ATM_ADDR_COPY(atmsub, &ipuap->ua_dstatmsub); - ipuap->ua_intf = uip; - -dataok: - /* - * Update cache data origin - */ - ipuap->ua_origin = MAX(ipuap->ua_origin, origin); - - /* - * Ok, now act on this new/updated cache data - */ - ipuap->ua_flags |= UAF_LOCKED; - - /* - * Save pointer to last VCC currently on cached entry chain that - * will need to be notified of the map becoming valid - */ - itail = NULL; - if ((ipuap->ua_flags & UAF_VALID) == 0) { - - for (itail = ipuap->ua_ivp; itail && itail->iv_arpnext; - itail = itail->iv_arpnext) { - } - } - - /* - * If there was a 'nomap' entry for this mapping, then we need to - * announce the new mapping to them first. - */ - if (nouap) { - - /* - * Move the VCCs from this entry to the cache entry and - * let them know there's a valid mapping now - */ - for (ivp = nouap->ua_ivp; ivp; ivp = inext) { - inext = ivp->iv_arpnext; - - UNLINK(ivp, struct ipvcc, nouap->ua_ivp, iv_arpnext); - - LINK2TAIL(ivp, struct ipvcc, ipuap->ua_ivp, iv_arpnext); - ivp->iv_arpent = (struct arpmap *)ipuap; - - (*inp->inf_arpnotify)(ivp, MAP_VALID); - } - - /* - * Unlink and free the 'nomap' entry - */ - UNLINK(nouap, struct uniarp, uniarp_nomaptab, ua_next); - UNIARP_CANCEL(nouap); - uma_zfree(uniarp_zone, nouap); - } - - /* - * Now, if this entry wasn't valid, notify the remaining VCCs - */ - if (itail) { - - for (ivp = ipuap->ua_ivp; ivp; ivp = inext) { - inext = ivp->iv_arpnext; - (*inp->inf_arpnotify)(ivp, MAP_VALID); - if (ivp == itail) - break; - } - } - ipuap->ua_flags &= ~UAF_LOCKED; - - /* - * We now have a valid cache entry, so cancel any retry timer - * and reset the aging timeout - */ - UNIARP_CANCEL(ipuap); - if ((ipuap->ua_origin == UAO_REGISTER) && (origin != UAO_REGISTER)) { - if (((ipuap->ua_flags & UAF_VALID) == 0) || - (ipuap->ua_aging <= - UNIARP_SERVER_AGE - UNIARP_MIN_REFRESH)) { - ipuap->ua_flags |= UAF_REFRESH; - ipuap->ua_aging = UNIARP_SERVER_AGE; - ipuap->ua_retry = UNIARP_SERVER_RETRY; - } - } else { - if (uip->uip_arpstate == UIAS_SERVER_ACTIVE) { - ipuap->ua_aging = UNIARP_SERVER_AGE; - ipuap->ua_retry = UNIARP_SERVER_RETRY; - } else { - ipuap->ua_aging = UNIARP_CLIENT_AGE; - ipuap->ua_retry = UNIARP_CLIENT_RETRY; - } - ipuap->ua_flags |= UAF_REFRESH; - } - ipuap->ua_flags |= UAF_VALID; - ipuap->ua_flags &= ~UAF_USED; - return (0); -} - - -/* - * Process ARP data from a PVC - * - * The arp table cache is never updated with PVC information. - * - * Called at splnet. - * - * Arguments: - * ivp pointer to input PVC's IPVCC control block - * ip pointer to IP address structure - * atm pointer to ATM address structure - * atmsub pointer to ATM subaddress structure - * - * Returns: - * none - * - */ -void -uniarp_cache_pvc(ivp, ip, atm, atmsub) - struct ipvcc *ivp; - struct in_addr *ip; - Atm_addr *atm; - Atm_addr *atmsub; -{ - struct ip_nif *inp; - struct uniarp *uap; - -#ifdef DIAGNOSTIC - char buf[64]; - int vpi = 0, vci = 0; - - if ((ivp->iv_conn) && (ivp->iv_conn->co_connvc)) { - vpi = ivp->iv_conn->co_connvc->cvc_vcc->vc_vpi; - vci = ivp->iv_conn->co_connvc->cvc_vcc->vc_vci; - } - strncpy(buf, unisig_addr_print(atmsub), sizeof(buf)); - buf[sizeof(buf) - 1] = 0; - ATM_DEBUG5("cache_pvc: vcc=(%d,%d), ip=%s, atm=(%s,%s)\n", - vpi, vci, inet_ntoa(*ip), unisig_addr_print(atm), buf); -#endif - - /* - * Get PVC info - */ - inp = ivp->iv_ipnif; - uap = (struct uniarp *)ivp->iv_arpent; - - /* - * See if IP address for PVC has changed - */ - if (uap->ua_dstip.s_addr != ip->s_addr) { - if (uap->ua_dstip.s_addr != 0) - (*inp->inf_arpnotify)(ivp, MAP_CHANGED); - uap->ua_dstip.s_addr = ip->s_addr; - } - - /* - * Let IP/ATM know if address has become valid - */ - if ((uap->ua_flags & UAF_VALID) == 0) - (*inp->inf_arpnotify)(ivp, MAP_VALID); - uap->ua_flags |= UAF_VALID; - uap->ua_aging = UNIARP_CLIENT_AGE; - uap->ua_retry = UNIARP_CLIENT_RETRY; - - /* - * Save ATM addresses just for debugging - */ - ATM_ADDR_COPY(atm, &uap->ua_dstatm); - ATM_ADDR_COPY(atmsub, &uap->ua_dstatmsub); - - return; -} - - -/* - * Validate IP address - * - * Arguments: - * uip pointer to UNI IP interface - * ip pointer to IP address structure - * origin source of arp information - * - * Returns: - * 0 IP address is acceptable - * else invalid IP address - * - */ -int -uniarp_validate_ip(uip, ip, origin) - struct uniip *uip; - struct in_addr *ip; - u_int origin; -{ - struct uniarp_prf *upp; - u_int i; - - - /* - * Can't be multicast or broadcast address - */ - if (IN_MULTICAST(ntohl(ip->s_addr)) || - in_broadcast(*ip, ANIF2IFP(uip->uip_ipnif->inf_nif))) - return (1); - - /* - * For ATMARP registration information (including SCSP data), - * the address must be allowed by the interface's prefix list. - */ - if ((origin == UAO_REGISTER) || (origin == UAO_SCSP)) { - for (i = uip->uip_nprefix, upp = uip->uip_prefix; - i; i--, upp++) { - if ((ip->s_addr & upp->upf_mask.s_addr) == - upp->upf_addr.s_addr) - break; - } - if (i == 0) - return (1); - } - - return (0); -} - |