From 567ba9b00a248431e7c1147c4e079fd7a11b9ecf Mon Sep 17 00:00:00 2001 From: brooks Date: Fri, 10 Jun 2005 16:49:24 +0000 Subject: Stop embedding struct ifnet at the top of driver softcs. Instead the struct ifnet or the layer 2 common structure it was embedded in have been replaced with a struct ifnet pointer to be filled by a call to the new function, if_alloc(). The layer 2 common structure is also allocated via if_alloc() based on the interface type. It is hung off the new struct ifnet member, if_l2com. This change removes the size of these structures from the kernel ABI and will allow us to better manage them as interfaces come and go. Other changes of note: - Struct arpcom is no longer referenced in normal interface code. Instead the Ethernet address is accessed via the IFP2ENADDR() macro. To enforce this ac_enaddr has been renamed to _ac_enaddr. - The second argument to ether_ifattach is now always the mac address from driver private storage rather than sometimes being ac_enaddr. Reviewed by: sobomax, sam --- sys/netatm/atm_if.c | 28 ++++++++++++++++++---------- sys/netatm/atm_if.h | 5 +++-- sys/netatm/atm_socket.c | 2 +- sys/netatm/atm_usrreq.c | 2 +- sys/netatm/ipatm/ipatm_input.c | 2 +- sys/netatm/ipatm/ipatm_load.c | 2 +- sys/netatm/ipatm/ipatm_output.c | 4 ++-- sys/netatm/ipatm/ipatm_usrreq.c | 6 +++--- sys/netatm/ipatm/ipatm_vcm.c | 4 ++-- sys/netatm/spans/spans_arp.c | 4 ++-- sys/netatm/uni/uniarp.c | 8 ++++---- sys/netatm/uni/uniarp_cache.c | 2 +- 12 files changed, 39 insertions(+), 30 deletions(-) (limited to 'sys/netatm') diff --git a/sys/netatm/atm_if.c b/sys/netatm/atm_if.c index 49c1867..f6f78b9 100644 --- a/sys/netatm/atm_if.c +++ b/sys/netatm/atm_if.c @@ -341,7 +341,7 @@ atm_physif_ioctl(code, data, arg) "%s%d", pip->pif_name, pip->pif_unit ); if ( pip->pif_nif ) { - strcpy(apr.anp_nif_pref, pip->pif_nif->nif_if.if_dname); + strcpy(apr.anp_nif_pref, pip->pif_nif->nif_ifp->if_dname); nip = pip->pif_nif; while ( nip ) { @@ -376,7 +376,7 @@ atm_physif_ioctl(code, data, arg) */ aip = (struct atminfreq *)data; nip = (struct atm_nif *)arg; - ifp = &nip->nif_if; + ifp = nip->nif_ifp; pip = nip->nif_pif; /* @@ -503,7 +503,15 @@ atm_physif_ioctl(code, data, arg) } nip->nif_pif = pip; - ifp = &nip->nif_if; + ifp = nip->nif_ifp = if_alloc(IFT_IPOVERATM); + if (ifp == NULL) { + uma_zfree(cup->cu_nif_zone, nip); + /* + * Destroy any successful nifs + */ + atm_physif_freenifs(pip, cup->cu_nif_zone); + break; + } strcpy ( nip->nif_name, asr->asr_nif_pref ); nip->nif_sel = count; @@ -514,10 +522,6 @@ atm_physif_ioctl(code, data, arg) ifp->if_output = atm_ifoutput; ifp->if_ioctl = atm_if_ioctl; ifp->if_snd.ifq_maxlen = ifqmaxlen; - /* - * Set if_type and if_baudrate - */ - ifp->if_type = IFT_IPOVERATM; switch ( cup->cu_config.ac_media ) { case MEDIA_TAXI_100: ifp->if_baudrate = 100000000; @@ -544,6 +548,7 @@ atm_physif_ioctl(code, data, arg) break; } if ((err = atm_nif_attach(nip)) != 0) { + if_free(nip->nif_ifp); uma_zfree(cup->cu_nif_zone, nip); /* * Destroy any successful nifs @@ -755,7 +760,9 @@ atm_nif_attach(nip) struct atm_ncm *ncp; int s; - ifp = &nip->nif_if; + ifp = nip->nif_ifp; + if (ifp == NULL) + return (ENOSPC); pip = nip->nif_pif; s = splimp(); @@ -831,7 +838,7 @@ atm_nif_detach(nip) { struct atm_ncm *ncp; int s; - struct ifnet *ifp = &nip->nif_if; + struct ifnet *ifp = nip->nif_ifp; s = splimp(); @@ -853,6 +860,7 @@ atm_nif_detach(nip) * then remove from the system interface list */ if_detach(ifp); + if_free(ifp); /* * Remove from physical interface list @@ -970,7 +978,7 @@ atm_if_ioctl(ifp, cmd, data) caddr_t data; { register struct ifreq *ifr = (struct ifreq *)data; - struct atm_nif *nip = (struct atm_nif *)ifp; + struct atm_nif *nip = IFP2ANIF(ifp); int error = 0; int s = splnet(); diff --git a/sys/netatm/atm_if.h b/sys/netatm/atm_if.h index 6cadb75..c9ea43a 100644 --- a/sys/netatm/atm_if.h +++ b/sys/netatm/atm_if.h @@ -224,7 +224,7 @@ struct atm_pif { * each physical ATM interface. */ struct atm_nif { - struct ifnet nif_if; /* Network interface */ + struct ifnet *nif_ifp; /* Network interface */ struct atm_pif *nif_pif; /* Our physical interface */ char nif_name[IFNAMSIZ];/* Network interface name */ u_char nif_sel; /* Interface's address selector */ @@ -234,7 +234,8 @@ struct atm_nif { long nif_ibytes; /* Bytes received from interface */ long nif_obytes; /* Bytes sent to interface */ }; - +#define ANIF2IFP(an) ((an)->nif_ifp) +#define IFP2ANIF(ifp) ((struct atm_nif *)(ifp)->if_softc) /* * Common Device VCC Entry diff --git a/sys/netatm/atm_socket.c b/sys/netatm/atm_socket.c index 37ea86d..7da8f3e 100644 --- a/sys/netatm/atm_socket.c +++ b/sys/netatm/atm_socket.c @@ -1218,7 +1218,7 @@ atm_sock_getopt(so, sopt, atp) struct t_atm_net_intf netif; struct ifnet *ifp; - ifp = &ap->nif->nif_if; + ifp = ANIF2IFP(ap->nif); (void) snprintf(netif.net_intf, sizeof(netif.net_intf), "%s", ifp->if_xname); return (sooptcopyout(sopt, &netif, diff --git a/sys/netatm/atm_usrreq.c b/sys/netatm/atm_usrreq.c index 67cc6a9..8baec6a 100644 --- a/sys/netatm/atm_usrreq.c +++ b/sys/netatm/atm_usrreq.c @@ -393,7 +393,7 @@ atm_dgram_control(so, cmd, data, ifp, td) */ for (nip = pip->pif_nif; nip; nip = nip->nif_pnext) { - if (&nip->nif_if == ifp2) + if (ANIF2IFP(nip) == ifp2) break; } if (nip) diff --git a/sys/netatm/ipatm/ipatm_input.c b/sys/netatm/ipatm/ipatm_input.c index 3899d23..1bdadd2 100644 --- a/sys/netatm/ipatm/ipatm_input.c +++ b/sys/netatm/ipatm/ipatm_input.c @@ -142,7 +142,7 @@ ipatm_ipinput(inp, m) /* * Save the input ifnet pointer in the packet header */ - m->m_pkthdr.rcvif = (struct ifnet *)inp->inf_nif; + m->m_pkthdr.rcvif = ANIF2IFP(inp->inf_nif); /* * Finally, hand packet off to IP. diff --git a/sys/netatm/ipatm/ipatm_load.c b/sys/netatm/ipatm/ipatm_load.c index 638c0ce..2e931cd 100644 --- a/sys/netatm/ipatm/ipatm_load.c +++ b/sys/netatm/ipatm/ipatm_load.c @@ -438,7 +438,7 @@ ipatm_start() * Process each network interface */ for (nip = pip->pif_nif; nip; nip = nip->nif_pnext) { - struct ifnet *ifp = (struct ifnet *)nip; + struct ifnet *ifp = ANIF2IFP(nip); struct in_ifaddr *ia; /* diff --git a/sys/netatm/ipatm/ipatm_output.c b/sys/netatm/ipatm/ipatm_output.c index 11ac8c0..45559f0 100644 --- a/sys/netatm/ipatm/ipatm_output.c +++ b/sys/netatm/ipatm/ipatm_output.c @@ -92,7 +92,7 @@ ipatm_ifoutput(ifp, m, dst) /* * See if we've already got an appropriate VCC */ - ivp = ipatm_iptovc((struct sockaddr_in *)dst, (struct atm_nif *)ifp); + ivp = ipatm_iptovc((struct sockaddr_in *)dst, IFP2ANIF(ifp)); if (ivp) { /* @@ -164,7 +164,7 @@ ipatm_ifoutput(ifp, m, dst) */ s = splnet(); for (inp = ipatm_nif_head; inp; inp = inp->inf_next) { - if (inp->inf_nif == (struct atm_nif *)ifp) + if (inp->inf_nif == IFP2ANIF(ifp)) break; } (void) splx(s); diff --git a/sys/netatm/ipatm/ipatm_usrreq.c b/sys/netatm/ipatm/ipatm_usrreq.c index 9fcc20c..19c02b3 100644 --- a/sys/netatm/ipatm/ipatm_usrreq.c +++ b/sys/netatm/ipatm/ipatm_usrreq.c @@ -325,7 +325,7 @@ ipatm_ioctl(code, data, arg1) } if ((ip.s_addr == INADDR_ANY) || - in_broadcast(ip, &inp->inf_nif->nif_if) || + in_broadcast(ip, ANIF2IFP(inp->inf_nif)) || IN_MULTICAST(ntohl(ip.s_addr))) { err = EADDRNOTAVAIL; break; @@ -391,7 +391,7 @@ ipatm_ioctl(code, data, arg1) } if ((ip.s_addr == INADDR_ANY) || - in_broadcast(ip, &inp->inf_nif->nif_if) || + in_broadcast(ip, ANIF2IFP(inp->inf_nif)) || IN_MULTICAST(ntohl(ip.s_addr))) { err = EADDRNOTAVAIL; break; @@ -447,7 +447,7 @@ ipatm_ioctl(code, data, arg1) SATOSIN(&aivr.aip_dst_addr)->sin_addr.s_addr = ivp->iv_dst.s_addr; strlcpy(aivr.aip_intf, - inp->inf_nif->nif_if.if_xname, + ANIF2IFP(inp->inf_nif)->if_xname, sizeof(aivr.aip_intf)); if ((ivp->iv_conn) && (ivp->iv_conn->co_connvc) && diff --git a/sys/netatm/ipatm/ipatm_vcm.c b/sys/netatm/ipatm/ipatm_vcm.c index 7f7cdf7..f06348e 100644 --- a/sys/netatm/ipatm/ipatm_vcm.c +++ b/sys/netatm/ipatm/ipatm_vcm.c @@ -367,7 +367,7 @@ ipatm_openpvc(pvp, sivp) * Validate fixed destination IP address */ if (pvp->ipp_dst.sin_addr.s_addr != INADDR_ANY) { - if (in_broadcast(pvp->ipp_dst.sin_addr, &nip->nif_if) || + if (in_broadcast(pvp->ipp_dst.sin_addr, ANIF2IFP(nip)) || IN_MULTICAST(ntohl(pvp->ipp_dst.sin_addr.s_addr)) || ipatm_chknif(pvp->ipp_dst.sin_addr, inp)) { err = EINVAL; @@ -606,7 +606,7 @@ ipatm_createsvc(ifp, daf, dst, sivp) caddr_t dst; struct ipvcc **sivp; { - struct atm_nif *nip = (struct atm_nif *)ifp; + struct atm_nif *nip = IFP2ANIF(ifp); struct ip_nif *inp; struct ipvcc *ivp = NULL; /* XXX pacify gcc-3.1 */ struct in_addr *ip; diff --git a/sys/netatm/spans/spans_arp.c b/sys/netatm/spans/spans_arp.c index 507562b..eefdb3e 100644 --- a/sys/netatm/spans/spans_arp.c +++ b/sys/netatm/spans/spans_arp.c @@ -665,7 +665,7 @@ spansarp_input(clp, m) * If source IP address is from unspecified or broadcast addresses, * don't bother updating arp table, but answer possible requests */ - if (in_broadcast(in_src, &inp->inf_nif->nif_if)) + if (in_broadcast(in_src, ANIF2IFP(inp->inf_nif))) goto chkop; /* @@ -1118,7 +1118,7 @@ spansarp_ioctl(code, data, arg1) SATOSIN(&aar.aap_arp_addr)->sin_addr.s_addr = sap->sa_dstip.s_addr; strlcpy(aar.aap_intf, - clp->cls_ipnif->inf_nif->nif_if.if_xname, + ANIF2IFP(clp->cls_ipnif->inf_nif)->if_xname, sizeof(aar.aap_intf)); aar.aap_flags = sap->sa_flags; aar.aap_origin = sap->sa_origin; diff --git a/sys/netatm/uni/uniarp.c b/sys/netatm/uni/uniarp.c index bcd0967..c23a905 100644 --- a/sys/netatm/uni/uniarp.c +++ b/sys/netatm/uni/uniarp.c @@ -722,7 +722,7 @@ uniarp_client_mode(uip, aap) /* * Next, initiate an SVC to the server */ - if ((*inp->inf_createsvc)(&inp->inf_nif->nif_if, AF_ATM, + if ((*inp->inf_createsvc)(ANIF2IFP(inp->inf_nif), AF_ATM, (caddr_t)&uip->uip_arpsvratm, &ivp)) { uma_zfree(uniarp_zone, uap); UNIIP_ARP_TIMER(uip, 1 * ATM_HZ); @@ -1054,7 +1054,7 @@ uniarp_ioctl(code, data, arg1) AF_INET; SATOSIN(&aar.aap_arp_addr)->sin_addr.s_addr = uap->ua_dstip.s_addr; - strlcpy(aar.aap_intf, nip->nif_if.if_xname, + strlcpy(aar.aap_intf, ANIF2IFP(nip)->if_xname, sizeof(aar.aap_intf)); aar.aap_flags = uap->ua_flags; aar.aap_origin = uap->ua_origin; @@ -1107,7 +1107,7 @@ uniarp_ioctl(code, data, arg1) */ SATOSIN(&aar.aap_arp_addr)->sin_family = AF_INET; SATOSIN(&aar.aap_arp_addr)->sin_addr.s_addr = 0; - strlcpy(aar.aap_intf, nip->nif_if.if_xname, + strlcpy(aar.aap_intf, ANIF2IFP(nip)->if_xname, sizeof(aar.aap_intf)); aar.aap_flags = 0; aar.aap_origin = uap->ua_origin; @@ -1187,7 +1187,7 @@ updbuf: /* * Fill in info to be returned */ - strlcpy(asr.asp_intf, nip->nif_if.if_xname, + strlcpy(asr.asp_intf, ANIF2IFP(nip)->if_xname, sizeof(asr.asp_intf)); asr.asp_state = uip->uip_arpstate; if (uip->uip_arpstate == UIAS_SERVER_ACTIVE) { diff --git a/sys/netatm/uni/uniarp_cache.c b/sys/netatm/uni/uniarp_cache.c index 946fee8..074b8c7 100644 --- a/sys/netatm/uni/uniarp_cache.c +++ b/sys/netatm/uni/uniarp_cache.c @@ -413,7 +413,7 @@ uniarp_validate_ip(uip, ip, origin) * Can't be multicast or broadcast address */ if (IN_MULTICAST(ntohl(ip->s_addr)) || - in_broadcast(*ip, &uip->uip_ipnif->inf_nif->nif_if)) + in_broadcast(*ip, ANIF2IFP(uip->uip_ipnif->inf_nif))) return (1); /* -- cgit v1.1