aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
authorAndrey V. Elsukov <ae@FreeBSD.org>2018-10-21 18:06:15 +0000
committerAndrey V. Elsukov <ae@FreeBSD.org>2018-10-21 18:06:15 +0000
commit009d82ee0fefdc797f55d25a50d3b6ebe61d56e4 (patch)
treeccfeec6723ecabba8eea9e3ee3b77ddfc9a1e97e /sys/net
parent8251c68d5c8f068fbf8462b8809517d45f8fed86 (diff)
downloadsrc-009d82ee0fefdc797f55d25a50d3b6ebe61d56e4.tar.gz
src-009d82ee0fefdc797f55d25a50d3b6ebe61d56e4.zip
Add handling for appearing/disappearing of ingress addresses to if_gif(4).
* register handler for ingress address appearing/disappearing; * add new srcaddr hash table for fast softc lookup by srcaddr; * when srcaddr disappears, clear IFF_DRV_RUNNING flag from interface, and set it otherwise; * remove the note about ingress address from BUGS section. MFC after: 1 month Sponsored by: Yandex LLC Differential Revision: https://reviews.freebsd.org/D17134
Notes
Notes: svn path=/head/; revision=339551
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if_gif.c3
-rw-r--r--sys/net/if_gif.h1
2 files changed, 3 insertions, 1 deletions
diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c
index 51adc37832bb..6a5571a996f5 100644
--- a/sys/net/if_gif.c
+++ b/sys/net/if_gif.c
@@ -284,6 +284,7 @@ gif_transmit(struct ifnet *ifp, struct mbuf *m)
sc = ifp->if_softc;
if ((ifp->if_flags & IFF_MONITOR) != 0 ||
(ifp->if_flags & IFF_UP) == 0 ||
+ (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 ||
sc->gif_family == 0 ||
(error = if_tunnel_check_nesting(ifp, m, MTAG_GIF,
V_max_gif_nesting)) != 0) {
@@ -674,7 +675,6 @@ gif_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
cmd == SIOCSIFPHYADDR_IN6 ||
#endif
0) {
- ifp->if_drv_flags |= IFF_DRV_RUNNING;
if_link_state_change(ifp, LINK_STATE_UP);
}
}
@@ -689,6 +689,7 @@ gif_delete_tunnel(struct gif_softc *sc)
sx_assert(&gif_ioctl_sx, SA_XLOCKED);
if (sc->gif_family != 0) {
+ CK_LIST_REMOVE(sc, srchash);
CK_LIST_REMOVE(sc, chain);
/* Wait until it become safe to free gif_hdr */
GIF_WAIT();
diff --git a/sys/net/if_gif.h b/sys/net/if_gif.h
index 501a4e5d1789..264fe7b3ddd5 100644
--- a/sys/net/if_gif.h
+++ b/sys/net/if_gif.h
@@ -63,6 +63,7 @@ struct gif_softc {
} gif_uhdr;
CK_LIST_ENTRY(gif_softc) chain;
+ CK_LIST_ENTRY(gif_softc) srchash;
};
CK_LIST_HEAD(gif_list, gif_softc);
MALLOC_DECLARE(M_GIF);