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/* 29 * Copyright (c) 1998 Apple Computer, Inc. 30 */ 31 32#ifndef _NETAT_AT_VAR_H_ 33#define _NETAT_AT_VAR_H_ 34 35#include <sys/appleapiopts.h> 36#ifdef __APPLE_API_OBSOLETE 37#include <sys/queue.h> 38 39/* at_var.h */ 40 41/* at_var.h contains definitions formerly found in: at/at_lap.h & at/elap.h */ 42 43/* multicast tracking */ 44#define MAX_MCASTS 25 /* #multicast addrs tracked per i/f */ 45#define MCAST_TRACK_ADD 1 46#define MCAST_TRACK_DELETE 2 47#define MCAST_TRACK_CHECK 3 48 49/* maximum number of I/F's allowed */ 50#define IF_TOTAL_MAX 17 /* max count of any combination of I/F's */ 51 /* 17 == (1+(4*4)); 9 and 13 would also be 52 reasonable values */ 53 54#define FDDI_OR_TOKENRING(i) ((i == IFT_FDDI) || (i == IFT_ISO88025)) 55#define ETHERNET_ADDR_LEN 6 56#define IFNAMESIZ 16 57typedef struct etalk_addr { 58 u_char etalk_addr_octet[ETHERNET_ADDR_LEN]; 59} etalk_addr_t; 60typedef char if_name_t[IFNAMESIZ]; 61typedef struct at_ifname_list { 62 if_name_t at_if[IF_TOTAL_MAX]; 63} at_ifnames_t; 64 65typedef struct at_if_statstics { 66 u_long fwdBytes; /* bytes received & forwarded */ 67 u_long fwdPkts; /* pkts received & forwarded */ 68 u_long droppedBytes; /* bytes received & dropped */ 69 u_long droppedPkts; /* pkts received & dropped */ 70 u_long outBytes; /* bytes sent */ 71 u_long outPkts; /* pkts sent */ 72 u_long routes; /* count of routes in rtmptable */ 73} at_if_statistics_t; 74 75typedef struct { 76 u_int unknown_mblks; /* number of unknown streams msgs */ 77 u_int rcv_bytes; /* number of data bytes received */ 78 u_int rcv_packets; /* number of packets received */ 79 u_int xmit_bytes; /* number of data bytes xmited */ 80 u_int xmit_packets; /* number of packets xmited */ 81} at_elap_stats_t; 82 83typedef struct { 84 char ifr_name[IFNAMESIZ]; 85 u_int flags; /* misc. port flags, 86 (ELAP_CFG_xxx on input 87 ifFlags on output) */ 88 struct at_addr node; /* Our node number. */ 89 struct at_addr router; /* Our router. */ 90 u_short netStart; /* network start range */ 91 u_short netEnd; /* network ending range */ 92 at_nvestr_t zonename; 93} at_if_cfg_t; 94 95typedef struct { 96 at_entity_t name; 97 at_inet_t addr; /* net and node are ignored, except in 98 multihoming mode where "addr" is used 99 to specify the interface. */ 100 u_char ddptype; 101 long unique_nbp_id; 102} at_nbp_reg_t; 103 104typedef struct { 105 char ifr_name[IFNAMESIZ]; 106 at_nvestr_t zonename; 107} at_def_zone_t; 108 109typedef struct zone_usage { 110 int zone_index; /* index in local_zones */ 111 at_nvestr_t zone_name; /* the zone name & len */ 112 int zone_home; /* used only to set zones in 113 router mode */ 114 at_ifnames_t zone_iflist; /* list of interfaces for 115 this zone. */ 116 char usage[IF_TOTAL_MAX]; /* I/F usage (set if 117 I/F in this zone) */ 118} zone_usage_t; 119 120typedef struct { 121 short multihome; 122 short rtmp_table_sz; 123 short zone_table_sz; 124 short router_mix; 125} at_router_params_t; 126 127 128typedef struct at_kern_err { 129 int error; /* kernel error # (KE_xxx) */ 130 int port1; 131 int port2; 132 char name1[IFNAMESIZ]; 133 char name2[IFNAMESIZ]; 134 u_short net; 135 u_char node; 136 u_short netr1b, netr1e; /* net range 1 begin & end */ 137 u_short netr2b, netr2e; /* net range 2 begin & end */ 138 u_char rtmp_id; 139} at_kern_err_t; 140 141#define KE_CONF_RANGE 1 142#define KE_CONF_SEED_RNG 2 143#define KE_CONF_SEED1 3 144#define KE_CONF_SEED_NODE 4 145#define KE_NO_ZONES_FOUND 5 146#define KE_NO_SEED 6 147#define KE_INVAL_RANGE 7 148#define KE_SEED_STARTUP 8 149#define KE_BAD_VER 9 150#define KE_RTMP_OVERFLOW 10 151#define KE_ZIP_OVERFLOW 11 152 153#ifdef KERNEL_PRIVATE 154/* 155 * Interface address, AppleTalk version. One of these structures 156 * is allocated for each AppleTalk address on an interface. 157 * 158 * The ifaddr structure contains the protocol-independent part 159 * of the structure and is assumed to be first, as it is in 160 * "struct in_ifaddr", defined in bsd/netinet/in_var.h. 161 */ 162typedef struct at_ifaddr { 163 struct ifaddr aa_ifa; 164#define aa_ifp aa_ifa.ifa_ifp 165#define aa_flags aa_ifa.ifa_flags 166 167 TAILQ_ENTRY(at_ifaddr) aa_link; /* tailq macro glue */ 168 int at_was_attached; /* 1=attached, 0=detached */ 169 170 /* from pat_unit_t */ 171 unsigned char mcast[MAX_MCASTS]; 172 char xaddr[ETHERNET_ADDR_LEN]; 173 174 /* from elap_specifics_t */ 175 at_elap_stats_t stats; 176 177 /* The DDP sets these values: */ 178 u_char ifState; /* State of the interface LAP_* */ 179 u_short ifThisCableStart; 180 u_short ifThisCableEnd; 181 struct at_addr ifARouter; 182 u_char ifRouterState; 183 u_int ifFlags; /* Flags, see AT_IFF_* */ 184 struct sockaddr_at ifNodeAddress; 185#define ifThisNode ifNodeAddress.sat_addr 186 /* AppleTalk node ID is ifNodeAddress.sat_addr*/ 187 188 /* for use by ZIP */ 189 u_char ifNumRetries; 190 u_char ifGNIScheduled; /* to keep getnetinfo from being scheduled more than once */ 191 at_nvestr_t ifZoneName; 192 193 /* Added for routing support */ 194 int ifPort; /* the unique ddp logical port 195 number, also index into 196 at_interfaces[] and ifID_table[] */ 197 char ifName[IFNAMESIZ]; 198 /* added to support LAP_IOC_GET_IFID */ 199 u_short ifDefZone; /* Default Zone index in ZoneTable; used 200 only in routing/multihome modes to be 201 able to answer a ZIP GetNetInfo request */ 202 char ifZipNeedQueries; 203 /* ZIP/RTMP Query flag */ 204 char ifRoutingState; /* Port (as a router) state */ 205 at_if_statistics_t 206 ifStatistics; /* statistics */ 207 /* end of elap_if structure */ 208 209 u_short flags; /* port specific flags */ 210 struct etalk_addr ZoneMcastAddr; 211 /* zone multicast addr */ 212 struct etalk_addr cable_multicast_addr; 213 /* AppleTalk broadcast addr */ 214 215 struct at_addr initial_addr; /* temporary value used during startup */ 216 at_nvestr_t startup_zone; 217 int startup_error, /* to get error code back from 218 ZIPwakeup() / AARPwakeup() */ 219 startup_inprogress; /* to decide whether it's the 220 middle of an elap_online operation */ 221 222} at_ifaddr_t; 223#endif /* KERNEL_PRIVATE */ 224 225#define LAP_OFFLINE 0 /* LAP_OFFLINE MUST be 0 */ 226#define LAP_ONLINE 1 227#define LAP_ONLINE_FOR_ZIP 2 228#define LAP_ONLINE_ZONELESS 3 /* for non-home router ports */ 229 230#define NO_ROUTER 1 /* there's no router around */ 231#define ROUTER_WARNING 2 /* there's a router around that */ 232 /* we are ignoring, warning has */ 233 /* been issued to the user */ 234#define ROUTER_AROUND 3 /* A router is around and we've */ 235 /* noted its presence */ 236#define ROUTER_UPDATED 4 /* for mh tracking of routers. Value decremented 237 with rtmp aging timer, a value of 4 allows a 238 minimum of 40 secs to laps before we decide 239 to revert to cable multicasts */ 240 241/* AppleTalk IOCTLs */ 242 243 244#define AIOCSTOPATALK _IOWR('a', 1, int) /* stop AppleTalk */ 245#define AIOCGETIFCFG _IOWR('a', 2, at_if_cfg_t) /* get AT interface cfg */ 246#define AIOCNBPREG _IOWR('a', 3, at_nbp_reg_t) /* NBP register */ 247#define AIOCNBPREMOVE _IOW('a', 4, at_nbp_reg_t) /* NBP remove */ 248#define AIOCGETSTATE _IOR('a', 5, at_state_t) /* get AT global state */ 249#define AIOCSETDEFZONE _IOW('a', 6, at_def_zone_t) 250 /* in single-port, router, and multihome modes, set default zone */ 251#define AIOCSETROUTER _IOW('a', 7, at_router_params_t) 252#define AIOCGETROUTER _IOR('a', 8, at_router_params_t) 253#define AIOCSIFADDR _IOW('a', 9, at_if_cfg_t) /* init AT interface */ 254#define AIOCSTARTROUTER _IOR('a',10, at_kern_err_t) /* start AT routing */ 255#define AIOCREGLOCALZN _IOW('a',11, at_nvestr_t) 256 /* in single-port mode, register local zone in kernel table for 257 future use in error checking NBP registration */ 258#define AIOCSETZNUSAGE _IOW('a',12, zone_usage_t) 259 /* in router mode, set up each zone for interfaces being seeded */ 260#define AIOCGETZNUSAGE _IOWR('a',13, zone_usage_t) 261 /* in router and multihome modes, given a zone index, report zone name 262 and interfaces corresponding to that zone */ 263 264/* values for ifFlags */ 265#define LAP_STATE_MASK 0xf /* low order bits used to report 266 IF state, by AIOCGETIFCFG */ 267#define AT_IFF_DEFAULT 0x40000 268#define AT_IFF_AURP 0x20000 269#define RTR_NXNET_PORT 0x10000000 /* Non Extended net port */ 270#define RTR_XNET_PORT 0x20000000 /* Extended net port */ 271#define RTR_SEED_PORT 0x40000000 /* Seed port require config net values*/ 272 273/* elap_cfg 'flags' defines */ 274#define ELAP_CFG_ZONELESS 0x01 /* true if we shouldn't set a zone 275 (to avoid generating a zip_getnetinfo 276 when routing) */ 277#define ELAP_CFG_HOME 0x02 /* designate home port (one allowed) */ 278#define ELAP_CFG_SEED 0x08 /* set if it's a seed port */ 279 280#ifdef KERNEL_PRIVATE 281extern TAILQ_HEAD(at_ifQueueHd, at_ifaddr) at_ifQueueHd; 282 283int at_control(struct socket *, u_long, caddr_t, struct ifnet *); 284int ddp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, 285 struct mbuf *); 286int ddp_ctloutput(struct socket *, struct sockopt *); 287void ddp_init(void); 288void ddp_slowtimo(void); 289#endif /* KERNEL_PRIVATE */ 290 291/* 292 * Define AppleTalk event subclass and specific AppleTalk events. 293 */ 294 295#define KEV_ATALK_SUBCLASS 5 296 297#define KEV_ATALK_ENABLED 1 /* AppleTalk enabled from user space - node/net set and valid */ 298#define KEV_ATALK_DISABLED 2 /* AppleTalk disabled from user space */ 299#define KEV_ATALK_ZONEUPDATED 3 /* Zone for this node set/changed */ 300#define KEV_ATALK_ROUTERUP 4 /* Seed router found with valid cable range */ 301#define KEV_ATALK_ROUTERUP_INVALID 5 /* Seed router found with invalid cable range */ 302#define KEV_ATALK_ROUTERDOWN 6 /* Seed router down */ 303#define KEV_ATALK_ZONELISTCHANGED 7 /* Zone list changed by router */ 304 305struct kev_atalk_data { 306 struct net_event_data link_data; 307 union { 308 struct at_addr address; 309 at_nvestr_t zone; 310 } node_data; 311}; 312 313#ifdef KERNEL_PRIVATE 314 315void atalk_post_msg(struct ifnet *ifp, u_long event_code, struct at_addr *address, at_nvestr_t *zone); 316void aarp_sched_probe(void *); 317void atalk_lock(void); 318void atalk_unlock(void); 319void appletalk_hack_start(void); 320void ddp_input(gbuf_t *, at_ifaddr_t *); 321struct etalk_addr; 322void ddp_glean(gbuf_t *, at_ifaddr_t *, struct etalk_addr *); 323 324int pat_output(at_ifaddr_t *, struct mbuf *, unsigned char *, int); 325 326void ep_input(gbuf_t *, at_ifaddr_t *); 327void zip_router_input(gbuf_t *, at_ifaddr_t *); 328void nbp_input(gbuf_t *, at_ifaddr_t *); 329void sip_input(gbuf_t *, at_ifaddr_t *); 330 331void ioc_ack(int, gbuf_t *, gref_t *); 332int ddp_adjmsg(gbuf_t *, int ); 333gbuf_t *ddp_growmsg(gbuf_t *, int ); 334 335struct proc; 336int atalk_openref(gref_t *, int *, struct proc *); 337 338struct fileglob; 339int atalk_closeref(struct fileglob *, gref_t **); 340 341int _ATputmsg(int, strbuf_t *, strbuf_t *, int , int *, void *); 342int _ATgetmsg(int, strbuf_t *, strbuf_t *, int *, int *, void *); 343int _ATsocket(int, int *, void *); 344 345void ddp_start(void); 346 347typedef void (*ddp_handler_func)(gbuf_t *, at_ifaddr_t *); 348void add_ddp_handler(u_char, ddp_handler_func); 349void init_ddp_handler(void); 350 351int elap_wput(gref_t *gref, gbuf_t *m); 352int at_ioctl(struct atpcb *, u_long, caddr_t, int ); 353 354 355 356#endif /* KERNEL_PRIVATE */ 357#endif /* __APPLE_API_OBSOLETE */ 358#endif /* _NETAT_AT_VAR_H_ */ 359