- struct gif_softc *sc = (struct gif_softc*)ifp;
- struct ifreq *ifr = (struct ifreq*)data;
- int error = 0, size;
- struct sockaddr *sa, *dst, *src;
- const struct encaptab *p;
- struct sockaddr_in smask4, dmask4;
-
- switch (cmd) {
- case SIOCSIFFLAGS:
- /*
- * whenever we change our idea about multi-destination mode
- * we need to update encap attachment.
- */
- if (((ifp->if_flags ^ sc->gif_oflags) & IFF_LINK0) == 0)
- break;
- if (sc->gif_psrc == NULL || sc->gif_pdst == NULL ||
- sc->gif_psrc->sa_family != sc->gif_pdst->sa_family)
- break;
- bzero(&smask4, sizeof(smask4));
- smask4.sin_addr.s_addr = ~0;
- dmask4 = smask4;
- if ((ifp->if_flags & IFF_LINK0) != 0 &&
- ((struct sockaddr_in *)dst)->sin_addr.s_addr ==
- INADDR_ANY) {
- bzero(&dmask4, sizeof(dmask4));
- }
- p = encap_attach(sc->gif_psrc->sa_family, -1, sc->gif_psrc,
- (struct sockaddr *)&smask4, sc->gif_pdst,
- (struct sockaddr *)&dmask4,
- (struct protosw *)&in_gif_protosw, &sc->gif_if);
- if (p == NULL) {
- error = EINVAL;
- goto bad;
- }
- if (sc->encap_cookie != NULL)
- (void)encap_detach(sc->encap_cookie);
- sc->encap_cookie = p;
- sc->gif_oflags = ifp->if_flags;