X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/21362eb3e66fd2c787aee132bce100a44d71a99c..2d21ac55c334faf3a56e5634905ed6987fc787d4:/bsd/netat/ddp_lap.c diff --git a/bsd/netat/ddp_lap.c b/bsd/netat/ddp_lap.c index a55c561ae..c7e075c5a 100644 --- a/bsd/netat/ddp_lap.c +++ b/bsd/netat/ddp_lap.c @@ -72,6 +72,7 @@ #include #include +#include #include #include #include @@ -79,13 +80,14 @@ #include #include #include -#include #include #include #include #include #include #include +#include +#include #include @@ -121,8 +123,6 @@ int xpatcnt = 0; /* externs */ extern TAILQ_HEAD(name_registry, _nve_) name_registry; extern snmpStats_t snmpStats; -extern atlock_t ddpinp_lock; -extern atlock_t arpinp_lock; extern short appletalk_inited; extern int adspInited; extern struct atpcb ddp_head; @@ -136,19 +136,21 @@ extern at_ddp_stats_t at_ddp_stats; extern lck_mtx_t * atalk_mutex; /* protos */ -extern snmpAarpEnt_t * getAarp(int *); -extern void nbp_shutdown(), routershutdown(), ddp_brt_shutdown(); -extern void ddp_brt_init(), rtmp_init(), rtmp_input(); -extern rtmp_router_start(at_kern_err_t *); -static void getIfNames(at_ifnames_t *); -static void add_route(); -static int set_zones(); -void elap_offline(); -static int elap_online1(), re_aarp(); -int at_reg_mcast(), at_unreg_mcast(); -void AARPwakeup(), ZIPwakeup(); -static void elap_hangup(); -static getSnmpCfg(); +int rtmp_router_start(at_kern_err_t *); +static void add_route(RT_entry *); +void elap_offline(at_ifaddr_t *); +static int elap_online1(at_ifaddr_t *); +static void elap_online2(at_ifaddr_t *); + int elap_online3(at_ifaddr_t *); +static int re_aarp(at_ifaddr_t *); +static int getSnmpCfg(snmpCfg_t *); + +int routerStart(at_kern_err_t *); + +static int validate_msg_size(gbuf_t *, gref_t *, at_ifaddr_t **); +at_ifaddr_t *find_ifID(char *); +int lap_online( at_ifaddr_t *, at_if_cfg_t *cfgp); + at_ifaddr_t *find_ifID(if_name) char *if_name; @@ -174,7 +176,6 @@ static int validate_msg_size(m, gref, elapp) */ { register ioc_t *iocbp; - register at_if_cfg_t *cfgp; int i = 0, size = 1; *elapp = NULL; @@ -257,8 +258,9 @@ int lap_online(elapp, cfgp) elapp->flags |= ELAP_CFG_SEED; } - if (!DEFAULT_ZONE(&cfgp->zonename) && - (elapp->flags & ELAP_CFG_HOME) || MULTIHOME_MODE) { + /* (VL) !? */ + if ((!DEFAULT_ZONE(&cfgp->zonename) && + (elapp->flags & ELAP_CFG_HOME)) || MULTIHOME_MODE) { elapp->startup_zone = cfgp->zonename; } @@ -314,10 +316,12 @@ int elap_wput(gref, m) register ioc_t *iocbp; register at_if_cfg_t *cfgp; at_elap_stats_t *statsp; - int i; - int (*func)(); - gbuf_t *tmpm; - at_ifaddr_t *patp; + int i,j; + int size, totalsize = 0, tabsize; + gbuf_t *mn; /* new gbuf */ + gbuf_t *mo; /* old gbuf */ + gbuf_t *mt = NULL; /* temp */ + snmpNbpTable_t *nbp; switch (gbuf_type(m)) { @@ -466,7 +470,6 @@ int elap_wput(gref, m) kprintf("LAP_IOC_SNMP_GET_CFG\n"); #endif { - int i,size; snmpCfg_t snmp; i = *(int *)gbuf_rptr(gbuf_cont(m)); @@ -550,12 +553,6 @@ int elap_wput(gref, m) kprintf("LAP_IOC_SNMP_GET_ZIP\n"); #endif { /* matching brace NOT in this case */ - register int i,j; - register int size, total, tabsize; - gbuf_t *mn; /* new gbuf */ - gbuf_t *mo; /* old gbuf */ - gbuf_t *mt; /* temp */ - snmpNbpTable_t *nbp; i = *(int *)gbuf_rptr(gbuf_cont(m)); gbuf_freem(gbuf_cont(m)); @@ -586,11 +583,11 @@ int elap_wput(gref, m) } if (!mo) { /* if first new one */ mt = mn; - total = size; + totalsize = size; } else { gbuf_cont(mo) = mn; - total += size; + totalsize += size; } mo = mn; getZipTable((ZT_entry*)gbuf_rptr(mn),i,j); @@ -606,9 +603,9 @@ int elap_wput(gref, m) if (!tabsize) { dPrintf(D_M_ELAP,D_L_WARNING, ("elap_wput:snmp: empty zip table\n")); - total = 0; + totalsize = 0; } - *(int*)gbuf_rptr(gbuf_cont(m)) = total; /* return table size */ + *(int*)gbuf_rptr(gbuf_cont(m)) = totalsize; /* return table size */ gbuf_wset(gbuf_cont(m),sizeof(int)); iocbp->ioc_count = sizeof(int); ioc_ack(0, m, gref); @@ -651,11 +648,11 @@ int elap_wput(gref, m) } if (!mo) { /* if first new one */ mt = mn; - total = size; + totalsize = size; } else { gbuf_cont(mo) = mn; - total += size; + totalsize += size; } mo = mn; getRtmpTable((RT_entry*)gbuf_rptr(mn),i,j); @@ -669,8 +666,8 @@ int elap_wput(gref, m) break; } if (!tabsize) - total = 0; - *(int*)gbuf_rptr(gbuf_cont(m)) = total; /* return table size */ + totalsize = 0; + *(int*)gbuf_rptr(gbuf_cont(m)) = totalsize; /* return table size */ gbuf_wset(gbuf_cont(m),sizeof(int)); iocbp->ioc_count = sizeof(int); ioc_ack(0, m, gref); @@ -717,7 +714,7 @@ int elap_wput(gref, m) } if (!mo) { /* if first new one */ mt = mn; - total = size; + totalsize = size; nbp = (snmpNbpTable_t*)gbuf_rptr(mn); nbp->nbpt_entries = tabsize; nbp->nbpt_zone = ifID_home->ifZoneName; @@ -725,7 +722,7 @@ int elap_wput(gref, m) } else { gbuf_cont(mo) = mn; - total += size; + totalsize += size; getNbpTable((snmpNbpEntry_t *)gbuf_rptr(mn),i,j); } mo = mn; @@ -739,8 +736,8 @@ int elap_wput(gref, m) break; } if (!tabsize) - total = 0; - *(int*)gbuf_rptr(gbuf_cont(m)) = total; /* return table size */ + totalsize = 0; + *(int*)gbuf_rptr(gbuf_cont(m)) = totalsize; /* return table size */ gbuf_wset(gbuf_cont(m),sizeof(int)); iocbp->ioc_count = sizeof(int); ioc_ack(0, m, gref); @@ -776,6 +773,7 @@ int elap_wput(gref, m) /* Called directly by ddp/zip. */ +int elap_dataput(m, elapp, addr_flag, addr) register gbuf_t *m; register at_ifaddr_t *elapp; @@ -784,10 +782,8 @@ elap_dataput(m, elapp, addr_flag, addr) { register int size; int error = 0; - extern int zip_type_packet(); struct etalk_addr dest_addr; struct atalk_addr dest_at_addr; - extern gbuf_t *growmsg(); int loop = TRUE; /* flag to aarp to loopback (default) */ @@ -861,10 +857,10 @@ elap_dataput(m, elapp, addr_flag, addr) * it doesn't know net#, consequently can't do * AMT_LOOKUP. That task left to aarp now. */ - error = aarp_send_data(m,elapp,&dest_at_addr, loop); + error = aarp_send_data(m, elapp, &dest_at_addr, loop); break; case ET_ADDR : - error = pat_output(elapp, m, &dest_addr, 0); + error = pat_output(elapp, m, (unsigned char *)&dest_addr, 0); break; } return (error); @@ -963,9 +959,11 @@ static void elap_online2(elapp) /* LD 081694: set the RTR_SEED_PORT flag for seed ports */ elapp->ifFlags |= RTR_SEED_PORT; } +#if DEBUG else dPrintf(D_M_ELAP,D_L_STARTUP_INFO, ("elap_online: it's a router, but non seed\n")); +#endif } if (elapp->flags & ELAP_CFG_ZONELESS) { @@ -1030,10 +1028,6 @@ void elap_offline(elapp) register at_ifaddr_t *elapp; { - void zip_sched_getnetinfo(); /* forward reference */ - int errno; - int s; - dPrintf(D_M_ELAP, D_L_SHUTDN_INFO, ("elap_offline:%s\n", elapp->ifName)); if (elapp->ifState != LAP_OFFLINE) { @@ -1046,11 +1040,9 @@ void elap_offline(elapp) (void)at_unreg_mcast(elapp, (caddr_t)&elapp->cable_multicast_addr); elapp->ifState = LAP_OFFLINE; - ATDISABLE(s, ddpinp_lock); if (MULTIPORT_MODE) RT_DELETE(elapp->ifThisCableEnd, elapp->ifThisCableStart); - ATENABLE(s, ddpinp_lock); /* make sure no zip timeouts are left running */ elapp->ifGNIScheduled = 0; @@ -1102,8 +1094,7 @@ int ddp_shutdown(count_only) struct atp_state *atp, *atp_next; CCB *sp, *sp_next; gref_t *gref; - vm_offset_t temp_rcb_data, temp_state_data; - int i, s, active_skts = 0; /* count of active pids for non-socketized + int i, active_skts = 0; /* count of active pids for non-socketized AppleTalk protocols */ /* Network is shutting down... send error messages up on each open @@ -1112,8 +1103,6 @@ int ddp_shutdown(count_only) sockets, but return EBUSY and don't complete shutdown. *** */ - s = splimp(); /* *** previously contained mismatched locking - that was ifdef'ed to splimp() *** */ if (!count_only) nbp_shutdown(); /* clear all known NVE */ @@ -1199,11 +1188,9 @@ int ddp_shutdown(count_only) atalk_notify(gref, ESHUTDOWN); } } - if (count_only) { - splx(s); + if (count_only) return(active_skts); - } /* if there are no interfaces in the process of going online, continue shutting down DDP */ for (i = 0; i < IF_TOTAL_MAX; i++) { if (at_interfaces[i].startup_inprogress == TRUE) @@ -1255,7 +1242,6 @@ int ddp_shutdown(count_only) } ddp_start(); - splx(s); return(0); } /* ddp_shutdown */ @@ -1316,11 +1302,9 @@ void ZIPwakeup(elapp, ZipError) at_ifaddr_t *elapp; int ZipError; { - int s, error = ZipError; + int error = ZipError; - ATDISABLE(s, ddpinp_lock); if ( (elapp != NULL) && elapp->startup_inprogress) { - ATENABLE(s, ddpinp_lock); /* was ZIPContinue */ /* was elapp_online() with jump to ZIP_sleep */ @@ -1355,21 +1339,17 @@ void ZIPwakeup(elapp, ZipError) dPrintf(D_M_ELAP, D_L_STARTUP_INFO, ("elap_online: ifZipError=%d\n", error)); } - } else - ATENABLE(s, ddpinp_lock); + } } /* ZIPwakeup */ void AARPwakeup(probe_cb) aarp_amt_t *probe_cb; { - int s; int errno; at_ifaddr_t *elapp; - ATDISABLE(s, arpinp_lock); elapp = probe_cb->elapp; if ( (elapp != NULL) && elapp->startup_inprogress && elapp->aa_ifp != 0) { - ATENABLE(s, arpinp_lock); /* was AARPContinue */ errno = aarp_init2(elapp); @@ -1391,8 +1371,7 @@ void AARPwakeup(probe_cb) ("elap_online: aarp_init returns zero\n")); elap_online2(elapp); } - } else - ATENABLE(s, arpinp_lock); + } } /* AARPwakeup */ void ddp_bit_reverse(addr) @@ -1439,6 +1418,8 @@ static unsigned char reverse_data[] = { addr[k] = reverse_data[addr[k]]; } +static int elap_trackMcast(at_ifaddr_t *, int, caddr_t); + static int elap_trackMcast(patp, func, addr) at_ifaddr_t *patp; int func; @@ -1518,7 +1499,7 @@ static int elap_trackMcast(patp, func, addr) } -static getSnmpCfg(snmp) +static int getSnmpCfg(snmp) snmpCfg_t *snmp; { int i; @@ -1621,7 +1602,7 @@ int at_reg_mcast(ifID, data) *(unsigned*)data, (*(unsigned *)(data+2))&0x0000ffff, (unsigned)ifID)); - if (if_addmulti(nddp, &sdl, 0)) + if (if_addmulti(nddp, (struct sockaddr *)&sdl, 0)) return -1; } return 0; @@ -1660,7 +1641,7 @@ int at_unreg_mcast(ifID, data) (unsigned)ifID)); bzero(data, sizeof(struct etalk_addr)); - if (if_delmulti(nddp, &sdl)) + if (if_delmulti(nddp, (struct sockaddr *)&sdl)) return -1; } return 0;