summaryrefslogtreecommitdiffstats
path: root/sys/netatm
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2005-06-10 16:49:24 +0000
committerbrooks <brooks@FreeBSD.org>2005-06-10 16:49:24 +0000
commit567ba9b00a248431e7c1147c4e079fd7a11b9ecf (patch)
treef65b6d7834b40dfcd48534829a0a1e9529ab87ee /sys/netatm
parent3eaa67c3ad947d85be5350e0e184cd6ee5b93a52 (diff)
downloadFreeBSD-src-567ba9b00a248431e7c1147c4e079fd7a11b9ecf.zip
FreeBSD-src-567ba9b00a248431e7c1147c4e079fd7a11b9ecf.tar.gz
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
Diffstat (limited to 'sys/netatm')
-rw-r--r--sys/netatm/atm_if.c28
-rw-r--r--sys/netatm/atm_if.h5
-rw-r--r--sys/netatm/atm_socket.c2
-rw-r--r--sys/netatm/atm_usrreq.c2
-rw-r--r--sys/netatm/ipatm/ipatm_input.c2
-rw-r--r--sys/netatm/ipatm/ipatm_load.c2
-rw-r--r--sys/netatm/ipatm/ipatm_output.c4
-rw-r--r--sys/netatm/ipatm/ipatm_usrreq.c6
-rw-r--r--sys/netatm/ipatm/ipatm_vcm.c4
-rw-r--r--sys/netatm/spans/spans_arp.c4
-rw-r--r--sys/netatm/uni/uniarp.c8
-rw-r--r--sys/netatm/uni/uniarp_cache.c2
12 files changed, 39 insertions, 30 deletions
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);
/*
OpenPOWER on IntegriCloud