Date: Tue, 14 Jul 1998 21:05:11 +0900 (JST) From: jinmei@kame.net To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: kern/7281: Multicast kludge does not work correctly Message-ID: <199807141205.VAA03050@kame201.kame.net>
index | next in thread | raw e-mail
>Number: 7281
>Category: kern
>Synopsis: Multicast kludge does not work correctly
>Confidential: yes
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Jul 14 05:10:01 PDT 1998
>Last-Modified:
>Originator: JINMEI Tatuya
>Organization:
KAME project
>Release: FreeBSD 2.2.6-RELEASE i386
>Environment:
FreeBSD perfume.kame.net 2.2.6-RELEASE FreeBSD 2.2.6-RELEASE #5:
Mon Jul 13 15:52:36 JST 1998
jinmei@perfume.kame.net:/usr/src/sys/compile/PERFUME i386
>Description:
If we join more than one multicast groups on an interface and then
delete the unicast address on the interface,
only one of them will be saved to multicast kludge area.
>How-To-Repeat:
0. Suppose that the IP address of ed0 is 10.0.0.1 and it's the only IP
address on the interface.
1. Join 224.0.0.2 on ed0
2. Join 224.0.0.3 on ed0
3. # ifconfig ed0 delete 10.0.0.1
4. # ifconfig ed0 10.0.0.1
5. # netstat -ian
there should be 224.0.0.2 and 224.0.0.3 on ed0, but only 224.0.0.3
is printed.
>Fix:
This is because the way to use LIST_INSERT_HEAD is wrong in in_control()
and in_ifinit(). We should forward pointer before calling LIST_INSERT_HEAD.
I wrote a patch to solve this problem and applied it.
It seems that the problem is fixed.
I'll attach the patch to this mail.
Index: in.c
===================================================================
RCS file: /cvsroot/hydrangea-freebsd/sys/netinet/in.c,v
retrieving revision 1.1.1.1.12.2
diff -c -r1.1.1.1.12.2 in.c
*** in.c 1998/06/02 15:53:18 1.1.1.1.12.2
--- in.c 1998/07/14 10:19:54
***************
*** 461,469 ****
*/
IFP_TO_IA(oia->ia_ifp, ia);
if (ia) { /* there is another address */
! struct in_multi *inm;
for(inm = oia->ia_multiaddrs.lh_first; inm;
! inm = inm->inm_entry.le_next) {
IFAFREE(&inm->inm_ia->ia_ifa);
ia->ia_ifa.ifa_refcnt++;
inm->inm_ia = ia;
--- 461,470 ----
*/
IFP_TO_IA(oia->ia_ifp, ia);
if (ia) { /* there is another address */
! struct in_multi *inm, *next;
for(inm = oia->ia_multiaddrs.lh_first; inm;
! inm = next) {
! next = inm->inm_entry.le_next;
IFAFREE(&inm->inm_ia->ia_ifa);
ia->ia_ifa.ifa_refcnt++;
inm->inm_ia = ia;
***************
*** 472,484 ****
}
FREE(mk, M_IPMADDR);
} else { /* last address on this if deleted, save */
! struct in_multi *inm;
LIST_INIT(&mk->mk_head);
mk->mk_ifp = ifp;
for(inm = oia->ia_multiaddrs.lh_first; inm;
! inm = inm->inm_entry.le_next) {
LIST_INSERT_HEAD(&mk->mk_head, inm, inm_entry);
}
--- 473,486 ----
}
FREE(mk, M_IPMADDR);
} else { /* last address on this if deleted, save */
! struct in_multi *inm, *next;
LIST_INIT(&mk->mk_head);
mk->mk_ifp = ifp;
for(inm = oia->ia_multiaddrs.lh_first; inm;
! inm = next) {
! next = inm->inm_entry.le_next;
LIST_INSERT_HEAD(&mk->mk_head, inm, inm_entry);
}
***************
*** 609,618 ****
*/
for(mk = in_mk.lh_first; mk; mk = mk->mk_entry.le_next) {
if(mk->mk_ifp == ifp) {
! struct in_multi *inm;
for(inm = mk->mk_head.lh_first; inm;
! inm = inm->inm_entry.le_next) {
IFAFREE(&inm->inm_ia->ia_ifa);
ia->ia_ifa.ifa_refcnt++;
inm->inm_ia = ia;
--- 611,621 ----
*/
for(mk = in_mk.lh_first; mk; mk = mk->mk_entry.le_next) {
if(mk->mk_ifp == ifp) {
! struct in_multi *inm, *next;
for(inm = mk->mk_head.lh_first; inm;
! inm = next) {
! next = inm->inm_entry.le_next;
IFAFREE(&inm->inm_ia->ia_ifa);
ia->ia_ifa.ifa_refcnt++;
inm->inm_ia = ia;
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199807141205.VAA03050>
