diff options
author | Andrey V. Elsukov <ae@FreeBSD.org> | 2018-10-21 18:06:15 +0000 |
---|---|---|
committer | Andrey V. Elsukov <ae@FreeBSD.org> | 2018-10-21 18:06:15 +0000 |
commit | 009d82ee0fefdc797f55d25a50d3b6ebe61d56e4 (patch) | |
tree | ccfeec6723ecabba8eea9e3ee3b77ddfc9a1e97e /sys/net | |
parent | 8251c68d5c8f068fbf8462b8809517d45f8fed86 (diff) | |
download | src-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.c | 3 | ||||
-rw-r--r-- | sys/net/if_gif.h | 1 |
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); |