diff options
-rw-r--r-- | sys/net/if.c | 11 | ||||
-rw-r--r-- | sys/netinet/if_ether.c | 43 | ||||
-rw-r--r-- | sys/netinet/if_ether.h | 6 |
3 files changed, 36 insertions, 24 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 086c2d36769..d68f64bf203 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if.c,v 1.245 2012/10/05 17:17:04 camield Exp $ */ +/* $OpenBSD: if.c,v 1.246 2012/10/18 00:36:21 deraadt Exp $ */ /* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */ /* @@ -67,6 +67,7 @@ #include "carp.h" #include "pf.h" #include "trunk.h" +#include "ether.h" #include <sys/param.h> #include <sys/systm.h> @@ -553,8 +554,8 @@ if_detach(struct ifnet *ifp) rt_if_remove(ifp); #ifdef INET rti_delete(ifp); -#if NETHER > 0 - myip_ifp = NULL; +#if NETHER > 0 && defined(NFSCLIENT) + revarp_ifp = NULL; #endif #ifdef MROUTING vif_delete(ifp); @@ -1496,8 +1497,8 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) rt_if_remove(ifp); #ifdef INET rti_delete(ifp); -#if NETHER > 0 - myip_ifp = NULL; +#if NETHER > 0 && defined(NFSCLIENT) + revarp_ifp = NULL; #endif #ifdef MROUTING vif_delete(ifp); diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 6b591c89f1a..4e669c77ec2 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ether.c,v 1.95 2012/10/05 17:17:04 camield Exp $ */ +/* $OpenBSD: if_ether.c,v 1.96 2012/10/18 00:36:22 deraadt Exp $ */ /* $NetBSD: if_ether.c,v 1.31 1996/05/11 12:59:58 mycroft Exp $ */ /* @@ -96,11 +96,13 @@ int useloopback = 1; /* use loopback interface for local traffic */ int arpinit_done; int la_hold_total; +#ifdef NFSCLIENT /* revarp state */ -struct in_addr myip, srv_ip; -int myip_initialized; +struct in_addr revarp_myip, revarp_srvip; +int revarp_finished; int revarp_in_progress; -struct ifnet *myip_ifp; +struct ifnet *revarp_ifp; +#endif /* NFSCLIENT */ #ifdef DDB #include <uvm/uvm_extern.h> @@ -912,7 +914,9 @@ out: void in_revarpinput(struct mbuf *m) { +#ifdef NFSCLIENT struct ifnet *ifp; +#endif /* NFSCLIENT */ struct ether_arp *ar; int op; @@ -929,21 +933,25 @@ in_revarpinput(struct mbuf *m) default: goto out; } +#ifdef NFSCLIENT if (!revarp_in_progress) goto out; ifp = m->m_pkthdr.rcvif; - if (ifp != myip_ifp) /* !same interface */ + if (ifp != revarp_ifp) /* !same interface */ goto out; - if (myip_initialized) + if (revarp_finished) goto wake; if (bcmp(ar->arp_tha, ((struct arpcom *)ifp)->ac_enaddr, sizeof(ar->arp_tha))) goto out; - bcopy((caddr_t)ar->arp_spa, (caddr_t)&srv_ip, sizeof(srv_ip)); - bcopy((caddr_t)ar->arp_tpa, (caddr_t)&myip, sizeof(myip)); - myip_initialized = 1; + bcopy((caddr_t)ar->arp_spa, (caddr_t)&revarp_srvip, + sizeof(revarp_srvip)); + bcopy((caddr_t)ar->arp_tpa, (caddr_t)&revarp_myip, + sizeof(revarp_myip)); + revarp_finished = 1; wake: /* Do wakeup every time in case it was missed. */ - wakeup((caddr_t)&myip); + wakeup((caddr_t)&revarp_myip); +#endif out: m_freem(m); @@ -990,6 +998,7 @@ revarprequest(struct ifnet *ifp) ifp->if_output(ifp, m, &sa, (struct rtentry *)0); } +#ifdef NFSCLIENT /* * RARP for the ip address of the specified interface, but also * save the ip address of the server that sent the answer. @@ -1001,23 +1010,23 @@ revarpwhoarewe(struct ifnet *ifp, struct in_addr *serv_in, { int result, count = 20; - if (myip_initialized) + if (revarp_finished) return EIO; - myip_ifp = ifp; + revarp_ifp = ifp; revarp_in_progress = 1; while (count--) { revarprequest(ifp); - result = tsleep((caddr_t)&myip, PSOCK, "revarp", hz/2); + result = tsleep((caddr_t)&revarp_myip, PSOCK, "revarp", hz/2); if (result != EWOULDBLOCK) break; } revarp_in_progress = 0; - if (!myip_initialized) + if (!revarp_finished) return ENETUNREACH; - bcopy((caddr_t)&srv_ip, serv_in, sizeof(*serv_in)); - bcopy((caddr_t)&myip, clnt_in, sizeof(*clnt_in)); + bcopy((caddr_t)&revarp_srvip, serv_in, sizeof(*serv_in)); + bcopy((caddr_t)&revarp_myip, clnt_in, sizeof(*clnt_in)); return 0; } @@ -1028,7 +1037,7 @@ revarpwhoami(struct in_addr *in, struct ifnet *ifp) struct in_addr server; return (revarpwhoarewe(ifp, &server, in)); } - +#endif /* NFSCLIENT */ #ifdef DDB diff --git a/sys/netinet/if_ether.h b/sys/netinet/if_ether.h index c48f7efd314..287fb8a4ef8 100644 --- a/sys/netinet/if_ether.h +++ b/sys/netinet/if_ether.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ether.h,v 1.47 2010/02/08 13:32:50 claudio Exp $ */ +/* $OpenBSD: if_ether.h,v 1.48 2012/10/18 00:36:22 deraadt Exp $ */ /* $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $ */ /* @@ -276,7 +276,9 @@ do { \ #ifdef _KERNEL -extern struct ifnet *myip_ifp; +#ifdef NFSCLIENT +extern struct ifnet *revarp_ifp; +#endif /* NFSCLIENT */ void arprequest(struct ifnet *, u_int32_t *, u_int32_t *, u_int8_t *); void revarpinput(struct mbuf *); |