Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!nntp.coast.net!news.kei.com!newsfeed.internetmci.com!uwm.edu!daffy!uwvax!newssinet!news.nc.u-tokyo.ac.jp!wnoc-tyo-news!spinnews!spin-hsd0-tky!okigw!tyo-hub!okics!primera!usenet
From: yokoi@hard2.takasaki.oki.co.jp (Eiji Yokoi)
Newsgroups: comp.unix.bsd.freebsd.misc
Subject: Re: Multicast support in the 3COM 3C509B (ep0) driver?
Date: 1 Dec 1995 08:09:45 GMT
Organization: Oki Electric Industry Co., Ltd.
Lines: 173
Message-ID: <49md89$3up@primera.hard1.takasaki.oki.co.jp>
References: <finlayson-1811950121040001@hokianga.live.com>
NNTP-Posting-Host: gop.hard2.takasaki.oki.co.jp
X-Newsreader: WinVN 0.92.6J
In article <finlayson-1811950121040001@hokianga.live.com>, finlayson@live.com (Ross Finlayson) says:
>Is there a good reason for this? Is there a version of this driver code
>out there that handles multicast? If not, could I likely get the driver
>to work by copying appropriate code from the if_ed.c driver (which, unlike
>if_ep.c, *does* seem to support multicast)?
Next patch have been posted to fj.os.bsd.freebsd(fj meens From Japan).
by Mr. Nakagawa <y-nakaga@ccs.mt.nec.co.jp>
The message ID is <Y-NAKAGA.95Oct26163023@spls63.ccs.mt.nec.co.jp>.
Original article was wrote in Japanese, so I will post only part
of the patch. He said that ep0 looks like works well, but use it by
your own risk.
Good luck!
--- from here ---
*** if_ep.c.org Wed Sep 20 16:31:24 1995
--- if_ep.c Thu Sep 21 14:40:13 1995
***************
*** 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;
--- 423,430 ----
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;
***************
*** 1200,1205 ****
--- 1201,1223 ----
}
break;
+
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ error = (cmd == SIOCADDMULTI) ?
+ ether_addmulti(ifr, &sc->arpcom) :
+ ether_delmulti(ifr, &sc->arpcom);
+
+ if (error == ENETRESET) {
+ /*
+ * Multicast list has changed; set the hardware filter
+ * accordingly.
+ */
+ epinit(ifp->if_unit);
+ error = 0;
+ }
+ break;
+
#ifdef notdef
case SIOCGHWADDR:
bcopy((caddr_t) sc->sc_addr, (caddr_t) & ifr->ifr_data,
*** if_zp.c.org Thu Sep 21 14:23:44 1995
--- if_zp.c Thu Sep 21 15:00:51 1995
***************
*** 912,918 ****
sc->attached = 1;
#else /* MACH_KERNEL */
! ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS;
ifp->if_unit = isa_dev->id_unit;
ifp->if_name = "zp";
ifp->if_init = zpinit;
--- 912,919 ----
sc->attached = 1;
#else /* MACH_KERNEL */
! ifp->if_flags =
! IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
ifp->if_unit = isa_dev->id_unit;
ifp->if_name = "zp";
ifp->if_init = zpinit;
***************
*** 1987,1992 ****
--- 1988,2010 ----
if (ifp->if_flags & IFF_UP && (ifp->if_flags & IFF_RUNNING) == 0)
zpinit(ifp->if_unit);
break;
+
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ error = (cmd == SIOCADDMULTI) ?
+ ether_addmulti(ifr, &sc->arpcom) :
+ ether_delmulti(ifr, &sc->arpcom);
+
+ if (error == ENETRESET) {
+ /*
+ * Multicast list has changed; set the hardware filter
+ * accordingly.
+ */
+ zpinit(ifp->if_unit);
+ error = 0;
+ }
+ break;
+
#ifdef notdef
case SIOCGHWADDR:
bcopy((caddr_t) sc->sc_addr, (caddr_t) & ifr->ifr_data,
*** if_tun.c.org Thu Sep 21 17:19:49 1995
--- if_tun.c Thu Sep 21 19:02:18 1995
***************
*** 108,114 ****
ifp->if_mtu = TUNMTU;
ifp->if_ioctl = tunifioctl;
ifp->if_output = tunoutput;
! ifp->if_flags = IFF_POINTOPOINT;
ifp->if_snd.ifq_maxlen = ifqmaxlen;
ifp->if_collisions = 0;
ifp->if_ierrors = 0;
--- 108,114 ----
ifp->if_mtu = TUNMTU;
ifp->if_ioctl = tunifioctl;
ifp->if_output = tunoutput;
! ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST;
ifp->if_snd.ifq_maxlen = ifqmaxlen;
ifp->if_collisions = 0;
ifp->if_ierrors = 0;
***************
*** 238,243 ****
--- 238,244 ----
int cmd;
caddr_t data;
{
+ register struct ifreq *ifr = (struct ifreq *)data;
struct tun_softc *tp = &tunctl[ifp->if_unit];
int error = 0, s;
***************
*** 253,258 ****
--- 254,279 ----
TUNDEBUG("%s%d: destination address set\n",
ifp->if_name, ifp->if_unit);
break;
+
+ case SIOCADDMULTI:
+ case SIOCDELMULTI:
+ if (ifr == 0) {
+ error = EAFNOSUPPORT; /* XXX */
+ break;
+ }
+ switch (ifr->ifr_addr.sa_family) {
+
+ #ifdef INET
+ case AF_INET:
+ break;
+ #endif
+
+ default:
+ error = EAFNOSUPPORT;
+ break;
+ }
+ break;
+
default:
error = EINVAL;
}
--
--
$BF|K\EE5$3t<02q<R(B $B%M%C%H%o!<%-%s%05;=Q8&5f=j(B $B%$%s%?%M%C%H5;=QIt(B
$BCf@n(B $B9%5W(B y-nakaga@ccs.mt.nec.co.jp
jj3mxl@eatell.msr.prug.or.jp