From owner-freebsd-hackers Mon Jun 15 19:42:23 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id TAA13789 for freebsd-hackers-outgoing; Mon, 15 Jun 1998 19:42:23 -0700 (PDT) (envelope-from owner-freebsd-hackers@FreeBSD.ORG) Received: from alpo.whistle.com (alpo.whistle.com [207.76.204.38]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id TAA13766 for ; Mon, 15 Jun 1998 19:42:16 -0700 (PDT) (envelope-from julian@whistle.com) Received: (from daemon@localhost) by alpo.whistle.com (8.8.5/8.8.5) id TAA05219; Mon, 15 Jun 1998 19:34:31 -0700 (PDT) Received: from current1.whistle.com(207.76.205.22) via SMTP by alpo.whistle.com, id smtpd005212; Tue Jun 16 02:34:20 1998 Message-ID: <3585D9A8.15FB7483@whistle.com> Date: Mon, 15 Jun 1998 19:34:16 -0700 From: Julian Elischer Organization: Whistle Communications X-Mailer: Mozilla 3.0Gold (X11; I; FreeBSD 2.2.5-RELEASE i386) MIME-Version: 1.0 To: hackers@FreeBSD.ORG CC: netatalk@umich.edu Subject: [patch] netatalk broken in 3.0 Content-Type: multipart/mixed; boundary="------------3F54BC7E1CFBAE3959E2B600" Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG This is a multi-part message in MIME format. --------------3F54BC7E1CFBAE3959E2B600 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit The netatalk port for FreeBSD doesn't work on FreeBSD because of an apparently gratuitous change in the 3.0 kernel. in 3.0 you need to use a correct AF_LINK sockaddr (sockaddr_dl) for setting a hardware multicast address. In most other systems including 2.2.x this is a AF_UNSPEC (as used by arp). this patch patches two files in the etc/atalkd directory of netatalk. can someone who knows how to fix ports commit it? (CC'd to netatalk list) julian (off to usenix) --------------3F54BC7E1CFBAE3959E2B600 Content-Type: text/plain; charset=us-ascii; name="d1" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="d1" Index: nbp.c =================================================================== RCS file: /cvs/mod/umich/netatalk/etc/atalkd/nbp.c,v retrieving revision 1.1.1.3.2.1 retrieving revision 1.1.1.3.2.2 diff -c -r1.1.1.3.2.1 -r1.1.1.3.2.2 *** nbp.c 1998/01/10 00:09:18 1.1.1.3.2.1 --- nbp.c 1998/06/16 02:24:27 1.1.1.3.2.2 *************** *** 9,14 **** --- 9,17 ---- #include #include #include + #if ( __FreeBSD__ >= 3 ) + #include + #endif #include #include #include *************** *** 176,184 **** } bcopy( zone_mcast( zt->zt_name, zt->zt_len ), zt->zt_bcast, sizeof( ethermulti )); bzero( &sa, sizeof( struct sockaddr )); bcopy( zt->zt_bcast, sa.sa_data, sizeof( ethermulti )); ! for ( iface = interfaces; iface; iface = iface->i_next ) { if (( iface->i_flags & IFACE_PHASE2 ) == 0 ) { continue; --- 179,201 ---- } bcopy( zone_mcast( zt->zt_name, zt->zt_len ), zt->zt_bcast, sizeof( ethermulti )); + #if ( __FreeBSD__ >= 3 ) + struct sockaddr_dl *dlp; + + /* configure multicast for this interface */ + bzero( &sa, sizeof( struct sockaddr )); + dlp = (struct sockaddr_dl *)&sa; + dlp->sdl_len = sizeof(struct sockaddr_dl); + dlp->sdl_family = AF_LINK; + dlp->sdl_index = 0; + dlp->sdl_nlen = 0; + dlp->sdl_alen = 6; + dlp->sdl_slen = 0; + bcopy (zt->zt_bcast, LLADDR(dlp), sizeof( ethermulti )); + #else bzero( &sa, sizeof( struct sockaddr )); bcopy( zt->zt_bcast, sa.sa_data, sizeof( ethermulti )); ! #endif for ( iface = interfaces; iface; iface = iface->i_next ) { if (( iface->i_flags & IFACE_PHASE2 ) == 0 ) { continue; Index: main.c =================================================================== RCS file: /cvs/mod/umich/netatalk/etc/atalkd/main.c,v retrieving revision 1.1.1.3.2.3 retrieving revision 1.1.1.3.2.4 diff -c -r1.1.1.3.2.3 -r1.1.1.3.2.4 *** main.c 1996/10/11 01:50:34 1.1.1.3.2.3 --- main.c 1998/06/16 02:24:27 1.1.1.3.2.4 *************** *** 17,22 **** --- 17,25 ---- #include #include #include + #if ( __FreeBSD__ >= 3 ) + #include + #endif #include #include *************** *** 1146,1154 **** --- 1149,1171 ---- bootaddr( ciface ); } } else { + #if ( __FreeBSD__ >= 3 ) + struct sockaddr_dl *dlp; + /* configure multicast for this interface */ bzero( &sa, sizeof( struct sockaddr )); + dlp = (struct sockaddr_dl *)&sa; + dlp->sdl_len = sizeof(struct sockaddr_dl); + dlp->sdl_family = AF_LINK; + dlp->sdl_index = 0; + dlp->sdl_nlen = 0; + dlp->sdl_alen = 6; + dlp->sdl_slen = 0; + bcopy (ethermulti, LLADDR(dlp), sizeof( ethermulti )); + #else + bzero( &sa, sizeof( struct sockaddr )); bcopy( ethermulti, sa.sa_data, sizeof( ethermulti )); + #endif if ( ifconfig( iface->i_name, SIOCADDMULTI, &sa )) { syslog( LOG_ERR, "addmulti: %m" ); exit( 1 ); --------------3F54BC7E1CFBAE3959E2B600-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message