1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28#ifndef _NETAT_AT_AARP_H_ 29#define _NETAT_AT_AARP_H_ 30#include <sys/appleapiopts.h> 31#ifdef KERNEL_PRIVATE 32#include <netat/at_var.h> 33#endif KERNEL_PRIVATE 34 35#ifdef __APPLE_API_OBSOLETE 36 37/* 38 * Copyright (c) 1988, 1989 Apple Computer, Inc. 39 */ 40 41/* "@(#)at_aarp.h: 2.0, 1.6; 10/4/93; Copyright 1988-89, Apple Computer, Inc." */ 42 43/* This is a header file for AARP. 44 * 45 * Author: R. C. Venkatraman 46 * Date : 3/2/88 47 * 48 */ 49 50/* AARP packet */ 51 52typedef struct { 53 u_short hardware_type; 54 u_short stack_type; /* indicates appletalk or xns*/ 55 u_char hw_addr_len; /* len of hardware addr, e.g 56 * ethernet addr len, in bytes 57 */ 58 u_char stack_addr_len; /* protocol stack addr len, 59 * e.g., appletalk addr len 60 * in bytes 61 */ 62 u_short aarp_cmd; 63 struct etalk_addr src_addr; 64 struct atalk_addr src_at_addr; 65 struct etalk_addr dest_addr; 66 struct atalk_addr dest_at_addr; /* desired or dest. at addr */ 67} aarp_pkt_t; 68 69 70/* Constants currently defined in AARP */ 71 72#define AARP_AT_TYPE 0x80F3 /* indicates aarp packet */ 73#define AARP_ETHER_HW_TYPE 0x1 74#define AARP_AT_PROTO 0x809B /* indicates stack type */ 75#define AARP_ETHER_ADDR_LEN 6 /* in bytes */ 76#define AARP_AT_ADDR_LEN 4 /* in bytes */ 77 78/* AARP cmd definitions */ 79 80#define AARP_REQ_CMD 0x1 /* address lookup request */ 81#define AARP_RESP_CMD 0x2 /* address match response */ 82#define AARP_PROBE_CMD 0x3 /* new kid probing... */ 83 84/* AARP timer and retry counts */ 85 86#define AARP_MAX_PROBE_RETRIES 20 87#define AARP_PROBE_TIMER_INT HZ/30 /* HZ defines in param.h */ 88#define AARP_MAX_REQ_RETRIES 10 89#define AARP_REQ_TIMER_INT HZ/30 90#define AARP_MAX_NODES_TRIED 200 /* max no. of addresses tried */ 91 /* on the same net before */ 92 /* giving up on the net# */ 93#define AARP_MAX_NETS_TRIED 10 /* max no. of net nos tried */ 94 /* before giving up on startup*/ 95 96/* Probe states */ 97 98#define PROBE_IDLE 0x1 /* There is no node addr */ 99#define PROBE_TENTATIVE 0x2 /* probing */ 100#define PROBE_DONE 0x3 /* an appletalk addr has been */ 101 /* assigned for the given node*/ 102/* Errors returned by AARP routines */ 103#define AARP_ERR_NOT_OURS 1 /* not our appletalk address */ 104 105#ifdef KERNEL_PRIVATE 106 107/*************************************************/ 108/* Declarations for AARP Address Map Table (AMT) */ 109/*************************************************/ 110 111typedef struct { 112 struct atalk_addr dest_at_addr; /* net# in network byte order */ 113 struct etalk_addr dest_addr; 114 char dummy[2]; /* pad out to struct size of 32 */ 115 time_t last_time; /* the last time that this addr 116 * was used. Read in lbolt 117 * whenever the addr is used. 118 */ 119 int no_of_retries; /* number of times we've xmitted */ 120 gbuf_t *m; /* ptr to msg blk to be sent out */ 121 at_ifaddr_t *elapp; 122 int error; 123 int tmo; 124} aarp_amt_t; 125 126#define AMT_BSIZ 4 /* bucket size */ 127#define AMT_NB 64 /* number of buckets */ 128#define AMTSIZE (AMT_BSIZ * AMT_NB) 129 130typedef struct { 131 aarp_amt_t et_aarp_amt[AMTSIZE]; 132} aarp_amt_array; 133 134#define AMT_HASH(a) \ 135 ((NET_VALUE(((struct atalk_addr *)&a)->atalk_net) + ((struct atalk_addr *)&a)->atalk_node) % AMT_NB) 136 137/* at_addr - net # in network byte order */ 138#define AMT_LOOK(at, at_addr, elapp) { \ 139 int n; \ 140 at = &aarp_table[elapp->ifPort]->et_aarp_amt[AMT_HASH(at_addr) * AMT_BSIZ]; \ 141 for (n = 0 ; ; at++) { \ 142 if (at->dest_at_addr.atalk_node == (at_addr).atalk_node && \ 143 NET_EQUAL(at->dest_at_addr.atalk_net, (at_addr).atalk_net)) \ 144 break; \ 145 if (++n >= AMT_BSIZ) { \ 146 at = NULL; \ 147 break; \ 148 } \ 149 } \ 150} 151 152/* at_addr - net # in network byte order */ 153#define NEW_AMT(at, at_addr, elapp) { \ 154 int n; \ 155 aarp_amt_t *myat; \ 156 myat = at = &aarp_table[elapp->ifPort]->et_aarp_amt[AMT_HASH(at_addr) * AMT_BSIZ]; \ 157 for (n = 0 ; ; at++) { \ 158 if (at->last_time == 0) \ 159 break; \ 160 if (++n >= AMT_BSIZ) { \ 161 at = aarp_lru_entry(myat); \ 162 break; \ 163 } \ 164 } \ 165} 166 167#define AARP_NET_MCAST(p, elapp) \ 168 (NET_VALUE((p)->dst_net) == elapp->ifThisNode.s_net) \ 169 ) /* network-wide broadcast */ 170 171#define AARP_CABLE_MCAST(p) \ 172 (NET_VALUE((p)->dst_net) == 0x0000 \ 173 ) 174 175#define AARP_BROADCAST(p, elapp) \ 176 (((p)->dst_node == 0xff) && \ 177 ( \ 178 (NET_VALUE((p)->dst_net) == 0x0000) || \ 179 (NET_VALUE((p)->dst_net) == elapp->ifThisNode.s_net)) \ 180 ) /* is this some kind of a broadcast address (?) */ 181 182 183#define ETHER_ADDR_EQUAL(addr1p, addr2p) \ 184 (( \ 185 ((addr1p)->etalk_addr_octet[0]==(addr2p)->etalk_addr_octet[0]) && \ 186 ((addr1p)->etalk_addr_octet[1]==(addr2p)->etalk_addr_octet[1]) && \ 187 ((addr1p)->etalk_addr_octet[2]==(addr2p)->etalk_addr_octet[2]) && \ 188 ((addr1p)->etalk_addr_octet[3]==(addr2p)->etalk_addr_octet[3]) && \ 189 ((addr1p)->etalk_addr_octet[4]==(addr2p)->etalk_addr_octet[4]) && \ 190 ((addr1p)->etalk_addr_octet[5]==(addr2p)->etalk_addr_octet[5]) \ 191 ) ? 1 : 0 \ 192 ) 193 194int aarp_chk_addr(at_ddp_t *, at_ifaddr_t *); 195int aarp_rcv_pkt(aarp_pkt_t *, at_ifaddr_t *); 196void AARPwakeup(aarp_amt_t *); 197int aarp_send_data(gbuf_t *, at_ifaddr_t *, struct atalk_addr *, int); 198 199#endif /* KERNEL_PRIVATE */ 200 201#endif /* __APPLE_API_OBSOLETE */ 202#endif /* _NETAT_AT_AARP_H_ */ 203