summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authormdodd <mdodd@FreeBSD.org>2002-03-29 10:40:35 +0000
committermdodd <mdodd@FreeBSD.org>2002-03-29 10:40:35 +0000
commitfdbdd2f5af8ced636e98ffa82c0898512b04bfba (patch)
tree1d378ed0d1996bfa65a54b3ff8d9f3b6e298d1ee /sys/net
parent57e3ddce9b3dad4fe3bb8b3554c4f44cb96e2b87 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/net/fddi.h14
-rw-r--r--sys/net/if_fddisubr.c99
2 files changed, 108 insertions, 5 deletions
diff --git a/sys/net/fddi.h b/sys/net/fddi.h
index 7ff9a5d..7d69ce7 100644
--- a/sys/net/fddi.h
+++ b/sys/net/fddi.h
@@ -88,17 +88,21 @@ struct fddi_header {
};
#if defined(_KERNEL)
-#define fddibroadcastaddr etherbroadcastaddr
#define fddi_ipmulticast_min ether_ipmulticast_min
#define fddi_ipmulticast_max ether_ipmulticast_max
#define fddi_addmulti ether_addmulti
#define fddi_delmulti ether_delmulti
#define fddi_sprintf ether_sprintf
-void fddi_ifattach(struct ifnet *);
-void fddi_input(struct ifnet *, struct fddi_header *, struct mbuf *);
-int fddi_output(struct ifnet *,
- struct mbuf *, struct sockaddr *, struct rtentry *);
+#define FDDI_BPF_UNSUPPORTED 0
+#define FDDI_BPF_SUPPORTED 1
+
+void fddi_ifattach(struct ifnet *);
+void fddi_ifdetach(struct ifnet *, int);
+void fddi_input(struct ifnet *, struct fddi_header *, struct mbuf *);
+int fddi_output(struct ifnet *, struct mbuf *, struct sockaddr *,
+ struct rtentry *);
+int fddi_ioctl(struct ifnet *, int, caddr_t);
#endif /* _KERNEL */
#endif /* _NET_FDDI_H_ */
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;
OpenPOWER on IntegriCloud