diff options
author | mdodd <mdodd@FreeBSD.org> | 2002-03-29 10:40:35 +0000 |
---|---|---|
committer | mdodd <mdodd@FreeBSD.org> | 2002-03-29 10:40:35 +0000 |
commit | fdbdd2f5af8ced636e98ffa82c0898512b04bfba (patch) | |
tree | 1d378ed0d1996bfa65a54b3ff8d9f3b6e298d1ee /sys/net/if_fddisubr.c | |
parent | 57e3ddce9b3dad4fe3bb8b3554c4f44cb96e2b87 (diff) | |
download | FreeBSD-src-fdbdd2f5af8ced636e98ffa82c0898512b04bfba.zip FreeBSD-src-fdbdd2f5af8ced636e98ffa82c0898512b04bfba.tar.gz |
- Define fddibroadcastaddr in if_fddisubr.c.
- Add fddi_ifdetach() and fddi_ioctl().
Diffstat (limited to 'sys/net/if_fddisubr.c')
-rw-r--r-- | sys/net/if_fddisubr.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/sys/net/if_fddisubr.c b/sys/net/if_fddisubr.c index 8285268..642e625 100644 --- a/sys/net/if_fddisubr.c +++ b/sys/net/if_fddisubr.c @@ -91,6 +91,9 @@ extern u_char at_org_code[ 3 ]; extern u_char aarp_org_code[ 3 ]; #endif /* NETATALK */ +static u_char fddibroadcastaddr[FDDI_ADDR_LEN] = + { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + static int fddi_resolvemulti(struct ifnet *, struct sockaddr **, struct sockaddr *); @@ -551,6 +554,102 @@ fddi_ifattach(ifp) return; } +void +fddi_ifdetach(ifp, bpf) + struct ifnet *ifp; + int bpf; +{ + + if (bpf) + bpfdetach(ifp); + + if_detach(ifp); + + return; +} + +int +fddi_ioctl (ifp, command, data) + struct ifnet *ifp; + int command; + caddr_t data; +{ + struct ifaddr *ifa; + struct ifreq *ifr; + int error; + + ifa = (struct ifaddr *) data; + ifr = (struct ifreq *) data; + error = 0; + + switch (command) { + case SIOCSIFADDR: + ifp->if_flags |= IFF_UP; + + switch (ifa->ifa_addr->sa_family) { +#ifdef INET + case AF_INET: /* before arpwhohas */ + ifp->if_init(ifp->if_softc); + arp_ifinit(ifp, ifa); + break; +#endif +#ifdef IPX + /* + * XXX - This code is probably wrong + */ + case AF_IPX: { + struct ipx_addr *ina; + struct arpcom *ac; + + ina = &(IA_SIPX(ifa)->sipx_addr); + ac = IFP2AC(ifp); + + if (ipx_nullhost(*ina)) { + ina->x_host = *(union ipx_host *) + ac->ac_enaddr; + } else { + bcopy((caddr_t) ina->x_host.c_host, + (caddr_t) ac->ac_enaddr, + sizeof(ac->ac_enaddr)); + } + + /* + * Set new address + */ + ifp->if_init(ifp->if_softc); + } + break; +#endif + default: + ifp->if_init(ifp->if_softc); + break; + } + case SIOCGIFADDR: { + struct sockaddr *sa; + + sa = (struct sockaddr *) & ifr->ifr_data; + bcopy(IFP2AC(ifp)->ac_enaddr, + (caddr_t) sa->sa_data, FDDI_ADDR_LEN); + + } + break; + case SIOCSIFMTU: + /* + * Set the interface MTU. + */ + if (ifr->ifr_mtu > FDDIMTU) { + error = EINVAL; + } else { + ifp->if_mtu = ifr->ifr_mtu; + } + break; + default: + break; + } + + return (error); +} + static int fddi_resolvemulti(ifp, llsa, sa) struct ifnet *ifp; |