Date: Mon, 15 Jan 1996 16:22:30 +0300 (MSK) From: Alicher O Alikhodjaev <cher@test.phys.msu.su> To: hackers@freebsd.org Message-ID: <199601151322.QAA06200@test.phys.msu.su>
next in thread | raw e-mail | index | archive | help
SUMMARY:
This patch adds multicast support for 3c5x9 (ep) driver
INSTALLATION:
cd /sys # your local kernel source tree
patch -p < this_file
# then rebuild your kernel
===================================================================
*** i386/isa/if_ep.c.cur Thu Dec 28 17:57:32 1995
--- i386/isa/if_ep.c Mon Jan 15 15:59:14 1996
***************
*** 53,58 ****
--- 53,65 ----
#include "ep.h"
#if NEP > 0
+ #ifndef EPMULTICAST
+ #define EPMULTICAST
+ #endif
+ #ifndef ETHER_IS_MULTICAST
+ #define ETHER_IS_MULTICAST(addr) (*addr & 0x01) /* is address mcast/bcast? */
+ #endif
+
#include "bpfilter.h"
#include <sys/param.h>
***************
*** 423,429 ****
ifp->if_unit = is->id_unit;
ifp->if_name = "ep";
ifp->if_mtu = ETHERMTU;
! ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS;
ifp->if_init = epinit;
ifp->if_output = ether_output;
ifp->if_start = epstart;
--- 430,437 ----
ifp->if_unit = is->id_unit;
ifp->if_name = "ep";
ifp->if_mtu = ETHERMTU;
! ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS |
! IFF_MULTICAST;
ifp->if_init = epinit;
ifp->if_output = ether_output;
ifp->if_start = epstart;
***************
*** 614,620 ****
--- 622,636 ----
sc->tx_underrun = 0;
#endif
ep_fset(F_RX_FIRST);
+ #ifdef EPMULTICAST
+ if (sc->arpcom.ac_multiaddrs || ifp->if_flags & IFF_ALLMULTI )
+ ep_fset(F_WAIT_TRAIL);
+ else
+ ep_frst(F_WAIT_TRAIL);
+ ep_fset(F_RX_TRAILER);
+ #else
ep_frst(F_RX_TRAILER);
+ #endif
if (sc->top) {
m_freem(sc->top);
sc->top = sc->mcur = 0;
***************
*** 1068,1075 ****
(eh->ether_dhost[0] & 1) == 0 &&
bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr,
sizeof(eh->ether_dhost)) != 0 &&
bcmp(eh->ether_dhost, etherbroadcastaddr,
! sizeof(eh->ether_dhost)) != 0) {
if (sc->top) {
m_freem(sc->top);
sc->top = 0;
--- 1084,1097 ----
(eh->ether_dhost[0] & 1) == 0 &&
bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr,
sizeof(eh->ether_dhost)) != 0 &&
+ #ifdef EPMULTICAST
+ /* non-multicast (also non-broadcast) */
+ !ETHER_IS_MULTICAST(eh->ether_dhost)
+ #else
bcmp(eh->ether_dhost, etherbroadcastaddr,
! sizeof(eh->ether_dhost)) != 0
! #endif
! ) {
if (sc->top) {
m_freem(sc->top);
sc->top = 0;
***************
*** 1200,1205 ****
--- 1222,1245 ----
}
break;
+
+ #ifdef EPMULTICAST
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ /*
+ * Update out multicast list.
+ */
+ error = (cmd == SIOCADDMULTI) ?
+ ether_addmulti(ifr, &sc->arpcom) :
+ ether_delmulti(ifr, &sc->arpcom);
+
+ if (error == ENETRESET) {
+ epinit(ifp->if_unit);
+ error = 0;
+ }
+ break;
+ #endif
+
#ifdef notdef
case SIOCGHWADDR:
bcopy((caddr_t) sc->sc_addr, (caddr_t) & ifr->ifr_data,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199601151322.QAA06200>
